Formulaire : select multiple dans php...

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 : Formulaire : select multiple dans php...

par piratmac » 17 févr. 2007, 11:46

Re,

Bon, après tests et édition de mon message, je me suis aperçu que :
-je pouvais parfaitement garder index.php?action=faq_ajouter comme action dans la balise form
-il suffisait de récupérer le tableau des réponse avec $_REQUEST et pas avec $_POST ...

Donc en fait ça donne ça :
if(isset($_REQUEST['sujets_quest'])) {
	$_POST['sujets_quest']=implode(",",$_REQUEST['sujets_quest']);
}




<form id="form1" name="form1" method="post" action="index.php?action=faq_ajouter">
<select name="sujets_quest[]" size="8" multiple="multiple" class="input">
<?php
foreach ($sujets as $sujet => $valeur) {
?>
<option value="<?php echo $sujet; ?>"<?php 
//Est-ce que l'utilisateur a sélectionné cette option?
if (isset($_POST['sujets_quest']) && $_POST['sujets_quest']!='' && strpos($_POST['sujets_quest'],$sujet)!==FALSE) 
{echo ' selected="selected"';} ?>>
<?php echo $valeur; ?></option>
<?php
}//Fin du foreach qui affiche le tout
?>
</select>
</form>


Ce qui génère ce HTML (sachant que j'avait coché les options parrain, profil et comite et elles sont bien sélectionnées, ce que je voulais ;) ) :

Code : Tout sélectionner

<form id="form1" name="form1" method="post" action="index.php?action=faq_ajouter"> <select name="sujets_quest[]" multiple="multiple" class="input"> <option value="inscription" selected="selected">Inscription sur le site</option> <option value="login">Connexion</option> <option value="parrain" selected="selected">Questions spécifiques aux parrains</option> <option value="filleul">Questions spécifiques aux filleuls</option> <option value="candidat">Questions spécifiques aux candidats parrain</option> <option value="profil" selected="selected">Profil</option> <option value="comite" selected="selected">Questions sur le Comité</option> <option value="autres">Autres</option> </select> </form>
Donc j'ai trouvé la solution, même s'il faut un peu chercher et que c'est pas forcément très propre..

Merci :)

Piratmac

par Ajoloca » 17 févr. 2007, 10:56

Re,

Tu n'as pas grande chose à changer.

Imaginons que dans ton fichier index.php tu dois gérer plusieurs actions (sans te soucier de savoir si elles sont passées en GET ou en POST).
// Récupération de "action" 
if(isset($_REQUEST['action'])){ // action existe
  // Généralisation de la variable
  $action = $_REQUEST['action'];

  // Traitements en fonction de la valeur
  switch($action){
    case 'faq_ajouter' :
      // Ton traitement pour faq_ajouter
      break;
    case 'supprimer' :
      // Ton traitement pour la suppression
      break;
    default :
      // L'action demandée n'est pas connue
  }
}
else {
// À toi de voir le traitement à faire si pas d'action
}
Et tu peu ajouter autant de "case" que tu le souhaites.

par piratmac » 17 févr. 2007, 10:44

Bonjour,


