Boumbadaboum Posté 6 Août 2005 Partager Posté 6 Août 2005 (modifié) Bonjour à tous, Voilà mon souci : J'ai dans ma base de donnée une colonne nommée 'patate' et une autre nommé 'patate à l'eau' (ce sont des exemples). J'ai un script PHP avec un switch qui dit : switch ($cuisine) {case "patate": $cuisine2='patate';break;case"patate à l'eau": $cuisine2='patate à l\'eau'; break;etc... ensuite je vais chercher dans la base la catégorie qui correspond à cuisine2. Tout marche bien mais pour la 'ligne patate à l'eau', la seule avec une apostrophe, j'obtiens: You have an error in your SQL syntax near 'eau%' AND valider='1%'' at line 1 Dans ma base de donnée, vue avec phpmyadmin la colonne patate à l'eau est écrite comme tel. Voila vous savez tout. Si vous pouvez m'expliquer le problème çe serait très sympa. Merci d'avance. Modifié 6 Août 2005 par Boumbadaboum Lien vers le commentaire Partager sur d’autres sites More sharing options...
AntoineViau Posté 6 Août 2005 Partager Posté 6 Août 2005 Il s'agit d'une confusion entre deux interprétations. D'une part celle de PHP, d'autre part celle de SQL. D'un point de vue général, je te conseille : - toujours écrire ses chaînes PHP avec des guillemets. Donc mettre plutôt $cuisine2 = "patate à l'eau"; Ca te permet de distinguer clairement ce qui est une chaîne et une "chaîne dans une chaîne" (dans ce cas tu mets un antislash). - addslashes est ton ami quand tu travailles en SQL à partir de PHP. Autrement dit : $cuisine2 = "patate à l'eau"; mysql_query("INSERT INTO matables VALUES(".addslashes($cuisine2).")"); Et tu seras assuré que ce qui est dans la BDD est bien ce que tu voulais. Et dans l'autre sens, même principe : $var = "patate à l'eau"; $r=mysql_query("SELECT * FROM matable WHERE monchamp='".addslashes($var)."'"); Si tu ne mets pas le addslahes, voici ce qui est envoyé à MySQL : SELECT * FROM matable WHERE monchamp='patate à l'eau' (problème !) avec le addslahes : SELECT * FROM matable WHERE monchamp='patate à l\'eau' (bien !) Antoine Lien vers le commentaire Partager sur d’autres sites More sharing options...
Dan Posté 6 Août 2005 Partager Posté 6 Août 2005 Il suffit de passer ta variable par addslashes() pour éviter ces soucis. Donc: $query = "select * from cuisine where plat = '".addslashes("patate a l'eau")."'"; <edit: grillé par Antoine qui est beaucoup plus explicite > Lien vers le commentaire Partager sur d’autres sites More sharing options...
Boumbadaboum Posté 6 Août 2005 Auteur Partager Posté 6 Août 2005 (modifié) Merci pour vos réponse les gars Effectivement j'ai oublié que le "\" dans le script php ne se reportait pas dans la requête d'où addslashes que je n'avais encore jamais utilisé. D'où cette dernière question, parce que la syntaxe de la requête est un peu confuse pour moi : j'ai écrit : $Plat="SELECT * WHERE cuisine like '"addslashes.("$cuisine2%")." AND valide='1%'" Bien entendu j'obtiens un " unexpected T_STRING" Elle est où l'erreur svp ? Modifié 6 Août 2005 par Boumbadaboum Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sarc Posté 6 Août 2005 Partager Posté 6 Août 2005 $Plat="SELECT * WHERE cuisine like '".addslashes("$cuisine2%")." AND valide='1%'"; Ca devrait être mieux... Le point est à mettre entre les éléments du echo, et non entre la fonction et ses paramètres Lien vers le commentaire Partager sur d’autres sites More sharing options...
AntoineViau Posté 6 Août 2005 Partager Posté 6 Août 2005 Merci pour vos réponse les garsEffectivement j'ai oublié que le "\" dans le script php ne se reportait pas dans la requête d'où addslashes que je n'avais encore jamais utilisé. D'où cette dernière question, parce que la syntaxe de la requête est un peu confuse pour moi : j'ai écrit : $Plat="SELECT * WHERE cuisine like '"addslashes.("$cuisine2%")." AND valide='1%'" Bien entendu j'obtiens un " unexpected T_STRING" Elle est où l'erreur svp ? <{POST_SNAPBACK}> T'as mal placé un point petit scarabé : $Plat="SELECT * WHERE cuisine like '"addslashes.("$cuisine2%")." AND valide='1%'" $Plat="SELECT * WHERE cuisine like '".addslashes("$cuisine2%")." AND valide='1%'" Lien vers le commentaire Partager sur d’autres sites More sharing options...
Boumbadaboum Posté 6 Août 2005 Auteur Partager Posté 6 Août 2005 Eh eh ça marche... Pas ! j'obtiens You have an error in your SQL syntax near '1%'' at line 1 et j'ai bien vérifié avoir inscrit votre code proprement les mecs ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sarc Posté 6 Août 2005 Partager Posté 6 Août 2005 $Plat="SELECT * WHERE cuisine like '".addslashes("$cuisine2%")."' AND valide='1%'"; J'aurais du vérifier un peu mieux moi aussi Il manquait un apostrophe Quand il y a ça, je te conseille de faire un echo de ta variable, tu vois plus facilement les erreurs une fois la requète écrite ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Boumbadaboum Posté 6 Août 2005 Auteur Partager Posté 6 Août 2005 Non ça marche toujours pas j'obtiens Parse error : should change Job Non je rigole c bon les gars ça fonctionne Merci Lien vers le commentaire Partager sur d’autres sites More sharing options...
Boumbadaboum Posté 6 Août 2005 Auteur Partager Posté 6 Août 2005 Ceci dit j'ai appris un truc, je ne savais pas que l'on pouvait passer des instructions php directement dans une requête sql et traiter ainsi des chaînes de caractères. Je me trompe en disant ça ou pas? Et si c'est le cas avez vous des exemples de ce que l'on peut faire dans le genre? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Anonymus Posté 7 Août 2005 Partager Posté 7 Août 2005 Si tu parles de ce genre de figure : '".addslashes("$cuisine2%")."' C'est possible, mais pas tout à fait comme tu l'expliques. passer des instructions php directement dans une requête sql Il faut bien garder en mémoire que php et sql sont totalement différents. Dans le cas de cette requète, on commence par construire la requète. Donc, on est autorisé à inclure autant de fonctions (addslashes est une fonction, non une instruction ) que l'on veut. Les usages sont tellement multiples qu'il est difficile de t'en donner des exemples, mais tu peux multiplier ainsi tous les cas de figure, tant que tu te retrouves, à la fin, avec une requète sql 'normalisée'. Donc, en cas de problèmes, juste avant la fonction mysql_query, tu peux éditer ta requète, pour voir si elle correspond bien à une requète sql. Si elle est valide, c'est bon. Sinon, c'es au niveau php qu'il faut revoir la construction de la requète. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Boumbadaboum Posté 7 Août 2005 Auteur Partager Posté 7 Août 2005 Bonjour et merci pour tes explications avant tout. Quelques questions peut être : tant que tu te retrouves, à la fin, avec une requète sql 'normalisée' à la fin de quoi? c'était quoi le début? addslashes est une fonction, non une instruction la différence ? tu peux éditer ta requète comment? Sinon, c'es au niveau php qu'il faut revoir la construction de la requète C'est où le niveau PHP ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Anonymus Posté 7 Août 2005 Partager Posté 7 Août 2005 Quand tu veux faire une requète sql, en général, tu fais ceci : $query = "select champ from table"; mysql_query($query); La variable $query peut être construite au fur et à mesure de ton programme, pas forcément juste avant la fonction mysql_query. Dans ce cas là, elle a un début, et une fin. Le début, c'est justement la première fois où elle apparait, et la fin c'est la dernière fois où elle apparait. Un exemple valant mieux que... exemples de fonctions : addslashes, str_replace, mysql_query, trim, etc.. exemples d'instructions : for, if, else, foreach, switch, etc.. Pour éditer une requète, au lieu de faire : mysql_query("select champs from table"); tu fais : $query = "select champs from table"; echo $query; mysql_query($query); Le niveau de Php est d'environs 1,346 metres Sérieux : Tout ce qui est entre les parenthèses du mysql_query() est considéré comme la requète. C'est ce que tu envoies au serveur de base de données. Voilà Lien vers le commentaire Partager sur d’autres sites More sharing options...
Boumbadaboum Posté 7 Août 2005 Auteur Partager Posté 7 Août 2005 Ok merci beaucoup ! J'ai compris. Un peu mieux en tout cas... Petit à petit l'oiseau fait son nid Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant