Page 1 sur 1
recherche multi critères
Posté : 21 mars 2006, 01:01
par cretefre
Encore moi !
Est-ce qu'il y a une méthode pour coder une recherche multi-critère dans une base sans se coltiner des IF à la pelle ?
J'aurais besoin de 2 critères + 1 qui contient 3 choix (départements).
Si je compte bien ,cela fait 32 possibilités, donc 32 IF....
Ca me semble trop long pour être la bonne méthode.
Quelqu'un a une idée ?
Merci !
Posté : 21 mars 2006, 08:20
par mario
http://phpdebutant.org/article63.php
rubrique: SELECT
tu es dans la requête
Posté : 21 mars 2006, 09:24
par cretefre
oui, j'ai compris le système pour SELECT mais, je ne vois pas comment faire
pourlimiter mes 32 possibilités.
Comment font les sites,par exemple d'immobilier, qui proposent des recherches avec une vingtaine de critères ?
Merci
Posté : 21 mars 2006, 10:29
par Reman
Bonjour,
Je ne sais pas comment font les autres, moi j'utilise ce genre de fonction
La succession de if me semble inévitable par contre. Dans ton cas ca fait au plus
3 if maxi
function lire_multi($param1,
$param2,
$param3,
$connexion)
{
// les champs obligatoires
// ecrire une première clause where toujours vérifiée (par exemple l'existence de la clé primaire)
$req = "select champ_a,
champ_b,
champ_c
from table1
where champ_cle is not null";
// tester l'existence de tous les autres paramètres en entrée
if ((isset($param1)) and ($param1 !='') ){
$req = $req." and champ1 = '$param1'";
}
if ((isset($param2)) and ($param2 !='') ){
$req = $req." and champ2 = '$param2'";
}
if ((isset($param3)) and ($param3 !='') ){
$req = $req." and champ3 = '$param3'";
}
// ajout de la clause order
$req = $req." order by champ_a";
$result = mysql_query($req,$connexion)
or die ("Execution de la requete impossible".mysql_error());
return $result;
}
Posté : 21 mars 2006, 11:08
par Ryle
Si tu n'as que 3 critères, tu n'as effectivement que 3 if à mettre en place, ces tests étant "faut-il filtrer la recherche sur ce critère"
Les différentes valeurs que peuvent prendre ces critères sont généralement issues d'un formulaire, tu n'as donc pas à t'en soucier au niveau de ta requête
L'exemple de Reman est très bien, c'est également comme ça que je procède
// tu peux toujours l'écrire ainsi (encore qu'un switch/case serait plus adapté)
if($critere==1)
$sql.= "WHERE champ = 1";
if($critere==2)
$sql.= "WHERE champ = 2";
if($critere==3)
$sql.= "WHERE champ = 3";
// mais cette solution est quand même nettement plus : jolie, lisible, maintenable (cherchez pas, y a pas de mention inutile à rayer ;))
if(isSet(critere) && !empty($critere))
$sql.= "WHERE champ = $critere";
Posté : 21 mars 2006, 11:43
par cretefre
ok, pigé mais je voudrais un formulaire comme ceci :
_un critère (age)
_un critère (niveau)
_un critère qui contient trois champs (3 cases pour les département)
dans lesquels on peut choisir 0,1,2,ou 3 départements
Ca multiplie donc beaucoup les possibilités.
Un idée ?
Merci beaucoup !
PS : je précise que je voudrais laisser le choix au gens d'utiliser 1,2 ou les 3 critères...
Posté : 21 mars 2006, 15:40
par Reman
Re,
1- Le département : Selon ton post, il est toujours renseigné (soit 0, 1, 2 ou 3) donc celui la inutile de tester sa présence, il ne sera jamais 'null'.
2 - l'age : peut prendre 2 valeurs, renseigné ou non renseigné
3 - le niveau : peut prendre 2 valeurs, renseigné ou non renseigné
Tu n'a donc que
2 paramètres à tester (age et niveau), soit au total seulement 2 conditions 'IF', ca ne fait vraiment pas beaucoup
Bon courage
Posté : 21 mars 2006, 17:46
par cretefre
ok, pigé !
je ne suis pas encore familier de la concaténation.
C'est pourtant ici indispensable !
Merci pour le coup de main !