[RESOLU] module de recherche multicriteres php

Eléphant du PHP | 123 Messages

02 déc. 2012, 14:48

bonjour tout le monde

je souhaite faire mon module de recherche multicriteres
j ai deja en parcourant le net reussi a faire en sorte de recupéré des info sur deux critere "marque et energie"
mais la ou je bloc c est pour ma recherche entre deux chiffre comme km maxi et mini et année maxi et mini et prix mini et maxi

voici le code que j utilise actuellement
            

 
 // 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($marque)) { $choix[$i++] = "Marque = '$marque'"; }
                 if(!empty($Energie)) { $choix[$i++] = "Energie = '$Energie'"; }
                 if(!empty($prix_mini)) { $choix[$i++] = "Prix_public = '$prix_mini'"; }
                 if(!empty($prix_maxi)) { $choix[$i++] = "Prix_public = '$prix_maxi'"; }
                 if(!empty($kilometrage_mini)) { $choix[$i++] = "Kilometrage = '$kilometrage_mini'"; }
                 if(!empty($kilometrage_maxi)) { $choix[$i++] = "Kilometrage = '$kilometrage_maxi'"; }
                 if(!empty($annee_min)) { $choix[$i++] = "Millesime = '$annee_min'"; }
                 if(!empty($annee_max)) { $choix[$i++] = "Millesime = '$annee_max'"; }
                
 
                // 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) 
                {
              
              //crÚation de la requete
              $requete= "select * from autotran WHERE $critere";
 //$requete= "select * from autotran WHERE Marque LIKE \"%$marque%\" AND Energie LIKE \"%$Energie%\"";
 
$resultat=mysql_query($requete);
echo $requete;
merci d avance et bon dimanche

Avatar du membre
Mammouth du PHP | 1609 Messages

02 déc. 2012, 17:20

Salut,

Pour la recherche entre 2 nombres, il faut générer pour le where une clause du type :

Code : Tout sélectionner

Prix_public >= '$prix_mini' AND Prix_public <= '$prix_maxi'
Comme ça, ça sortira les prix compris dans la tranche ou les prix supérieur égal à prix mini ou les prix inférieur égal à prix maxi si seulement un des deux est renseigné.

EDIT pas la peine de faire une boucle si tu mets du AND entre tous les paramètres, un implode suffit :
$criteres = implode(' AND ', $choix);
REDIT et aussi pas la peine d'incrémenter un compteur $i pour remplir le tableau choix, il suffit de laisser les crochets vides et $choix devrait être déclaré au préalable, la je ne vois pas la déclaration :
$choix = array();
$choix[] = 'le critère';// ajoute dans $choix[0]
$choix[] = 'le critère';// ajoute dans $choix[1]
// etc
Développeur web depuis + de 20 ans

Eléphant du PHP | 123 Messages

02 déc. 2012, 18:15

hello saian

alors j ai modifier mon code apres tes recommandations et voici ci dessous
 $marque=$_POST["Marque"];
 $Energie=$_POST["Energie"];
 $prix_mini=$_POST["prix_mini"];
 $prix_maxi=$_POST["prix_maxi"];
 $kilometrage_mini=$_POST["kilometrage_mini"];
 $kilometrage_maxi=$_POST["kilometrage_maxi"];
 $annee_min=$_POST["annee_min"];
 $annee_max=$_POST["annee_max"]; 
 
 // on récupère les critères sélectionnés
                 extract($_POST);
 
                $i = 0;
                $choix = array();
                // 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($marque))
                  { $choix[] = "Marque = '$marque'"; }
                 if(!empty($Energie))
                  { $choix[] = "Energie = '$Energie'"; }
                 if(!empty($prix_mini))
                  { $choix[] = "Prix_public = '$prix_mini'"; }
                 if(!empty($prix_maxi))
                  { $choix[] = "Prix_public = '$prix_maxi'"; }
                 if(!empty($kilometrage_mini))
                  { $choix[] = "Kilometrage = '$kilometrage_mini'"; }
                 if(!empty($kilometrage_maxi))
                  { $choix[] = "Kilometrage = '$kilometrage_maxi'"; }
                 if(!empty($annee_min))
                  { $choix[] = "Millesime = '$annee_min'"; }
                 if(!empty($annee_max))
                  { $choix[] = "Millesime = '$annee_max'"; }
                 // etc... tu fais pareil pour chaque critère
 
               
                
           
                $critere = implode(' AND ', $choix);
 
                // enfin on fait la requête si $i >0, ça veut dire qu'il y a des critères
                                       
              
              //crÚation de la requete
              $requete= "select * from autotran WHERE $critere AND Millesime >= '$annee_min' AND Millesime <= '$annee_max'";
  
$resultat=mysql_query($requete);
echo $requete;
si ma requete est
$requete= "select * from autotran WHERE $critere ;
j ai bien la marque choisi et si je fais
$requete= "select * from autotran WHERE Millesime >= '$annee_min' AND Millesime <= '$annee_max'";
ca fais bien le trie entre les deux mais j arrive pas a mettre tout les conditions reunie je pensai que le and suffisait mais ca marche pas comme j ai fais la
$requete= "select * from autotran WHERE $critere AND Millesime >= '$annee_min' AND Millesime <= '$annee_max'";

Eléphanteau du PHP | 10 Messages

02 déc. 2012, 18:46

tu mets 4 conditions en tout sur le millésime, c'est pour ça que ça marche pas,

essaie
 $choix = array();
                // 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($marque))
                  { $choix[] = "Marque = '$marque'"; }
                 if(!empty($Energie))
                  { $choix[] = "Energie = '$Energie'"; }
                 if(!empty($prix_mini))
                  { $choix[] = "Prix_public >= '$prix_mini'"; }
                 if(!empty($prix_maxi))
                  { $choix[] = "Prix_public <= '$prix_maxi'"; }
                 if(!empty($kilometrage_mini))
                  { $choix[] = "Kilometrage >= '$kilometrage_mini'"; }
                 if(!empty($kilometrage_maxi))
                  { $choix[] = "Kilometrage <= '$kilometrage_maxi'"; }
                 if(!empty($annee_min))
                  { $choix[] = "Millesime >= '$annee_min'"; }
                 if(!empty($annee_max))
                  { $choix[] = "Millesime <= '$annee_max'"; }
                 // etc... tu fais pareil pour chaque critère
 
               
                
           
                $critere = implode(' AND ', $choix);
 
                // enfin on fait la requête si $i >0, ça veut dire qu'il y a des critères
                                       
              
              //crÚation de la requete
              $requete= "select * from autotran WHERE $critere ";
  
$resultat=mysql_query($requete);

Eléphant du PHP | 123 Messages

02 déc. 2012, 19:03

nickel merci :-)

