我正在制作一个测验生成器,我有一个带有单选按钮的HTML表单,可以选择多个答案。现在,当我提交表单时,$ _POST变量的内容在我提交时看起来像这样:
Array ( [a1] => Bob [a2] => Bobby )
(Bob和Bobby是我选择的单选按钮选项)
我正在使用PHP函数生成此表单,该函数除了回显HTML表单外还返回一个答案数组。有没有办法修改$ _POST变量以获得“回答”字段(用于检查我的答案),如下所示:
Array( [a1] => Bob [a2] => Bobby [answers] => Array( [0] => Bob [1] => Bilbo ))
以上是我想用$ _POST数组检查应答数组的一种方法。
编辑:到目前为止我有更多信息:
是否有更好的方法来检查表单提交的结果?谢谢!
答案 0 :(得分:1)
进行测验的最佳方法是使用答案数组和用户输入数组。循环使用一个并使用相同的增量进行比较。
你可以获取所有的post变量并创建一个数组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++;
}
}
答案 1 :(得分:1)
如果要在提交表单时传送答案,可以使用隐藏类型(如)在页面上不可见的输入。但是,只有用户检查页面的源HTML才能看到这些答案,因此可能不适合您的使用。希望这有帮助
答案 2 :(得分:1)
我认为你需要做的就是看看会议。
答案 3 :(得分: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
}
}
答案 4 :(得分:0)
如果你想要$ _POST包含一个数组,你可以在表单的name字段上使用括号数组表示法。
例如:
<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>
(请注意,fieldset标记是可选的,我只是将它包含在一起组合)
post中的输出将是一个数组$ _POST ['answers'],每个问题都有一个元素。因此,如果您选择问题1的答案1,针对问题2答案2,针对问题3答案2:
$_POST['answers'] = [ 'Question1Answer1', 'Question2Answer2', 'Question3Answer2' ]
答案 5 :(得分:0)
不确定,但看起来你要求解Y,而你的问题是X (XY Problem)
XY问题是当你需要做X时,你认为你可以使用Y. 做X,所以当你真正应该做的时候,你会问你如何做Y. 是你的X问题是什么。可能有Z解决方案 甚至比Y更好,但如果从未提及X,没有人能够提出建议。
通常不建议修改$ _POST数组,也不建议将问题传回给客户端。相反,方法应该是因为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
&amp; verify.php
(将answers.php
代码置于verify.php
之上)更好的是,您还可以将所有这三个文件合并为一个。answers
数组相同。即answers[foo]
是$_POST["answers"][foo]