recherche multi critères (liste déroulante)

Eléphant du PHP | 90 Messages

19 janv. 2006, 16:11

salut !

après avoir compris à peu près comment fonctionnaient les listes déroulantes avec mysql/php... je me suis dit "tiens donc, pourquoi pas faire du multi-critères ! :lol: " je pense m'etre à peu près débrouillé, mais vous allez peut etre me dire çà, voici le code :
<link href="agenda/styles_agenda.css" rel="stylesheet" type="text/css">

<?php
require("conf.php");

$db_link = mysql_connect("$serveur","$user","$mdp") or die;
mysql_selectdb("$bdd") or die;
$multistyles = $_POST["multistyle"];
$multiprix = $_POST["multiprix"];
$multilieux = $_POST["multilieux"];
?>
<p></p>
<p></p>
<table width="530" border="0" cellpadding="0" cellspacing="0">

<?php
$requetestyles= "SELECT libellestyles FROM styles where codestyles = '$multistyles'";
$varstyles = mysql_query("$requetestyles") or die ('erreur');
$datastyles=mysql_fetch_assoc($varstyles);
echo '<td width="530" height="40" class="TitreHaut">' . '| ' . $datastyles['libellestyles'] . ' |' . '</td>';


$requeteprix= "SELECT libelleprix FROM prix where codeprix = '$multiprix'";
$varprix = mysql_query("$requeteprix") or die ('erreur');
$dataprix=mysql_fetch_assoc($varprix);
echo '<td width="530" height="40" class="TitreHaut">' . '| ' . $dataprix['libelleprix'] . ' |' . '</td>';


$requetelieux= "SELECT libellelieux FROM lieux where codelieux = '$multilieux'";
$varlieux = mysql_query("$requetelieux") or die ('erreur');
$datalieux=mysql_fetch_assoc($varlieux);
echo '<td width="530" height="40" class="TitreHaut">' . '| ' . $datalieux['libellelieux'] . ' |' . '</td>';
?>

</table>

<table width="530" border="0" cellpadding="0" cellspacing="0"> 
<tr><td width="50" class="Titres">Date</td>
<td width="50" class="Titres">Heure</td>
<td width="380" class="Titres">Description</td>
<td width="50" class="Titres">Prix</td></tr>

<?php

$requete= "SELECT date, heure, type, prix FROM ag_fev1 WHERE codestyles = '$multistyles' AND codeprix = '$multiprix' AND codelieux = '$multilieux'";
$var = mysql_query("$requete") or die('Erreur Requete');

$i = 0; 

while ($data=mysql_fetch_assoc($var))
{ 
        if ($i % 2)
            { 
                echo '<tr><td width="50" height="40" class="Ligne1">' . $data['date'] . '</td>'; 
				echo '<td width="50" class="Ligne1">' . $data['heure'] . '</td>'; 
                echo '<td width="380" class="Ligne1">' . $data['type'] . '</td>'; 
                echo '<td width="50" class="Ligne1">' . $data['prix'] . '</td></tr>'; 
                  
            } 
            else 
            { 
				echo '<tr><td width="50" height="40" class="Ligne2">' . $data['date'] . '</td>'; 
                echo '<td width="50" class="Ligne2">' . $data['heure'] . '</td>'; 
                echo '<td width="380" class="Ligne2">' . $data['type'] . '</td>'; 
                echo '<td width="50" class="Ligne2">' . $data['prix'] . '</td></tr>'; 
            } 
     
   $i++; 

}

mysql_close();