par contre j ai un autre soucis ,si je clik sur le bouton je ne veux pas qu il execute la requete si j ai rien choisi coment je peux faire cela

j ai fais ceci
if ($critere == "")
        {
        
      	echo " Veuillez renseigner les champs s'il vous plait!";
      
        }
      else {
mais meme un des critere rempli ca me retourne le message...

EDit finalement c est bon j ai reussi :D

merci a tous =D>

Eléphant du PHP | 123 Messages

03 déc. 2012, 00:04

:? bouuuu je reviens car finalement j ai trouvé un nouveau probleme

si mon resultat de ma recherche comporte plusieur page ma variable critere est perdu si je clique sur la page suivante

j ai essayer avec une sessions mais il ne la garde pas quand meme

comment puis je garder ma variable en memoire pour que je puisse acceder au pages suivantes????

Avatar du membre
Mammouth du PHP | 1609 Messages

03 déc. 2012, 12:19

Pourtant il faut bien que tu sauvegardes les critères en session. Mais du coup ce n'est plus dans $_POST que tu vas récupérer les critères mais dans $_SESSION.
Si le formulaire est soumis tu injectes les paramètres dans $_SESSION sinon tu te contentes de les extraire :
if(/* soumission du formulaire de recherche */)
  $_SESSION['criteres'] = $_POST;

extract($_SESSION['criteres']);
Bien sur il ne faut pas oublier le session_start au début du fichier, mais tu dois le savoir.

EDIT oups le s, c'est corrigé ^^
Modifié en dernier par Saian le 03 déc. 2012, 17:30, modifié 1 fois.
Développeur web depuis + de 20 ans

Eléphant du PHP | 123 Messages

03 déc. 2012, 17:12

bonjour,

j ai cette erreur avec extracts()
Fatal error: Call to undefined function extracts()

ViPHP
xTG
ViPHP | 7331 Messages

03 déc. 2012, 17:15

Sans "s". ;)

Eléphant du PHP | 123 Messages

03 déc. 2012, 17:29

Sans "s". ;)
merci

par contre maintenant j ai une jolie page blanche que je clik sur page suivante

