[RESOLU] Recherche multicritère

Eléphant du PHP | 167 Messages

14 mai 2013, 15:53

Bonjour,

J'ai une table Etablissement sur laquelle je voudrais faire une sélection selon multicritère.
C'est-à-dire, je fais d'abord une recherche de mon établissement, sinon je ne le trouve pas dans ma liste déroulante, je coche selon
d'autre critère, par exemple le critère du département et de la nature de l'établissement.
J'ai déjà un fichier qui me sélectionne les dpts mais maintenant je veux pouvoir sélectionner suivants plusieurs critères et je ne vois pas comment je peux m'en servir.
Voici mon code avec des checkbox :

<?php
require("connect.php");
// pour oracle: $dsn="oci:dbname=//serveur:1521/mydb
$dsn="mysql:dbname=".BASE.";host=".SERVER;
    try{
      $connexion=new PDO($dsn,USER,PASSWD);
    }
    catch(PDOException $e){
      printf("Échec de la connexion : %s\n", $e->getMessage());
      exit();
    }
$sql="SELECT * from Etablissement order by nomEtablissement";
if(!$connexion->query($sql)) echo "Pb d'accès à la table Etablissement";
else{
        ?>
        <form action="etablissement.php" method="GET">
        <select name="nom">
                <?php
        foreach ($connexion->query($sql) as $row){

           echo "<option value=".$row['idEtablissement'].">".$row['nomEtablissement']."</option>";
           
}
}      
?>
</select>
<input type="submit" value="Rechercher">

</form>




<form>
  <input type="checkbox" name="dpt">Département<br>
  

</form>
  <form>
  <input type="checkbox" name="nature">Nature<br>
   <select name="nature"> 
                <option value="1">...</option>
                <option value="2">...</option>
                <option value="3">...</option>
               
                </select>
       
  <input 
  

</form>
  <input type="submit" value="Rechercher">

</body>
</html>
Merci de m'aider

Mammouth du PHP | 619 Messages

14 mai 2013, 15:59


Eléphant du PHP | 167 Messages

14 mai 2013, 16:15

Merci ghost5922
Ce code remplace quelle partie de mon code, je ne vois pas où je dois modifier...

Mammouth du PHP | 619 Messages

14 mai 2013, 16:19

Bonjour,

juste avant le select

ce code permet de voir quel champ sont envoyer en post pour derriere initialise le where

donc je pense que du dois le traite avant

$sql="SELECT * from Etablissement order by nomEtablissement";

pour que ta requete devienne

if



$sql="SELECT * from Etablissement $where order by nomEtablissement";

Eléphant du PHP | 167 Messages

14 mai 2013, 16:25

C'est ce que j'ai fais mais que devienne les input et checkbox, rien n'est relié finalement...

<?php
require("connect.php");
// pour oracle: $dsn="oci:dbname=//serveur:1521/mydb
$dsn="mysql:dbname=".BASE.";host=".SERVER;
    try{
      $connexion=new PDO($dsn,USER,PASSWD);
    }
    catch(PDOException $e){
      printf("Échec de la connexion : %s\n", $e->getMessage());
      exit();
    }
     $where="";      

if(isset($_POST['dpt']) and !empty($_POST['dpt'])){$where.="dpt = '".$_POST['dpt']."' and ";}
if(isset($_POST['nature']) and !empty($_POST['nature'])){$where.="nature = '".$_POST['nature']."' and ";}

if(!empty($where)){$where = 'where '.substr($where, 0, -4);}
;
$sql="SELECT * from Etablissement $where order by nomEtablissement";
if(!$connexion->query($sql)) echo "Pb d'accès à la table Etablissement";
else{
        ?>
        <form action="etablissement.php" method="GET">
        <select name="nom">
                <?php
        foreach ($connexion->query($sql) as $row){

           echo "<option value=".$row['idEtablissement'].">".$row['nomEtablissement']."</option>";
           
}
}      
?>
</select>
<input type="submit" value="Rechercher">

</form>




<form>
  <input type="checkbox" name="dpt">Département<br>
  

</form>
  <form>
  <input type="checkbox" name="nature">Nature<br>
   <select name="nature"> 
                <option value="1">...</option>
                <option value="2">...</option>
                <option value="3">...</option>
               
                </select>
       
  <input 
  