?>
</table> 
ensuite je l'appelle dans l'index comme cela :
if(isset($_POST["submit"]) && isset($_POST["multistyles"])) {
		include('agenda/multi_resultat.php');
	}
	
	if(isset($_POST["submit"]) && isset($_POST["multiprix"])) {
		include('agenda/multi_resultat.php');
	}

	if(isset($_POST["submit"]) && isset($_POST["multilieux"])) {
		include('agenda/multi_resultat.php');
et bien, à ma grande surprise ca fonctionne !! mais j'ai un petit problème, ca m'affiche les résulats en doublons :roll: vous voyez ce qui cloche ?!

Eléphant du PHP | 90 Messages

19 janv. 2006, 16:30

c'est bizarre, quand j'enlève le
	if(isset($_POST["submit"]) && isset($_POST["multilieux"])) {
		include('agenda/multi_resultat.php');
	}
de l'index, ca fonctionne nickel avec tous les critères pourtant il manque le critère lieux, je comprends pas...

Eléphant du PHP | 90 Messages

19 janv. 2006, 17:54

comme vous pouvez le voir dans les posts précédents, j'ai des codes styles, lieux etc... qui définissent les champs de ma table principale afin de pouvoir sélectionner seulement les événements théatres, musique ou encore les soirées à moins de 5 euros etc...
le problème dans ma recherche multicritère, c'est que j'aimerai que l'internaute puisse sélectionner TOUT STYLES et seulement choisir le prix et le lieu et ainsi de suite... parce que dans le script du post précédent, il est obligé de réponde aux questions pour pouvoir afficher l'agenda.
j'ai mis un libbelestyle "tout" sans codestyle dans ma table style. mais après je suis complètement perdu car je voudrais garder ma boucle i qui me permet de mettre un CSS une ligne sur deux... zarabotak.com

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

19 janv. 2006, 22:37

c'est bizarre, quand j'enlève le
	if(isset($_POST["submit"]) && isset($_POST["multilieux"])) {
		include('agenda/multi_resultat.php');
	}
de l'index, ca fonctionne nickel avec tous les critères pourtant il manque le critère lieux, je comprends pas...
normal lors de la validation du formulaire toutes les variables POST correspondantes aux champs sont créées. Puisque tous les champs doivent être remplis tu peux en mettre qu'un seul test qui reviendrait à la meme chose.

Sinon regarde ce topic pour de l'inspiration :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 90 Messages

20 janv. 2006, 15:20

merci truc pour ton inspiration, j'entrevois un peu plus la lumière mais j'ai encore besoin des votres (je suis désolé...)
http://sceno.fr/v3 vous donnera une idée de ce que je veux faire. je voudrais rajouter dans chaque liste déroulante un libbele "tout" qui permette à li'nternaute de faire sa selection seulement sur un ou plusieurs des critères... ce qui donne dans mon fichier résultat...
<link href="agenda/styles_agenda.css" rel="stylesheet" type="text/css">

<?php
require("conf.php");

$db_link = mysql_connect("$serveur","$user","$mdp") or die;
mysql_selectdb("$bdd") or die;

$multistyles = $_POST["multistyle"];
$multiprix = $_POST["multiprix"];
$multilieux = $_POST["multilieux"];

?>


<table width="530" border="0" cellpadding="0" cellspacing="0"> 
<tr><td width="50" class="Titres">Date</td>
<td width="50" class="Titres">Heure</td>
<td width="380" class="Titres">Description</td>
<td width="50" class="Titres">Prix</td></tr>

<?php

$requete= "SELECT date, heure, type, prix FROM ag_fev1 WHERE codestyles = '$multistyles' AND codeprix = '$multiprix' AND codelieux = '$multilieux'";
$var = mysql_query("$requete") or die('Erreur Requete');

// c'est donc ici que je veux rajouter la condition 'TOUT' grace au topic de truc j'ai essayé ca mais je suis perdu... le libelle TOUT renvoit à un code vide donc...

$requete= "SELECT date, heure, type, prix FROM ag_fev1 WHERE codestyles = '$multistyles' AND codeprix = '$multiprix' AND codelieux = '$multilieux'";
$var = mysql_query("$requete") or die('Erreur Requete');

if (!empty($multistyles)) {
    $requete= "SELECT date,heure, type, prix FROM ag_fev1 WHERE codeprix = '$multiprix' AND codelieux = '$multilieux'";
}

if (!empty($multiprix)) {
    $requete= "SELECT date,heure, type, prix FROM ag_fev1 WHERE codestyles = '$multistyles' AND codelieux = '$multilieux'";
}

if (!empty($multilieux)) {
    $requete= "SELECT date,heure, type, prix FROM ag_fev1 WHERE codestyles = '$multistyles' AND codeprix = '$multiprix'";
} 


$i = 0; 

while ($data=mysql_fetch_assoc($var))
{ 
        if ($i % 2)
            { 
                echo '<tr><td width="50" height="40" class="Ligne1">' . $data['date'] . '</td>'; 
				echo '<td width="50" class="Ligne1">' . $data['heure'] . '</td>'; 
                echo '<td width="380" class="Ligne1">' . $data['type'] . '</td>'; 
                echo '<td width="50" class="Ligne1">' . $data['prix'] . '</td></tr>'; 
                  
            } 
            else 
            { 
				echo '<tr><td width="50" height="40" class="Ligne2">' . $data['date'] . '</td>'; 
                echo '<td width="50" class="Ligne2">' . $data['heure'] . '</td>'; 
                echo '<td width="380" class="Ligne2">' . $data['type'] . '</td>'; 
                echo '<td width="50" class="Ligne2">' . $data['prix'] . '</td></tr>'; 
            } 
     
   $i++; 

}

mysql_close();

?>
</table>
j'en demande beaucoup sur ce forum, j'en ai conscience mais j'ai vraiment besoin de votre aide... :oops:

Eléphant du PHP | 90 Messages

20 janv. 2006, 15:46

je tente dans ce genre, ca a pas trop l'air de le déranger mais ca marche pas non plus

if  (!empty($multistyle)) {
    $requete= "SELECT date, heure, type, prix FROM ag_fev1 WHERE codeprix = '$multiprix' AND codelieux = '$multilieux'";
}

if (!empty($multiprix)) {
    $requete= "SELECT date, heure, type, prix FROM ag_fev1 WHERE codestyles = '$multistyles' AND codelieux = '$multilieux'";
}

if (!empty($multilieux)) {
    $requete= "SELECT date, heure, type, prix FROM ag_fev1 WHERE codestyles = '$multistyles' AND codeprix = '$multiprix'";
} 

$requete= "SELECT date, heure, type, prix FROM ag_fev1 WHERE codestyles = '$multistyles' AND codeprix = '$multiprix' AND codelieux = '$multilieux'";

$var = mysql_query("$requete") or die('Erreur Requete');

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

20 janv. 2006, 16:06

Voici ma suggestion :
$requete = "SELECT date, heure, type, prix FROM ag_fev1 WHERE 1=1";
if (!empty($multistyle)) $requete .= " AND codeprix = ".$multiprix." AND codelieux = ".$multilieux;
if (!empty($multiprix))  $requete .= " AND codestyles = ".$multistyles." AND codelieux = ".$multilieux;
if (!empty($multilieux)) $requete .= " AND codestyles = ".$multistyles." AND codeprix = ".$multiprix;
Fais bien attention à extraire les variables de tes chaînes de caractères.

Revois aussi le choix de tes tests,
car ton architecture (que j'ai reprise scrupuleusement ci-dessus)
génère beaucoup de redondances de tests.

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

20 janv. 2006, 16:07

Avant tout le principal est de ne pas faire 15 requetes !!

Sinon ça ne sert a rien de faire une recherche multicritères :wink:

Il faut donc récupérer les valeurs des listes comme ceci:
$multistyles = (isset($_POST["multistyle"])  && $_POST["multistyle"] != "tout") ? $_POST["multistyle"] : "";
$multiprix   = (isset($_POST["multiprix"]))  && $_POST["multiprix"] != "tout" ? $_POST["multiprix"]  : "";
$multilieux  = (isset($_POST["multilieux"])) && $_POST["multilieux"] != "tout" ? $_POST["multilieux"] : ""; 
on teste donc l'existence de la variable correspondante à une liste et que celle ci est différente de "tout" (1ere option avec value="tout" ). Si tel est le cas alors on récupère son contenu sinon la recherche ne portera pas sur ce champ.

Ensuite construction de LA requete en fonction des choix:
$requete= "SELECT date, heure, type, prix FROM ag_fev1 WHERE 1=1 ";

if (!empty($multistyles)) 
	$requete .= " AND codestyles = '".$multistyles."' ";

if (!empty($multiprix)) 
	$requete .= " AND codeprixs = '".$multiprix."' ";
	
if (!empty($multilieux)) 
	$requete .= " AND codelieux = '".$multilieux."' ";
Le "1=1" dans la requete permet de placer la clause WHERE sans se soucier si la recherche portera sur un champ précis ou pas.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

20 janv. 2006, 16:11

D'autant que j'ai l'impression que les requêtes et les tests que tu as écrits
te donnent le contraire de ce que tu dois souhaiter obtenir...

Voici donc ma suggestion corrigée :
$requete = "SELECT date, heure, type, prix FROM ag_fev1 WHERE 1=1";
if (!empty($multilieux))  $requete .= " AND codelieux  = ".$multilieux;
if (!empty($multiprix))   $requete .= " AND codeprix   = ".$multiprix;
if (!empty($multistyles)) $requete .= " AND codestyles = ".$multistyles;
Est-ce bien ce que tu souhaites faire ?


NB : Je viens aussi de voir que tu as employé $multistyle et $multistyles. Attention... [-X

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

20 janv. 2006, 16:12

Le "1=1" dans la requete permet de placer la clause WHERE
sans se soucier si la recherche portera sur un champ précis ou pas.
Prem's ! :langue:

Eléphant du PHP | 72 Messages

20 janv. 2006, 16:16

Bonjour !

Cher epilog ton sujet m'intéresse énormément, car je suis en train d'essayer de créer un formulaire de recherche comme le tiens, mais seulement voilà je suis débutante dans la matière donc grosse galère !

Après de nombreuses recherches j'ai vraiment bcp de mal à m'y retrouver (je parle de mon code !), donc si tu pouvais m'orienter afin que j'arrive à distinguer ce que tu mets vraiment ds ta page recherche et ds ta page résultat.

Merci d'avance !
y a un début à tout !

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

20 janv. 2006, 16:17

Le "1=1" dans la requete permet de placer la clause WHERE
sans se soucier si la recherche portera sur un champ précis ou pas.
Prem's ! :langue:
Oui mais il y a eu du rattrapage là :-"

il a pompé mon exemple :^o

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 90 Messages

20 janv. 2006, 16:50

merci les gars pour vos réponses, vous assurez ! :pouce:

je vais me faire charcuter chez mon dentiste, donc je m'y recollerai après si je suis encore vivant...

lafieau... je te file sur ce que j'ai pu regroupé comme tuyaux qu'on m'a donné ici et quelques infos que j'ai chopée. Je pense que le plus simple pour comprendre au début, c'est commencer avec une seule liste, c'est que j'ai fait... tu crées une premiere page php "choix_liste.php" dans laquelle tu mets ce code

<form name="form" method="post" action="choix_resultat.php"> 
<select name="maliste" class="Questcequisepasse"> // ici tu déclares ton formulaire liste ainsi que ses attributs
      
<?php  

require("conf.php"); // < va chercher tes id de connexion à la base

$db_link = mysql_connect("$serveur","$user","$mdp") or die;
mysql_selectdb("$bdd") or die; // se connecte à la base

$sql = 'SELECT codelieux, libellelieux FROM lieux;';   // requete qui sélectionne tes champs de la base, ici j'ai deux tables différentes (une lieux, avec deux champs codelieux (un code à deux chiffres que je reporte à ma table principale pour qu'il puisse identifier les champs en fonction) et libellelieux (avec le nom complet correpondant au code et qui sera affiché dans la liste)
$query = mysql_query($sql) or die('Erreur');   // chope la requete

if (mysql_num_rows === 0){   // si rien bah rien
   echo '<option>Aucun lieux</option>';   
}
else
{   
   while ($list = mysql_fetch_assoc($query)) {
      echo '<option value="'.$list['codelieux'].'">'.$list['libellelieux'].'</option>';   
   }   // sinon affiche les libellelieux (à vrai dire je capte pas vraiment parce que je suis un débutant aussi)
}
 mysql_close();  

?>
    </select>
    <input type="submit" name="submit" value="OK"/>
  </form> // tu termines ton formulaire. 

puis dans ta page choix_resultat.php tu mets ce code

<?php
require("conf.php");

$db_link = mysql_connect("$serveur","$user","$mdp") or die;
mysql_selectdb("$bdd") or die;

$codeLieu = $_POST["maliste"]; // ici il va cherche le choix de l'internaute et le mets dans la variable $codelieu
?>


<?php

$requete= "SELECT date, heure, type, prix FROM ag_fev1 WHERE codelieux = '$codeLieu'"; // la requete sql ou on va chercher les champs de la table principale (ici ag_fev1) ou le codelieu saisi par l'internaute est présent
$var = mysql_query("$requete") or die('Erreur Requete'); // on le met dans la variable $ var


// à partir de la c'est une boucle qu'on m'a donné sur ce forum pour pouvoir appliquer un style css une ligne sur deux (c'est plus z'oli et plus lisible)
$i = 0; 

while ($data=mysql_fetch_assoc($var))
{ 
        if ($i % 2)
            { 
                echo '<tr><td width="50" height="40" class="Ligne1">' . $data['date'] . '</td>'; 
				echo '<td width="50" class="Ligne1">' . $data['heure'] . '</td>'; 
                echo '<td width="380" class="Ligne1">' . $data['type'] . '</td>'; 
                echo '<td width="50" class="Ligne1">' . $data['prix'] . '</td></tr>'; 
                  
            } 
            else 
            { 
				echo '<tr><td width="50" height="40" class="Ligne2">' . $data['date'] . '</td>'; 
                echo '<td width="50" class="Ligne2">' . $data['heure'] . '</td>'; 
                echo '<td width="380" class="Ligne2">' . $data['type'] . '</td>'; 
                echo '<td width="50" class="Ligne2">' . $data['prix'] . '</td></tr>'; 
            } 
     
   $i++; 

}

mysql_close();

?> // et walla !
</table> 
ce tutos m'a bien servi, il explique tres bien l'astuce http://www.phpdebutant.org/article117.php

walla, je suis content pour une fois que je peux aider quelqu'un :langue:

Invité
Invité n'ayant pas de compte PHPfrance

20 janv. 2006, 17:53

Merci epilog !

Mais j'ai bien commencé par une seule liste qui fonctionne à merveille d'ailleurs mais c'est après que ça se complique, c'est pourquoi je faisais appel à tes connaissances.

Tiens pendant que j'y pense, sur ma liste j'avais mis un 'distinct' afin de ne pas avoir de répétitions, mais avec 2 listes ça ne marche pas, tu saurais comment faire par hasard ?

Merci bcp pour tout !
Bye !

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

20 janv. 2006, 17:58

Tiens pendant que j'y pense, sur ma liste j'avais mis un 'distinct' afin de ne pas avoir de répétitions, mais avec 2 listes ça ne marche pas, tu saurais comment faire par hasard ?
Je ne veux pas jouer le trouble fête mais tu pourrais ouvrir un nouveau sujet sinon ça va vite devenir un cafouillage monstre :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute