SELECT de données avec apostrophes

Résolu
ephelya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention   -  
ephelya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention   -
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 !! :-)



A voir également:

4 réponses

jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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
ephelya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention   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
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752 > ephelya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention  
 
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
ephelya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention   2 > jordane45 Messages postés 38486 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
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752 > ephelya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention  
 
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
ephelya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention   2 > jordane45 Messages postés 38486 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
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
ephelya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention   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
Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention   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
ephelya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention   2 > Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention  
 
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
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
ephelya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention   2
 
J'avais déjà fait ce test, mais ça n'avait rien donné...
0
ephelya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention   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
Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention   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
ephelya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention   2 > Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention  
 
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
Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention   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
ephelya Messages postés 282 Date d'inscription   Statut Membre Dernière intervention   2 > Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention  
 
En fait je suis sous mac, mais je chercherai, au cas où... :-)
Merci pour l'info en tout cas !
0