requete contenant des if

Eléphant du PHP | 120 Messages

24 févr. 2009, 17:43

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...
si tu as un soucis en informatique, dis toi bien que quelqu'un d'autre l'a eu avant toi

Mammouth du PHP | 686 Messages

24 févr. 2009, 18:41

Tu n'as que trois filtre ? pourquoi tu pose pas directement tous les cas possibles ? (ca te fais 9 cas possibles)
Modifié en dernier par sylvaing26 le 24 févr. 2009, 18:45, modifié 1 fois.

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

24 févr. 2009, 18:43

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 ?
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 120 Messages

24 févr. 2009, 19:38

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...
si tu as un soucis en informatique, dis toi bien que quelqu'un d'autre l'a eu avant toi

ViPHP
ViPHP | 4039 Messages

24 févr. 2009, 20:32

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.
Mais qu'importe. (je suis ici - dernier petit projet)
Berze going social.

Eléphant du PHP | 120 Messages

25 févr. 2009, 19:50

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 !
si tu as un soucis en informatique, dis toi bien que quelqu'un d'autre l'a eu avant toi