执行UPDATE语句后调用mysqli_fetch_all报错,求代码问题排查
解决mysqli_fetch_all()参数类型错误的问题
嘿,我来帮你排查这段代码的问题,报错的原因其实很直观,还有几个潜在的风险也一起给你指出来:
核心报错原因
- UPDATE语句返回的不是结果集:
mysqli_query()执行UPDATE、INSERT、DELETE这类写操作时,返回的是布尔值(执行成功返回true,失败返回false),而mysqli_fetch_all()是专门用来处理SELECT这类读操作返回的mysqli_result结果集对象的。你直接把mysqli_query()的结果传给它,自然会出现“参数是bool而非mysqli_result”的错误。
代码里的其他潜在问题
- 严重的SQL注入风险:你直接把
$_POST['newUserName']和$_SESSION['id']拼进SQL语句里,恶意用户很容易通过构造特殊字符串来篡改你的数据库,这是非常危险的。 - 缺乏错误处理:没有判断
mysqli_query()是否执行成功,就算SQL语句写错或者数据库连接出问题,你也没法快速定位原因。
修正后的代码示例
if(isset($_POST['saveUserName'])){ // 先做基础的输入验证,避免空用户名 $newUserName = trim($_POST['newUserName']); if(empty($newUserName)){ echo "用户名不能为空,请重新输入"; exit; } $id = $_SESSION['id']; // 使用预处理语句,彻底避免SQL注入 $sql = "UPDATE users SET user=? WHERE id=?"; $stmt = mysqli_prepare($conn, $sql); // 绑定参数:"si"表示第一个参数是字符串(s),第二个是整数(i) mysqli_stmt_bind_param($stmt, "si", $newUserName, $id); $executeResult = mysqli_stmt_execute($stmt); if($executeResult){ echo "用户名更新成功!"; // 如果需要知道有多少行被修改,可以获取受影响行数 $affectedRows = mysqli_stmt_affected_rows($stmt); echo "本次共修改了 {$affectedRows} 条数据"; } else { // 执行失败时输出错误信息,方便排查问题 echo "更新失败:" . mysqli_error($conn); } // 记得关闭预处理语句 mysqli_stmt_close($stmt); }
修正说明
- 移除了
mysqli_fetch_all():因为UPDATE操作不需要读取结果集,只需要判断执行是否成功,或者通过mysqli_stmt_affected_rows()获取受影响的行数即可。 - 改用预处理语句:通过参数绑定的方式传递变量,彻底杜绝SQL注入风险。
- 增加输入验证:避免空用户名被写入数据库。
- 完善错误处理:执行失败时可以打印数据库错误信息,快速定位问题。
内容的提问来源于stack exchange,提问作者Shaan Alam
相关产品推荐
相关产品推荐

