Afficher un résultat depuis plusieurs listes déroulantes

Eléphant du PHP | 186 Messages

08 févr. 2007, 13:18

Bonjour à tout le monde.
Je reviens vers vous afin d'aboutir l'une de mes réalisations, à savoir l'afichage d'un résultat à partir de plusieurs listes déroulantes.
Pour illustrer mon problème, rien de tel qu'une mise en situation.
Imaginez vous sur un site annuaire référencant des hébergements touristiques. Depuis un menu, vous cliquez sur l'onglet "hebergements" puis sur sur le sous menu "camping". Une page s'affiche alors sur laquelle 8 enregistrements de camping par page apparaissent. Comme il semble y avoir plusieurs pages, un filtre par ville est à votre disposition et vous permet alors de n'afficher que les campings pour telle ou telle ville. Un autre filtre est aussi disponible et vous permet de n'afficher que les campings ayant 1, 2, 3 ou 4étoiles selon votre séléction dans la liste déroulante.
J'ai déjà réussi à mettre en place ces deux filtres (grâce à Maitrepylos entre autre).
Vous avez même la possibilité sur les deux listes de choix, de faire réapparaitre tous les enregistrements en séléctionnant "afficher tous les campings".
Voici une représentation imagée de la page: http://develop.web.free.fr/ff.JPG
Néanmoins, je souhaiterais que les deux filtres, qui fonctionnent indépendamment l'un de l'autre, puissent fonctionner ensemble. Ainsi, une fois le filtre par ville activé, que l'on puisse filtrer les campings de cette ville par étoile, et inversement. Mais il faudrait aussi laisser la possibilité de ne filtrer qu'un seul critère (ville ou étoile) comme ce qui se passe actuellement.
A l'heure actuelle, je suis arrivé à deux résultats:
- soit je peux filtrer par ville ou par étoile mais pas les deux critères en même temps.
- soit je peux filtrer par ville "et" par étoile avec un seul bouton "ok" mais le filtre par ville seul ainsi que le filtre par étoile seul ne fonctionnent plus.