</form>
  <input type="submit" value="Rechercher">

</body>
</html>

Mammouth du PHP | 619 Messages

14 mai 2013, 16:33

je ne comprend pas tu veux que lorque tu valide filtre les résultats ?

dans tes form tu mets aucun action donc c'est du GET et non post :)
Modifié en dernier par ghost5922 le 14 mai 2013, 16:42, modifié 1 fois.

Eléphant du PHP | 167 Messages

14 mai 2013, 16:42

Ce que je veux pouvoir faire c'est par exemple sélectionner toutes les établissements qui ont pour "nature" école d'ingénieur et qui ont pour département 75 en cochant sur des cases et choisir la nature dans une liste déroulante. J'espère que c'est clair :?

Mammouth du PHP | 619 Messages

14 mai 2013, 19:44

Oui mais vous avez plusieurs formulaire

voila

j'ai pas modifie le php
<?php
require("connect.php");
// pour oracle: $dsn="oci:dbname=//serveur:1521/mydb
$dsn="mysql:dbname=".BASE.";host=".SERVER;
    try{
      $connexion=new PDO($dsn,USER,PASSWD);
    }
    catch(PDOException $e){
      printf("Échec de la connexion : %s\n", $e->getMessage());
      exit();
    }
     $where="";      

if(isset($_POST['dpt']) and !empty($_POST['dpt'])){$where.="dpt = '".$_POST['dpt']."' and ";}
if(isset($_POST['nature']) and !empty($_POST['nature'])){$where.="nature = '".$_POST['nature']."' and ";}

if(!empty($where)){$where = 'where '.substr($where, 0, -4);}
;
$sql="SELECT * from Etablissement $where order by nomEtablissement";
if(!$connexion->query($sql)) echo "Pb d'accès à la table Etablissement";
else{
        ?>
        <form action="etablissement.php" method="GET">
        <select name="nom">
                <?php
        foreach ($connexion->query($sql) as $row){

           echo "<option value=".$row['idEtablissement'].">".$row['nomEtablissement']."</option>";
           
}
}      
?>


le form
 </select>
<input type="submit" value="Rechercher">

</form>




<form action="" method="post">
  <input type="checkbox" name="dpt">Département<br>

  <input type="checkbox" name="nature">Nature<br>
   <select name="nature"> 
                <option value="1">...</option>
                <option value="2">...</option>
                <option value="3">...</option>
               
                </select>
       
<input type="submit" value="Rechercher">
</form>
  

</body>
</html>
 
dans les formulaire
le premier qui va envoyer vers etablissement.php
le second va envoyer sur la même page mais avec les critère en plus

Eléphant du PHP | 167 Messages

15 mai 2013, 10:41

Merci ghost5922, ça marche mais je voudrais pouvoir utiliser mon fichier selectiondpt.php qui me permettais de sélectionner plusieurs dpts aussi.

Voici mon code :

<?php
require("connect.php");
// pour oracle: $dsn="oci:dbname=//serveur:1521/mydb
$dsn="mysql:dbname=".BASE.";host=".SERVER;
    try{
      $connexion=new PDO($dsn,USER,PASSWD);
    }
    catch(PDOException $e){
      printf("Échec de la connexion : %s\n", $e->getMessage());
      exit();
    }
     $where="";      

if(isset($_POST['dpt']) and !empty($_POST['dpt'])){$where.="dpt = '".$_POST['dpt']."' and ";}
if(isset($_POST['nature']) and !empty($_POST['nature'])){$where.="nature = '".$_POST['nature']."' and ";}

if(!empty($where)){$where = 'where '.substr($where, 0, -4);}
;
$sql="SELECT * from Etablissement $where order by nomEtablissement";
if(!$connexion->query($sql)) echo "Pb d'accès à la table Etablissement";
else{
        ?>
        <form action="etablissement.php" method="GET">
        <select name="nom">
                <?php
        foreach ($connexion->query($sql) as $row){

           echo "<option value=".$row['idEtablissement'].">".$row['nomEtablissement']."</option>";
           
}
}      
?>
</select>
<input type="submit" value="Rechercher">

</form>




<form action="" method="POST">

   <p>Département</p>
 <form action="selectiondpt.php">
  <input type="checkbox" name="checkbox[]"  value="75">75
