|
|
|
#1 |
|
Messages: n/a
Hébergeur: |
Bonjour,
J'ai une erreur de syntaxe dans une requête et je ne vois pas où ? type de variable ?? c'est survenu quand j'ai voulu ajouter et tester un champ int dans ma table. Voilà une partie du code : __________________________________________________ __________________________________________________ ___ Le formulaire contient des select (qui eux fonctionnent) et un input pour entrer ce qui sera un entier __________________________________________________ __________________________________________________ ____ le traitement passe les variables (ça aussi ça marchait qd il n'y avait pas le text nb_petales que je change en entier avec intval... <? $fleur = $_POST['fleur']; $bois = $_POST['bois']; $nervures = $_POST['nervures']; $nbpetales = $_POST['nb_petales']; # <---------------- ??? $nb_petales=intval($nbpetales); # <---------------- ??? $petales = $_POST['petales']; $corolle = $_POST['corolle']; $couleur = $_POST['couleur']; $lumiere = $_POST['lumiere']; $terrain = $_POST['terrain']; $altitude = $_POST['altitude']; print ("Critères retenus : "); print("$fleur + $bois + feuilles : $nervures + $nb_petales pétales + pétales : $petales $corolle + $couleur + terrain : $lumiere, $terrain, $altitude") ; echo '<br>'; # jusque là, le progr marche et affiche ce que je demande, y compris nb_petales... //connexion table $db=mysql_connect('localhost','root',''); mysql_select_db('floresoule',$db); $sql = "SELECT nom, lien, vignette, fleur, bois, nervures, petales_min, petales_max, petales, corolle, couleur, lumiere, terrain, altitude FROM floresoule2 WHERE fleur like '%$fleur%' and bois like '%$bois%' and 'petales_min'<=%nb_petales% and 'petales_max'>=%nb_petales% and nervures like '%$nervures%' and petales like '%$petales%' and corolle like '%$corolle%' and couleur like '%$couleur%' and lumiere like '%$lumiere%' and terrain like '%$terrain%' and altitude like '%$altitude%' ORDER BY nom"; $req = mysql_query($sql) or die('Erreur SQL!<br>'.$sql.'<br>'.mysql_error()); $total=mysql_num_rows($req); # j'ai donc ajouté à cette requête la condition nb_petales doit être entre petales_min et petales_max (champs déclarés et renseignés) comme entiers dans la table __________________________________________________ ________________________________________________ et voilà le résultat :_((( : Critères retenus : grandes fleurs + non_ligneuse + feuilles : simples + 5 pétales + pétales : différents % + % + terrain : %, %, % ## ça c'est bon Erreur SQL! SELECT nom, lien, vignette, fleur, bois, nervures, petales_min, petales_max, petales, corolle, couleur, lumiere, terrain, altitude FROM floresoule2 WHERE fleur like '%grandes fleurs%' and bois like '%non_ligneuse%' and 'petales_min'<=%nb_petales% and 'petales_max'>=%nb_petales% and nervures like '%simples%' and petales like '%différents%' and corolle like '%%%' and couleur like '%%%' and lumiere like '%%%' and terrain like '%%%' and altitude like '%%%' ORDER BY nom Erreur de syntaxe près de '%nb_petales% and 'petales_max'>=%nb_petales% and nervures like '' à la ligne 1 __________________________________________________ _________________________________________________ Merci pour vos conseils ! -- Alain L |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
alainL a écrit :
> Bonjour, > J'ai une erreur de syntaxe dans une requête et je ne vois pas où ? type > de variable ?? c'est survenu quand j'ai voulu ajouter et tester un > champ int dans ma table. > Voilà une partie du code : (snip) > $sql = "SELECT nom, lien, vignette, fleur, bois, nervures, petales_min, > petales_max, petales, corolle, couleur, lumiere, terrain, altitude FROM > floresoule2 WHERE fleur like '%$fleur%' and bois like '%$bois%' and > 'petales_min'<=%nb_petales% and 'petales_max'>=%nb_petales% pb de syntaxe: and petales_min <= $nb_petales and petales_max >= $nb_petales (snip) > > et voilà le résultat :_((( : > > > > Critères retenus : grandes fleurs + non_ligneuse + feuilles : simples + > 5 pétales + pétales : différents % + % + terrain : %, %, % ## ça > c'est bon > Erreur SQL! Il en reste en effet: > and corolle like '%%%' and couleur like '%%%' and > lumiere like '%%%' and terrain like '%%%' and altitude like '%%%' Tu ne devrais ajouter ces critères que s'ils sont renseignés. |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
Bruno Desthuilliers a écrit :
> alainL a écrit : ........... > pb de syntaxe: > > and petales_min <= $nb_petales and petales_max >= $nb_petales > > Merci. J'ai modifié et je n'ai plus de message d'erreur émanant de mysql... Mais la requête ne trouve plus rien alors que des des éléments correspondent à la recherche. fleur like '%$fleur%' and bois like '%$bois%' and petales_min <= $nb_petales and petales_max >= $nb_petales and nervures like '%$nervures%' and petales like '%$petales%' and corolle like '%$corolle%' and couleur like '%$couleur%' and lumiere like '%$lumiere%' and terrain like '%$terrain%' and altitude like '%$altitude%' En partant d'easyphp, des requetes du genre select nom from... where petales_min>= 5 and petales_max<=7 affichent les éléments correspondants, je pense que la table est OK. On dirait que ma "variable" $nb_petales" n'est pas reconnue comme entier ??? probleme venant de la réutilisation du nom ?? -elle vient du form par <input type=text name="nb_petales"> , -je la passe au traitement par $nbpetales = $_POST['nb_petales']; $nb_petales=intval($nbpetales); ..... > >> and corolle like '%%%' and couleur like '%%%' and lumiere like '%%%' >> and terrain like '%%%' and altitude like '%%%' > > Tu ne devrais ajouter ces critères que s'ils sont renseignés. > Il se peut que l'utilisateur ne sache pas comment renseigner un champ. Ca marchait avec la première version de la page, avant l'ajout des petales max et min . -- Alain L Mon village en Haute Soule : http://jarailet.club.fr Carnet de voyages: http://jarailet.club.fr/Randobal |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
Le 01/04/2008 14:06, alainL a écrit :
> > Merci. J'ai modifié et je n'ai plus de message d'erreur émanant de mysql... > Mais la requête ne trouve plus rien alors que des des éléments > correspondent à la recherche. > > fleur like '%$fleur%' and bois like '%$bois%' and petales_min <= > $nb_petales and petales_max >= $nb_petales and nervures like > '%$nervures%' and petales like '%$petales%' and corolle like > '%$corolle%' and couleur like '%$couleur%' and lumiere like '%$lumiere%' > and terrain like '%$terrain%' and altitude like '%$altitude%' Que valent $fleur, $bois, etc., et que valent fleur, bois, etc. dans l'un des éléments dont tu dis qu'ils correspondent ? > [...] > > On dirait que ma "variable" $nb_petales" n'est pas reconnue comme entier Quelle importance, puisque tu la transformes en chaîne de caractères au moment de faire la requête ? Ce n'est sûrement pas de là que vient le problème. > -elle vient du form par > <input type=text name="nb_petales"> , > -je la passe au traitement par > $nbpetales = $_POST['nb_petales']; Ok. > $nb_petales=intval($nbpetales); Conversion à 100 % inutile. |
|
|
|
#5 |
|
Messages: n/a
Hébergeur: |
Le Tue, 01 Apr 2008 14:06:22 +0200, alainL <jarailet@club-internet.fr>
écrivait dans fr.comp.infosystemes.www.auteurs: >Bruno Desthuilliers a écrit : >> alainL a écrit : >.......... >> pb de syntaxe: >> >> and petales_min <= $nb_petales and petales_max >= $nb_petales >> >> > >Merci. J'ai modifié et je n'ai plus de message d'erreur émanant de mysql... >Mais la requête ne trouve plus rien alors que des des éléments >correspondent à la recherche. Une façon simple de travailler sur ce genre de problème. Faire un $query= qui reçoit la requête Puis un echo $query; Et recopier la réponse dans le dialogue SQL de phpmyadmin. Ensuite, on modifie l'énoncé jusqu'à ce qu'on obtienne une réponse valide et on retourne à l'étape précédente. Autre truc : quelques echo "[".$entree."]"; pour voir ce qu'il y a au départ. Aussi, simplifier la requête pendant que l'on cherche le problème. Il faut éviter les bouts de code trop longs si on débute ou si le problème est incompréhensible. Denis |
|
|
|
#6 |
|
Messages: n/a
Hébergeur: |
alainL a écrit :
> Bruno Desthuilliers a écrit : >> alainL a écrit : > .......... >> pb de syntaxe: >> >> and petales_min <= $nb_petales and petales_max >= $nb_petales >> >> > > Merci. J'ai modifié et je n'ai plus de message d'erreur émanant de mysql... > Mais la requête ne trouve plus rien alors que des des éléments > correspondent à la recherche. > > fleur like '%$fleur%' and bois like '%$bois%' and petales_min <= > $nb_petales and petales_max >= $nb_petales and nervures like > '%$nervures%' and petales like '%$petales%' and corolle like > '%$corolle%' and couleur like '%$couleur%' and lumiere like '%$lumiere%' > and terrain like '%$terrain%' and altitude like '%$altitude%' > > En partant d'easyphp, des requetes du genre select nom from... where > petales_min>= 5 and petales_max<=7 affichent les éléments > correspondants, je pense que la table est OK. > pb de logique: and petales_min => $nb_petales and petales_max =< $nb_petales !-) (snip) > .... >> >>> and corolle like '%%%' and couleur like '%%%' and lumiere like '%%%' >>> and terrain like '%%%' and altitude like '%%%' >> >> Tu ne devrais ajouter ces critères que s'ils sont renseignés. >> > Il se peut que l'utilisateur ne sache pas comment renseigner un champ. Oui, mais toi (dans ton code) tu peux vérifier si le champ est renseigné ou pas, et n'ajouter la clause à la requête que si nécessaire. En d'autres termes : tu construit ta requête par petits bouts. Exemple: $champs_like = array("fleur", "bois", "nervures", "petales", "corolle", "couleur", "lumiere", "terrain", "altitude"); $where = array(); foreach($champs_like as $champ) { if (isset($_POST[$champ])) { $val = $_POST[$champ]; // TODO : gérer les quotes etc ici $where[] = "$champ like '%$val%'"; } } $where = implode(' and ', $where); if (isset($_POST['nb_petales']) { if ($where) { $where .= " and "; } $nb_petales = $_POST['nb_petales']; // TODO : s'assurer ici qu'on a une valeur valide $where .= "and petales_min => $nb_petales " . "and petales_max =< $nb_petales"; } $sql = "SELECT yadda yadda etc..." . $where; > Ca marchait avec la première version de la page, avant l'ajout des > petales max et min . Et ? Tu sais, y a pleins de façons parfaitement inefficaces d'obtenir un résultat correct... J'ai vu une fois dans un CMS dont je tairai le nom par charité chrétienne l'algo suivant: mettre le compteur à zero selectionner les id de toute une table et le stoquer dans un tableau pour chaque element du tableau: sélectionner tous les champs de l'enregistrement correspondant à l'id si le champ "X" a la valeur "Y": incrementer le compteur fin si fin pour Sachant que la table en question était susceptible de contenir de quelques milliers à quelques dizaines de milliers d'enregistrements. Le résultat était correct. Quand on ne tombait pas en time-out avant... |
|
|
|
#7 |
|
Messages: n/a
Hébergeur: |
Bruno Desthuilliers a écrit :
> alainL a écrit : >> Bruno Desthuilliers a écrit : .................. >> fleur like '%$fleur%' and bois like '%$bois%' and petales_min <= >> $nb_petales and petales_max >= $nb_petales and nervures like >> '%$nervures%' and petales like '%$petales%' and corolle like >> '%$corolle%' and couleur like '%$couleur%' and lumiere like >> '%$lumiere%' and terrain like '%$terrain%' and altitude like >> '%$altitude%' >> >> En partant d'easyphp, des requetes du genre select nom from... where >> petales_min>= 5 and petales_max<=7 affichent les éléments >> correspondants, je pense que la table est OK. >> > > pb de logique: > > and petales_min => $nb_petales and petales_max =< $nb_petales > > > !-) > Là je ne suis plus ! La table contient par exemple pour renoncule: champ petales_min valeur 4 et champ pétales_max valeur 8 L'utilisateur entre le nb de petales qu'il a comptés sur une fleur : (input text) : 5 donc $nb_petales a pour valeur 5 Si petales_min(4) <= $nb_petales(5) et petales_max(8)>=$nb_petales(5) select renoncule. Non ??? -- Alain L Mon village en Haute Soule : http://jarailet.club.fr Carnet de voyages: http://jarailet.club.fr/Randobal |
|
|
|
#8 |
|
Messages: n/a
Hébergeur: |
> Olivier :
> Que valent $fleur, $bois, etc., et que valent fleur, bois, etc. dans > l'un des éléments dont tu dis qu'ils correspondent ? dans le mille ! $bois était le fautif ! > Denis : > on modifie l'énoncé jusqu'à ce qu'on obtienne une réponse > valide et on retourne à l'étape précédente. > ........... Aussi, simplifier la requête pendant que l'on cherche > le problème. J'ai effectivement supprimé la comparaison, sans reussite, puis un autre nouveau champ (bois) et là, bingo ! > Bruno: > Soluce 1 : utilise deux champs nb_petales_min et nb_petales_max. Je crois que c'est la soluce la plus adaptée à la situation. Et voilà ! Ca marche. Merci à vous trois et mes plates excuses parce que l'erreur venait des valeurs dans le select du form : bois = (ligneux ou non_ligneux) et de l'enum de la table :bois = (ligneuse ou non_ligneuse) Reste le bout de code pour optimiser passé par Bruno... mais là, ce n'est plus de l'artisanat, c'est une affaire de pro !!! J'ose pas me lancer ! Bonne soirée à vous -- Alain L Mon village en Haute Soule : http://jarailet.club.fr Carnet de voyages: http://jarailet.club.fr/Randobal |
|
![]() |
| Outils de la discussion | |
|
|