[PHP] Traitement liste choix multiples

Traitement liste choix multiples [PHP] - PHP - Programmation

Marsh Posté le 28-11-2006 à 12:01:06    

Bonjour, je viens de mettre en place sur mon site un formulaire de recherche avec une liste à choix multiples.
 
Je dois traiter les résultats afin de faire une requête sur une base MySQL.
 
Je transmet les données avec POST, et j'arrive à récupérer les données dans ma page de traitement, mais je ne sais pas comment transformer ça en requête.
 
Voici une partie du code de la liste à choix multiple:
 

Code :
  1. <select name="secteurs[]" size="10" multiple="multiple">
  2.         <option value="ne_carcassonnais">03 Carcassonnais</option>
  3. <option value="ne_cabardes">09 Cabardès</option>
  4. <option value="ne_minervois">10 Minervois</option>
  5. <option value="ne_corbieres">11 Corbières</option>
  6. <option value="ne_narbonnais">12 Narbonnais</option>
  7. <option value="ne_montagne_noire">25 Montagne Noire</option>
  8.         </select>


 
Et voici le code qui me permet de récupérer les choix de la liste:
 

Code :
  1. $tabsecteurs = (isset($_POST["secteurs"]))?$_POST["secteurs"]:null;
  2.  echo 'secteur choisi : ';
  3.   if (!empty ($tabsecteurs)){
  4.    foreach ($tabsecteurs as $secteurs) {
  5.     echo $secteurs;
  6.    }
  7.   }


 
Le "echo" me renvoie par exemple: ne_carcassonnaisne_minervoisne_narbonnais c'est à dire, les valeurs de la liste non séparées.
 
Je voudrais savoir comment isoler les résultats obtenus.
 
Merci par avance.

Reply

Marsh Posté le 28-11-2006 à 12:01:06   

Reply

Marsh Posté le 28-11-2006 à 12:08:34    

Ben-o a écrit :


     

Code :
  1. $tabsecteurs = (isset($_POST["secteurs"]))?$_POST["secteurs"]:null;
  2.  echo 'secteur choisi : ';
  3.   if (!empty ($tabsecteurs)){
  4.    foreach ($tabsecteurs as $secteurs) {
  5.     echo $secteurs;
  6.    }
  7.   }
 

Le "echo" me renvoie par exemple: ne_carcassonnaisne_minervoisne_narbonnais c'est à dire, les valeurs de la liste non séparées.

 

Je voudrais savoir comment isoler les résultats obtenus.

 

Merci par avance.

 

echo $secteurs."<br />";

 

Voila.........


Message édité par gooopil le 28-11-2006 à 12:09:24
Reply

Marsh Posté le 28-11-2006 à 13:11:26    

sinon, y'a print_r($_POST["secteurs"]); (à utiliser sans la boucle)

Reply

Marsh Posté le 28-11-2006 à 13:57:10    

Merci, mais en fait je ne veux pas afficher les résultats à l'écran, c'était pour tester ce qui était renvoyé, je veux ensuite récupérer les résultats et les mettre sous forme de variables pour les exploiter dans ma requête SQL.

Reply

Marsh Posté le 28-11-2006 à 14:15:02    

$_POST["secteurs"] est vu comme un tableau avec des indices de 0 à n. Dans une requête SQL, tu peux faire un truc du genre :  

Code :
  1. $Sql = "SELECT ... FROM table t1, ... WHERE t1.Secteur IN (".implode(',', $_POST["secteurs"])." )";


 
ps : je vais encore me faire enguirlander par MaggicBuzz avec mon IN dans ma requête :whistle:


Message édité par rufo le 28-11-2006 à 14:16:08
Reply

Marsh Posté le 28-11-2006 à 14:18:42    

Merci encore Rufo, je vais essayer ça.

Reply

Marsh Posté le 28-11-2006 à 14:41:14    

En fait j'avais une requête de ce type grace à un petit formulaire de recherche à trois entrées: prix, secteur et type de bien.
 
Dans mon fichier de traitement php, j'avais ça:
 
tout d'abord le choix du prix:
 

Code :
  1. ... if ($_POST["prix"] == 'prix_1') {
  2.  $result_requete_prix = " AND t_maison.prix <= 75000";
  3. }
  4. elseif ($_POST["prix"] == 'prix_2') {
  5.  $result_requete_prix = " AND t_maison.prix > 75000 AND t_maison.prix < 150000";
  6. }...


 
ensuite le choix du secteur:
 

Code :
  1. ...if ($_POST["secteurs"] == 'cne') {
  2.  $result_requete_secteurs = " AND (t_maison.idx_secteur = '1' OR t_maison.idx_secteur = '2')";
  3. }
  4. elseif ($_POST["secteurs"] == 'ne') {
  5.  $result_requete_secteurs = " AND (t_maison.idx_secteur = '8' OR t_maison.idx_secteur = '9')";
  6. }...


 
et finalement le choix du type de bien:
 

Code :
  1. ...if ($_POST["categorie"] == 'bastide') {
  2.  $result_requete_categorie = " AND t_maison.idx_categorie = '1'";
  3. }
  4. elseif ($_POST["categorie"] == 'bergerie') {
  5.  $result_requete_categorie = " AND t_maison.idx_categorie = '2'";
  6. }
  7. elseif ($_POST["categorie"] == 'cave') {
  8.  $result_requete_categorie = " AND t_maison.idx_categorie = '3'";
  9. }...


 
Ensuite, j'assemble le tout pour construire la requête:
 

Code :
  1. $query_final = $query.$result_requete_prix.$result_requete_secteurs.$result_requete_categorie.$tri;
  2. $reponse = mysql_query($query_final);


 
Voila un peu le topo, ça fonctionne très bien comme ça.
 
C'était facile à gérer puisque les secteurs étaient regroupés (par exemple "cne" regroupe les secteurs 1 et 2)
 
Maintenant, tous les secteurs sont disponibles dans la liste déroulante à choix multiple, du coup le traitement côté PHP est plus délicat pour moi.
 
J'espère avoir été assez clair dans mes explications  :sweat:  d'avance merci  :)

Reply

Marsh Posté le 28-11-2006 à 15:39:10    

t'aurais peut-être intérêt à mettre dans le "value" de la balise <option> l'ID du secteur et non son nom.
 
par ailleurs, le IN est "équivalent" à un OR mais en plus rapide. Cela dit, faut préférer le EXISTS ;)

Reply

Marsh Posté le 28-11-2006 à 15:54:31    

C'est vrai que mettre l'ID du secteur au lieu du nom dans le "value" de la balise <option> est beaucoup mieux, je n'y avais pas pensé... Pour ce qui est de EXISTS, je ne connais pas, je vais regarder ce que je peux trouver là dessus.

Reply

Marsh Posté le 28-11-2006 à 18:59:55    

J'ai beau chercher, je ne trouve pas de solution... j'aurai encore besoin de votre aide!

Reply

Marsh Posté le 28-11-2006 à 18:59:55   

Reply

Marsh Posté le 29-11-2006 à 11:07:46    

où tu bloques? Parce qu'il n'y a rien de bien compliquer. Dans le value de chaque <option>, tu mets l'ID de chaque secteur et dans ta requête sql, tu fais un implode($_POST['secteurs']) après la condition "IN"...
 
(cf l'un de mes précédents messages)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed