Requête à partir de plusieurs listes déroulante

spirit
Invité n'ayant pas de compte PHPfrance

06 mai 2008, 08:28

Bonjour,
j'ai 3 listes déroulantes a partir duquel je veut faire une requète ( du genre where id_var=2 and util =3 and app=5 ) par exemple, biensur une ou plusieur des 3 listes peut etre "nul" c'est la dessus que je bloc, pouvez vous m'aider, merci.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

06 mai 2008, 09:00

Quand tu construits ta requête, il faut que tu vérifies que la valeur de chaque liste déroulante n'est pas nulle et tu n'ajoutes la condition dans le Where que dans ce cas là.

Mais sans l'état actuel de ton code (juste le code HTML de tes listes et le PHP qui construit ta requête), il va être dure de t'aider plus que ça
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

spirit
Invité n'ayant pas de compte PHPfrance

06 mai 2008, 09:32

voici mon code pour les menu déroulant:

Code : Tout sélectionner

<?php include ("config.inc.php"); ?> <form name="search2" method="post" action="index.php?pag=result"> <table width="238" border="0" align="left"> <tr> <td width="135"><label for="budget">Select budget :</label></td> <td width="258"><select name="budget"> <option value="*" selected>budget</option> <?php $sql_budget = "SELECT * FROM matable_budget ORDER BY budget asc"; $result_budget = mysql_query($sql_budget); while (list($id_budget,$budget )= mysql_fetch_row ($result_budget)) { echo ("<option value=\"$id_budget\">$budget</option>"); } ?> </select></td> </tr> <tr> <td class="formulaire"><label for="secteur">select secteur :</label></td> <td><select name="secteur"> <option value="*" selected>secteur</option> <?php $sql_secteur = "SELECT * FROM matable_secteur ORDER BY secteur asc"; $result_secteur = mysql_query($sql_secteur); while (list($id_secteur,$secteur )= mysql_fetch_row ($result_secteur)) { echo ("<option value=\"$id_secteur\">$secteur</option>"); } ?> </select></td> </tr> <tr> <td class="formulaire"><label for="type">select type :</label></td> <td><select name="type"> <option value="*" selected>type</option> <?php $sql_type = "SELECT * FROM matable_type ORDER BY type asc"; $result_type = mysql_query($sql_type); while (list($id_type,$type )= mysql_fetch_row ($result_type)) { echo ("<option value=\"$id_type\">$type</option>"); } ?> </select></td> </tr> <tr> <td>&nbsp;</td> <td><input type="submit" name="search2" value="search" /></td> </tr> </table> </form>
et la page ou je veut constriure ma requête:

Code : Tout sélectionner

<?php include ("config.inc.php"); /* code ébauché ou je suis bloqué */ if ($budget = "*") {$budget ="";} if ($secteur = "*") {$secteur ="";} if ($type = "*") {$type ="";} $sql_result = "SELECT * FROM matable WHERE budget = '".$budget."' AND secteur = '".$secteur."' AND type = '".$type."'"; echo $sql_result ; if ($result_result == 0) echo "Pas résultats pour cette recherche<br>"; else { while($nouv = mysql_fetch_assoc($result_result)) { echo $nouv['titre'] ; } } ?>

Eléphant du PHP | 224 Messages

06 mai 2008, 11:56

Bonjour, voici une petite suggestion (non testée) :

Code : Tout sélectionner

<?php include ("config.inc.php"); /* Construction du query pour chaque option */ if ($budget = "*") {$budget_query ="";} else {$budget_query = "budget = '".$budget."'";} if ($secteur = "*") {$secteur_query ="";} else {$secteur_query = "secteur = '".$secteur."'";} if ($type = "*") {$type_query ="";} else {$type_query = "type = '".$type."'";} /* Construction des conditions AND */ if (!empty($budget_query) && !empty($secteur_query)) {$and1 = " AND ";} else {$and1 = "";} if (!empty($secteur_query) && !empty($type_query)) {$and2 = " AND ";} else {$and2 = "";} if (!empty($budget_query) && !empty($type_query)) {$and1 = " AND ";} /* Construction de la requête */ $sql_result = "SELECT * FROM matable WHERE ".$budget_query.$and1.$secteur_query.$and2.$type_query; /* La suite du code ... */ ?>
Évidemment, ça peut largement se compliquer avec plus d'infos à chercher, surtout pour la partie du calcul des conditions "AND" à insérer... voici une autre possibilité, un peu plus simple :

Code : Tout sélectionner

<?php include ("config.inc.php"); /* Construction d'une liste de query avec chaque option valide */ $query_list = array(); if ($budget != "*") {$query_list[] = "budget = '".$budget."'";} if ($secteur != "*") {$query_list[] = "secteur = '".$secteur."'";} if ($type != "*") {$query_list[] = "type = '".$type."'";} /* Si la liste n'est pas vide */ if (!empty($query_list)) { /* Construction du query texte avec les conditions AND */ $query_text = implode(" AND ", $query_list); /* Construction de la requête */ $sql_result = "SELECT * FROM matable WHERE ".$query_text; } /* La suite du code ... */ ?>
;)
Fredo d;o)
"Un pas à la fois me suffit..." (Gandhi)

spirit
Invité n'ayant pas de compte PHPfrance

07 mai 2008, 18:20

je viens de tester et ça marche !!! merci. :D

spirit
Invité n'ayant pas de compte PHPfrance

13 mai 2008, 07:17

Bonjour,
je viens de m' appercevoir une petite chose :( tout fonctionne bien mais sur la page de résultat quant je fait un refresh de la page c'est ok mais pas quant on la recharge, ce qui est logique après réfflection, pouvez vous me dire quelle est la démarche a suivre pour que je garde les "résultats" et pas me retrouver avec une page vide de résultat. merci.

d0m
Mammouth du PHP | 1141 Messages

13 mai 2008, 12:35

garder les résultats en session?

Eléphant du PHP | 175 Messages

13 mai 2008, 14:55

Code : Tout sélectionner

<?php include ("config.inc.php"); /* Construction du query pour chaque option */ if ($budget = "*") {$budget_query ="";} else {$budget_query = "budget = '".$budget."'";} if ($secteur = "*") {$secteur_query ="";} else {$secteur_query = "secteur = '".$secteur."'";} if ($type = "*") {$type_query ="";} else {$type_query = "type = '".$type."'";} /* Construction des conditions AND */ if (!empty($budget_query) && !empty($secteur_query)) {$and1 = " AND ";} else {$and1 = "";} if (!empty($secteur_query) && !empty($type_query)) {$and2 = " AND ";} else {$and2 = "";} if (!empty($budget_query) && !empty($type_query)) {$and1 = " AND ";} /* Construction de la requête */ $sql_result = "SELECT * FROM matable WHERE ".$budget_query.$and1.$secteur_query.$and2.$type_query; /* La suite du code ... */ ?>
optimisation possible:

Code : Tout sélectionner

<?php include ("config.inc.php"); /* Construction du query pour chaque option */ $filtre=array(); if ($budget = "*") {$budget_query ="";} else {$filtre[] = "budget = '".$budget."'";} if ($secteur = "*") {$secteur_query ="";} else {$filtre[] = "secteur = '".$secteur."'";} if ($type = "*") {$type_query ="";} else {$filtre[] = "type = '".$type."'";} /* Construction de la requête */ $sql_result = "SELECT * FROM matable WHERE ".implode (' AND ',$filtre); /* La suite du code ... */ ?>
sinon pour garder les parametres passer en GET ou garder les valeurs en session, et j'ai tendance a preconiser la premiere...

Eléphant du PHP | 224 Messages

13 mai 2008, 16:08

Bonjour :)
optimisation possible:

Code : Tout sélectionner

