PHP注册表单重复用户校验失效问题:如何阻止重复用户添加?
解决PHP注册表单中重复用户名/邮箱检测失效的问题
问题根源
你代码里的核心问题在于错误使用mysqli_stmt_fetch():
mysqli_stmt_fetch()仅返回布尔值(查询成功返回true,失败/无结果返回false),不会直接返回查询到的用户数据数组- 后续判断
$user['username'] === $username和$user['email'] === $email永远不会触发,$errors数组始终为空,导致count($errors) == 0恒成立,无论是否存在重复用户都会执行插入操作
修正方案
以下两种方式任选其一即可修复问题:
方式1:使用mysqli_stmt_bind_result绑定结果字段
修改用户检测部分的代码,通过绑定字段来获取查询结果:
// Check if user exists $user_check_query = "SELECT username, email FROM users WHERE username= ? OR email= ? LIMIT 1"; $stmt = mysqli_prepare($db, $user_check_query); mysqli_stmt_bind_param($stmt, "ss", $username, $email); mysqli_stmt_execute($stmt); // 绑定查询结果到变量 mysqli_stmt_bind_result($stmt, $db_username, $db_email); // 获取结果并判断 if (mysqli_stmt_fetch($stmt)) { if ($db_username === $username) { array_push($errors, "Username already exists"); } if ($db_email === $email) { array_push($errors, "Email already exists"); } } mysqli_stmt_close($stmt);
方式2:使用mysqli_stmt_get_result(需mysqlnd驱动支持)
这种方式更直观,可直接获取关联数组形式的查询结果:
// Check if user exists $user_check_query = "SELECT * FROM users WHERE username= ? OR email= ? LIMIT 1"; $stmt = mysqli_prepare($db, $user_check_query); mysqli_stmt_bind_param($stmt, "ss", $username, $email); mysqli_stmt_execute($stmt); // 获取结果集 $result = mysqli_stmt_get_result($stmt); $user = mysqli_fetch_assoc($result); if ($user) { if ($user['username'] === $username) { array_push($errors, "Username already exists"); } if ($user['email'] === $email) { array_push($errors, "Email already exists"); } } mysqli_stmt_close($stmt);
额外优化建议
- 给
users表的username和email字段添加唯一约束,从数据库层面杜绝重复数据,即使代码出现漏洞也能保证数据一致性 - 执行插入操作后,建议通过
mysqli_stmt_affected_rows($stmt)判断是否插入成功,再执行跳转逻辑
内容的提问来源于stack exchange,提问作者Aguadiablo
相关产品推荐
相关产品推荐

