PHP中实现用户已考检测及已考考试仍可进入问题求助
如何在PHP中检查用户是否已参加考试?
嘿,我看了你遇到的问题和代码片段,这里有几个关键问题导致系统没正确拦截已参加过考试的用户,咱们一步步来排查和修复:
1. GET参数获取错误
你代码里写的$_GET[$user]是个典型的错误——这里的$user应该是你要获取的参数名(比如前端传的是user这个键),所以正确写法是$_GET['user'],同理$_GET[$test]要改成$_GET['test']。原来的写法会把$user变量的值当作参数名去取,大概率不是你想要的结果,直接导致查询条件失效。
2. 冗余的循环逻辑
你外面套了个while($row=mysqli_fetch_row($rs))循环,但这个循环和检查用户是否参加考试的逻辑完全不相关,反而可能导致重复执行查询甚至覆盖结果。如果你的需求只是检查当前用户是否参加过指定考试,直接执行查询就行,完全不需要这个循环。
3. 未正确判断查询结果
执行完mysqli_query后,你没有去检查结果集里有没有数据——如果用户已经参加过考试,查询结果应该至少有一条记录,你需要通过mysqli_num_rows()来判断这一点,然后给出对应的错误提示。
4. 严重的SQL注入风险
直接把用户输入拼接到SQL语句里是非常危险的操作,很容易被攻击者利用注入漏洞篡改数据库。必须改用预处理语句来避免这个问题。
修复后的完整示例代码
<?php include("header.php"); include("database.php"); // 先检查必要的GET参数是否存在,避免Undefined index错误 if (!isset($_GET['user']) || !isset($_GET['test'])) { die("缺少必要的参数,请返回重试"); } // 从GET中获取参数(建议后续改用SESSION存用户信息,更安全) $user_login = $_GET['user']; $target_test_id = $_GET['test']; // 使用预处理语句构建查询,彻底避免SQL注入 $check_sql = "SELECT * FROM mst_result WHERE login = ? AND test_id = ?"; $stmt = mysqli_prepare($cn, $check_sql); // 绑定参数:"si"表示第一个参数是字符串(login),第二个是整数(test_id),根据你表的字段类型调整 mysqli_stmt_bind_param($stmt, "si", $user_login, $target_test_id); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); // 判断是否存在已参加的记录 if (mysqli_num_rows($result) > 0) { // 用户已参加过,显示错误提示并终止后续逻辑 echo "<div style='color: red; font-size: 16px;'>抱歉,你已经参加过这场考试了,无法再次作答!</div>"; // 可以添加跳转逻辑,比如3秒后返回考试列表: // header("Refresh: 3; url=exam_list.php"); exit; // 终止后续代码执行 } else { // 用户未参加过,继续执行考试页面的逻辑 echo "<div>欢迎参加考试,请开始作答!</div>"; // 这里写你的考试页面代码 } // 清理资源 mysqli_stmt_close($stmt); mysqli_close($cn); ?>
额外的优化建议
- 不要用
$_GET传递用户登录信息,建议用$_SESSION存储用户的登录状态和信息,这样既安全又能避免参数被篡改。 - 确保
mst_result表中的login和test_id字段类型和你绑定的参数类型一致(比如test_id如果是字符串,就把"si"改成"ss")。 - 错误提示可以做得更友好,比如配合页面样式或者跳转逻辑,提升用户体验。
内容的提问来源于stack exchange,提问作者Rohan21
相关产品推荐
相关产品推荐