En fait, la quasi totalité de mon site est géré en pseudo-get : les formulaires sont tous en POST, mais les pages sont appelées en fonction de $_GET (ça me permet d'avoir une page d'origine qui fait un certain nombre d'actions communes à toutes les pages)

Comme je suppose qu'il n'y a aucune manière de m'en sortir autrement, je vais adapter mon code pour que ça marche quand même...

Merci encore,

Piratmac

par Ajoloca » 17 févr. 2007, 10:41

Bonjour,

Je crois que ton PB viens de cette ligne
<form id="form1" name="form1" method="post" action="index.php?action=faq_ajouter"> 
Tu demandes une méthode "post" mais une action en "get", je ne suis pas sur que cela fonctionne.

Si tu as vraiment besoin de ce paramètre, je te conseillerai d'utiliser dans ton formulaire un champ caché nomme "action" qui contiendra la valeur "faq_ajouter" et que tu récupères par $_REQUEST['action'].

De cette manière ça ne te fera pas modifier le reste de ton code, juste la ligne de récupération de cette variable.

En reprenant ton exemple
<html>
<head>
  <title>R&eacute;cup&eacute;ration des valeurs - Select multiple</title>
</head>

<body>
  <form id="form1" name="form1" method="post" action="index.php">
    <select name="sujets_quest[]" size="8" multiple="multiple" class="input">
      <option value="inscription">Inscription sur le site</option>
      <option value="login">Connexion</option>
      <option value="parrain">Questions spécifiques aux parrains</option>
      <option value="filleul">Questions spécifiques aux filleuls</option>
    </select><br /><br />
    <input type="hidden" name="action" value="faq_ajouter" />
    <input name="Envoyer" type="submit" value="Envoyer" />
  </form>
</body>
</html> 
Et le fichier index.php
<?php
  if(isset($_REQUEST['action']) && $_REQUEST['action'] == 'faq_ajouter'){
    if(isset($_POST['sujets_quest'])) {
      // C'est l'étape qui te manque (la récupération du tableau en POST
      $vals = $_POST['sujets_quest'];
      // Juste pour la vérification
       var_dump($vals);
      foreach($vals as $key => $val){
        echo 'Val = ' . $val . '<br />';
      }
      exit(); 
    }
  }
?>

par Invité » 17 févr. 2007, 10:12

Bonjour,

Effectivement, votre code marche :

Code : Tout sélectionner

array(3) { [0]=> string(2) "V1" [1]=> string(2) "V2" [2]=> string(2) "V3" } array(3) { [0]=> string(2) "V1" [1]=> string(2) "V2" [2]=> string(2) "V3" } Val = V1 Val = V2 Val = V3
Par contre, quand je l'adapte à mon cas, ça marche pas...
$vals=$_POST['sujets_quest'];
    // Juste pour la vérification
     var_dump($vals);
    foreach($vals as $key => $val){
      echo 'Val = ' . $val . '<br />';
    }

Code : Tout sélectionner

<form id="form1" name="form1" method="post" action="index.php?action=faq_ajouter"> <select name="sujets_quest[]" size="8" multiple="multiple" class="input"> <option value="inscription">Inscription sur le site</option> <option value="login">Connexion</option> <option value="parrain">Questions spécifiques aux parrains</option> <option value="filleul">Questions spécifiques aux filleuls</option> ... </select> </form>
(a page index.php?action=faq_ajouter est en fait la page où je suis...)

Et quand j'envoie le formulaire, il me met ça :

Code : Tout sélectionner

string(5) "Array" <br> <b>Warning</b>: Invalid argument supplied for foreach()[blablabla]

Merci d'avance,
Piratmac

par Ajoloca » 17 févr. 2007, 00:21

Bonjour,

Il te manque une étape, la récupération du tableau
<?php
  if(isset($_POST['Col'])) {
    // C'est l'étape qui te manque (la récupération du tableau en POST
    $vals = $_POST['Col'];
    // Juste pour la vérification
     var_dump($vals);
    foreach($vals as $key => $val){
      echo 'Val = ' . $val . '<br />';
    }
    exit(); 
  }
?>
<html>
<head>
  <title>R&eacute;cup&eacute;ration des valeurs - Select multiple</title>
</head>

<body>
  <form name="Liste1" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    <select name="Col[]" size="4" multiple="multiple" style="width: 150px">
      <option value="V1">Valeur 1</option>
      <option value="V2">Valeur 2</option>
      <option value="V3">Valeur 3</option>
      <option value="V4">Valeur 4</option>
      <option value="V5">Valeur 5</option>
    </select><br><br>
    <input name="Envoyer" type="submit" value="Envoyer" />
  </form>
</body>
</html>

Formulaire : select multiple dans php...

par piratmac » 16 févr. 2007, 23:32

Bonjour,

J'ai essayé de chercher sur un certain nombre de forums, via Google, dans des tutos en ligne, mais je ne trouve pas de solution...

Mon problème est simple : j'ai un formulaire avec une liste à choix multiple, et j'aimerai, à l'aide de PHP, récupérer les choix de l'utilisateur...

mon code source (php) ressemble à ça :
<select name="sujets_quest[]" size="8" multiple="multiple">
<?php

foreach ($sujets as $sujet => $valeur) {
?>

<option value="<?php echo $sujet; ?>"><?php echo $valeur; ?></option>

<?php
}//Fin liste
?>
</select>
Le code source généré en HTML ressemble à ça :

Code : Tout sélectionner

<select name="sujets_quest[]" size="8" multiple="multiple"> <option value="inscription">Inscription sur le site</option> <option value="login">Connexion</option> <option value="parrain">Questions spécifiques aux parrains</option> ... </select>
Cependant, quand je fait un print_r de $_POST, j'obtient ce résultat :

Code : Tout sélectionner

Array ([sujets_quest] => Array [Submit] => Envoyer)
Un print_r ou un echo de $_POST[sujets_quest] renvoie "Array"


J'ai essayé de ne pas mettre de crochets dans l'attribut name du select, ce qui a pour effet de ne prendre en compte qu'un seul des choix de l'utilisateur, de ne pas mettre </option>, ...

Je précise que j'utilise PHP 5, sur windows (avec Wamp) ;)

Merci à tout ceux qui pourraient m'aider ;)