Page 1 sur 1

requete contenant des if

Posté : 24 févr. 2009, 17:43
par jp.bond
bonjour,

je suis en train de realiser des filtres sur un tableau de resultats.
En gros, pas de probleme pour filtrer les resultats en fonction d'un critere, mais ca commence à etre compliqué lorsque qu'il y a plusieurs criteres. je m'explique :
Voila mon code qui couvre les différents cas de filtres, pris un par un :
filtre par date, par type, par pays ou sans filtre :
		if ($filtre_date)
		{
			$requete = "SELECT * FROM chantiers WHERE date_debut LIKE '$filtre_date%' ORDER BY $tri ASC";
		}
		elseif ($type_chantier)
		{
			$requete = "SELECT * FROM chantiers WHERE type_chantier='$type_chantier' ORDER BY $tri ASC";
		}
		elseif ($type_pays)
		{
			$requete = "SELECT * FROM chantiers WHERE type_pays='$type_pays' ORDER BY $tri ASC";
		}
		else
		{
			$requete = "SELECT * FROM chantiers ORDER BY $tri ASC";
		}
Je cherche à écrire une requete qui s'adapterai à l'existance d'un ou de x filtres, voire d'aucun.
La requete pourrait ressembler à ca (dans l'exemple, je n'ai appliqué que le cas de l'existance du filtre date) :
$requete = "SELECT * FROM chantiers "if ($filtre_date) { echo "WHERE date_debut LIKE '$filtre_date%'"; }" ORDER BY $tri ASC";

Je pourrais multiplier les if... mais il reste malgré tout le probleme des cas :
- zero filtre, pas de WHERE
- 2 filtres, il faut WHERE et il faut AND entre les 2 conditions donc le WHERE doit etre indépendant d'une condition et le AND doit apparaitre à chaque fois et à partir de 2 conditions

c'est un peu un casse tete...

vous auriez pas une idée ?

merci de votre aide...

Posté : 24 févr. 2009, 18:41
par sylvaing26
Tu n'as que trois filtre ? pourquoi tu pose pas directement tous les cas possibles ? (ca te fais 9 cas possibles)

Posté : 24 févr. 2009, 18:43
par Ryle
Et si au lieu d'un echo, tu te contentais de concaténer des chaines, sous certaines conditions, afin de construire ta requête complète :)
$sql = "SELECT ..... FROM ....."
if ($filtre_date) {
  $sql.= "WHERE date_debut LIKE '$filtre_date%'";
}
if ($filtre_pays) {
  ...
}
Alors bien sur, se pose le problème du WHERE qui, dès le moment où tu vas en ajouter un, ne devrait plus aparaitre et être remplacé par des AND.... Comment à partir de là, pourrais tu faire pour savoir si tu es déjà entré dans l'un des if(), et remplacer le WHERE par un AND dans les if() suivants ?

Posté : 24 févr. 2009, 19:38
par jp.bond
Tu n'as que trois filtre ? pourquoi tu pose pas directement tous les cas possibles ? (ca te fais 9 cas possibles)
oui je n'ai que 3 filtres, mais je peux me retrouver très vite avec 4 ou 5 filtres donc il faut que je trouve une solution sans avoir à poser tous les cas sinon ca va vite faire 16 ou 25 cas différents... et il faudra que je repense mon developpement....

et pour répondre à ryle :
oui, mon probleme est là... trouver un moyen de savoir si je suis déjà rentré dans les if simplement...
alors s'il n'y a pas d'autres possibilités, je vais utiliser des compteurs i,j,k , qui seront nuls si je ne rentre pas dans la boucle et =1 sinon...

J'imaginai qu'il y avait peut etre une petite feinte dans la syntaxe pour eviter cela...

Posté : 24 févr. 2009, 20:32
par Berzemus
Voilà un beau sujet pour un concours que je ne citerais pas: Comment optimiser ça. Moi j'ai trouvé ça (toujours réfléchir avant de coder un peu):

D'abords, tu mets tes valeurs et cles dans un tableau. Un tableau, c'est pratique, ça augmente et ça diminue de taille sans soucis, et c'est facile pour faire une boucle dessus.
$fields = array(
   type_pays => $type_pays,
   type_chantier => $type_chantier
   // etc... (ou pas)
   );
Ensuite, crées un tableau ou tu stockes tes "filtres", dans un boucle:
$filters = array();
foreach ($fields as $critere => $valeur)
   {
   $filters[] = $critere . '=\''.$valeur.'\'';
   }
green!!

et ensuite tu utilises un implode sur ce dernier tableau pour tout mettre joliment dans la requete finale:
$sql = "SELECT * FROM chantiers WHERE ". implode(' AND ',$filters) ." ORDER BY $tri ASC";
C'est beau, c'est propre, et peu importe le nombre ou les filtres, ce bout de code ne devra plus être modifié. Ce qui compte, ce sera la façon dont tu créeras le premier tableau, pour que ce soit propre et pro aussi, et green.

De plus, faire un "select * " est déconseillé, c'est pas propre, mieux vaut être spécifique dans ce que tu veux, c'est green.

Posté : 25 févr. 2009, 19:50
par jp.bond
franchement, j'ai rien compris ! lol

c'est exactement ce genre de code que je cherchais. C'est clair qu'en lisant, je comprends rien mais je vais m'y pencher et essayer de coder "green" comme toi parce que c'est pro et efficace !

Merci beaucoup pour l'exemple, je vais le décortiquer et me l'approprier, histoire de comprendre ;-)

Pas la peine de detailler plus, faut juste que je m'y penche et si vraiment j'ai un soucis je reviendrai... mais y a pas de raison...

merci encore ! c'est génial !