[RESOLU] Plusieurs menus déroulant, un seul choix pour la bdd

Eléphanteau du PHP | 32 Messages

16 déc. 2015, 14:11

Bonjour auriez-vous une idée de comment placer un choix unique de trois (ou plus) liste déroulante ?

Le but est qu’il y a plusieurs catégorie (menu déroulant), le visiteur choisi UN choix et en validant le value envoie l’id dans une bdd qui affichera un tableau avec son contenu. Mon code fonction mais seulement avec une seul liste déroulante…

Merci d’avance


<form action="<?php echo($_SERVER['PHP_SELF']); ?>" method="post">
<fieldset style="border: 3px double #333399">
<legend>Sélectionnez une catégorie</legend><P>&nbsp;</P>
 
 
<SELECT NAME="CAT1">
  <OPTION VALUE="">-- Choisir un théme-- </OPTION>
  <OPTION VALUE="006">Choix 1</OPTION>
</select>
 
<P>&nbsp;</P>
 
<SELECT NAME="CAT2">
  <OPTION VALUE="">-- Choisir un théme-- </OPTION>
  <OPTION VALUE="002">Choix 2</OPTION>
  <OPTION VALUE="003">Choix 3</OPTION>
  <OPTION VALUE="004">Choix 4</OPTION>
  <OPTION VALUE="005">Choix 5</option>
</select>
 
<P>&nbsp;</P>
 
<SELECT NAME="CAT3">
  <OPTION VALUE="">-- Choisir un théme --</OPTION>
  <OPTION VALUE="007">Choix 6</OPTION>
  <OPTION VALUE="008">Choix 7</OPTION>
  <OPTION VALUE="001">Choix 8</OPTION>
</select>
 
 
<P>&nbsp;</P><P>&nbsp;</P><input type="submit" name="ok" id="ok" value="Envoyer" />
</fieldset>
</form>

