在提交之前修改$ _POST变量

时间:2012-08-18 02:47:25

标签: php html

我正在制作一个测验生成器,我有一个带有单选按钮的HTML表单,可以选择多个答案。现在,当我提交表单时,$ _POST变量的内容在我提交时看起来像这样:

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

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

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

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

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

编辑:到目前为止我有更多信息:

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

是否有更好的方法来检查表单提交的结果?谢谢!

6 个答案:

答案 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)

我认为你需要做的就是看看会议。

  • 在questions.php上,您可以将答案保存到会话变量
  • 然后在verify.php上,您可以从会话变量中读取答案,并将它们与$ _POST变量提供的答案进行比较

答案 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之上)更好的是,您还可以将所有这三个文件合并为一个。
  • 我认为$ _POST已经消毒了。
  • 问题顺序&amp; answers数组相同。即answers[foo]$_POST["answers"][foo]
  • 的正确答案