<?php include ("config.inc.php"); /* Construction du query pour chaque option */ $filtre=array(); if ($budget = "*") {$budget_query ="";} else {$filtre[] = "budget = '".$budget."'";} if ($secteur = "*") {$secteur_query ="";} else {$filtre[] = "secteur = '".$secteur."'";} if ($type = "*") {$type_query ="";} else {$filtre[] = "type = '".$type."'";} /* Construction de la requête */ $sql_result = "SELECT * FROM matable WHERE ".implode (' AND ',$filtre); /* La suite du code ... */ ?>
Bein oui steph29, nous sommes bien d'accord sur le principe d'optimisation (voir ma seconde proposition), mais je ne pense pas que ce soit prudent de faire le "implode()" directement sur la requête sans s'assurer au préalable que l'array contient bien des valeurs...

D'accord, je chipote un peu, mais ce genre de petit oubli peut parfois avoir des conséquences importantes, bref, un petit test ne coûte rien et ça peut éviter des dysfonctionnements (ou pire)...

à+ :)
Fredo d;o)
"Un pas à la fois me suffit..." (Gandhi)

Eléphant du PHP | 175 Messages

13 mai 2008, 16:58

oui oui bien sur! desolé de l'oubli :oops:

PS: pour ta deuxieme soluce, rassure moi tu as edite ton post?

Eléphant du PHP | 224 Messages

13 mai 2008, 17:46

Re...
PS: pour ta deuxieme soluce, rassure moi tu as edite ton post?
Bein... non :!: pas depuis le 6 mai, date à laquelle je posté ce message... mais, si mes souvenirs sont bons, il me semble en effet que j'ai bien édité ce post une ou deux fois ce jour là... mais pas depuis... :roll:

Tu as dû afficher la page juste au moment de mon tout premier post et tu n'a pas mise à jour la page depuis, c'est peut être ça, non ? :shock:

Bref, peu importe au final, ce qui compte c'est qu'on soit arrivé à peut près à la même idée d'optimisation, et que ça puisse rendre service à Spirit (ou à d'autres)...

à+ :)
Fredo d;o)
"Un pas à la fois me suffit..." (Gandhi)

spirit
Invité n'ayant pas de compte PHPfrance

13 mai 2008, 21:38

:oops: help !!! quant je test :

Code : Tout sélectionner

<?php include ("config.inc.php"); /* Construction du query pour chaque option */ /* l' * à été changer en 0 car lors des tests ça marcher pas */ $filtre=array(); if ($budget = "0") {$budget_query ="";} else {$filtre[] = "budget = '".$budget."'";} if ($secteur = "0") {$secteur_query ="";} else {$filtre[] = "secteur = '".$secteur."'";} if ($type = "0") {$type_query ="";} else {$filtre[] = "type = '".$type."'";} /* Construction de la requête */ $sql_result = "SELECT * FROM matable WHERE ".implode (' AND ',$filtre); /* La suite du code ... */ ?>
$filtre est vide ?? j'ai donc remis:

Code : Tout sélectionner

$query_list = array(); if ($budget != "0") {$query_list[] = "id_budget = '".$budget."'";} if ($secteur != "0") {$query_list[] = "id_secteur = '".$secteur."'";} if ($type != "0") {$query_list[] = "id_type = '".$type."'";} if (!empty($query_list)) { if(isset($_SESSION['query_text'])) { $query_text = $_SESSION['query_text'] ; echo 'session existe'; } else { $_SESSION['query_text'] = $query_text ; $query_text = implode(" AND ", $query_list); echo 'pas de session'; } $sql_result = "SELECT * FROM matble WHERE ".$query_text ; /* La suite du code ... */ ?>
ça marche mais pas ma tentative de session !!! peut être à cause de la valeur de $query_text ? :? :!: :?:

Eléphant du PHP | 224 Messages

14 mai 2008, 06:03

Salut Spirit :)

Code : Tout sélectionner