j ai fais ceci
if (isset($_POST['action']))
  {
                  $marque=$_POST["Marque"];
                  $Energie=$_POST["Energie"];
                  $prix_mini=$_POST["prix_mini"];
                  $prix_maxi=$_POST["prix_maxi"];
                  $kilometrage_mini=$_POST["kilometrage_mini"];
                  $kilometrage_maxi=$_POST["kilometrage_maxi"];
                  $annee_min=$_POST["annee_min"];
                  $annee_max=$_POST["annee_max"];
            // on récupère les critères sélectionnés
                  $choix = array(); 
                 // 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($marque))
                   { $choix[] = "Marque = '$marque'"; }
                  if(!empty($Energie))
                   { $choix[] = "Energie = '$Energie'"; }
                  if(!empty($prix_mini))
                   { $choix[] = "Prix_public >= '$prix_mini'"; }
                  if(!empty($prix_maxi))
                   { $choix[] = "Prix_public <= '$prix_maxi'"; }
                  if(!empty($kilometrage_mini))
                   { $choix[] = "Kilometrage >= '$kilometrage_mini'"; }
                  if(!empty($kilometrage_maxi))
                   { $choix[] = "Kilometrage <= '$kilometrage_maxi'"; }
                  if(!empty($annee_min))
                   { $choix[] = "Millesime >= '$annee_min'"; }
                  if(!empty($annee_max))
                   { $choix[] = "Millesime <= '$annee_max'"; }
                   




                   $critere = implode(' AND ', $choix);
                     
 
                   $_SESSION['criteres'] = $_POST;
                   
                    extract($_SESSION['criteres']);





Avatar du membre
Mammouth du PHP | 1609 Messages

03 déc. 2012, 17:31

Ben oui $_POST['action'] n'est pas défini et donc ça ne passe pas dans le if ! tu dois revoir la condition qui permet de rentrer dans la "procédure".
En fait je dirai même que tu dois toujours exécuter la procédure de construction de la requête et son exécution.
La seule chose que tu vas conditionner sur la soumission du formulaire c'est l'écrasement de $_SESSION['criteres'].
if($_POST['action']) // si le formulaire est soumis on stocke les paramètres dans la session
  $_SESSION['criteres'] = $_POST;

if(isset($_SESSION['criteres'])) // condition tant que le visiteur n'a encore pas touché aux critères et que donc $_SESSION['criteres'] n'existe pas, on ne peut pas extraire les paramètres
  extract($_SESSION['criteres']);// extraction des critères de recherche

// on récupère les critères sélectionnés
$choix = array();
// 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(isset($marque) && !empty($marque))// ajout du isset car tant qu'on a pas choisi de critère, on ne peut pas les extraires et donc la variable n'existe pas
  $choix[] = "Marque = '$marque'";
if(isset($Energie) && !empty($Energie))
  $choix[] = "Energie = '$Energie'";
// etc
Développeur web depuis + de 20 ans

Eléphant du PHP | 123 Messages

03 déc. 2012, 18:18

alors j ai fais comme tu ma dit et la j ai bien la page suivante avec le reste de la recherche
mais avec des erreurs en primes lol

Notice: Undefined index: Marque
et cela pour chaque criteres

Avatar du membre
Mammouth du PHP | 1609 Messages

03 déc. 2012, 18:36

L'exemple de code que j'ai écris n'est pas sensé te faire du undefined index Marque étant donné que l'index n'est jamais directement attaqué... (il est extrait de $_SESSION['criteres'] si l'index a bien été définit et c'est bien pour le cas ou l'index n'est pas définit que j'ai ajouté du isset sur chaque critère) sauf erreur de ma part tu n'as pas du bien comprendre le principe.
Oublie les $marque=$_POST["Marque"]; etc. Bien entendu il peut y avoir des erreurs dans mon code ne l'ayant pas testé, mais le principe est la. Si tu comprends le principe tu dois pouvoir corriger les éventuelles erreurs qui seraient dans mon code.
if(isset($_POST['action'])) // si le formulaire est soumis on stocke les paramètres dans la session
  $_SESSION['criteres'] = $_POST;

if(isset($_SESSION['criteres'])) // condition tant que le visiteur n'a pas encore touché aux critères et que donc $_SESSION['criteres'] n'existe pas, on ne peut pas extraire les paramètres
  extract($_SESSION['criteres']);// extraction des critères de recherche

// on récupère les critères sélectionnés
$choix = array();
// 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(isset($marque) && !empty($marque))// ajout du isset car tant qu'on a pas choisi de critère, on ne peut pas les extraires et donc la variable n'existe pas
  $choix[] = "Marque = '$marque'";
if(isset($Energie) && !empty($Energie))
  $choix[] = "Energie = '$Energie'";
// etc, pour chaque critère en respectant la casse des noms de variable bien entendu

$requete = 'SELECT * FROM autotran WHERE '.implode(' AND ', $choix);
Développeur web depuis + de 20 ans

Eléphant du PHP | 123 Messages

03 déc. 2012, 18:50

effectivement j ai viré les declarations de variables en post et ajouté if (isset($_POST['action']))

et les erreurs sont plus la ouffff

merci a toi pour ton aide =D> :D

mbmk92
Invité n'ayant pas de compte PHPfrance

27 juin 2013, 11:57

Bonjour merci pour ce forum il m'a infiniment aidé. Mai je rencontre un problème au niveau de la page suivante. S'il te plait daddevil peut tu me montrer ton code final?