Formulaire de recherche multi critere

Eléphanteau du PHP | 27 Messages

23 sept. 2011, 09:28

Salut !!

Bon un autre problème se pose a moi, je veux créer un formulaire ou l'utilisateur pourra remplir les champs qu'il veut. En fonction des champs renseignés la base de donnée devra retourner un tableau avec l'ensemble des données correspondant au critère (que ce soit avec un OR ou un AND)

J'ai deja bien avancé mais le probleme c'est que quand un champs n'est pas renseigné bah dans la requete mysql ca fais un champs a 0 donc avec un AND ca fout tout en l'air. Et avec un OR ca me donne pas ce que je veux car je veux que ca me retourne les lignes ou tout les criteres sont validés.

J'espere que je suis claire. Je vous montre ce que j'ai :

Voila mon formulaire sur la page prendre_BDD.php
<form method="post" action="ciblebis.php">
			<p>
				Type du materiel : <br />
				<select name="type_materiel" value="Choisissez">
					<option value="" selected="selected"></option>
					<option>Routeur</option>
					<option>Switch</option>
					<option>Parfeu</option>
				</select><br />
				Systeme/OS : <br />
				<select name="systeme_OS">
					<option value="" selected="selected"></option>
					<option>Option 1</option>
					<option>Option 2</option>
					<option>Option 3</option>
				</select><br />
				Lieu : <br />
				<select name="lieu">
					<option value="" selected="selected"></option>
					<option>Lieu 1</option>
					<option>Lieu 2</option>
					<option>Lieu 3</option>
				</select><br />
				Opérationnel ou Secours : <br />
				<select name="ope_sec">
					<option value="" selected="selected"></option>
					<option>Opérationnel</option>
					<option>Secours</option>
				</select><br />
				<input type="submit" value="Valider" /><br />