<?php
if(isset($_POST['ok']) && isset($_POST['CAT']) && $_POST['CAT'] != "")
{
mysql_select_db('fpej_db_s6',$db);
$IDD = $_POST['CAT'];
$sql1 = "SELECT IMG FROM tbl_s6_img WHERE CAT='$IDD'";
$req1 = mysql_query($sql1);
$col1 = 6;
$coll1 = 1;
?>

ynx
Mammouth du PHP | 586 Messages

16 déc. 2015, 15:19

Salut,

Puisque toutes tes options ont bien un attribut value différent, pourquoi ne pas rassembler tous les choix dans un seul menu déroulant ?
<select name="CAT">
  <option value="">-- Choisir un théme-- </option>
  <option value="006">Choix 1</option>
  <option value="002">Choix 2</option>
  <option value="003">Choix 3</option>
  <option value="004">Choix 4</option>
  <option value="005">Choix 5</option>
  <option value="007">Choix 6</option>
  <option value="008">Choix 7</option>
  <option value="001">Choix 8</option>
</select>
Tu peux également regrouper des options dans une liste déroulante avec la balise optgroup, par exemple :
<select name="CAT">
  <option value="">-- Choisir un théme-- </option>
  <optgroup label="Thèmes A">  
    <option value="006">Choix 1</option>
  </optgroup>
  <optgroup label="Thèmes B">
    <option value="002">Choix 2</option>
    <option value="003">Choix 3</option>
    <option value="004">Choix 4</option>
    <option value="005">Choix 5</option>
  </optgroup>
  <optgroup label="Thèmes C">
  <option value="007">Choix 6</option>
    <option value="008">Choix 7</option>
    <option value="001">Choix 8</option>
  </optgroup>
</select>
Si tu souhaites absolument à conserver les trois listes déroulantes, il faudra alors surement utiliser javascript pour limiter le choix de l'utilisateur à une seule liste.

Bonne journée

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

16 déc. 2015, 15:50

Bonjour,

Je ne suis pas sur d'avoir bien compris ton besoin... tu as 3 listes déroulantes, l'utilisateur peut choisir une valeur dans l'une ou l'autre des listes mais pas les 3 à la fois ? ou éventuellement dans 2 ou dans les 3 à la fois ? est-ce que tu as un seul champ en base ou bien 3 ?

S'il y a 3 listes, mais un seul champ en base, au niveau de ton code, tu peux récupérer la valeur sélectionnée dans chaque liste et adapter le traitement en fonction de leur contenu en ajoutant l'instruction sql " cat IN (element1, element2, ...) :
<?php
if (isset($_POST['ok'])) { // lorsque le formulaire est envoyé 

  $cat = array(); // tableau pour stocker les catégories demandées
  if (!empty($_POST['CAT1'])) // on ajoute dans le tableau chaque demande
    $cat[] = $_POST['CAT1']; 
  if (!empty($_POST['CAT2'])) 
    $cat[] = $_POST['CAT2'];
  if (!empty($_POST['CAT3'])) 
    $cat[] = $_POST['CAT3'];

mysql_select_db('fpej_db_s6',$db); // choix bdd
$sql1 = "SELECT IMG FROM tbl_s6_img"; // début de la requête SQL
if (!empty($cat))
   $sql.= " WHERE cat IN (" . implode(',', $cat) . ")"; // 

  $req1 = mysql_query($sql1);
}
?>
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 32 Messages

16 déc. 2015, 16:25

Merci ynx, je ne connaissais pas cette balise, ça pourrait mettre utile dans d’autres situations. Là j’aurais en fait plus que trois listes avec beaucoup de choix dans chacune.

Merci également pour ton aide Ryle, en fait le visiteur peut choisir qu’un seul choix parmi le total des menus déroulant, 3, 5 ou 10 menus.

Là avec l’exemple que tu me donne (qui semble bien être la solution à mon problème) me charge toutes les images de ma la table tbl_s6_img.

Or chaque image dans la bd ont un id qui correspond à un value.

Exemple le choix 4 avec value 004 pour la CAT 004 dans ma bd qui me sortira 12 cartes clients.

Vraiment désolé si mon énoncé ne semble pas très compréhensible.

ynx
Mammouth du PHP | 586 Messages

16 déc. 2015, 17:47

Du coup une solution possible en utilisant un peu de javascript :
<?php 
$cat = ''; 

if (!empty($_POST['CAT1'])) {
    $cat = $_POST['CAT1']; 
} else if (!empty($_POST['CAT2'])) {
    $cat = $_POST['CAT2'];
} else if (!empty($_POST['CAT3'])) {
    $cat = $_POST['CAT3'];
}

var_dump($cat);
?>

<form method="post">
	<select name="CAT1" class="select-group">
	  <option value="">-- Choisir un théme-- </option>
	  <option value="006">Choix 1</option>
	</select>

	<select name="CAT2" class="select-group">
	  <option value="">-- Choisir un théme-- </option>
	  <option value="002">Choix 2</option>
	  <option value="003">Choix 3</option>
	  <option value="004">Choix 4</option>
	  <option value="005">Choix 5</option>
	</select>

	<select name="CAT3" class="select-group">
	  <option value="">-- Choisir un théme-- </option>
	  <option value="007">Choix 6</option>
	  <option value="008">Choix 7</option>
	  <option value="001">Choix 8</option>
	</select>

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

<script>
var selects = document.getElementsByClassName('select-group');

for (var i = 0, nbSelects = selects.length; i < nbSelects; i++) {
    selects[i].addEventListener('change', function() {
        var selected = this.selectedIndex;
        
        for (var i = 0, nbSelects = selects.length; i < nbSelects; i++) {
            selects[i].selectedIndex = 0;
        }
        
        this.selectedIndex = selected;
    });
}
</script>
Quelques explications :
- sur le code html, on ajoute une classe select-group sur les balises select
- en javascript :
1. On récupère toutes les balises select avec la classe select-group et on applique pour chacune d'elle une fonction déclenchée par l'événement onchange (c-a-d dès que l'utilisateur fait un choix dans une liste).
2. Dans la fonction déclenchée par l'événement onchange : on commence par enregistrer le choix de l'utilisateur dans la variable selected puis on parcours toutes les balises select afin de les remettre à zéro pour finalement remettre le choix de l'utilisateur.

Eléphanteau du PHP | 32 Messages

16 déc. 2015, 19:45

Super ça marche très bien :D un grand merci à vous deux

Par contre il y a un string qui apparaît (bizarre de dire ça comme ça) sur la page, or dans le code je ne vois à nul par string!?

Ça me donne en dessus du formulaire (après avoir validé) cette ligne string(3) "007"

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

16 déc. 2015, 19:48

Tu as un var_dump($cat); qui traine ;)
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 32 Messages

16 déc. 2015, 22:02

Tu as un var_dump($cat); qui traine ;)
Ah oui effectivement :roll:

Tout fonctione parfaitement. Un grand merci à vous tous. :lol: