Ses derniers messages sur les forums
Quand tu as besoin de faire du transactionnel.
En gros, tu as besoin d'innod dès lors que tu fais une action sur plusieures tables via un seul script.
Grace à innodb, tu lances une transaction.
Tu fais ton insert dans la table 1.
Si ton insert plante, tu rollback la transation (et la, tu es sur que ton insert n'a pas été fait), sinon tu fais un autre insert dans la table 2. Si cette deuxieme requete fait du caca, tu rollback la transation (et la, en rollbackant, ce sont la requete 2 ET la requete 1 qui sont annulées), sinon, tu la commit.
Bref, ca permet de garder une base intègre.
Le cas typique d'utilisation : pour un forum, pour un nouveau sujet, souvent tu fais un insert dans une table sujet et une table message. En innodb, tu es assuré à 100% de ne pas avoir un sujet sans message.
Oui, en MyISAM, c'est beaucoup plus rapide.
Pas en InnoDB.
C'est surement mieux, mais ca te coutera deux requetes SQL.
Des que tu lances mysql_real_escape_string n'importe ou dans ton code, ca fait appel à mysql pour savoir ce qui doit etre escapé en fonction de l'encodage. Bref, c'est plus couteux.
En conséquences, pour utiliser mysql_real_escape_string, il faut que ta connexion mysql soit déja établi sinon tu te manges une erreur alors qu'avec mysql_escape_string non.
Apres, c'est sur, la fonction real donne de meilleurs résultats, mais c'est pas forcemment la plus pratique à utiliser (chez moi, par exemple, quand j'ecris ma requete SQL, ma connexion à MySQL n'est pas encore faite, ma connexion se fait au moment ou je lance la query dans une fonction SQL : bref, je ne peux pas utiliser cette fonction à moins de faire des trucs crades).
Le select count est à déconseillé si ta table est en innodb.
En myisam, peu importe la méthode.
C'est pas parce que ca marche que c'est bien.
Si tu as 10 catégories qui ont x sous catégories chacune, tu vas faire 11 requetes SQL sur une seule page alors que tout peut se faire en une seule requete SQL.
<?php
$sql = "SELECT categorie.idcategorie, categorie.nom, lien.lien FROM categorie, lien WHERE lien.idcategorie = categorie.idcategorie ORDER BY categorie.idcategorie ASC, lien.idcategorie ASC";
$req = mysql_query($sql) or die ($sql.' '.mysql_error());
$temp = '';
while ($data = mysql_fetch_array($req)) {
if ($temp != $data['idcategorie']) {
echo 'Catégorie : '.$data['nom'].'';
$temp = $data['idcategorie'];
}
echo 'Lien : '.$data['lien'].'';
}
mysql_free_result($req);
?>
Je ne connaissais pas le coup de la virgule :) (enfin, si, pour les echo sans concaténation : echo $blu,'toto',$titi; Je n'avais essayé de le faire ailleurs)
Qu'est ce qui t'empêche de faire cela en PHP avant d'afficher ce que contient ta base ?
Les { } sont obligatoires que si ton if comporte plus qu'une instruction.
Si tu me dump un bout de ta base de données avec les structures des tables et les données d'un user, je veux bien t'aider :) (mais la, j'ai trop la flemme de créer ca et de remplir à la main les tables)
Plusieures regles simples :
- controler par des regex ou autres ce que tu comptes rentrer en base
- utiliser les fonctions d'escape adaptées à ta base de données (mysql_escape_string ou mysql_real_escape_string) : on doit utiliser addslashes QU'EN DERNIERE SOLUTION (c'est à dire lorsque PHP ne propose pas de fonction d'escape pour un SGBD, mais ce n'est pas le cas pour MySQL)
- utiliser la fonction intval de PHP au lieu de mysql_escape_string lors de condition sur des champs numériques
- ne pas afficher les erreurs de PHP et/ou de MySQL en production
- protéger tes champs SQL via des backquotes : `
Voila, si tu suis toutes ces regles à la lettre, ton site sera plus sécurisé que 80% des sites fais en PHP
Faut le reconnaitre : PHP est simple d'accès. Beaucoup de gens font de la merde avec en se disant "ca marche donc c'est bon". Ben oui mais non.... La programmation, c'est un vrai métier qui s'apprend, et la sécurité est un élément important lors du développement d'un site.
Je ne jette pas la pierre sur les autres, moi meme il y a 7 ans, je ne pretais que tres peu attention à ces problèmes (c'est d'ailleurs principalement pour ca que la v4 met du temps à sortir : je veux qu'elle soit "parfaite"), mais c'est une erreur.