0

我正在制作一个测验生成器,并且我有一个带有单选按钮的 HTML 表单,用于选择答案。现在,当我提交表单时,$_POST 变量的内容在我提交时如下所示:

Array ( [a1] => Bob [a2] => Bobby )

(Bob 和 Bobby 是我选择的单选按钮)

我正在使用 PHP 函数生成此表单,该函数除了回显 HTML 表单外,还返回一组答案。有没有办法修改 $_POST 变量以具有“答案”字段(用于检查我的答案),如下所示:

 Array( [a1] => Bob [a2] => Bobby [answers] => Array( [0] => Bob [1] => Bilbo ))

以上是我想到用 $_POST 数组检查答案数组的一种方法。

编辑:关于我到目前为止的更多信息:

  • 我有一个响应 HTML 表单的 PHP 函数 getTest(),并返回一个包含正确答案的数组。
  • getTest() 随机生成每个问题,因此正确答案是随机的。
  • 主要问题是我有两个单独的 PHP 文件,questions.php 和 verify.php。
    • questions.php 使用 getTest() 回显表单,并具有答案数组。
    • verify.php 只有 $_POST 的内容,但没有正确答案的数组。

一般有没有更好的方法来检查表单提交的结果?谢谢!

4

6 回答 6

1

我认为您需要做的是查看会话。

  • 这样,在 questions.php 上,您可以将答案保存到会话变量中,
  • 然后在 verify.php 上,您可以从会话变量中读取答案并将它们与 $_POST 变量提供的答案进行比较
于 2012-08-18T04:03:04.587 回答
1

如果您真的想要,您可能只使用表单中的隐藏字段来提交答案数组。但是,任何人都可以更改您的来源并修改正确答案。

最好的方法是在您的处理脚本中使用相同的键(a1,a2),但具有正确的答案。

您的处理脚本如下所示:

$answers = array('a1'=>'Robert', 'a2'=>'Hobo');

foreach($_POST as $key => $value)
{
   if (!array_key_exists($key, $answers))
   {
       continue;
   }

   if (trim($value) == $answers[$key])
   {
        // correct
   }
   else
   {
        // incorrect
   }
}
于 2012-08-18T04:23:32.350 回答
1

如果您想在提交表单时传输答案,您可以使用页面上不可见的隐藏类型(如 )输入。然而,它只需要用户检查页面的源 HTML 来查看这些答案,因此它可能不适合您的使用。希望这可以帮助

于 2012-08-18T03:52:27.733 回答
1

进行测验的最佳方法是拥有一个答案数组和一个用户输入数组。循环遍历一个并使用相同的增量与另一个进行比较。

您可以获取所有帖子变量并创建一个数组 print_r($_POST); 然后,循环这个。

$inputArray = //the post data into an array
$answerArray = array('a','b','a');
$numCorrect = 0;
for($a = 0; $a < count($inputArray); $a++)
{
if($inputArray[$a] == $answerArray[$a])
{
$numCorrect++;
}
}
于 2012-08-18T02:51:32.200 回答
0

不确定,但看起来您正在寻求解决方案 Y,而您的问题是 X XY 问题

XY问题是当你需要做X,并且你认为你可以用Y做X,所以你问如何做Y,而你真正应该做的是陈述你的X问题是什么。可能存在比 Y 更好的 Z 解决方案,但如果从未提及 X,则没有人可以建议它。

通常不建议修改 $_POST 数组,也不建议将带有问题的 Answers 传送到客户端。相反,该方法应该是因为questions.php不需要答案,但verify.php确实需要,因此只能verify.php获得答案。

例如,在考试时,答题单永远不会与试卷一起运送到考场。

我冒昧地修改了您的代码结构。如果您仍然想使用自己的代码,请发布它,然后您可以获得您想要的答案。

尝试使用这个:

question.php:

<form action="verify.php" method="POST">
<fieldset class="Question1"> Complete this: ___<b>bar</b>
  <input type="radio" name="answers[]" value="foo">Foo<br>
  <input type="radio" name="answers[]" value="too">Too<br>
  <input type="radio" name="answers[]" value="cho">Cho<br>
</fieldset>

<fieldset class="Question2"> Complete this: ___<b>overflow</b> 
  <input type="radio" name="answers[]" value="stack">Stack<br>
  <input type="radio" name="answers[]" value="stock">Stock<br>
  <input type="radio" name="answers[]" value="stick">Stick<br>
</fieldset>
</form>

answers.php:

//correct answers
$answers = array("foo", "stock");

verify.php:

include("answers.php");
$user_answers = $_POST["answers"];
$user_answers_count = count($user_answers);

$error = "";
for($i=0;$i<$user_answers_count;$i++)
    if($user_answers[$i] !== $answers[$i]) //verify
        $error[] = "Answer for Question ".($i+1)." is wrong!";

if(empty($error))
    //Notify that user has passed the Quiz
else
    //Notify that user has NOT passed the Quiz
    //print the $error array 

几点注意事项:

  • 我用answers.php的是不同的文件,但如果没有特殊要求,可以考虑合并answers.php& verify.php(把answers.php代码放在上面verify.php),更好的是,你也可以将这三个文件合并为一个。
  • 我假设 $_POST 已经过消毒。
  • answers问题和数组的顺序是相同的。即answers[foo]是正确的答案$_POST["answers"][foo]
于 2012-08-18T05:14:54.787 回答
0

如果您希望 $_POST 包含一个数组,您可以简单地在表单的名称字段上使用括号数组表示法。

例如:

<fieldset class="Question1"> 
  <input type="radio" name="answers[]" value="Question1Answer1">Question1Answer1<br>
  <input type="radio" name="answers[]" value="Question1Answer2">Question1Answer2<br>
  <input type="radio" name="answers[]" value="Question1Answer3">Question1Answer3<br>
</fieldset>

<fieldset class="Question2"> 
  <input type="radio" name="answers[]" value="Question2Answer1">Question2Answer1<br>
  <input type="radio" name="answers[]" value="Question2Answer2">Question2Answer2<br>
  <input type="radio" name="answers[]" value="Question2Answer3">Question2Answer3<br>
</fieldset>

<fieldset class="Question3"> 
  <input type="radio" name="answers[]" value="Question3Answer1">Question1Answer1<br>
  <input type="radio" name="answers[]" value="Question3Answer2">Question1Answer2<br>
  <input type="radio" name="answers[]" value="Question3Answer3">Question1Answer3<br>
</fieldset>

(请注意,字段集标签是可选的,我只是将其包含在一起以将事物组合在一起)

post 中的输出将是一个数组 $_POST['answers'] ,每个问题都有一个元素。因此,如果您为问题 1 选择答案 1,为问题 2 选择答案 2,为问题 3 选择答案 2,您将拥有:

$_POST['answers'] = [ 'Question1Answer1', 'Question2Answer2', 'Question3Answer2' ]
于 2012-08-18T02:59:24.093 回答