MySQL校验字段非空后更新表时修改用户名功能不生效如何解决
问题根因
- 逻辑嵌套错误:你将更新用户名的代码放在了「查询到用户名已存在」的分支内部,当新用户名未被占用时,查询返回的行数为0,不会进入该分支,自然无法执行更新操作
- 分支判断顺序错误:
if ($checkUsername === $newUsername)成立时直接输出已占用,后续的elseif没有正确对应「用户名不存在」的场景 - 存在安全隐患:UPDATE语句直接拼接用户输入的$newUsername,有SQL注入风险
- 绑定参数类型错误:用户ID通常为整型,使用字符串类型
s绑定可能出现隐式转换异常
修正后的代码
change.php 调整后代码
session_start(); // 如果你此前未开启会话,需要先加这行代码 $newUsername = $_POST['changeUsername']; $newNom = $_POST['changeNom']; $currentId = $_SESSION['id']; $currentName = $_SESSION['name']; // 修改后的用户名更新逻辑 if(empty($newUsername)){ echo "username is empty"; }else if ($stmt = $con->prepare('SELECT username from users where USERNAME = ? ')) { $stmt->bind_param('s', $newUsername); $stmt->execute(); $stmt->store_result(); if ($stmt->num_rows > 0) { // 用户名已存在 echo "username deja utiliser"; } else { // 用户名未占用,执行更新,用参数绑定避免注入 if($stmt = $con->prepare("UPDATE users SET USERNAME = ? WHERE ID = ? ")){ $stmt->bind_param('si', $newUsername, $currentId); // ID用整型i绑定 $stmt->execute(); echo "les valeur on été modifier"; session_regenerate_id(); $_SESSION['name'] = $newUsername; }else{ echo "les valeurs n'ont pas été modifier"; } } $stmt->close(); // 用完关闭statement,避免资源占用 } // 姓氏修改逻辑也建议改成参数绑定,避免注入 if(empty($newNom)){ echo "nom is empty"; }else if($stmt = $con->prepare("UPDATE users SET NOM = ? WHERE ID = ? ")){ $stmt->bind_param('si', $newNom, $currentId); $stmt->execute(); echo "les valeur on été modifier"; $stmt->close(); }else{ echo "les valeurs n'ont pas été modifier"; }
调整说明
- 将更新逻辑从「用户名已存在」的分支移到了对应的else分支,只有查询不到匹配的用户名时才执行更新
- UPDATE语句全部改用参数绑定,杜绝SQL注入风险
- 修正了ID参数的绑定类型为整型
i - 新增了statement资源关闭的逻辑,避免不必要的资源占用
内容的提问来源于stack exchange,提问作者Jermey
相关产品推荐
相关产品推荐

