【问题标题】:PHP: takes the value from the old formPHP:从旧形式中获取值
【发布时间】: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?并标记它是哪一行?

标签: php mysql forms


【解决方案1】:

很可能,您的一条 SQL 语句的格式不正确。

之后

$sql = ...

插入:

echo $sql;

然后直接在数据库中运行那个SQL,看看是否得到了你需要的东西。

另外,请编辑您的问题以反映当前代码。有很多 cmets,很难弄清楚你的实际代码是什么。

如果您需要更多帮助,请告诉我。

【讨论】:

    【解决方案2】:

    非常感谢你们,非常感谢你们的帮助。

    通过调用方法解决了问题

    storeExamQ($sec, $level,$EvalOrExam, $Answers, $stdAnswer, $result,$Qbody);
    

    在方法(1)直接设置学生答案和结果之后。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-21
      • 1970-01-01
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多