【问题标题】:Checking Correct Answer and Submitting Form检查正确答案并提交表格
【发布时间】:2010-01-25 17:11:08
【问题描述】:

诚然,我对 PHP 的熟练程度不如我希望的那样。我的大部分经验是使用 Wordpress 循环。

我正在尝试创建一个非常简单的测验,其中包含 URL 中正确答案的数量(例如 domaindotcom/?p=3,如果他们到目前为止得到了 3 个正确答案)。

我正在使用以下 PHP 代码来启动它:

<?php 
    /* Gets current correct answer Count */ 
    $answer_count = $_GET["p"]; 

    /* checks to see if the submitted answer is the same as the correct answer */
    if ($_POST["submitted-answer"] == "correct-answer") {
        $answer_count++;
    }
?>

现在我知道我可以使用链接获得正确的链接:

<a href="link-to-next-question.php/?p=<?php echo $answer_count; ?>">Next Question</a>

但现在我尝试在表单中使用它并被 POST、GET 等弄糊涂了。

这是我的 HTML:

<form name="quiz" action="" method="POST">
<label for="o1"><input type="radio" name="grp" id="o1" value="o1"> Label 1</label>
<label for="o2"><input type="radio" name="grp" id="o2" value="o2"> Label 2</label>
<label for="o3"><input type="radio" name="grp" id="o3" value="o3"> Label 3</label>
<input type="submit" value="Next Question" class="btn">
</form>

如何选择正确的答案(安全性不重要,这只是一个有趣的测验),然后将它们发送到下一个 URL,同时在创建 URL 之前将增量添加到 $answer_count?

【问题讨论】:

  • 如果我在网址中手动增加p 欺骗我下一个问题怎么办?
  • 那么你在测验结束时不会收到金星
  • 只是为了好玩。如果他们想让 url p=100000,那很好。没有奖品,不涉及金钱,没有广告,他们只是因为得到一个愚蠢的结果而输了。

标签: php forms post get


【解决方案1】:

不要在链接中传递答案计数(即通过 GET)。相反,只需包含一个隐藏的表单字段,并使用客户端 javascript 代码来增加您想要的变量并提交表单。

<form id="qfrm" name="quiz" action="" method="POST"> 
  <input type="hidden" name="question_number" value="<?php echo $next_question_number?>">
  <input type="hidden" id="n_c_a" name="num_correct_answers" value=<?php echo $num_correct_answers?>">
  <input type="button" value="Submit" onclick="validateAnswerAndSubmit(); return false;">
</form>

<script language="javascript">
  function validateAnswerAndSubmit(){
    if(validate_answer()){
      document.getElementById("n_c_a").value += 1;
    }
    document.getElementById("qfrm").submit();
  }  
</script>

然后让你的 php 脚本开启 $_POST["question_number"]


好的,所以您不想使用 javascript...如果您真的在问“我如何知道从 PHP 中选择了哪个单选框?”答案是:

<?php $answer = $_POST["grp"]; ?>

我认为您确实应该在 URL 中传递两个变量,一个是 question_number,另一个是 num_correct。然后您可以编写如下代码:

<?php

$num_correct = (int) $_GET["num_correct"];
$question_number = (int) $_GET["question_number"];

switch($question_number - 1){ // assuming your question numbers are in order by convention
                              // validate the answer to the previous question
  case -1: //no validation necessary for the first question ($question_number 0)    
    break;
  case 0: 
    if($_POST["grp"] == "correct answer"){
      $num_correct++;
    }
    break;

   // and so forth;         
}       
?>

<form name="quiz" 
      action="this_page.php/?num_correct=<?php echo $num_correct;?>&question_number=<?php echo $question_number + 1?>" 
      method="POST">

<?php Display_Question_Number($question_number);?>

</form>

这里的关键点是表单中的“action=”类似于锚点中的“href=”,即当用户单击提交按钮时,它是表单提交到的 URL。

【讨论】:

  • 客户端的一切都可以很容易地被篡改。隐藏字段与将其作为 URL 参数传递一样糟糕
  • 感谢您的回复。感谢您花时间写下所有这些。我只为移动浏览器做这个,其中一些不支持 JavaScript,所以我只使用 PHP/HTML/CSS。篡改不是问题。这是一个有趣的测验,如果用户想作弊,那就这样吧。这只是我在 URL 中计算答案的要求。
  • 是在右侧单选按钮上使用“正确答案”的值吗?或者换句话说,如何验证答案。我理解你帖子的其余部分。我只有 10 个问题,每个问题都有 3 个选项,所以我很容易硬编码答案。
  • 全局 $_POST 变量将有一个对应于提交表单中每个命名输入字段的键。因此,从您的代码中,您将单选按钮组命名为“grp”。 $_POST["grp"] 条目的值将是所选单选按钮的值属性。所以为了有意义,上面代码中的“正确答案”必须是“o1”、“o2”或“o3”之一。如果您想知道 $_POST 变量中的内容,请将 &lt;?php print_r($_POST);?&gt; 放在 yoru PHP 的顶部,您将获得漂亮的打印输出。我认为对您的应用程序的正确答案进行硬编码没有问题。
【解决方案2】:

使用 type="hidden" 数据字段发送当前计数。

【讨论】:

  • 好吧,这有点道理。谁能详细说明一下?我了解隐藏字段等,但仍然不明白如何将数据发布到 $answer_count 变量,将其包含在 URL 中并转到下一页。
  • 您将action="" 更改为下一个问题的页面,因此操作可能是action="page9.php"。在 page9.php 中你得到当前变量$counter = $_POST["counter"];,然后检查答案并添加一个。该数字将是 page9.php &lt;input type="hidden" name="counter" value="$counter" /&gt; 上问题中隐藏字段的值,并将“传输”到第 10 页。
  • 感谢您的帮助。我现在明白你对计数器的意思,以及进入下一页的操作。你能给我推荐一个教程或指导我检查答案并将计数添加到 $answer_count 中吗?
  • 只需按照我在下面描述的模式(从上一篇文章编辑),您就可以在一个 php 页面中完成所有操作,并使用一堆“案例”。
【解决方案3】:

您可以在$_SESSION中设置正确答案的计数(它是一个在页面之间持续存在的全局变量),因此更难作弊。

【讨论】:

  • 作弊不是问题(见上面的评论)。 $_SESSION 可能会有所帮助,但我怎样才能将答案发送到 $_SESSION 并一键进入下一页?
猜你喜欢
  • 2020-10-10
  • 2021-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-02
  • 2017-02-16
  • 2020-07-03
  • 2018-10-11
相关资源
最近更新 更多