Quillemets, probleme requete Mysql

Eléphanteau du PHP | 41 Messages

21 janv. 2008, 08:52

Bonjour,

J ai un problème de requête lorsque le texte recherché dans ma table contient un guillemet.

Voici mon code :

Code : Tout sélectionner

$sql="SELECT `id` , `id_carac` , `nom_carac` , `vide` FROM `nom_carac` WHERE 1 AND `nom_carac` LIKE 'Pas d'aplat"; $donnes=mysql_fetch_array( $recup); $id=$donnes["id"];
Dans ma table il y a bien une ligne avec le texte "Pas d'aplat", quand je fé la requête dans phpMyadmin cela fonctionne mais pas via mon code php.

Merci de votre aide

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

21 janv. 2008, 11:06

En sql, on délimite une chaine avec des apostrophes.

Première erreur dans ton code, tu ouvres bien une apostrophe en début de chaine, mais tu ne la referme pas :)

Second problème, c'est que ta chaine contient déjà une apostrophe. Du coup sql va l'interpréter comme s'il s'agissait de la fin de la chaine et va se retrouver avec un "aplat" dont il ne sait que faire. Pour éviter cela, il te faut protéger les apostrophes de ta chaine. Pour MySQL, il faut y ajouter un antislash : 'Pas d\'aplat'

PHP propose des fonctions afin de protéger tes chaines : mysql_real_escape_string()

Enfin, une petite remarqur, si tu recherche la chaine éxacte, évite d'utiliser LIKE et préfère un simple "=" :) (voire la FAQ sur les bonnes pratiques SQL ;))
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 41 Messages

21 janv. 2008, 13:15

Ok donc je dois revoir tous les textes de ma table pour mettre à \' sur les guillemets.

JE ne peux pas faire une requette du genre :

sql="select * from `matable` where `fontionmettreslsh (montexte)`"="addslashes('mon t\'eexr')";

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

21 janv. 2008, 15:07

Nonononononononononon .... tu ne dois pas modifier tes enregistrements, seulement la syntaxe de ta requête SQL pour éviter qu'il ne confonde les apostrpohes contenues dans une chaine avec celles qui délimitent la chaine :)

Dans ta base tu dois bien avoir "Pas d'aplat", mais dans tes requête sql il te faut protéger l'apostrohpe :
$sql="SELECT id, id_carac, nom_carac, vide 
  FROM nom_carac 
  WHERE nom_carac = 'Pas d\'aplat' ";

// ou bien 
$sql="SELECT id, id_carac, nom_carac, vide 
  FROM nom_carac 
  WHERE nom_carac = '" . mysql_real_escape_string("Pas d'aplat") . "'";
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...