recherche multi critères (liste déroulante)

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : recherche multi critères (liste déroulante)

par lafieau » 20 janv. 2006, 18:04

Sorry !

J'y penserais la prochaine fois !

Bye !

par Truc » 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:

par Invité » 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 !

par epilogg » 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:

par Truc » 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

par lafieau » 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 !

par albat » 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:

par albat » 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

par Truc » 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.

par albat » 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.

par epilogg » 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');

par epilogg » 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:

par Truc » 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:

par epilogg » 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

par epilogg » 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...