形式复选框神秘化

时间:2015-01-18 03:23:36

标签: php html checkbox

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

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

我认为我的问题在于我的回答键中的这一行:

 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;

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

4 个答案:

答案 0 :(得分:1)

因为问题是&#34;选择所有正确答案&#34;类型,它不像只检查一个变量,看它是否正确。您需要检查是否选中了正确的答案,并且未检查错误的答案。

可能有更优雅的方式,你可以在你认为合适的代码中实现这个逻辑,但这是你需要的基本想法:

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

答案 1 :(得分:1)

您可以使用基于阵列的系统。在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++; }
?>

答案 2 :(得分:1)

您也可以尝试这样做...将复选框作为数组。这是完整的代码,表格将自行提交......

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

答案 3 :(得分:1)

您可以在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>