Page 1 sur 1

logique multicriteres

Posté : 08 mars 2010, 21:11
par graffx
Salut a tous,

je seche sur la strategie a utiliser pour le petit systeme d' annonce que je fais,le visiteur a plusieurs champs de criteres:


$c (pour moteur de recherche) $r (region) $cp (code postal) $cat (categorie)

J' aimerai donc pouvoir faire une sorte de :
mysql_query('SELECT * FROM annonces WHERE region='.$r.'  AND cat='.$cat.'  AND c='.$c.' AND cp='.$cp.'ORDER BY id DESC');

Je me retrouve donc avec un probleme sur cette requete, surement parce qu' elles sont toutes vides sauf la region qui est la selection du départ.


Comment remédier a ce souci sachant que toutes ne sont pas forcement remplies par le visiteur?


Merci d' avance!

Re: logique multicriteres

Posté : 09 mars 2010, 01:33
par @rthur
Comment remédier a ce souci sachant que toutes ne sont pas forcement remplies par le visiteur?
Si l'utilisateur n'indique pas le critère X, alors ne pas mettre la condition X dans la requête SQL.

Par ailleurs, je ne vois pas de mysql_real_escape_string(), j'espère que tu ne passe pas tes variables en directe dans ta requête :)

Re: logique multicriteres

Posté : 09 mars 2010, 19:43
par graffx
Bonjour et merci de votre reponse :)

Mais d' aprés le peu que je sais, il est impossible de faire une condition dans une requete, si?

Si je suis votre résonnement, ca donnerai quelque chose comme:
mysql_query('SELECT * FROM annonces WHERE region='.$r.' 
if(empty($cat))
{
 AND cat='.$cat.'
}
else
{
}
 ORDER BY id DESC');
Je crois que j' ai tout faux la, sinon si pour l' instant je n' ai pas mis de string, mais ca va venir :)

Re: logique multicriteres

Posté : 09 mars 2010, 20:50
par Shrell
C'est presque ça, mais pas dans le bon sens
La requete que tu passes à mysql_query() n'est jamais qu'une string comme une autre, donc il faut juste la construire avant de l'envoyer
Je reprends ton exemple :
$maRequete = "SELECT * FROM annonces WHERE 1=1";
if(isset($cat)) {
$maRequete .= " AND cat='".mysql_real_escape_string($cat)."'";
}
if(isset($c)) {
$maRequete .= " AND c='".mysql_real_escape_string($c)."'";
}
$maRequete .= " ORDER BY id DESC";
mysql_query($maRequete);

Re: logique multicriteres

Posté : 09 mars 2010, 21:49
par graffx
Ben la j' apprend quelque chose, je ne pensais pas ca directement possible dans une requete, ha ben si!!! j' ai deja vu un exemple 8-|

J' ai donc un :
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/sekilmef/www/l.php on line 37
La ligne 37 est la requete .
			$annonce2 = "SELECT * FROM annonces WHERE 1=1";
if(isset($cat)) {
$annonce2 .= " AND cat='".mysql_real_escape_string($cat)."'";
}
if(isset($r)) {
$annonce2 .= " AND region='".mysql_real_escape_string($r)."'";
}
$annonce2 .= " ORDER BY id DESC";

mysql_query($annonce2);

			while ($annonce = mysql_fetch_array($annonce2))
			{
			?>
En passant, ca signifie quoi ce 1=1?

Re: logique multicriteres

Posté : 09 mars 2010, 22:14
par Shrell
Le 1=1 ça sélectionne toutes les lignes, c'est une condition qui ne correspond à rien, elle est juste là pour pouvoir commencer les rajouts avec un "AND" sans se soucier de quoi que ce soit
Ton erreur vient du fait que tu passes $annonce2 à mysql_fetch_array(), alors qu'il attend un résultat de mysql_query()
$annonce2 = "SELECT * FROM annonces WHERE 1=1";
if(isset($cat)) {
$annonce2 .= " AND cat='".mysql_real_escape_string($cat)."'";
}
if(isset($r)) {
$annonce2 .= " AND region='".mysql_real_escape_string($r)."'";
}
$annonce2 .= " ORDER BY id DESC";

$maResource = mysql_query($annonce2); // on stocke le résultat de la requete dans $maResource, qui lui est une resource mysql, alors que $annonce2 est une string

while ($annonce = mysql_fetch_array($maResource)) // on passe une ressource mysql et pas une string
          {

Re: logique multicriteres

Posté : 10 mars 2010, 00:09
par graffx
Ce coup ci plus d' erreur, mais ca m' affiche mon annonce test peu importe le critere choisi ! Je regarderai demain, meric deja pour l' aide :)

edit: bon j' ai modif vite fait 1=1 par region='".$r."' mais je suis obligé de valider deux fois mon formulaire, normal puisque formulaire et traitement sont sur la meme page, le probleme est que si je met une redirection, ca va tourner en boucle, y' a il un moyen de faire une redirection unique??