recherche multi critères

Petit nouveau ! | 7 Messages

21 mars 2006, 01:01

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 !

Mammouth du PHP | 768 Messages

21 mars 2006, 08:20

http://phpdebutant.org/article63.php
rubrique: SELECT
tu es dans la requête
M A R I O
Si une patte de lapin porte bonheur, qu'a-t-il bien pu arriver au lapin ?

Petit nouveau ! | 7 Messages

21 mars 2006, 09:24

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

Eléphanteau du PHP | 36 Messages

21 mars 2006, 10:29

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

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

21 mars 2006, 11:08

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

Petit nouveau ! | 7 Messages

21 mars 2006, 11:43

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

Eléphanteau du PHP | 36 Messages

21 mars 2006, 15:40

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

Bon courage

Petit nouveau ! | 7 Messages

21 mars 2006, 17:46

ok, pigé !

je ne suis pas encore familier de la concaténation.
C'est pourtant ici indispensable !

Merci pour le coup de main !