2
votes

Un seul bouton radio sélectionné sur quatre questions

Je veux faire une liste de quatre questions et quatre options pour chaque question. J'ai réussi à récupérer les questions avec la boucle foreach , mais les boutons radio ne semblent pas fonctionner avec la boucle foreach .

Exemple: j'ai choisi une réponse pour la première question et je passe à la seconde, mais si je sélectionne une réponse pour la seconde question, l'option sélectionnée des premières questions est désélectionnée. J'ai essayé de changer les valeurs des options, cela n'a pas fonctionné, j'ai essayé d'utiliser la boucle for dans la boucle foreach et même cela n'a pas fonctionné.

Voici mon code: p>

<form method="post" action="process/quiz.php">
<?php 

$quizList = $quiz->getQuiz(4);

if($quizList){

    foreach($quizList as $list){
        ?>
        <div class="row rowpadding">
    <div class="col-md-8 col-md-offset-2" id="panel1">
        <div class="panel panel-default">
            <div class="panel-heading">
                <h5 class="panel-title">
                    <?php echo $list->title; ?>
                </h5>
            </div>
            <div class="panel-body two-col">
                <div class="row">
                    <div class="col-md-6">
                        <div class="frb frb-danger margin-bottom-none">
                            <input type="radio" id="radio-button-1" name="ans1" value="<?php echo $list->option_A ?>">
                            <label for="radio-button-1">
                                <span class="frb-title"><?php echo $list->option_A ?> </span>
                                <span class="frb-description"></span>
                            </label>
                        </div>
                    </div>
                    <div class="col-md-6">
                        <div class="frb frb-danger margin-bottom-none">
                            <input type="radio" id="radio-button-2" name="ans2" value="<?php echo $list->option_B ?>">
                            <label for="radio-button-2">
                                <span class="frb-title"><?php echo $list->option_B ?></span>
                                <span class="frb-description"></span>
                            </label>
                        </div>
                    </div>

                    <div class="col-md-6">
                        <div class="frb frb-danger margin-bottom-none">
                            <input type="radio" id="radio-button-3" name="ans3" value="<?php echo $list->option_C ?>">
                            <label for="radio-button-3">
                                <span class="frb-title"><?php echo $list->option_C ?></span>
                                <span class="frb-description"></span>
                            </label>
                        </div>
                    </div>
                    <div class="col-md-6">
                        <div class="frb frb-danger margin-bottom-none">
                            <input type="radio" id="radio-button-4" name="ans4" value="<?php echo $list->option_D ?>">
                            <label for="radio-button-4">
                                <span class="frb-title"><?php echo $list->option_D ?></span>
                                <span class="frb-description"></span>
                            </label>
                        </div>
                    </div>

                </div>
            </div>
        </div>
    </div>
</div>
        <?php
    }

}

?>


<div class="panel-footer rowpadding">
    <div class="row">
        <div class="col-md-6">
            <button type="submit" class="btn btn-sm btn-block ">
                <span class="fa fa-send"></span>
                submit </button>
        </div>

    </div>
</div>
</form>

Y a-t-il quelque chose qui me manque?


5 commentaires

Vous allez par ce script générer plusieurs entrées avec le même ID, qui n'est pas du HTML.


@Qirel J'ai supprimé l'identifiant du formulaire, mais cela a fait la même chose que lorsqu'il y avait un identifiant.


Ouais, l'ID n'a pas d'importance, ce qui compte, c'est que vous continuiez à utiliser les mêmes noms pour les mêmes questions. Voir ma réponse ci-dessous pour la solution.


C'était simplement un commentaire - pas la réponse, @dearsina. ;-)


@Qirel, votre commentaire est parfait, les identifiants comptent .


3 Réponses :


1
votes

Les boutons radio sont liés par leur nom. Dans votre foreach () , vous répétez sans cesse les mêmes noms pour chaque ensemble de réponses aux questions. (Vous répétez également le même identifiant, ce qui est de mauvaise forme, mais ne cassera pas votre script.)

Vous devez restructurer vos boutons radio pour que chaque groupe de boutons (qui appartiennent ensemble) ait le même nom. Et ce nom doit être unique par groupe.

Un exemple simplifié:

<form>
  <p>These belong together, and all have the name "gender":</p>
  <input type="radio" name="gender" value="male"> Male<br>
  <input type="radio" name="gender" value="female"> Female<br>

  <p>These belong together, and all have the name "team":</p>
  <input type="radio" name="team" value="blue"> Blue<br>
  <input type="radio" name="team" value="red"> Red<br>
</form>


2 commentaires

y a-t-il un moyen possible de le faire avec la boucle foreach? Parce qu'en boucle, les boutons radio fonctionnaient parfaitement.


Oui, absolument, je crois qu'il y a déjà une réponse à cela, alors jetez un œil là-bas.



3
votes

Votre problème est que vous réutilisez les noms et les identifiants de vos entrées. Les noms et identifiants doivent être uniques pour que le code HTML soit valide et fonctionne comme vous le souhaitez. Vous pouvez avoir les noms d'entrée sous forme de tableaux HTML à la place, et les grouper par cela.

En utilisant la $ key du tableau, vous pouvez définir un nom unique pour chaque votre groupe de réponses. Nous l'utilisons également pour définir les identifiants de vos éléments, car ils doivent être uniques.