$query_list = array(); if ($budget != "0") {$query_list[] = "id_budget = '".$budget."'";} if ($secteur != "0") {$query_list[] = "id_secteur = '".$secteur."'";} if ($type != "0") {$query_list[] = "id_type = '".$type."'";} if (!empty($query_list)) { if(isset($_SESSION['query_text'])) { $query_text = $_SESSION['query_text'] ; echo 'session existe'; } else { $_SESSION['query_text'] = $query_text ; $query_text = implode(" AND ", $query_list); echo 'pas de session'; } $sql_result = "SELECT * FROM matble WHERE ".$query_text ; /* La suite du code ... */ ?>
ça marche mais pas ma tentative de session !!! peut être à cause de la valeur de $query_text ? :? :!: :?:
Au fait, je ne sais pas trop, mais là, à première vue, je dirais que tu tentes de mémoriser des données dans une session alors qu'elles n'ont pas été encore déclarées :shock:

Au fait, il faudrait que la variable "$query_text" soit affectée avant de tenter de la mémoriser dans la session, du coup, voici ce que je ferais :
<?php
// Construction de la liste des query valides
$query_list = array(); 
if ($budget != "0") {$query_list[] = "id_budget = '".$budget."'";} 
if ($secteur != "0") {$query_list[] = "id_secteur = '".$secteur."'";} 
if ($type != "0") {$query_list[] = "id_type = '".$type."'";} 

// Si la liste n'est pas vide :
if (!empty($query_list)) { 

	// Si une session "query_text" existe, on recupere sa valeur,
	// sinon on utilise celle issue de la variable "$query_list"
	if(isset($_SESSION['query_text'])) { 
		$query_text = $_SESSION['query_text'] ; 
	} else { 
		$query_text = implode(" AND ", $query_list); 
		$_SESSION['query_text'] = $query_text ; 
	} 

	$sql_result = "SELECT * FROM matble WHERE ".$query_text ; 
	/* La suite du code ... */ 
}
/* Le reste du code... */
?>
Bon, je pense que là ça devrait fonctionner, mais comme je ne sais pas ce qu'il y a avant, ni ce qui se passe après, je ne peux rien assurer... :?

Sinon, n'hésites pas à indenter ton code pour y voir plus clair...

Tiens-nous au courant Stp... à+ :)

[Edit]
En y réfléchissant, je pense qu'il faut tester la présence de la variable "query_text" de la session avant de construire la liste des query... si la session ne contient aucune valeur, alors on génère la liste... bref, voici ce que ça rendrait :
<?php 
$query_text = '';
// Si une session "query_text" existe et qu'elle n'est pas vide, on recupere sa valeur, 
if(isset($_SESSION['query_text']) && !empty($_SESSION['query_text'])) {  
	$query_text = $_SESSION['query_text'] ;  

} else {  
	// Construction de la liste des query valides 
	$query_list = array();  
	if ($budget != "0") {$query_list[] = "id_budget = '".$budget."'";}  
	if ($secteur != "0") {$query_list[] = "id_secteur = '".$secteur."'";}  
	if ($type != "0") {$query_list[] = "id_type = '".$type."'";}  

	// Si la liste n'est pas vide on utilise ses valeurs
	if (!empty($query_list)) { 
		$query_text = implode(" AND ", $query_list); 
		$_SESSION['query_text'] = $query_text; 
	}
} 
// Si la variable "$query_text" n'est pa vide, alors on lance la requete
if (!empty($query_text)) {
	$sql_result = "SELECT * FROM matble WHERE ".$query_text;  
	/* La suite du code ... */ 
}
?>
Test les deux pistes et dis-nous celle qui a le comportement le plus adapté à ce que tu cherches à faire...

Voilô... ;)
[/Edit]
Fredo d;o)
"Un pas à la fois me suffit..." (Gandhi)

spirit
Invité n'ayant pas de compte PHPfrance

14 mai 2008, 06:45

je viens de tester ça marche :D
en fait en page d'appel j'ai 3 menu déroulant qui me renvois sur la page de résultat ou je tri "matable" selon 3 critères.
Juste en 1er page j'ai rajouter
unset($_SESSION['query_text'] );  
car la 1ere fois c'était ok mais aprés on pouvais plus changer le tri une fois que la session était créer.
Je continu a tester ce soir, merci encore pour l'aide.

spirit
Invité n'ayant pas de compte PHPfrance

15 mai 2008, 06:43

:oops:
aprés ça marche plus ?? pourtant quant j'avais tester avant hier c'était ok, p en tout cas ça donne ça:
Warning: Variable passed to each() is not an array or object in...
:cry: