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

PHP(XAMPP)注册页面故障:仅支持首次写入,后续无法新增用户

注册模块BUG修复:首次注册后无法新增用户

问题说明

基于PHP(XAMPP)开发的登录页面注册模块,用于检测数据库重复用户名。当前异常:数据库为空时注册正常,但提交一次用户后,后续所有新用户注册都会触发"用户名已存在"错误。

原代码

if (uidExists($conn, $username) !== false) {
    header("location: ../homepage.php?error=usernametaken");
    exit();
}

function uidExists($conn, $username) {
    $sql = "SELECT * FROM user_information WHERE UserUid = ?;";
    $stmt = mysqli_stmt_init($conn);
    if (!mysqli_stmt_prepare($stmt, $sql)) {
        header("location: ../homepage.php?error=stmtfailed");
        exit();
    }

    mysqli_stmt_bind_param($stmt, "s", $username);
    mysqli_stmt_execute($stmt);
    
    $resultData = mysqli_stmt_get_result($stmt);

    if ($row = mysqli_fetch_assoc($resultData)) {
        return $row;
    }
    else {
        $result = false;
        return $result;
    }

    mysqli_stmt_close($stmt);
}

问题根源

  1. 结果集未释放:首次查询后,mysqli_stmt_get_result获取的结果集没有被释放,MySQL连接会一直持有该资源,后续查询无法正常返回新结果,导致每次调用uidExists都返回之前的用户数据。
  2. 语句未关闭:mysqli_stmt_close($stmt)写在return语句之后,永远不会被执行,Prepared Statement资源无法回收,堆积后阻塞连接。

修复代码

// 调用逻辑简化,直接判断返回值是否存在
if (uidExists($conn, $username)) {
    header("location: ../homepage.php?error=usernametaken");
    exit();
}

function uidExists($conn, $username) {
    $sql = "SELECT * FROM user_information WHERE UserUid = ?;";
    $stmt = mysqli_stmt_init($conn);
    
    if (!mysqli_stmt_prepare($stmt, $sql)) {
        header("location: ../homepage.php?error=stmtfailed");
        exit();
    }

    mysqli_stmt_bind_param($stmt, "s", $username);
    mysqli_stmt_execute($stmt);
    
    $resultData = mysqli_stmt_get_result($stmt);
    $row = mysqli_fetch_assoc($resultData);
    
    // 先释放结果集资源
    mysqli_free_result($resultData);
    // 再关闭Prepared Statement
    mysqli_stmt_close($stmt);
    
    // 存在用户则返回行数据,不存在返回false
    return $row ?? false;
}

额外建议

  • 注册逻辑中增加插入结果校验:执行插入语句后,用mysqli_affected_rows($conn)判断是否有1行数据被插入,确保注册操作成功。
  • 后端必须保留用户名唯一性校验,不要仅依赖前端校验(前端校验可被绕过)。
  • 开发阶段开启PHP错误提示(error_reporting(E_ALL); ini_set('display_errors', 1);),方便快速定位问题。

内容的提问来源于stack exchange,提问作者Aioli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 09:33:21