<input type="checkbox" name="checkbox[]"  value="92">92

<input type="checkbox" name="checkbox[]"  value="95">95
<input type="checkbox" name="checkbox[]"      value="98">98
</form>
    <p>Nature</p>
  <input type="radio" name="nature"value="1">Université
   <input type="radio" name="nature" value="2">Ecole d'ingénieur
               
              
       <input type="submit" value="Rechercher">  

</form>

 
</body>
</html>

Mammouth du PHP | 619 Messages

15 mai 2013, 11:02

Bonjour,

c'est le même principe tu fais un

if(isset($_POST['checkbox'])){
// ici tu utilise un implode pour preparer la requete
}

http://php.net/manual/fr/function.implode.php

Mammouth du PHP | 619 Messages

15 mai 2013, 11:05

if(isset($_POST['checkbox'])){$where.=implode($_POST['checkbox'])." and";}

Eléphant du PHP | 167 Messages

15 mai 2013, 11:16

J'ai fais quelques modifications, c'est-à-dire que je ne veux pas que la sélection se fasse dans la liste déroulante mais que les résultats s'affichent dans un tableau en dessous. Voilà mon code :
<?php
require("connect.php");
$dsn="mysql:dbname=".BASE.";host=".SERVER;
    try{
      $connexion=new PDO($dsn,USER,PASSWD);
    }
    catch(PDOException $e){
      printf("Échec de la connexion : %s\n", $e->getMessage());
      exit();
    }

$sql="SELECT * from Etablissement order by nomEtablissement";

if(!$connexion->query($sql)) echo "Pb d'accès à la table Etablissement";
else{
        ?>
        <form action="etablissement.php" method="GET">
        <select name="nom">
                <?php
        foreach ($connexion->query($sql) as $row){

           echo "<option value=".$row['idEtablissement'].">".$row['nomEtablissement']."</option>";
           
}
}      
?>
</select>
<input type="submit" value="Rechercher">

</form>
<?php
     $where="";      

if(isset($_POST['dpt']) and !empty($_POST['dpt'])){$where.="dpt = '".$_POST['dpt']."' and ";}
if(isset($_POST['nature']) and !empty($_POST['nature'])){$where.="nature = '".$_POST['nature']."' and ";}
if(isset($_POST['checkbox'])){$where.=implode($_POST['checkbox'])." and";}

if(!empty($where)){$where = 'where '.substr($where, 0, -4);}
;
$sql="SELECT * from Etablissement $where order by nomEtablissement";
if(!$connexion->query($sql)) echo "Pb d'accès à la table Etablissement";
else{
       echo "<table><tr><td>NOM D'ETABLISSEMENT</td></tr>";
     foreach ($connexion->query($sql) as $row)
      ?>
<form action="" method="POST">

   <p>Département</p>
 
  <input type="checkbox" name="checkbox[]"  value="75">75
<input type="checkbox" name="checkbox[]"  value="92">92

<input type="checkbox" name="checkbox[]"  value="95">95
<input type="checkbox" name="checkbox[]"      value="98">98

    <p>Nature</p>
  <input type="radio" name="nature"value="1">Université
   <input type="radio" name="nature" value="2">Ecole d'ingénieur
               
              
       <input type="submit" value="Rechercher">  

</form>
<?php
   echo "<br><a href=\"etablissement1.php?idEtablissement=".$row['idEtablissement'].'">'.'<br/>'.$row['nomEtablissement'];
   echo "</table>";    
           
}      
 ?>
 
</body>
</html>

Mammouth du PHP | 619 Messages

15 mai 2013, 11:23

j'ai peux d'etre fais une erreur
if(isset($_POST['checkbox'])){$where.=implode($_POST['checkbox']." and ");}
apres faut tester et revenir avec un problème :)

Eléphant du PHP | 167 Messages

15 mai 2013, 11:26

J'ai testé mais j'ai ce warning Warning: implode() [<a href='function.implode'>function.implode</a>]: Argument must be an array in C
Et puis, mon autre problème c'est que j'ai le dernier établissement d'affiché :?

Mammouth du PHP | 619 Messages

15 mai 2013, 11:30

voila au moins il a une erreur ;)

if(isset($_POST['checkbox']) and !empty($_POST['checkbox'])){$where.=implode($_POST['checkbox']," and ")." and ";}