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

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就会直接抛出上述类型错误。

修复方案
  1. 打开项目路径下的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. 针对不同写法对应修改:
  • 如果是写法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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 05:12:19