You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:19:20