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); }
问题根源
- 结果集未释放:首次查询后,
mysqli_stmt_get_result获取的结果集没有被释放,MySQL连接会一直持有该资源,后续查询无法正常返回新结果,导致每次调用uidExists都返回之前的用户数据。 - 语句未关闭:
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
相关产品推荐
相关产品推荐

