实现用户登录时遇致命错误:Call to a member function fetchAll() on bool
解决「Call to a member function fetchAll() on bool」登录错误
这个错误的核心原因很明确:你把$stmt->execute()的返回值当成了查询结果集,但实际上它只返回布尔值(执行成功返回true,失败返回false),自然没法调用fetchAll()方法。
修复步骤
获取正确的结果集对象
执行预处理语句后,必须通过$stmt->get_result()方法拿到mysqli_result对象,这个对象才支持fetch_all()、fetch_assoc()等获取数据的方法。补充错误检查(可选但推荐)
增加对预处理、语句执行环节的错误检查,能快速定位问题,避免后续无意义的报错。修正变量未定义问题
原代码中$_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
相关产品推荐
相关产品推荐

