[sql] problème avec apostrophe

Résolu
Bonjour,
J'ai un problème avec la légendaire apostrophe ^^'

voici ma requete
SELECT id,serie FROM serie WHERE serie="'.mysql_real_escape_string(stripslashes($serie)).'" ORDER BY serie ASC

$serie contient une chaine avec 2 apostrophes (That's 70's Show).
j'ai rajouté stripslashes() car je ne sais pas trop si magicquote est activé ou non.

la valeur dans ma table est celle ci : That\'s 70\'s Show.

sauf que voila, ma requête ne retourne rien !
J'ai essayé avec addslashes() et parail, aucun résultat :(

Qualqu'un pourrait m'aider ?

ps : avec $serie égal a une chaine sans apostrophe, le script fonctionne.

Merci d'avance.
--
L'amour, c'est comme les spaghettis; quand c'est mou, c'est cuit. (proverbe belge)

11 réponses

Résumé de la discussion

Problème rencontré est une requête SELECT qui compare une variable PHP à une valeur stockée, et la présence d'apostrophes dans That’s 70’s Show complique l’égalité recherchée. Les échanges préconisent d'utiliser mysql_real_escape_string sans stripslashes, car un anti-slash est ajouté automatiquement et une écriture identique doit être observée en base lors de l'insertion et du SELECT. Pour diagnostiquer, certains recommandent d'afficher la requête générée (echo) ou d'inspecter directement la valeur dans la base via phpMyAdmin pour confirmer l'égalité exacte; d'autres suggèrent d'éviter addslashes et d'utiliser des procédures équivalentes.

Bobot (l’IA à votre service)
  1. Fait une page info.php sur ton serveur avec ce code (le nom de la page importe peu, c'est pour l'exemple):
    <?php
    phpinfo();
    ?>

    Tu sauras si magicquote est activé ou non. Dans tout les cas, il ne faut pas mettre stripslashes() dans ta requête.
    1. Ok mais de toute façon, avec ou sans, ça ne change rien.
    2. Peux-tu me mettre ici la requête qui te permet d'ajouter les données à la BDD?
  2. Si tu ne souhaites pas avoir de soucis avec les quotes utilise ' [ALT Gr]+7.
    1. Hein ? ^^"
  3. Pour répondre à arthezius :
    voila l'enregistrement dans ma bdd a partir du POST.
    $serie = $_POST['serie'];
    $serie = ucwords(strtolower($serie));//on met en majuscule les 1er lettre de chaque mot, les autres sont en minuscules.
    $serie = Trim($serie);
    $serie = mysql_real_escape_string(htmlspecialchars($serie));
    
    puis la requete ou j'ajoute directement $serie
    
    1. Ben justement, met moi ta requête aussi.
    2. 'INSERT INTO raynal_video_serie
      (serie,type,description,realisateur,genre,genre2,format,creation,auteur,compteur)
      VALUES("'.$serie.'", "'.$type.'", "'.$description.'", "'.$realisateur.'", "'.$genre.'", "'.$genre2.'", "'.$format.'", NOW(), "'.$id_user.'", "0")'
    3. Je ne vois rien de précis qui pourrait poser problème à l'enregistrement dans la BDD.

      Sur ta requête:
      SELECT id,serie FROM serie WHERE serie="'.mysql_real_escape_string($serie).'" ORDER BY serie ASC

      Place un echo juste après pour vérifier que celle-ci passe correctement.
      $sql='SELECT id,serie FROM serie WHERE serie="'.mysql_real_escape_string($serie).'" ORDER BY serie ASC';
      echo $sql;

      Logiquement, il devrait te retourner:
      SELECT id,serie FROM serie WHERE serie="That\'s 70\'s Show" ORDER BY serie ASC
  4. SELECT id,serie FROM raynal_video_serie WHERE serie="Ma Famille D\'abord" ORDER BY serie ASC

    bon c'est un autre nom mais le problème est le même
    voici ce que me retourne $serie avant la requete
    Ma Famille D'abord

    1. L'anti-slashes est ajouté par la fonction mysql_real_escape_string().
      C'est normal s'il n'apparaît pas avant la requête et c'est également pour cette raison qu'il ne fallait pas mettre stripslashes() dans ta requête.

      Comme tu utilises la même fonction sur la requête d'ajout à la base de donnée, tu devrais avoir la même valeur dans la base de donnée.

      Vérifie en passant par PhpMyAdmin que tu as bien Ma Famille D\'abord d'enregistré.

      Si le texte est exactement identique entre ta requête et la valeur de ta base de donnée, il n'y a aucune raison que ça ne fonctionne pas.

      D'où proviens ta variable $serie de ta requête (avec le SELECT) ?
  5. Ma chaine dans ma table est bien celle ci : Ma Famille D\'abord

    $serie provient d'un fichier txt que j'extrais avec unserialize.
    et lors de l'enregistrement de ce fichier, j'ai mis plusieurs données dans un tableau que je serialize pour le transport (dans le fichier).
    1. bonjour,

      esseyer
      $serie="$_POST[serie]"; et dans la requete utilise

      '".mysql_real_escape_string($serie)."'
      1. C'est déjà fait.
      2. $s="$_POST[serie]";

        '".mysql_real_escape_string($s)."'

        remarque b1 " " dans "$_POST[serie]";
      3. Je ne comprend pas ta dernière ligne.
        remarque b1 " " dans "$_POST[serie]";
      4. c-a-d met $_POST[serie] entre " "
      5. mais qu'est ce que ça change avec ton post précédent ?
    2. Alors voila, j'ai fait quelque test.
      Si je prend toute ma table et que je fais la comparaison via php, ça fonctionne mais gros problème, je bouffe de la ressource a fond.

      Autrement, c'est en rajoutant addslashes() comme ceci :
      $sql = 'SELECT id,serie FROM raynal_video_serie WHERE serie="'.mysql_real_escape_string(addslashes($serie)).'" ORDER BY serie ASC';

      j'obtiens ceci :
      SELECT id,serie FROM raynal_video_serie WHERE serie="Ma Famille D\\\'abord" ORDER BY serie ASC

      et bizarrement, pour sql
      ça : Ma Famille D\\\'abord
      et ça : Ma Famille D\'abord
      C'est la même chose ...

      Vous comprenez quelque chose ??
      1. addslashes fait la même chose que mysql_real_escape_string.
        Autrement dit, ces deux fonctions te rajoute un slashes devant l'apostrophe.

        Essai en remplaçant la fonction addslashes par stripslashes.
    3. as ce que la valeur de $serie ==Ma Famille D'abord
      1. oui c'est bien cette chaine de caractère
      2. J'ai le même problème il ya quelque temps...

        $s="$_POST[le nom de cham qui contient la valeur de serie]";

        $sql ="SELECT id,serie FROM raynal_video_serie WHERE serie="'.mysql_real_escape_string(($s)).'" ";

        copier et coller le test...

        mon probleme avec l'insertion
      3. Si cela ne fonctionne pas j'ai une autre façon...
      4. ça ne fonctionne pas.
        J'ai alors modifier manuellement les nom dans ma table en enlevant les " \ " et ça fonctionne.

        Merci de vos aides.
      5. Bon, ben si ton problème est résolu, oubli ne tiens pas compte de mon dernier message.