Voila la parti traitement de la base mysql :
<?php
		 
		$host = "127.0.0.1";
		$user = "Benoit";
		$pass = "xxxx";
		$bdd = "config_reseaux";
		
		
		//Test si les $_POST sont vides
		//if (!empty($_POST['type_materiel'])) 
		//{
		$type_materiel = $_POST["type_materiel"];
		//}
		//if (!empty($_POST['systeme_OS'])) 
		//{
		$systeme_OS = $_POST["systeme_OS"];
		//}
		//if (!empty($_POST['lieu'])) 
		//{
		$lieu = $_POST["lieu"];
		//}
		//if (!empty($_POST['ope_sec'])) 
		//{
		$ope_sec = $_POST["ope_sec"];
		//}
				
		 // connexion
			$cnx = mysql_connect($host,$user,$pass) or die("Impossible de se connecter");
			$db = mysql_select_db("$bdd") or die("Impossible de se connecter");
				if (mysql_connect ($host,$user,$pass)) 
				{
					echo 'Connexion réussie'; echo '<br>';
				}
				else 
				{
					echo 'Connexion impossible...'.mysql_error(); echo '<br>';
				} 
			
			$sql = "SELECT * FROM bdd WHERE type_materiel = '$type_materiel' OR systeme_OS = '$systeme_OS' OR lieu = '$lieu' OR ope_sec = '$ope_sec'ORDER BY nom_fichier";
			$requete = mysql_query( $sql, $cnx ) or die( "ERREUR MYSQL numéro: ".mysql_errno()."<br>Type de cette erreur: ".mysql_error()."<br>\n" );

			//récupération avec mysql_fetch_array(), et affichage de nos résultats :
			echo( "<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" align=\"center\">\n" );
			echo( "<tr>
			<td><div align=\"center\">Nom du fichier</div></td>
			<td><div align=\"center\">Type de materiel</div></td>
			<td><div align=\"center\">Systeme/OS</div></td>
			<td><div align=\"center\">Lieu</div></td>
			<td><div align=\"center\">Operationnel/Secours</div></td>

			</tr>" );
 
			while( $result = mysql_fetch_array( $requete ) )
			{	
			echo( "<tr>\n" );
			echo( "<td><div align=\"center\">".$result["nom_fichier"]."</div></td>\n" );
			echo( "<td><div align=\"center\">".$result["type_materiel"]."</div></td>\n" );
			echo( "<td><div align=\"center\">".$result["systeme_OS"]."</div></td>\n" );
			echo( "<td><div align=\"center\">".$result["lieu"]."</div></td>\n" );
			echo( "<td><div align=\"center\">".$result["ope_sec"]."</div></td>\n" );
			/*echo( "<td><div align=\"center\"><form method='post' action='telechargement.php'><input type='submit' value='Telechargement'/></form></div></td>\n" );*/
			echo( "</tr>\n" );
			}
			echo( "</table><br>\n" );	
		?>
Merci de votre aide !!

ViPHP
ViPHP | 2577 Messages

23 sept. 2011, 09:44

Bonjour,

Au lieu d'enregistrer les valeurs saisies, il faut faire un tableau des conditions.
$conditions = array();
if ($_POST['VARIABLE'] <> ""
{
    $conditions[] = "VARIABLE = '".$_POST['VARIABLE'];  
} 
...
if (count($conditions) == 0)
{
    $where = "";
}
else
{
   $where = " WHERE ".implode($conditions,' AND ');
}
$SQL = "select ....".$where  
...
Il faut faire chaque condition en tenant compte du type (string avec de quote...) et traiter les $_POST avec les règles d'existence et de préparation (suppression des quotes).
Modifié en dernier par Mazarini le 23 sept. 2011, 10:04, modifié 1 fois.

Eléphanteau du PHP | 27 Messages

23 sept. 2011, 09:50

J'ai pas bien saisi ce que tu me dis :p désolé

ViPHP
ViPHP | 2577 Messages

23 sept. 2011, 10:10

Au lieu de traiter les variables saisies pour alimenter une variable que tu utilises dans ton select, tu alimentes un post d'un tableau avec la contition.

Toi tu fais $variable = "quelque chose" et tu utilise $variable dans le select
Moi je te propose de faire $conditions[] = "VARIABLE = 'quelquechose'" puis de transformer ce tableau en "WHERE" suivi de toutes les conditions calculées avec des AND (que tu peux remplacer par des OR si tu préfères).

Eléphanteau du PHP | 27 Messages

23 sept. 2011, 10:15

Voila les modifs effectuées et ca marche nickel :
<?php
		 
		$host = "127.0.0.1";
		$user = "Benoit";
		$pass = "mikrou";
		$bdd = "config_reseaux";
				
		 // connexion
			$cnx = mysql_connect($host,$user,$pass) or die("Impossible de se connecter");
			$db = mysql_select_db("$bdd") or die("Impossible de se connecter");
				if (mysql_connect ($host,$user,$pass)) 
				{
					echo 'Connexion réussie'; echo '<br>';
				}
				else 
				{
					echo 'Connexion impossible...'.mysql_error(); echo '<br>';
				} 
			
		// on récupère les critères sélectionnés
		extract($_POST);

		$i = 0;
          
		// si la variable est présente, on lui affecte une place dans le tableau 'choix[]', qui nous servira ensuite à construire le WHERE de la requête.
		if(!empty($type_materiel)) { $choix[$i++] = "type_materiel = '$type_materiel'"; }
		if(!empty($systeme_OS)) { $choix[$i++] = "systeme_OS = '$systeme_OS'"; }
		if(!empty($lieu)) { $choix[$i++] = "lieu = '$lieu'"; }
		if(!empty($ope_sec)) { $choix[$i++] = "ope_sec = '$ope_sec'"; }
		// etc... tu fais pareil pour chaque critère

		// on insère les éléments remplis dans une variable $critere, en commençant par la première occurrence, puis on boucle
		$critere = $choix[0]." ";
          
		for($j=1;$j<$i;$j++) 
		{
			$critere .= " AND ".$choix[$j]." ";
		}

		// enfin on fait la requête si $i >0, ça veut dire qu'il y a des critères
		if($i > 0) 
		{
			// requete de selection
			$sql = "SELECT * FROM bdd WHERE $critere ORDER BY nom_fichier";
			$requete = mysql_query( $sql, $cnx ) or die( "ERREUR MYSQL numéro: ".mysql_errno()."<br>Type de cette erreur: ".mysql_error()."<br>\n" );
		}

		// si $i = 0, alors l'utilisateur n'a pas saisi de critère, là soit on fait la même requete mais sans "WHERE $critere", soit on lui demande de saisir au moins un critère.
		else 
		{
			$sql = "SELECT * FROM bdd ORDER BY nom_fichier";
		}

			//récupération avec mysql_fetch_array(), et affichage de nos résultats :
			echo( "<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" align=\"center\">\n" );
			echo( "<tr>
			<td><div align=\"center\">Nom du fichier</div></td>
			<td><div align=\"center\">Type de materiel</div></td>
			<td><div align=\"center\">Systeme/OS</div></td>
			<td><div align=\"center\">Lieu</div></td>
			<td><div align=\"center\">Operationnel/Secours</div></td>

			</tr>" );
 
			while( $result = mysql_fetch_array( $requete ) )
			{	
			echo( "<tr>\n" );
			echo( "<td><div align=\"center\">".$result["nom_fichier"]."</div></td>\n" );
			echo( "<td><div align=\"center\">".$result["type_materiel"]."</div></td>\n" );
			echo( "<td><div align=\"center\">".$result["systeme_OS"]."</div></td>\n" );
			echo( "<td><div align=\"center\">".$result["lieu"]."</div></td>\n" );
			echo( "<td><div align=\"center\">".$result["ope_sec"]."</div></td>\n" );
			/*echo( "<td><div align=\"center\"><form method='post' action='telechargement.php'><input type='submit' value='Telechargement'/></form></div></td>\n" );*/
			echo( "</tr>\n" );
			}
			echo( "</table><br>\n" );	
		?>

Petit nouveau ! | 1 Messages

11 oct. 2011, 18:47

Bonjour,
Merci à MIRRIX et à MAZARINI pour leur aide, j'ai pu adapter le code de MAZARINI à mon site "Agence immobililière" dont la particularitée est de vendre des fonds de commerce dans 4 règions et 18 départements. Je suis entrain de transformer mon site HTML et JAVASCRIPT en PHP avec une bdd MYSQL et c'est la galère (je découvre tout).
Grace à vous le moteur de recherche marche mais pour des raisons de lecture et d'esthétique, j'aurais besoin de votre aide.
Pour l'instant, les résultats s'affichent sous la forme d'un seul tableau avec une entête , je souhaiterais que chaque résultat est son propre tableau (sans entête); j'y étais arrivé avec le premier code de MIRRIX mais le formulaire ne marchait pas correctement.
Voila mon formulaire, la page recherche ainsi que tableau
<form method="post" action="recherche9.php">
                         <p>
                                 commerce : 
                                 <select name="code_commerce" value="Choisissez">
                                         <option value="" selected="selected"></option>
                                         <option>TABAC (presse)</option>
                                         <option>TABAC (bar)</option>
                                         <option>PRESSE</option>
                                         <option>HOTEL-Bureau</option>
                                         <option>HOTEL-Restaurant</option>
                                         <option>BAR (brasserie)</option>
                                         <option>Resto-Rapide)</option>
                                         <option>CAMPING</option>
                                         
                                 </select><br />
                                 <br />
                                 region :
                                 <select name="region">
                                         <option value="" selected="selected"></option>
                                         <option>aquitaine</option>
                                         <option>midi-pyrenees</option>
                                         <option>languedoc-roussillon</option>
                                         <option>limousin</option>
                                 </select><br />
                                 <br />
                                 departement :

                                 <select name="departement">
                                         <option value="" selected="selected"></option>
                                         <option>Dordogne 24</option>
                                         <option>Gironde 33</option>
                                         <option>Landes 40</option>
                                         <option>Lot et Garonne 47</option>
                                         <option>Pyrénées-Atlantiques 64</option>
                                         <option>Ariège 09</option>
                                         <option>Aveyron 12</option>
                                         <option>Haute-Garonne 31</option>
                                         <option>gers 32</option>
                                         <option>Lot 46</option>
                                         <option>Hautes-Pyrénées 65</option>
                                         <option>Tarn 81</option>
                                         <option>Tarn et Garonne 82</option>
                                         <option>Aude 11</option>
                                         <option>Gard 30</option>
                                         <option>Hérault 34</option>
                                         <option>Pyrénées-Orientales 66</option>
                                         <option>Corrèze 19</option>
                                 </select><br />
                                 <br />
                                                                  <input type="submit" value="Valider" /><br />
<?php
                  
                 $host = "localhost";
                 $user = "root";
                 $pass = "";
                 $bdd = "XXXXXXXX";
                                 
                 // connexion
                         $cnx = mysql_connect($host,$user,$pass) or die("Impossible de se connecter");
                         $db = mysql_select_db("$bdd") or die("Impossible de se connecter");
                                 if (mysql_connect ($host,$user,$pass)) 
                                {
                                         echo 'Connexion réussie'; echo '<br>';
                                 }
                                 else 
                                {
                                         echo 'Connexion impossible...'.mysql_error(); echo '<br>';
                                 } 
                        
                // on récupère les critères sélectionnés
                 extract($_POST);
 
                $i = 0;
           
                // si la variable est présente, on lui affecte une place dans le tableau 'choix[]', qui nous servira ensuite à construire le WHERE de la requête.
                 if(!empty($commerce)) { $choix[$i++] = "commercel = '$commerce'"; }
                 if(!empty($region)) { $choix[$i++] = "region = '$region'"; }
                 if(!empty($departement)) { $choix[$i++] = "departement = '$departement'"; }
                 // etc... tu fais pareil pour chaque critère
 
                // on insère les éléments remplis dans une variable $critere, en commençant par la première occurrence, puis on boucle
                 $critere = $choix[0]." ";
           
                for($j=1;$j<$i;$j++) 
                {
                         $critere .= " AND ".$choix[$j]." ";
                 }
 
                // enfin on fait la requête si $i >0, ça veut dire qu'il y a des critères
                 if($i > 0) 
                {
                         // requete de selection
                         $sql = "SELECT * FROM tous_commerces WHERE $critere ORDER BY ref";
                         $requete = mysql_query( $sql, $cnx ) or die( "ERREUR MYSQL numéro: ".mysql_errno()."<br>Type de cette erreur: ".mysql_error()."<br>\n" );
                 }
 
                // si $i = 0, alors l'utilisateur n'a pas saisi de critère, là soit on fait la même requete mais sans "WHERE $critere", soit on lui demande de saisir au moins un critère.
                 else 
                {
                         $sql = "SELECT * FROM tous_commerces ORDER BY ref";
                 }
 
                        //récupération avec mysql_fetch_array(), et affichage de nos résultats :
                         echo( "<table border=\"1\" cellpadding=\"1\" cellspacing=\"1\" align=\"center\">\n" );
                         echo( "<tr>
                         <td><div align=\"center\">ref</div></td>
                         <td><div align=\"center\">commerce</div></td>
                         <td><div align=\"center\">region</div></td>
                         <td><div align=\"center\">departement</div></td>
                         <td><div align=\"center\">prix</div></td>
                         <td><div align=\"center\">descriptif</div></td>
                        </tr>" );
  
                         while( $result = mysql_fetch_array( $requete ) )
                         {       
                        echo( "<tr>\n" );
                         echo( "<td><div align=\"center\">".$result["ref"]."</div></td>\n" );
                         echo( "<td><div align=\"center\">".$result["commerce"]."</div></td>\n" );
                         echo( "<td><div align=\"center\">".$result["region"]."</div></td>\n" );
                         echo( "<td><div align=\"center\">".$result["departement"]."</div></td>\n" );
                         echo( "<td><div align=\"center\">".$result["prix"]."</div></td>\n" );
                         echo( "<td><div align=\"center\">".$result["descriptif"]."</div></td>\n" );
                         /*echo( "<td><div align=\"center\"><form method='post' action='contact3.php'><input type='submit' value='Détails'/></form></div></td>\n" );*/
                         echo( "</tr>\n" );
                         }
                         echo( "</table><br>\n" );       
                ?>
[html<table border="1" cellspacing="1" style="border-collapse: collapse" width="750" height="121" bordercolor="#CCCCCC" bordercolorlight="#C0C0C0" bordercolordark="#C0C0C0">
<tr>
<td id="ref" align="center"style="width: 65px; color: #0000FF; font-family: Verdana" bgcolor="#CCCCCC" ></td>
<td id="region" align="center" width="200" bgcolor="#CCCCCC">&nbsp;</td>
<td id="departement"align="center" width="200" bgcolor="#CCCCCC" >&nbsp;</td>
<td id="EBE" align="center" width="142" bgcolor="#CCCCCC">&nbsp;</td>
<td id="prix" style="color: #FF0000; font-family: Verdana; font-size: 10pt" align="center" width="145" bgcolor="#CCCCCC">&nbsp;</td>
</tr>
<tr>
<td id="commerce" colspan="5" style="font-family: Verdana; font-weight: bold" align="center" width="750" bgcolor="#CCFFFF">&nbsp;</td>
</tr>
<tr>
<td id="descriptif"colspan="5" align="left" width="750" valign="top">&nbsp;</td>
</tr>
<tr>
<td colspan="4">&nbsp;</td>
<td id="details" align="center" style="color: #0000FF; font-family: Verdana" width="150">&nbsp;</td>
</tr>
</table>
][/html]

Merci pour votre aide

Cordialement

Eléphant du PHP | 257 Messages

07 nov. 2011, 22:52

bonjour j'aimerai rajouter deux champs texte prix et prix 1 pour faire une recherche entre les deux somme dans le jolis formulaire.
'`prix` BETWEEN '.$_GET['prix'].' AND '.$_GET['prix1'];
je recherche une solutions seriez vous m’éclairez =D> =D> svp