Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

php. variables et requete

11 réponses
Avatar
alainL
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

10 réponses

1 2
Avatar
Bruno Desthuilliers
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.
Avatar
alainL
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
Avatar
Olivier Miakinen
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.
Avatar
Denis Beauregard
Le Tue, 01 Apr 2008 14:06:22 +0200, alainL
é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
Avatar
Bruno Desthuilliers
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...
Avatar
alainL
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
Avatar
alainL
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
Avatar
Bruno Desthuilliers
alainL a écrit :
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 !



Et tu a raison - j'ai lu trop vite et dit une c...rie au lieu de réfléchir.
Avatar
Bruno Desthuilliers
alainL a écrit :
(snip)

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 !!!



Puis-je te rappeler que les artisans *sont* des pros ?-)

J'ose pas me
lancer !



Bin pourquoi ? C'est pas sorcier pourtant. Qu'est-ce qui te pose
problème dans ce bout de code ?
Avatar
SAM
alainL a écrit :
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%'



pb de logique:

and petales_min => $nb_petales and petales_max =< $nb_petales



Là je ne suis plus !



oui, bon ...

petales_min <= $nb_petales <= petales_max

ou
petales_min <= $nb_petales
and
$nb_petales <= petales_max

ou

petales_max => $nb_petales => petales_min
petales_max >= $nb_petales >= petales_min

ou
$nb_petales >= petales_min
and
petales_max >= $nb_petales


or tu avais écrit :
and petales_min <= $nb_petales
and petales_max >= $nb_petales

ce qui semble bien exact

du moins pour ce qui est de l'ordre de la recherche
reste à savoir si on écrit: >= ou => ?

La doc semble me dire que c'est: > mais, dans le doute, autant n'utiliser que: <
and petales_min <= $nb_petales
and $nb_petales <= petales_max


petale_max et petale_min
ont bien été complétés à toutes les lignes de la table ?
Oui ?
Donc ce sont les histoires de lumiere, terrain, bois qui cafouillent ?

Comment est censé fonctionner :
and terrain like '%$terrain%'
si terrain n'a pas été renseigné ?
Je vois que dans ce cas le formulaire renvoie '%'
Est-ce suffisant pour satisfaire le choix de n'importe quel terrain ?
where '%' like '$terrain'


--
sm
1 2