Только четыре переключателя выбираются из четырех вопросов - PullRequest
2 голосов
/ 13 марта 2019

Я хочу составить список из четырех вопросов и четырех вариантов для каждого вопроса.Я успешно получил вопросы с циклом foreach, но переключатели не работают с циклом foreach.

Например: я выбрал один ответ из первого вопроса и перешел ко второму, но если я выбрал ответ на второй вопрос, выбранный вариант первых вопросов отменяется.Я попытался изменить значения параметров, которые не работали, я попытался использовать цикл for внутри цикла foreach, и даже это не сработало.

Ниже приведен мой код:

<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>

Есть ли что-то, что мне не хватает?

Ответы [ 3 ]

3 голосов
/ 13 марта 2019

Ваша проблема в том, что вы повторно используете имена и идентификаторы ваших входов. Имена и идентификаторы должны быть уникальными, чтобы HTML-код был действительным и работал так, как вы хотите. Вместо этого вы можете использовать входные имена в виде HTML-массивов и группировать по ним.

Используя $key массива, вы можете определить уникальное имя для каждой группы ответов. Мы также используем это для определения идентификаторов ваших элементов, поскольку они должны быть уникальными.

Изменения сделаны,

  • Включить $key в цикл
  • Добавление -<?php echo $key; ?> ко всем случаям, когда вы используете идентификатор кнопок (и ссылку на этикетке), чтобы обеспечить уникальность всех идентификаторов
  • Использование name="answer[<?php echo $key; ?>]" вместо ans1, ans2, ans3, ans4. Это гарантирует, что для каждого ответа может быть выбрана только одна радиокнопка, и что у вас есть один массив ответов, каждый элемент является ответом на один вопрос.

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
}

Теперь, когда вы отправляете форму, выбранные ответы будут в массиве с именем answer. Так что вам придется сделать что-то вроде

foreach ($_POST['answer'] as $key=>$value) {
     // $key is the same key from the loop above
     // $value is the value of the selected radio button
}
1 голос
/ 13 марта 2019

Еще более упрощенный ответ

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>

Тогда в php вы должны получить что-то вроде этого:

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

с Ajax

Одна записка с пронумерованными ключами.Если вы используете AJAX (если вы не можете это игнорировать), вы можете потерять числовые индексы при преобразовании в JSON и из него, например, представьте, что мы ожидаем этого:

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

Когда это закодировано в Json, это будет аналогичнобыть примерно таким (куда делись ключи)

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

Затем, когда PHP преобразует это обратно, мы потеряли наши ключи.И у нас будет что-то вроде этого:

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

Это также верно для любой функции массива, которая не сохраняет ключи, sort и т. Д. Простое решение здесь состоит в том, чтобы просто поставить префикс передчто-то вроде a или _ даже.Затем они будут строками и будут преобразованы в объекты в формате JSON.В PHP вы все равно можете сопоставить их следующим образом:

  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.

И т. Д.

Надеюсь, это поможет!

1 голос
/ 13 марта 2019

Радиокнопки связаны по имени.В вашем foreach() вы продолжаете повторять одни и те же имена для каждого набора вопросов.(Вы также повторяете тот же идентификатор, что является плохой формой, но не нарушит ваш сценарий).

Вам необходимо реструктурировать переключатели таким образом, чтобы каждая группа кнопок (которые принадлежат друг другу) имелато же имя.И это имя должно быть уникальным для каждой группы.

Упрощенный пример:

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...