Voici le code que j'utilise avec les deux filtres valides mais fonctionnant indépendamment:
mysql_select_db($database_conn_develop, $conn_develop);
if ($_POST['etoile']=='toutes') {
$query_rs_camping = "SELECT nom_etab, cp_etab, ville_etab, url_photo4, alt_photo1, date_ouverture, nb_etoile_camping, id_camping FROM tbl_etab, tbl_camping WHERE tbl_etab.etab_id=tbl_camping.id_etab";
} else {
if ($_POST['ville']=='toutes') {
$query_rs_camping = "SELECT nom_etab, cp_etab, ville_etab, url_photo4, alt_photo1, date_ouverture, nb_etoile_camping, id_camping FROM tbl_etab, tbl_camping WHERE tbl_etab.etab_id=tbl_camping.id_etab";
} elseif (isset($_POST['etoile'])) {
$query_rs_camping = "SELECT nom_etab, cp_etab, ville_etab, url_photo4, alt_photo1, date_ouverture, nb_etoile_camping, id_camping FROM tbl_etab, tbl_camping WHERE tbl_etab.etab_id=tbl_camping.id_etab AND nb_etoile_camping='".$_POST['etoile']."'";
} elseif (isset($_POST['ville'])) {
$query_rs_camping = "SELECT nom_etab, cp_etab, ville_etab, url_photo4, alt_photo1, date_ouverture, nb_etoile_camping, id_camping FROM tbl_etab, tbl_camping WHERE tbl_etab.etab_id=tbl_camping.id_etab AND ville_etab='".$_POST['ville']."'";
} else {
$query_rs_camping = "SELECT nom_etab, cp_etab, ville_etab, url_photo4, alt_photo1, date_ouverture, nb_etoile_camping, id_camping FROM tbl_etab, tbl_camping WHERE tbl_etab.etab_id=tbl_camping.id_etab";
}
}
En espérant avoir été assez clair, j'attend tout simplement un coup de pouce qui m'aiderait à comprendre la démarche à suivre.
on m'a déjà parlé d'une forme comme celle-ci:
if (isset($_POST['ville']) && $_POST['etoile']){
$query_rs_camping = "SELECT nom_etab, cp_etab, ville_etab, url_photo4, alt_photo1, date_ouverture, nb_etoile_camping, id_camping FROM tbl_etab, tbl_camping WHERE tbl_etab.etab_id=tbl_camping.id_etab AND ville_etab='".$_POST['ville']."' AND nb_etoile_camping='".$_POST['etoile']."'";
Cela me semblait compréhensible mais après plusieurs tentatives, je n'arrive pas au résultat souhaité.
Merci par avance pour toute aide apportée.

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

08 févr. 2007, 13:29

Tu expliques bien ce que tu veux faire.
J'ai pas compris ton problème.
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Eléphant du PHP | 186 Messages

08 févr. 2007, 13:54

Mon problème est que j'arrive parfaitement à filtrer les enregistrements par ville "ou" par étoile avec deux boutons "ok" distincts pour chacunes des actions.
Mais je n'arrive pas à filtrer les enregistrements par ville "et" par étoile.

En gros, je voudrais un filtre par ville, un filtre par étoile (ce que j'ai) et un filtre par ville-etoile afin de n'afficher que les campings de "trouville" ayant 2 étoiles par exemple (ce que je n'arrive pas à faire pour le moment).

A l'heure actuelle, je n'arrive à avoir que les campings de "trouville" ou que les campings à 2 étoiles.
J'espère que mon problème est plus clair.

Eléphant du PHP | 186 Messages

09 févr. 2007, 10:20

Bonjour tout le monde!!
Je suis un peu déçu que personne ne puisse m'aider à essayer d'élucider mon problème. Au vu de la réponse de mère thérésa, je reviens avec un exemple flagrant de ce que je souhaite faire. Ce dernier se trouve sur rue du commerce avec la possibilité de filtrer les résultats par marque, par capacité, etc...
Voici le lien vers la page:
http://www.rueducommerce.fr/composant/s ... 8&col1=320
Comme vous pourrez le voir, on dispose d'un certains nombre de critères de filtres (listes déroulantes) qui fonctionnent indépendamment, cad que vous pouvez selectionner uniquement la marque et filtrer les résultats, mais vous pouvez aussi selectionner la marque puis la capacité avant de filtrer et obtenir des résultats suivant les deux selections.
C'est ce que je souhaite faire avec les filtres villes et etoiles.
Quelqu'un a t'il une idée de la marche à suivre ou simplement des pistes qui m'aideraient à avancer.
Merci par avance.

Eléphant du PHP | 145 Messages

09 févr. 2007, 11:06

Si ça peut t'aider, tu peux regarder mon système, moi c'est un peu le même truc que toi mais pour les cartouche, faut que trie les reference par marques et en même temps par type (jetd'encre ou tonner etc...)
Tu pourra trouver mon script final sur ce post : http://www.phpfrance.com/forums/voir_sujet-27077.php.
Voila, en même temps, si tu as une petite idée pour mon problème ;)...
La culture, c'est comme la confiture, moins on en a, plus on l'étale.

Eléphant du PHP | 186 Messages

09 févr. 2007, 12:20

Merci Albat90 pour ta réponse.
A vrai dire, je débute en php et j'ai un peu de mal à tout décoder pour le code que tu utilises.
Par contre, ce que j'ai remarqué c'est que tu utilise des requêtes qui vont tour à tour chercher les informations des précédentes requêtes. Tu filtres donc petit à petit les critères de recherche par type, marque et référence. C'est bien ca?
Dans ce que j'ai compris de la démarche que j'ai suivi pour mettre en place les listes déroulantes et la requete qui affiche les résultats en fonction de la séléction dans ces listes c'est qu'il faut définir une requete allant chercher les informations à mettre dans la liste déroulante, puis une requete qui affiche les résultats en fonction de ce que tu choisis dans la liste. Où s'inscrit le code que tu utilise:
$base = "SELECT DISTINCT Types FROM tarif$"; 
$base2 = "SELECT DISTINCT (Marques) FROM tarif$ WHERE Types = '$form1'";
$base3 = "SELECT DISTINCT (Ref) FROM tarif$ WHERE Marques = '$form2' AND Types = '$form1'";
et enfin
$base4 = "SELECT * FROM tarif$ WHERE Ref = '$form3' AND Marques = '$form2' AND Types = '$form1'"; 
Où sont les requetes qui définissent le remplissage de tes listes déroulantes et celle que tu utilise pour afficher les résultats en fonction des choix effectués.
Ca peut paraitre simple pour toi mais utilisant une autre forme de codification, je m'y perds facilement.
De mon côté, voici le code des requetes qui définissent le remplissage de mes listes déroulantes:
mysql_select_db($database_conn_develop, $conn_develop);
$query_rs_ville = "SELECT DISTINCT ville_etab FROM tbl_etab ORDER BY ville_etab ASC";
$rs_ville = mysql_query($query_rs_ville, $conn_develop) or die(mysql_error());
$row_rs_ville = mysql_fetch_assoc($rs_ville);


mysql_select_db($database_conn_develop, $conn_develop);
$query_rs_etoile = "SELECT DISTINCT nb_etoile_camping FROM tbl_etab, tbl_camping ORDER BY nb_etoile_camping ASC";
$rs_etoile = mysql_query($query_rs_etoile, $conn_develop) or die(mysql_error());
$row_rs_etoile = mysql_fetch_assoc($rs_etoile);
puis le code de mes listes déroulantes en tant que forme sur la page:
<table class="tri" border="0" cellspacing="0" cellpadding="0" valign="top">
  <tr>
    <td>Tri par ville</td>
    <td><form id="frm_ville" name="frm_ville" method="post" action="annuaire-campingtest.php">
            <select name="ville" id="ville">
              <option value="toutes">Afficher tous les campings</option>
              <?php
do {  
?>
              <option value="<?php echo $row_rs_ville['ville_etab']?>"><?php echo $row_rs_ville['ville_etab']?></option>
              <?php
} while ($row_rs_ville = mysql_fetch_assoc($rs_ville));

?>
       </select>
	   <input name="Submit" value="Ok" type="submit" />
	   </form></td>
    <td>Tri par étoiles</td>
    <td><form id="frm_etoile" name="frm_etoile" method="post" action="annuaire-campingtest.php">
	<select name="etoile" id="etoile">
      <option value="toutes">Afficher tous les campings</option>
      <?php
do {  
?>
      <option value="<?php echo $row_rs_etoile['nb_etoile_camping']?>"><?php echo $row_rs_etoile['nb_etoile_camping']?></option>
        <?php
} while ($row_rs_etoile = mysql_fetch_assoc($rs_etoile));

?>
			</select>
			<input name="Submit" value="Ok" type="submit" />
	   </form></td>
			   
  </tr>
</table>
et enfin la requete qui définit le remplissage de ma page en fonction des possibilités de filtre:
mysql_select_db($database_conn_develop, $conn_develop);
if ($_POST['etoile']=='toutes') { //si "afficher tous les campings" dans le filtre par étoile est selectionné alors tout mettre
$query_rs_camping = "SELECT nom_etab, cp_etab, ville_etab, url_photo4, alt_photo1, date_ouverture, nb_etoile_camping, id_camping FROM tbl_etab, tbl_camping WHERE tbl_etab.etab_id=tbl_camping.id_etab";
} else {
if ($_POST['ville']=='toutes') {//si "afficher tous les campings" dans le filtre par ville est selectionné alors tout mettre
$query_rs_camping = "SELECT nom_etab, cp_etab, ville_etab, url_photo4, alt_photo1, date_ouverture, nb_etoile_camping, id_camping FROM tbl_etab, tbl_camping WHERE tbl_etab.etab_id=tbl_camping.id_etab";
} elseif (isset($_POST['etoile'])) {//si on selectionne  un nombre d'étoile alors on affiche en fonction
$query_rs_camping = "SELECT nom_etab, cp_etab, ville_etab, url_photo4, alt_photo1, date_ouverture, nb_etoile_camping, id_camping FROM tbl_etab, tbl_camping WHERE tbl_etab.etab_id=tbl_camping.id_etab AND nb_etoile_camping='".$_POST['etoile']."'";
} elseif (isset($_POST['ville'])) {//si on selectionne  un nom de ville alors on affiche en fonction
$query_rs_camping = "SELECT nom_etab, cp_etab, ville_etab, url_photo4, alt_photo1, date_ouverture, nb_etoile_camping, id_camping FROM tbl_etab, tbl_camping WHERE tbl_etab.etab_id=tbl_camping.id_etab AND ville_etab='".$_POST['ville']."'";
} else {//si rien n'est fait, on affiche tout
$query_rs_camping = "SELECT nom_etab, cp_etab, ville_etab, url_photo4, alt_photo1, date_ouverture, nb_etoile_camping, id_camping FROM tbl_etab, tbl_camping WHERE tbl_etab.etab_id=tbl_camping.id_etab";
}
}
Ce qui me manque donc et tu l'as compris c'est une condition où quand on choisit une ville puis un nombre d'étoile, ca affiche les campings de la ville et du nombre d'etoile choisis.
Par ailleurs, je me posait la question de l'utilité de 2 boutons executer pour un filtre comprenant les deux choix (ville puis etoile ou etoile puis ville)...

Eléphanteau du PHP | 17 Messages

09 févr. 2007, 13:17

J'avais eu le même genre de problème sous un autre langage (ColdFusion pour ne pas le nommer) et c'est vrai que c'est un truc un peu zarbi à faire... :roll: Je vais essayer d'adapter mon CFM à php ce week-end et je te tiens au courant...

Eléphant du PHP | 186 Messages

09 févr. 2007, 14:33

Je te remercie beaucoup Cugel de t'arrêter sur mon problème. Tiens moi au courant. Bon week-end alors. je continue de mon côté de chercher.

Invité
Invité n'ayant pas de compte PHPfrance

11 févr. 2007, 15:11

Bon ben je tourne en rond :( çà n'a pas l'air de marcher ...

Mais j'ai trouvé çà en faisant une recherche, http://www.phpfrance.com/forums/viewtop ... E9roulante. Cà pourrais-pas être ce que tu recherches par hasard ...

ViPHP
ViPHP | 1961 Messages

11 févr. 2007, 21:09

Bonjour,

Comme tu peux le remarquer cette partie de la requête
$qry = "SELECT nom_etab, cp_etab, ville_etab, url_photo4, alt_photo1, date_ouverture, nb_etoile_camping, id_camping FROM tbl_etab, tbl_camping WHERE tbl_etab.etab_id=tbl_camping.id_etab "
est toujours identique.

Ensuite, tu ne dois ajouter de conditions que si les listes ont changé de valeur.

Il te suffit donc de tester si cette valeur à changée ou pas

tu peux par exemple utiliser QQ chose du style pour chaque liste
$etoiles = ($_POST['etoile']=='toutes') ? '' : " AND nb_etoile_camping='". $_POST['etoile'] . "'";
De cette manière ta requête sera toujours la même, ça te donnerait QQ chose du style
$qry .= $etoiles . $autre_condition . $encore_une_condition ....
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Eléphant du PHP | 186 Messages

12 févr. 2007, 12:36

Bonjour à tous.
J'ai finallement réussi à résoudre mon problème.
Merci à toi Cugel de t'être penché sur mon problème. Merci aussi à toi Ajoloca.

Je mets le code qui m'a permis d'arriver aux résultats suivants:
- Quand je selectionne le nom d'une ville, le filtre fonctionne pour la ville selectionnée et affiche tous les campings (sans filtre par étoile) de la ville;
- Si, à la suite du filtre par ville, je selectionne un nombre d'étoile (2 par exemple), les campings 2 étoiles de la ville précédemment selectionnée apparaissent.
- La même chose fonctionne si j'avais choisit de filtrer par nombre d'étoile d'abord et ensuite par ville.
- Je peux réafficher toutes les villes et toutes les étoiles.

Tout d'abord les requêtes générants les listes déroulantes:
mysql_select_db($database_conn_develop, $conn_develop);
if ((($_POST['etoile']) != '') && (($_POST['etoile']) != 'toutes')){
$query_rs_ville = "SELECT DISTINCT ville_etab FROM tbl_etab, tbl_camping WHERE tbl_etab.etab_id=tbl_camping.id_etab AND type_etab='camping' AND nb_etoile_camping='".$_POST['etoile']."' ORDER BY ville_etab ASC";
} else {
$query_rs_ville = "SELECT DISTINCT ville_etab FROM tbl_etab WHERE type_etab='camping' ORDER BY ville_etab ASC";
}
$rs_ville = mysql_query($query_rs_ville, $conn_develop) or die(mysql_error());
$row_rs_ville = mysql_fetch_assoc($rs_ville);


mysql_select_db($database_conn_develop, $conn_develop);
if ((($_POST['ville']) != '') && (($_POST['ville']) != 'toutes')){
$query_rs_etoile = "SELECT DISTINCT nb_etoile_camping FROM tbl_etab, tbl_camping WHERE tbl_etab.etab_id=tbl_camping.id_etab AND ville_etab='".$_POST['ville']."' ORDER BY nb_etoile_camping ASC";
} else {
$query_rs_etoile = "SELECT DISTINCT nb_etoile_camping FROM tbl_camping ORDER BY nb_etoile_camping ASC";
}
$rs_etoile = mysql_query($query_rs_etoile, $conn_develop) or die(mysql_error());
$row_rs_etoile = mysql_fetch_assoc($rs_etoile);
Ensuite les requêtes de conditions suivant les choix effectués dans les listes:
mysql_select_db($database_conn_develop, $conn_develop);


if (($_POST['ville']) == ''){ $_POST['ville'] = 'toutes';}
if (($_POST['etoile']) == ''){ $_POST['etoile'] = 'toutes';}

if ((($_POST['ville'])!='toutes') && (($_POST['etoile'])=='toutes')){
	$query_rs_camping = "SELECT nom_etab, cp_etab, ville_etab, url_photo4, alt_photo1, date_ouverture, nb_etoile_camping, id_camping FROM tbl_etab, tbl_camping WHERE tbl_etab.etab_id=tbl_camping.id_etab AND ville_etab='".$_POST['ville']."'";
}
else{
	if ((($_POST['etoile'])!='toutes') && (($_POST['ville'])=='toutes')){
		$query_rs_camping = "SELECT nom_etab, cp_etab, ville_etab, url_photo4, alt_photo1, date_ouverture, nb_etoile_camping, id_camping FROM tbl_etab, tbl_camping WHERE tbl_etab.etab_id=tbl_camping.id_etab AND nb_etoile_camping='".$_POST['etoile']."'";
	}
	else{
		if (($_POST['ville']=='toutes') && ($_POST['etoile']=='toutes')){
			$query_rs_camping = "SELECT nom_etab, cp_etab, ville_etab, url_photo4, alt_photo1, date_ouverture, nb_etoile_camping, id_camping FROM tbl_etab, tbl_camping WHERE tbl_etab.etab_id=tbl_camping.id_etab";
		}
		else{
			$query_rs_camping = "SELECT nom_etab, cp_etab, ville_etab, url_photo4, alt_photo1, date_ouverture, nb_etoile_camping, id_camping FROM tbl_etab, tbl_camping WHERE tbl_etab.etab_id=tbl_camping.id_etab AND ville_etab='".$_POST['ville']."' AND nb_etoile_camping='".$_POST['etoile']."'";
		}
	}
}

$query_limit_rs_camping = sprintf("%s LIMIT %d, %d", $query_rs_camping, $startRow_rs_camping, $maxRows_rs_camping);
$rs_camping = mysql_query($query_limit_rs_camping, $conn_develop) or die(mysql_error());
$row_rs_camping = mysql_fetch_assoc($rs_camping);
Et enfin le formulaire:
<table class="tri" border="0" cellspacing="0" cellpadding="0" valign="top">
  <tr>
    
    <form id="frm_ville" name="frm_ville" method="post" action="annuaire-camping.php">
	<td>Tri par ville
            <select name="ville" id="ville" onchange="submit()">
              <?php
	if ($_POST['ville'] == 'toutes') {
        echo '<option value="toutes" selected="selected">Toutes les villes</option>';
    } else {
        echo '<option value="toutes">Toutes les villes</option>';
	} 
	
do {  

if ($_POST['ville'] == $row_rs_ville['ville_etab']) {
        echo '<option value="'.$row_rs_ville['ville_etab'].'" selected="selected">'.$row_rs_ville['ville_etab'].'</option>';
    } else {
        echo '<option value="'.$row_rs_ville['ville_etab'].'">'.$row_rs_ville['ville_etab'].'</option>';
	} 

} while ($row_rs_ville = mysql_fetch_assoc($rs_ville));

?>
       </select></td>
	   
    <td>Tri par étoiles
    
	<!--<form id="frm_etoile" name="frm_etoile" method="post" action="annuaire-campingtest.php">-->
	<select name="etoile" id="etoile" onchange="submit()">
      <?php
	  
	  if ($_POST['etoile'] == 'toutes') {
        echo '<option value="toutes" selected="selected">Toutes les étoiles</option>';
    } else {
        echo '<option value="toutes">Toutes les étoiles</option>';
	} 
	
do {  

	if ($_POST['etoile'] == $row_rs_etoile['nb_etoile_camping']) {
        echo '<option value="'.$row_rs_etoile['nb_etoile_camping'].'" selected="selected">'.$row_rs_etoile['nb_etoile_camping'].'</option>';
    } else {
        echo '<option value="'.$row_rs_etoile['nb_etoile_camping'].'">'.$row_rs_etoile['nb_etoile_camping'].'</option>';
	} 

} while ($row_rs_etoile = mysql_fetch_assoc($rs_etoile));
  
?>
			</select>
			
	   </td></form>
      </tr>
</table>
Voilà!!
Je remercie encore Cugel et Ajoloca!!