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

执行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);
}

修正说明

  1. 移除了mysqli_fetch_all():因为UPDATE操作不需要读取结果集,只需要判断执行是否成功,或者通过mysqli_stmt_affected_rows()获取受影响的行数即可。
  2. 改用预处理语句:通过参数绑定的方式传递变量,彻底杜绝SQL注入风险。
  3. 增加输入验证:避免空用户名被写入数据库。
  4. 完善错误处理:执行失败时可以打印数据库错误信息,快速定位问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:52:39