Les modifications apportées sont,

  • Incluez la $ key dans la boucle
  • Ajout de - php echo $ key; ?> à toutes les instances où vous utilisez l'ID des boutons (et la référence dans l'étiquette), pour vous assurer que tous les ID sont uniques
  • Utilisation de name = "answer [ php echo $ key;?>]" au lieu de ans1 , ans2 , ans3 , ans4 . Cela garantit qu'un seul bouton radio peut être sélectionné par réponse et que vous disposez d'un tableau de réponses, chaque élément étant la réponse à une question.

foreach ($_POST['answer'] as $key=>$value) {
     // $key is the same key from the loop above
     // $value is the value of the selected radio button
}

Désormais, lorsque vous soumettez le formulaire, les réponses sélectionnées seront dans un tableau dont le nom est answer . Vous devrez donc faire quelque chose comme

foreach ($quizList as $key=>$list){
    ?>
    <div class="row rowpadding">
        <div class="col-md-8 col-md-offset-2" id="panel1-<?php echo $key; ?>">
            <div class="panel panel-default">
                <div class="panel-heading">
                    <h5 class="panel-title">
                        <?php echo $list->title; ?>
                    </h5>
                </div>
                <div class="panel-body two-col">
                    <div class="row">
                        <div class="col-md-6">
                            <div class="frb frb-danger margin-bottom-none">
                                <input type="radio" id="radio-button-1-<?php echo $key; ?>" name="answer[<?php echo $key; ?>]" value="<?php echo $list->option_A ?>">
                                <label for="radio-button-<?php echo $key; ?>">
                                    <span class="frb-title"><?php echo $list->option_A ?> </span>
                                    <span class="frb-description"></span>
                                </label>
                            </div>
                        </div>
                        <div class="col-md-6">
                            <div class="frb frb-danger margin-bottom-none">
                                <input type="radio" id="radio-button-2-<?php echo $key; ?>" name="answer[<?php echo $key; ?>]" value="<?php echo $list->option_B ?>">
                                <label for="radio-button-2-<?php echo $key; ?>">
                                    <span class="frb-title"><?php echo $list->option_B ?></span>
                                    <span class="frb-description"></span>
                                </label>
                            </div>
                        </div>

                        <div class="col-md-6">
                            <div class="frb frb-danger margin-bottom-none">
                                <input type="radio" id="radio-button-3-<?php echo $key; ?>" name="answer[<?php echo $key; ?>]" value="<?php echo $list->option_C ?>">
                                <label for="radio-button-3-<?php echo $key; ?>">
                                    <span class="frb-title"><?php echo $list->option_C ?></span>
                                    <span class="frb-description"></span>
                                </label>
                            </div>
                        </div>
                        <div class="col-md-6">
                            <div class="frb frb-danger margin-bottom-none">
                                <input type="radio" id="radio-button-4-<?php echo $key; ?>" name="answer[<?php echo $key; ?>]" value="<?php echo $list->option_D ?>">
                                <label for="radio-button-4-<?php echo $key; ?>">
                                    <span class="frb-title"><?php echo $list->option_D ?></span>
                                    <span class="frb-description"></span>
                                </label>
                            </div>
                        </div>

                    </div>
                </div>
            </div>
        </div>
    </div>
   <?php
}


2 commentaires

Comment puis-je connaître la question des réponses dans un tableau?


La $ key dans chaque tableau est la même. Donc $ _POST ['answers'] [0] sera la réponse à la question où $ key dans la boucle avec les questions ( foreach ($ quizList as $ key => $ list) {) était 0. Si vous définissez cette clé comme étant l'ID de la question, vous avez alors l'ID de la question à la fois dans la boucle de réponse et dans la boucle de question.



1
votes

Une réponse encore plus simplifiée

  if("a$id" == $post_id){}

  if(substr($post_id,1) == $id){}

  //remove all prefixes
  print_r(array_combine(preg_replace('/^a/', '', array_keys($answers)),$answers));

  //it feels wrong but if you have to append you can do this
   var_dump((int)'2a' == 2); //true so your key would be 2a because how PHP converts strings to ints.

Ensuite, en php, vous devriez obtenir quelque chose comme ceci:

  $_POST['answer'] = [
       0 => 'foo'
       1 => 'biz' ....
  ];

Avec Ajax

Une note avec des touches numérotées. SI vous utilisez AJAX (sinon vous pouvez ignorer cela), vous risquez de perdre des index numériques lors de la conversion vers et depuis JSON, par exemple imaginez que nous nous attendons à ceci:

  '{"answer":["foo", "biz"]}`

Quand c'est encodé en Json, ce sera probablement quelque chose comme ceci (où sont passées les clés)

  $_POST['answer'] = [
       '0' => 'foo'
       '2' => 'biz' ....
  ];

Ensuite, quand PHP convertit cela, nous avons perdu nos clés. Et nous aurons quelque chose comme ceci:

 $_POST['answer'] = [
       '0' => 'foo'
       //'1' => 'biz' ....
  ];

Ceci est également vrai pour toute fonction de tableau qui ne conserve pas les clés, sort etc. La solution simple ici est de simplement préfixer la clé avec quelque chose comme a ou _ même. Ensuite, ils seront des chaînes et se traduiront en objets dans le JSON. En PHP, vous pouvez toujours faire correspondre ceux-ci comme ceci:

foreach($quizList as $key => $list){ ?>
 <form>
    <input type="radio" id="radio-button-1" name="answer[<?php echo $key;?>]" value="<?php echo $list->option_A ?>"> <!-- answer_0 -->
    <input type="radio" id="radio-button-1" name="answer[<?php echo $key;?>]" value="<?php echo $list->option_B ?>"> <!-- answer_0 -->
</form>

Et ainsi de suite.

J'espère que cela aide!


0 commentaires