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

实现用户登录时遇致命错误:Call to a member function fetchAll() on bool

解决「Call to a member function fetchAll() on bool」登录错误

这个错误的核心原因很明确:你把$stmt->execute()的返回值当成了查询结果集,但实际上它只返回布尔值(执行成功返回true,失败返回false),自然没法调用fetchAll()方法。

修复步骤

  1. 获取正确的结果集对象
    执行预处理语句后,必须通过$stmt->get_result()方法拿到mysqli_result对象,这个对象才支持fetch_all()、fetch_assoc()等获取数据的方法。

  2. 补充错误检查(可选但推荐)
    增加对预处理、语句执行环节的错误检查,能快速定位问题,避免后续无意义的报错。

  3. 修正变量未定义问题
    原代码中$_SESSION['username'] = $username;的$username未定义,需要替换为实际存在的变量。

修复后的完整代码

$sql = "SELECT * FROM users WHERE username = ?";
$stmt = $db->prepare($sql);
// 检查预处理是否成功
if (!$stmt) {
    die("预处理失败: " . $db->error);
}
$stmt->bind_param("s", $_POST['name']);
$executeSuccess = $stmt->execute();
// 检查语句执行是否成功
if (!$executeSuccess) {
    die("执行语句失败: " . $stmt->error);
}
// 获取结果集对象
$result = $stmt->get_result();
// 以关联数组格式获取所有匹配数据(用户名唯一的话只会有一条)
$users = $result->fetch_all(MYSQLI_ASSOC);

if (!empty($users)) {
    $user = $users[0];
    if (password_verify($_POST['password'], $user['password'])) {
        $_SESSION['username'] = $user['username']; // 从查询结果取用户名更安全
        header('Location: index.php');
        exit; // 跳转后必须终止代码执行,避免后续逻辑干扰
    } else {
        echo "密码错误";
    }
} else {
    echo "用户名不存在";
}

额外说明

  • 如果习惯用对象格式获取数据,可以把fetch_all(MYSQLI_ASSOC)换成fetch_object(),但要注意后续访问字段的方式(比如$user->password)。
  • 跳转后必须加exit;,否则后续的echo代码可能会输出内容,导致HTTP跳转头失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 11:18:43