四个问题中只有一个无线电按钮



我想为每个问题列出四个问题和四个选项。我已经成功地使用了foreach循环提出问题,但是,无线电按钮似乎与foreach循环无法使用。

eg:我选择了一个答案形式的第一个问题,然后跳到第二个问题,但是如果我为第二个问题选择答案,那么第一个问题的选定选项将被取消选择。我尝试了更改选项值的值,但不起作用,我尝试在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>

我缺少什么吗?

您的问题是您正在重复使用输入的名称和ID。名称和ID必须是唯一的,才能使HTML有效,并且必须按照您的意图进行工作。您可以将输入名称称为 html数组,然后按此分组。

使用数组的$key,您可以为每个答案组定义一个唯一名称。我们还使用它来定义您的元素的ID,因为它们必须是唯一的。

进行的更改是

  • 在循环中包括$key
  • -<?php echo $key; ?>添加到使用按钮ID(以及标签中的参考)的所有实例中,以确保所有ID均为唯一的ID
  • 使用name="answer[<?php echo $key; ?>]"代替ans1ans2ans3ans4。这样可以确保每个答案只能选择一个广播按钮,并且您有一个答案,每个元素都是一个问题的答案。

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
}

无线电按钮用名称绑在一起。在您的foreach()中,您会为每组问题答案重复相同的名称。(您还重复相同的ID,这是不良形式,但不会打破您的脚本)。

您需要重组您的无线电按钮,以使每组按钮(属于在一起)具有相同的名称。这个名称必须是每个组唯一的。

一个简化的示例:

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

更简化的答案

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.

等等。

希望它有帮助!

相关内容

最新更新