Problème de groupe de checkbox

Mammouth du PHP | 620 Messages

29 déc. 2009, 10:25

bonjour,
dans un de mes formulaire j'essai de faire un groupement d checkbox afin que les internaute puissent cocher plusieurs cases afin que j'en reçoive les informations choisi.
dans mon cas j'ai donc plusieurs checkbox dont chaque checkbox represente un choix de chambre.
lorsque l'internaute selectionne plusieurs checkbox (plusieurs choix de chambre) la valeur qui m'est retrounée est la derniere case coché par l'internaute. je n'ai donc pas tout les choix.

voici comment je fait mes cases :
      Choix de la ou des chambres :<br/>
      
     <input name="Gchambre[]" type="checkbox" value="chambre21" />21
      <input name="Gchambre[]" type="checkbox" value="chambre22" />22
      <input name="Gchambre[]" type="checkbox" value="chambre23" />23
      <input name="Gchambre[]" type="checkbox" value="chambre24" />24
      <input name="Gchambre[]" type="checkbox" value="chambre25" />25
      <input name="Gchambre[]" type="checkbox" value="chambre26" />26
      <input name="Gchambre[]" type="checkbox" value="chambre27" />27



et comment j'essai de recupérer les choix :
for ($i=0;$i<count($_POST['Gchambre']);$i++)
{
$chambre = $_POST['Gchambre'][$i];
}
comme je vous le disais le HIC et que si par exemple l'internaute cache chambre 23 -23 -24 je ne recupere que la 24 et je ne sais donc pas qu'il a cacher le 22 et 23.

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

29 déc. 2009, 10:37

Lorsque tu ajoutes des crochets aux noms de tes champs, php récupères les valeurs des cases qui ont été cochées et en fait un tableau. Ainsi $_POST['Gchambre'] est en fait un tableau qui va contenir "chambre22", "champbre23" et "chambre24" si ton visiteur coche les cases 22, 23 et 24.

Pour le parcourir tu peux utiliser un foreach() :
if (isSet($_POST['Gchambre'])) { // on s'assure qu'au moins une des cases à été cochée
  foreach ($_POST['Gchambre'] as $numChambre) {
    // traitement
    echo 'La chambre "'.$numChambre.'" a été sélectionnée';
  }
}
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 620 Messages

29 déc. 2009, 11:12

OK SUPER sa fonctionne j'arrive bien à afficher les chambres sélectionnées.
cependant je me retrouve confronté à un nouveau problème.

pour l'affichage des chambres pas de soucis c'est nickel, par contre si j'essaie d'envoyé par mail (d'introduire le résultat dans un message) sa ne fonctionne pas.
$msg .= "Chambre choisie:\t$numChambre\n<br/>";  
J'ai essayé :
$msg .= "if (isSet($_POST['Gchambre'])) 
{ // on s'assure qu'au moins une des cases à été cochée
  foreach ($_POST['Gchambre'] as $numChambre) 
  {
    // traitement
    echo 'La chambre "'.$numChambre.'" a été sélectionnée';
  }
}<br/>";  
mais sa me plante l'envoi.

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

29 déc. 2009, 11:21

Si tu mets tout le code php dans une chaine, ce n'est plus du code php mais une chaine, le résultat ne pourra donc pas correspondre à ce que tu souhaite :)

Le traitement ci-dessus te permet d'identifier chacune des chambre sélectionnées par l'utilisateur. Il te faut donc le compléter et l'adapter pour correspondre à ce que tu souhaite faire :
if (isSet($_POST['Gchambre'])) { // on s'assure qu'au moins une des cases à été cochée
  $msg.= "Chambre(s) choisie(s) :<br />\n";
  foreach ($_POST['Gchambre'] as $numChambre) {
    // traitement
    $msg.= 'Chambre '.$numChambre . "<br />\n";
  }
}
Tu peux aussi simplifier (en fonction de ton besoin) pour mettre chacun des numéros à la suite :
if (isSet($_POST['Gchambre'])) { // on s'assure qu'au moins une des cases à été cochée
  // on utilise implode pour transformer le tableau en chaine, en séparant les éléments avec une virgule
  $msg.= "Chambre(s) choisie(s) :\t". implode(',' , $_POST['Gchambre']) . "<br />\n";
}
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 620 Messages

29 déc. 2009, 11:27

Ok effectivement sa fonctionne.
Merci pour cette leçon qui me sera certainement très utile pour la suite.