SELECT de données avec apostrophes

Résolu
ephelya Messages postés 296 Statut Membre -  
ephelya Messages postés 296 Statut Membre -
Bonjour,

J'ai un souci avec une requête pdo que j'utilise pour récupérer une liste d'articles dans ma bdd. Je n'aii aucun souci d'une façon générale mais lorsque le titre comporte une apostrophe, ça plante.
SELECT F_FR_phrase FROM `Bd_92_dlMoQd_phrases` WHERE M_FR_phrase = :valeur1

J'ai essayé un str_replace("'", "''", $title) mais ça ne fonctionne pas davantage, mon apostrophe n'est pas doublée...
Merci d'avance pour votre aide !! :-)

4 réponses

  1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 831
     
    Bonjour,

    - Tu as ton souci à quel moment ? (pour faire la requête ? pour afficher le resultat ? )
    - Que te retourne exactement ta requête ? (l'as tu testé en direct dans ta bdd pour voir .?? )
    - A quel moment, et avec quel code exactement, as tu essayé ton str_replace ?

    Merci de nous apporter toutes ces précisions.

    0
    1. ephelya Messages postés 296 Statut Membre 2
       
      oui pardon, voici ma requête
         try{
         $db = new \PDO('mysql:host='.DB_HOST.'; dbname='.DB_NAME.'; charset=utf8', DB_USER, DB_PASSWORD);
          $db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
          $db->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_OBJ);
         } catch(PDOException $e) {
             die('Erreur : ' . $e->getMessage());
         }
      
          $query ="SELECT F_".LANG."_phrase FROM `Sublym_92_dlMoQd_phrases` WHERE  M_".LANG."_phrase = :valeur1"; 
          $datas = array(':valeur1' => $title);
      
         try{
           $requete = $db -> prepare($query) ;
           $requete->execute($datas) ;
           $res = $requete -> fetchAll();  //print_r($res);
           $val = "F_".LANG."_phrase";
           $res = $res[0] -> $val;
      
      
         }catch(Exception $e){
           // en cas d'erreur :
            echo " Erreur ! ".$e->getMessage();
            echo " Les datas : " ;
         } 
         return($res);
      

      EDIT : Ajout du langage dans les balises de code (pour avoir la coloration syntaxique )

      Elle fonctionne parfaitement, mais quand il y a une apostrophe, ça ne trouve pas le résultat. (Notice: Undefined offset: 0 in /web/new/app/Models/Blog.php on line 487
      Notice: Trying to get property of non-object in /web/new/app/Models/Blog.php on line 487) la ligne 487 correspond à $res[0] -> val

      La requête est ok en bdd, j'ai bien mon résultat ,pour autant que je puisse vraiment la tester pcq pr ça je fais un echo $query en remplaçant les :valeur1, :valeur2 par $title, $idcat et donc en ajoutant les apostrophes obligatoires :
      $query2 ="SELECT F_".LANG."_phrase FROM `Sublym_92_dlMoQd_phrases` WHERE  M_".LANG."_phrase = \"$title\""; 
        echo  $query2;
      
      0
    2. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 831 > ephelya Messages postés 296 Statut Membre
       
      Peux tu me dire ce que donne :
      - le echo de $query2
      - Le print_r($res) (celui que tu as mis en commentaire)

      Au cas où, tu peux aussi essayer de faire du addSlaches sur ton title
      http://php.net/manual/fr/function.addslashes.php
      0
    3. ephelya Messages postés 296 Statut Membre 2 > jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention  
       
      echo $query2 donne par exemple
      SELECT F_FR_phrase FROM `Sublym_92_dlMoQd_phrases` WHERE M_FR_phrase = "Je suis à l’écoute des besoins de mon corps"
      


      et le print_r($res) donne Array()

      Le addslashes n'a aucun effet, un echo addslashes($title) me donne "Je suis à l’écoute des besoins de mon corps" et j'ai toujours un résultat vide...

      (je n'avais jamais vu qu'on pouvait indiquer le langage dans la balise de code, merci ! ;-) )
      0
    4. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 831 > ephelya Messages postés 296 Statut Membre
       
      et quand tu testes la requête directement dans la BDD tu obtiens bien quelque chose ?
      Sous quelle forme ? tu peux montrer ?
      Ta BDD, tes pages et ta connexion PDO sont bien en UTF8 ?
      0
    5. ephelya Messages postés 296 Statut Membre 2 > jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention  
       
      au temps pour moi, la requête
      SELECT F_FR_phrase FROM `Sublym_92_dlMoQd_phrases` WHERE M_FR_phrase = "Je suis à l’écoute des besoins de mon corps"

      ne sort aucun résultat, par contre la requête
      SELECT * FROM `Sublym_92_dlMoQd_phrases` WHERE `M_FR_phrase` LIKE '%besoins%' ORDER BY `type` DESC 
      me sort bien des résultats, dont "Je suis à l'écoute des besoins de mon corps"
      Ma table et la bdd sont en utf8_general_ci, le serveur en utf8mb4_general_ci, le fichier enregistré en utf 8 mais pour la connexion PDO rien n'est précisé pour le charset

       
         try{
         $db = new \PDO('mysql:host='.DB_HOST.'; dbname='.DB_NAME.'; charset=utf8', DB_USER, DB_PASSWORD);
          $db->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
          $db->setAttribute(\PDO::ATTR_DEFAULT_FETCH_MODE, \PDO::FETCH_OBJ);
         } catch(PDOException $e) {
             die('Erreur : ' . $e->getMessage());
         }
      
      0
  2. Utilisateur anonyme
     
    Bonsoir

    Attention, il existe plusieurs caractères apostrophe. Il est très possible que le texte enregistré dans la base utilise le U+2019, et que tu fasses ta recherche avec un U+0027

    http://www.fileformat.info/info/unicode/char/27/index.htm
    http://www.fileformat.info/info/unicode/char/2019/index.htm

    Sais-tu vérifier les vrais codes des caractères que tu utilises ?

    Si l'un des deux vient d'un copier-coller depuis un traitement de texte ou une page web, le cas est très possible.
    0
    1. ephelya Messages postés 296 Statut Membre 2
       
      non, je n'y connais rien en charset d'une façon générale, ça m'a toujours pas mal rebutée, un peu comme les regex... :-D
      mais en effet, à l'origine la requête sql qui m'a permis d'implémenter les centaines de lignes a été générée avec excel...
      0
    2. Reivax962 Messages postés 3742 Statut Membre 1 011
       
      Bonjour,
      Je suis en phase avec Le Père.
      Dans les phrases que tu colles, on voit bien que ce ne sont pas les mêmes caractères : dans les recherches tu as une apostrophe française (courbée) alors que dans ton dump de base tu as des apostrophes droites (celles qui sont accessibles sur un clavier standard sur la touche 4, qui ne sont pas typographiquement correctes pour écrire en Français).

      Du coup, je te suggère de changer cela dans ta variable $titre :
      $titre = str_replace('’', "'", $titre);
      0
      1. ephelya Messages postés 296 Statut Membre 2 > Reivax962 Messages postés 3742 Statut Membre
         
        c'est une bonne idée, je testerai ça, merci ! Pour le moment je suis noyée dans un autre debug plus urgent, mais je regarderai ça de plus près ! :-)
        0
  3. Utilisateur anonyme
     
    Pour vérifier d'abord, peux-tu faire ta requête avec
    WHERE M_FR_phrase LIKE :valeur1

    au lieu de
    WHERE M_FR_phrase = :valeur1

    et en mettant un % au lieu d'une apostrophe dans :valeur1 ?
    0
    1. ephelya Messages postés 296 Statut Membre 2
       
      J'avais déjà fait ce test, mais ça n'avait rien donné...
      0
  4. ephelya Messages postés 296 Statut Membre 2
     
    Bonjour à tous, il y avait plusieurs bugs en parallèle du coup j'ai finalement carrément changé toutes mes requêtes. La question n'est plus d'actualité du coup vu que j'ai contourné le problème, mais je vous remercie quand même pour votre aide ! :-)
    0
    1. Reivax962 Messages postés 3742 Statut Membre 1 011
       
      Tant mieux.
      De façon générale, j'aime bien, dans mes scripts d'insertion et de recherche en base de donnée, remplacer systématiquement les apostrophes droites par des apostrophes françaises.
      L'avantage principal à mes yeux, c'est d'enlever les apostrophes droites de la base de données, sachant qu'elles ont souvent un sens technique dont il faut se prémunir... On fait d'une pierre deux coups : ça permet de les "échapper", et ça permet d'écrire un meilleur français ;)
      0
      1. ephelya Messages postés 296 Statut Membre 2 > Reivax962 Messages postés 3742 Statut Membre
         
        C'est une bonne idée, merci, surtout pour moi qui hais les problèmes de charset !! ;-)
        Par contre comment tu fais pour choisir l'aporstrophe française ? Je ne vois pas ça sur mon clavier... ^^
        0
    2. Reivax962 Messages postés 3742 Statut Membre 1 011
       
      Euh si tu hais les problèmes de charset il faut peut-être oublier l'idée... L'apostrophe française ne fait pas partie de l'ASCII étendu. Il faut s'assurer d'avoir une bonne cohérence et que tout soit en UTF8...
      Sous windows : alt+0146
      Sous Linux, sur ma configuration de clavier, altgr+g

      Xavier
      0
      1. ephelya Messages postés 296 Statut Membre 2 > Reivax962 Messages postés 3742 Statut Membre
         
        En fait je suis sous mac, mais je chercherai, au cas où... :-)
        Merci pour l'info en tout cas !
        0