迷惑于表单复选框

Mystified by Form Checkboxes

我整理了一个测验,并将问题和答案存储在数据库中。它适用于多项选择题,我想出了如何让它也适用于填空题。

但我还没有想出复选框。我有一个问题,为用户提供了五个答案的选择,每个答案都与一个复选框相关联。为了做到正确,他们必须 select 两个复选框。

我认为我的问题出在我的答案键中的这一行:

 if ($answer10 == "AB") { $totalCorrect++; }

要获得正确的分数,用户必须选中前两个复选框(值 A 和 B)。所以 AB 显然不是正确答案,$answer10 == "A,B" 也不起作用。

那么告诉答案键正确选择是 A + B 的正确方法是什么?

这是一道选择题的HTML:

<li id="q9">
  <div class="Question">Scientists believe the universe is:</div>
  <div class="Answer">
    <label for="q9-A">
    <div class="Radio">
      <input type="radio" name="q9" id="q9-A" value="A" style="display: none;">
      A. disappearing</div>
    </label>
  </div>
  <div class="Answer">
    <label for="q9-B">
    <div class="Radio">
      <input type="radio" name="q9" id="q9-B" value="B" style="display: none;">
      B. expanding</div>
    </label>
  </div>
</li>

这是 HTML 我的复选框问题:

<li id="q10">
  <div class="Question">Check each item that can be found in our solar system.</div>
  <div class="Answer" style="margin-top: 5px; background: #000; color: #fff; text-align: center;">
    <label for="q10-A">
      <input type="checkbox" name="q10-A" id="q10-A" value="A">
      planet</label>
    <label for="q10-B">
      <input type="checkbox" name="q10-B" id="q10-B" value="B">
      asteroid</label>
    <label for="q10-C">
      <input type="checkbox" name="q10-C" id="q10-C" value="C">
      black hole</label>
    <label for="q10-D">
      <input type="checkbox" name="q10-D" id="q10-D" value="D">
      neutrino star</label>
    <label for="q10-E">
      <input type="checkbox" name="q10-E" id="q10-E" value="E">
      quasar</label>
   </div>
</li>

这是我的答案:

 $answer1 = $_POST['q1'];
 $answer2 = $_POST['q2'];
 $answer3 = $_POST['q3'];
 $answer4 = $_POST['q4'];
 $answer5 = $_POST['q5'];
 $answer6 = $_POST['q6'];
 $answer7 = $_POST['q7'];
 $answer8 = $_POST['q8'];
 $answer9 = $_POST['q9'];
 $answer10 = $_POST['q10'];
 $answer11 = $_POST['q11'];

 $totalCorrect = 0;

 if ($answer1 == "A") { $totalCorrect++; }
 if ($answer2 == "Jupiter") { $totalCorrect++; }
 if ($answer3 == "C") { $totalCorrect++; }
 if ($answer4 == "D") { $totalCorrect++; }
 if ($answer5 == "A") { $totalCorrect++; }
 if ($answer6 == "C") { $totalCorrect++; }
 if ($answer7 == "C") { $totalCorrect++; }
 if ($answer8 == "B") { $totalCorrect++; }
 if ($answer9 == "B") { $totalCorrect++; }
 if ($answer10 == "AB") { $totalCorrect++; }
 if ($answer11) { $totalCorrect++; }

编辑

以下是我将 Mark M 的回答插入我的评分系统的方式:

if (isset($_POST))
  {
    if (isset($_POST['q10-A'], $_POST['q10-B']) &&
        !isset($_POST['q10-C']) && 
        !isset($_POST['q10-D']) && 
        !isset($_POST['q10-E'])) 
    {
        $Checkbox = 'A';
    }

    else
    {
    $Checkbox = 'B';
    }

}

$answer1 = $_POST['q1'];
$answer2 = $_POST['q2'];
$answer3 = $_POST['q3'];
$answer4 = $_POST['q4'];
$answer5 = $_POST['q5'];
$answer6 = $_POST['q6'];
$answer7 = $_POST['q7'];
$answer8 = $_POST['q8'];
$answer9 = $_POST['q9'];
$answer10 = $Checkbox;

此解决方案的唯一缺点是我必须为每个包含复选框的问题创建一个特殊脚本。因此,我将探索其他答案,看看是否可以找到一个自动处理所有复选框问题的解决方案。否则,这对我来说很好。 ;)

因为问题是"select all the correct answers"类型,所以不是简单的只检查一个变量看是否正确。您需要检查是否检查了正确答案,是否检查了错误答案。

可能有更优雅的方法,您可以将此逻辑实现到您认为合适的代码中,但这是您需要的基本思想:

// Check that the 2 correct answers are set, and the 3 incorrect answers are not set
if (isset($_POST['q10-A'], $_POST['q10-B']) &&
    !isset($_POST['q10-C']) && 
    !isset($_POST['q10-D']) && 
    !isset($_POST['q10-E'])) 
{
    // Correct!
}

See demo

您可以使用基于数组的系统。在 HTML 部分,您使用相同的名称并在其前面加上 [],如下所示:

<label for="q10-A">
  <input type="checkbox" name="q10[]" id="q10-A" value="A">
  planet</label>
<label for="q10-B">
  <input type="checkbox" name="q10[]" id="q10-B" value="B">
  asteroid</label>
<label for="q10-C">
  <input type="checkbox" name="q10[]" id="q10-C" value="C">
  black hole</label>
<label for="q10-D">
  <input type="checkbox" name="q10[]" id="q10-D" value="D">
  neutrino star</label>
<label for="q10-E">
  <input type="checkbox" name="q10[]" id="q10-E" value="E">
  quasar</label>

然后在 php 部分使用 foreach 循环来获取用户输入,如下所示:

<?php
$a10=$_POST['q10'];  //put user inputs into a variable called $a10;
//then check what are values of $a10
foreach($a10 as $a) {
   $answer.=$a;  //put checked values in a string for example if user check A and C and D the $answer will be like 'ACD'
}
if($answer=='AB'){ $totalCorrect++; }
?>

您也可以试试这个...将复选框作为一个数组。这是完整的代码,表单将提交给自己...

<?php

// var_dump($_POST); 

if (!empty($_POST)) {

   $correct_answers=0;

   if (isset($_POST['q10']) &&  
          in_array('A',$_POST['q10']) &&  in_array('B',$_POST['q10']) &&
         !in_array('C',$_POST['q10']) && !in_array('D',$_POST['q10']) ) {
      $correct_answers++;  
   }
   print "$correct_answers correct answers<br/><br/>";
}
// else nothing was submitted

?>

<form method="post" action="">

<li id="q10">
  <div class="Question">Check each item that can be found in our solar system.</div>
  <div class="Answer" style="margin-top: 5px; background: #000; color: #fff; text-align: center;">
    <label for="q10-A">
      <input type="checkbox" name="q10[]" id="q10-A" value="A">
      planet</label>
    <label for="q10-B">
      <input type="checkbox" name="q10[]" id="q10-B" value="B">
      asteroid</label>
    <label for="q10-C">
      <input type="checkbox" name="q10[]" id="q10-C" value="C">
      black hole</label>
    <label for="q10-D">
      <input type="checkbox" name="q10[]" id="q10-D" value="D">
      neutrino star</label>
    <label for="q10-E">
      <input type="checkbox" name="q10[]" id="q10-E" value="E">
      quasar</label>
   </div>
</li>


<button type="submit">Submit</button>
</form>

您可以在 html 中以相同的方式处理复选框和单选按钮。只需意识到单选按钮组将有零个或一个答案,复选框组将有零个或多个答案。

在这个例子中,我设置了一组问题来纠正答案,如果输入的答案是一个复选框组,它会变成一个扁平化的字符串,以便于与正确答案进行比较。

<body>
<?php   
if (isset($_REQUEST['subbtn'])) {

    // array of questions to alpha-sorted answers
    // "q99" => "BA" will not work, it must be => "AB"
    $questions = array(
        "q9" => "B",
        "q10" => "AB"
    );

    foreach ($questions as $q => $a) {
        if (isset($_REQUEST[$q])) {
            $ga = $_REQUEST[$q];
            if (is_array($ga)) {
              sort($ga);
              $ga = strtoupper(implode("", $ga));
            }
            if ($ga == $a) {
                echo "question " . $q . " is correct<br>";
            } else {
                echo "question " . $q . " is incorrect<br>";
            }
        } else {
            echo "question " . $q . " was not answered<br>";
        }
    }


} else {
?>  
    <form>
        <li id="q9">
  <div class="Question">Scientists believe the universe is:</div>
  <div class="Answer">
    <label for="q9-A">
    <div class="Radio">
      <input type="radio" name="q9[]" id="q9-A" value="A">
      A. disappearing</div>
    </label>
  </div>
  <div class="Answer">
    <label for="q9-B">
    <div class="Radio">
      <input type="radio" name="q9[]" id="q9-B" value="B">
      B. expanding</div>
    </label>
  </div>
</li>

<li id="q10">
  <div class="Question">Check each item that can be found in our solar system.</div>
  <div class="Answer" style="margin-top: 5px; background: #000; color: #fff; text-align: center;">
    <label for="q10-A">
      <input type="checkbox" name="q10[]" id="q10-A" value="A">
      planet</label>
    <label for="q10-B">
      <input type="checkbox" name="q10[]" id="q10-B" value="B">
      asteroid</label>
    <label for="q10-C">
      <input type="checkbox" name="q10[]" id="q10-C" value="C">
      black hole</label>
    <label for="q10-D">
      <input type="checkbox" name="q10[]" id="q10-D" value="D">
      neutrino star</label>
    <label for="q10-E">
      <input type="checkbox" name="q10[]" id="q10-E" value="E">
      quasar</label>
   </div>
</li>
<input type='submit' value='Submit' name='subbtn'>

    </form>
<?php
}
?>

</body>