Aller au contenu

Sujets conseillés

Posté (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é par Boumbadaboum
Posté

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

Posté

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 ;) >

Posté (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é par Boumbadaboum
Posté

$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 ;)

Posté
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 ?

<{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%'"

Posté

$Plat="SELECT * WHERE cuisine like  '".addslashes("$cuisine2%")."' AND valide='1%'";

J'aurais du vérifier un peu mieux moi aussi :P 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 ! :P

Posté

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?

Posté

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.

Posté

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 ?

:wacko:

Posté

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 :D

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à ;)

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...