PHP登录系统输错账号密码触发count()致命错误求解
问题描述
在XAMPP环境部署php-login-simple-master简易登录系统时,输入正确账号密码可正常登录,输入错误用户名或密码时页面抛出如下致命错误:
Fatal error: Uncaught TypeError: count(): Argument #1 ($value) must be of type Countable|array, bool given in D:\xampp\htdocs\ss\php-login-simple-master\php-login-simple-master\login.php:18 Stack trace: #0 {main} thrown in D:\xampp\htdocs\ss\php-login-simple-master\php-login-simple-master\login.php on line 18
错误触发位置为login.php文件第18行。
报错原因
这是PHP 8+版本的兼容性问题:
该开源项目代码编写时间较早,默认数据库查询操作一定会返回数组/结果集对象,但当输入错误账号密码时,数据库查询没有匹配到对应记录,会直接返回布尔值false。PHP 8.0及以上版本对count()函数做了严格类型限制,要求传入参数必须是数组或者实现了Countable接口的类型,传入布尔值false就会直接抛出上述类型错误。
修复方案
- 打开项目路径下的
login.php文件,定位到第18行,原错误代码通常为以下两种形式之一:
// 写法1:直接对查询返回结果做count if (count($db->query("SELECT * FROM users WHERE username = '$username' AND password = '$password'")) == 1) { // 登录成功逻辑 } // 写法2:取结果集后直接count数组 $login_result = $db->query("SELECT * FROM users WHERE username = '$username' AND password = '$password'"); $user_data = $login_result->fetchAll(); if (count($user_data) == 1) { // 登录成功逻辑 }
- 针对不同写法对应修改:
- 如果是写法1:不要直接对查询结果调用
count(),先判断查询是否成功,再通过结果集的num_rows属性获取匹配行数,修改后代码如下:
// 拼接SQL时增加转义,避免SQL注入 $safe_username = $db->real_escape_string($username); $safe_password = $db->real_escape_string($password); $login_result = $db->query("SELECT * FROM users WHERE username = '$safe_username' AND password = '$safe_password'"); // 先判断查询未出错,且匹配到1条用户记录 if ($login_result && $login_result->num_rows == 1) { $user = $login_result->fetch_assoc(); // 后续原有登录成功逻辑,比如存session、跳转首页等 } else { // 原有登录失败逻辑,比如输出"用户名或密码错误"提示 }
- 如果是写法2:在调用
count()前先判断变量是否为数组,修改后代码如下:
$login_result = $db->query("SELECT * FROM users WHERE username = '$username' AND password = '$password'"); $user_data = $login_result ? $login_result->fetchAll() : []; if (is_array($user_data) && count($user_data) == 1) { // 后续原有登录成功逻辑 } else { // 原有登录失败逻辑 }
优化建议
- 原项目代码直接拼接用户输入到SQL语句,存在SQL注入风险,修复时建议改用PDO或mysqli预处理语句实现查询,不要直接拼接参数。
- 原项目默认明文存储密码,不建议直接在生产环境使用,建议改用
password_hash()做密码哈希存储,登录时用password_verify()校验密码。
内容的提问来源于stack exchange,提问作者abdiel
相关产品推荐
相关产品推荐

