SELECT de données avec apostrophes

Résolu/Fermé
ephelya Messages postés 282 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 - 21 mars 2017 à 15:03
ephelya Messages postés 282 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 - 30 mars 2017 à 01:27
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 38241 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 septembre 2024 4 689
21 mars 2017 à 16:35
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 mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2
Modifié par jordane45 le 21/03/2017 à 16:56
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 38241 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 septembre 2024 4 689 > ephelya Messages postés 282 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023
21 mars 2017 à 17:05
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 mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2 > jordane45 Messages postés 38241 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 septembre 2024
21 mars 2017 à 17:18
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 38241 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 septembre 2024 4 689 > ephelya Messages postés 282 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023
21 mars 2017 à 17:24
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 mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2 > jordane45 Messages postés 38241 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 septembre 2024
Modifié par jordane45 le 21/03/2017 à 18:07
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
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 mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2
21 mars 2017 à 19:49
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 jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
Modifié le 24 mars 2017 à 14:51
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 mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2 > Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021
24 mars 2017 à 17:35
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
21 mars 2017 à 20:25
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 mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2
24 mars 2017 à 17:37
J'avais déjà fait ce test, mais ça n'avait rien donné...
0
ephelya Messages postés 282 Date d'inscription mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2
27 mars 2017 à 12:47
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 jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
28 mars 2017 à 13:58
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 mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2 > Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021
28 mars 2017 à 19:26
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 jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
29 mars 2017 à 09:36
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 mercredi 28 septembre 2011 Statut Membre Dernière intervention 20 juin 2023 2 > Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021
30 mars 2017 à 01:27
En fait je suis sous mac, mais je chercherai, au cas où... :-)
Merci pour l'info en tout cas !
0