在php中测试注册页面

时间:2016-03-18 18:31:11

标签: php mysql login

我被困3个小时试图找出原因。我目前正在处理的网站使用Mysql(已弃用),我需要创建注册表单,用户需要在提交表单之前回答从数据库中提取的随机测试问题。数据库有[id / question / answer]列。

我写过这样的话:

$question_query = mysql_query("SELECT question FROM questions ORDER by RAND () LIMIT 1");
$question = mysql_result ($question_query, 0);

$answer_query = mysql_query("SELECT answer FROM questions WHERE question='$question'");
$answer = mysql_result ($answer_query, 0);

然后在所有检查之后

else {
$user_answer = $_POST['answer'];
if ($user_answer != $answer) {
$error = "Wrong answer";
}   
else {
$register = mysql_query("INSERT INTO user VALUES(blablabla)")
or die(mysql_error());
header("Location: register.php");
} 

当我点击提交时,回显$ error =“错误答案”。 但是,当我在数据库中只有一个问题行时,它完全正常。好像$ question_query在我点击提交或其他内容时再次运行随机选择,从而使得该问题的答案为false。这里有什么我想念的吗?

1 个答案:

答案 0 :(得分:1)

  

但是,当我在数据库中只有一个问题行时,它完全正常。

那是因为当您从列表1中获得随机元素时,它将始终是相同的元素。

您从数据库中选择随机问题,然后将该问题的答案与提供的答案进行比较:

SELECT question FROM questions ORDER by RAND () LIMIT 1

所以选择的随机问题将与之前提出的问题相同, 随着问题数量的增加,这种可能性会降低。 (2个问题的几率为50%,4个问题的概率为25%等)

当您最初向用户显示问题时,请在表单中包含问题的标识符。例如,如果表格中包含id列,那么您可以在表单中包含该列。简单的事情:

<input type="hidden" name="questionId" value="<?php echo $someQuestionId; " />

然后在发布表单时,标识符将在此处提供:

$_POST['questionId']

您可以使用该值对数据库进行一次查询,获取具有该ID的问题的答案。类似的东西:

SELECT answer FROM questions WHERE id=$id

重要提示:您当前的数据访问方法是全开SQL injection。您希望read this更好地理解为什么这是一个问题,以及如何能够,非常轻松地纠正它。