1 回答
TA贡献1802条经验 获得超6个赞
首先,您的代码很危险,因为可以通过 sql 注入攻击。您始终应该使用参数绑定。
最简单的方法是传递存储在 mst_question 中的问题的 id,并通过 WHERE 子句(如 test_id)选择一个。
//...
$test_id=$_POST["test_id"];
$questionId = filter_var($_POST['question_id'],FILTER_VALIDATE_INT);
if (!$questionId){
die('done');
}
$stmt= mysqli_prepare($con,"select * from mst_question where test_id='$test_id' AND id=?");
mysqli_stmt_bind_param(**$stmt**, 'd',$questionId);
mysqli_stmt_execute(**$stmt**);
// work with $stmt.
// f.e. your loop but now there will be only one execution
mysqli_stmt_close($stmt);
//...
$createTable .= '<input type="hidden" name="nextQuestionId" value="'.$nextQuestionId.'"/>';
//...
使用输入字段,您将返回下一个问题的 ID,该 ID 可以在 JavaScript 代码中的 url 参数中传递。
如果您担心测验作弊者,可以通过散列 nextQuestionId 来提高安全性。
//...
$stmt = mysqli_prepare($con,"select * from mst_question where test_id='$test_id' AND sha1(CONCAT('slat_',id))=?");
//...
$createTable .= '<input type="hidden" name="nextQuestionId" value="'.sha1('salt_'.$nextQuestionId).'"/>';
//...
这不是最好的解决方案,但需要对代码进行最少的更改。
我想建议切换到 PDO - 与数据库交互的非常友好和强大的方式。看一个例子。
- 1 回答
- 0 关注
- 96 浏览
添加回答
举报