Problème Requête SQL avec '

Eléphanteau du PHP | 16 Messages

30 mai 2012, 11:57

Bonjour,

J'ai un petit problème avec mes requête SQL, quand je modifie un textfield qui contient un ' cela ne me met une erreur... Quelqu'un aurait une solution?

Exemple : si je modifie le texte de ma base de données

si j'écris l'arbre ==== SQL ERROR
si j'écris l arbre ==== la modification se passe correctement.


Merci d'avance.

Mammouth du PHP | 1511 Messages

30 mai 2012, 13:36

Tu utilises l'extension mysql ou mysqli ?
Si c'est mysql, utilises mysql_real_escape_string sur ta variable, si c'est mysqli, utilises mysqli_real_escape_string.

Eléphanteau du PHP | 32 Messages

30 mai 2012, 14:12

Salut,

Tu peux aussi utiliser htmlscpecialchars ou htmlentities lorsque tu enregistre le textfield .

Mammouth du PHP | 1511 Messages

30 mai 2012, 14:34

Htmlentities est à utiliser à l'affichage, pas à l'enregistrement, et ne prémunit pas des injections SQL.

Eléphanteau du PHP | 33 Messages

30 mai 2012, 18:33

Salut,

Tu peux aussi utiliser htmlscpecialchars ou htmlentities lorsque tu enregistre le textfield .
Le caractère ' n'est pas filtré par ces fonctions comme ce n'est pas des caractères spécial au HTML.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

30 mai 2012, 19:33

Histoire d'être un peu plus précis sur le problème que tu rencontres : lorsque tu enregistres une chaine de caractère en base, tu délimite celle-ci avec des apostrophes :
INSERT INTO taTable (champ1, champ2, ...) VALUES ('valeur1', 'valeur2', ...);
du coup si ta valeur contient une apostrophe, SQL ne saura plus identifier où se termine la chaine : " 'l'arbre' " il va considérer que tu as une chaine "l", puis une instruction "arbre" qu'il ne connait pas et qui génère une erreur.

Pour éviter cela, il faut protéger les chaines contenant des apostrophes en ajoutant généralement un antislash pour que ta base sache qu'il s'agit d'un caractère apostrophe et non de la fin de la chaine : 'l\'arbre'

C'est là que la fonction mysql_real_escape_string() intervient puisqu'elle va protéger les caractères spéciaux de tes valeurs pour qu'elles puissent être utilisées dans ta base de données.

Voilà en gros l'origine du problème et le comment le résoudre. Une fois que tu seras à l'aise avec ceci tu pourras te pencher sur la gestion des magic quotes (en fonction de la configuration, php ajoute lui même des "\" mais pas toujours comme on voudrait) et les aspect sécurité (injection sql)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Dynamic88
Invité n'ayant pas de compte PHPfrance

31 mai 2012, 14:39

$sql= sprintf("update cycle set titre_cycle='$titre_cycle' where id_cycle='$id_cycle'",mysql_real_escape_string($titre_cycle));

voilà comment j'ai utilisé cette fonction.

Dynamic88
Invité n'ayant pas de compte PHPfrance

31 mai 2012, 14:41

Merci de vos conseils, j'ai utilisé cette fonction de cette façon. Je comprend maintenant ou était mon erreur. Mais cela ne marche toujours pas.
Est ce bien de cette façon que l'on utilise la fonction mysql_real_escape_string()?


$sql= sprintf("update cycle set titre_cycle='$titre_cycle' where id_cycle='$id_cycle'",mysql_real_escape_string($titre_cycle));
Merci d'avance.

kny
Eléphanteau du PHP | 47 Messages

31 mai 2012, 14:47

Quelle est l'utilité de sprintf pour écrire la requête?

Dynamic88
Invité n'ayant pas de compte PHPfrance

31 mai 2012, 15:52

C'est quelque chose que j'ai lu dans un tutoriel... mais avec ou sans cela ne fonctionne pas...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

31 mai 2012, 23:09

sprintf permet de formater une chaine... c'est souvent utilisé dans les tutos, mais j'avoue que personnellement je n'ai jamais compris l'intérêt de cette fonction pour faire des requêtes SQL. Celles-ci n'ont pas besoin d'un format d'affichage et pire que tout, c'est une vrai galère pour savoir quel valeur est utilisée à quel endroit.

Quoi qu'il en soit, pour que cela fonctionne, il faut que tu remplaces la variable dans ta requête sql par un spécificateur qui permettre à la fonction de savoir quoi remplacer (c'est pas clair, je sais, mais avec l'exemple ça te parlera plus ;))
$sql= sprintf("update cycle set titre_cycle='%s' where id_cycle=%d", mysql_real_escape_string($titre_cycle), $id_cycle);
Dans cet exemple, le %s va être remplacé par le premier argument (donc le titre protégé), le %d par le second argument (donc l'id cycle). Quand il n'y a que 2 valeurs à remplacer, ça va encore, mais dès qu'il y en a 10, c'est vite la pagaille pour repérer dans quel ordre ils doivent être...

Personnellement je trouve ceci plus lisible et plus facile à maintenir :
$sql= "UPDATE cycle SET titre_cycle='" . mysql_real_escape_string($titre_cycle) . "' WHERE id_cycle=" . $id_cycle;
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...