【发布时间】:2014-01-10 10:42:51
【问题描述】:
我正在编写考试代码。在表单中,我调用了一个生成问题并存储学生答案的方法。
我的问题是,当我将学生答案存储在数据库中时,上一个问题的答案存储在当前学生答案字段中。然后即使学生的答案是正确的,根据我编写的代码,它也总是错误的。
我觉得问题在于我将插入查询放在显示问题的显示函数中,但我不知道如何修复它或将插入查询放在哪里。
例子:
Q1:学生的答案是 4。
数据库中的学生答案字段存储为空。
Q2:学生的答案是 9。
数据库中的学生答案字段存储为4。
Q3:学生的答案是 2。
数据库中的学生答案字段存储为9。
在我调用方法(1)的形式中,他们调用方法(2)和方法(3)。
方法(2):
function display($sec, $level, $operation, $x, $y, $EvalOrExam, $Answers, $stdAnswer, $result)
{
$examID;
$sql = "SELECT * FROM question WHERE Qsec='$sec' and QlawID='$operation' ORDER BY RAND() LIMIT 1";
$result1 = mysql_query($sql);
$data = mysql_fetch_array($result1);
$Qbody = $data['Qtext'] . $x . $data['Qtext2'] . $y . $data['Qtext3'];
echo '<div dir=\'rtl\'>' . $Qbody . '</div>';
echo '<br/>';
return $Qbody;
}
方法(3):
function storeExamQ($sec, $level,$EvalOrExam, $Answers, $stdAnswer, $result,$Qbody)
{
$Answers = $Answers + 1;
if ($Answers == '1')
{
$sql = "SELECT MAX(examID) FROM exam WHERE stdID='" . $_SESSION['id'] . "'";
$query = mysql_query($sql);
$row = mysql_fetch_row($query);
if (!$query) echo "Database Error : " . $sql;
$query = intval($row['0']);
$_SESSION['examID'] = $query+1;
}
$sql1 = "INSERT INTO `exam`(`examID`,`QID`,`stdID`, `examLevel`, `Qbody` , `Qsec` , `stdAnswer` , `correctAnswer` ) VALUES ('" . $_SESSION['examID'] . "','" . $Answers . "','" . $_SESSION['id'] . "','" . $level . "','" . $Qbody . "','" . $sec . "','" . $stdAnswer . "','" . $result . "')";
$query1 = mysql_query($sql1);
if (!$query1) echo "Database Error : " . $sql1;
}
方法内部调用(一):
function operations($sec, $levelOfEval, $numOfQ, $EvalOrExam)
{
if (isset($_POST['result']))
{
echo '<br/>';
$stdAnswer = $_POST['stdAnswer'];
$result = intval($_POST['result']);
if (!isset($_SESSION['correctAnswers']) AND !isset($_SESSION['wrongAnswers']) AND !isset($_SESSION['Answers']))
{
$_SESSION['correctAnswers'] = $correctAnswers = 0;
$_SESSION['wrongAnswers'] = $wrongAnswers = 0;
$_SESSION['Answers'] = $Answers = 0;
}
else
{
$correctAnswers = $_SESSION['correctAnswers'];
$wrongAnswers = $_SESSION['wrongAnswers'];
$Answers = $_SESSION['Answers'];
}
if ($result != $stdAnswer OR $stdAnswer == "")
{
$wrongAnswers++;
$Answers++;
}
else if ($result == $stdAnswer)
{
$correctAnswers++;
$Answers++;
}
$_SESSION['correctAnswers'] = $correctAnswers;
$_SESSION['wrongAnswers'] = $wrongAnswers;
$_SESSION['Answers'] = $Answers;
}
if ($_SESSION['Answers'] < $numOfQ)
{
echo '<div dir=\'rtl\'>';
if (isset($_SESSION['correctAnswers']) AND isset($_SESSION['wrongAnswers']) AND isset($_SESSION['Answers']) AND $EvalOrExam == '0')
{
echo $correctAnswers;
echo '<br/>';
echo $wrongAnswers;
echo '<br/>';
}
echo $Answers + 1;
echo '<br/>';
echo '</div>';
$operation = rand(1, 4); // 1 add, 2 subtract, 3 multiply, 4 divied
//IF conditions that generate the values of $x and $y
$Qbody=displayOperations($sec, $levelOfEval, $operation, $x, $y, $EvalOrExam, $Answers, $stdAnswer, $result);
if ($EvalOrExam == 1)
{
storeExamQ($sec, $level,$EvalOrExam, $Answers, $stdAnswer, $result,$Qbody);
}
echo '<br/>';
return $result;
}
else
{
if ($EvalOrExam == 0)
{
echo '<br/>';
echo $correctAnswers;
echo '<br/>';
echo $wrongAnswers;
echo '<br/>';
/*echo "Answers:";
echo $Answers;*/
echo '<br/>';
$sql = "INSERT INTO `result`(`resultID`,`stdID`,`secID`, `grade`) VALUES (null,'" . $_SESSION['id'] . "','$sec','" . $correctAnswers . "')";
$query = mysql_query($sql);
if (!$query) echo "Database Error : " . $sql;
}
else if ($EvalOrExam == 1)
{
$sql = "UPDATE `student` SET `activateExam`=0 WHERE `ID`='". $_SESSION['id'] ."'";
$query = mysql_query($sql);
if (!$query) echo "Database Error : " . $sql;
echo mysql_error();
unset($_SESSION['examID']);
unset($_SESSION['operationsCount']);
unset($_SESSION['shapesCount']);
unset($_SESSION['calculationsCount']);
}
$_SESSION['finish'] = '1';
unset($_SESSION['correctAnswers']);
unset($_SESSION['wrongAnswers']);
unset($_SESSION['Answers']);
}
}
形式:
echo '<div>' . $result = evaluation('4', $level,$numOfQ,'1') . '</div>';
echo '<input type="hidden" name="result" value="' . $result . '">';
方法评估调用同时调用显示和存储的操作。
【问题讨论】:
-
如果您的函数被称为
display,我希望它只是显示问题 - 我建议将保存答案的代码分离到不同的函数中,并在之前调用它你打电话给display。它会让事情更易于维护。 -
我按照你说的做了,但问题仍然存在。我按照你说的更新了帖子里的代码。
-
很难理解你的代码,因为我不知道任何变量是什么。但是,如果我不得不冒险使用 WAG,那么在您执行 INSERT 之前,您已经得到了这条线
$_SESSION['examID'] = $query + 1;。我会把它移到 INSERT 之后。 -
是的,我知道,我非常感谢您的努力。
$_SESSION['examID'] = $query + 1;我的意思是我希望代码采用最后一个考试 id 并将其加一以便为当前考试创建一个新 id,我认为这与我遇到的问题没有任何关系有。谢谢你的想法。 -
那么恐怕您将不得不进行更多调试。我可以看到两条
INSERT INTO exam行;我认为那些是给你带来问题的那些?你能试着缩小范围吗?当您提交第一个问题时,答案根本没有被存储,您能否回显将其写入数据库的 SQL?并标记它是哪一行?