PHP中rowCount()函数恒返回0、count变量输出0,无法跳转home.php问题排查
嘿,我来帮你捋捋这个头疼的问题——明明数据库里有对应的数据,但rowCount()一直返回0,输入正确的账号密码也跳不到home.php。这种情况我在开发中碰到过好多次,大概率是踩了下面几个常见的坑,咱们一个个排查:
数据库扩展的
rowCount()用法不对
首先得明确:rowCount()本质是为INSERT/UPDATE/DELETE这类修改语句设计的,用来返回受影响的行数。对于SELECT查询,不是所有数据库驱动都能让rowCount()返回正确的结果行数!比如PDO的MySQL驱动虽然支持,但官方文档明确说这是依赖驱动的行为,并不保证所有场景都可靠。
如果你是用PDO做查询,更稳妥的方式是先把结果集取出来,再用count()统计:$stmt->execute(); $results = $stmt->fetchAll(PDO::FETCH_ASSOC); $count = count($results); // 用这个代替rowCount()更靠谱要是你用的是MySQLi,那根本就没有
rowCount()方法(准确说是mysqli_stmt::rowCount只对修改语句生效),查询行数得用$result->num_rows:$result = $mysqli->query($sql); $count = $result->num_rows;SQL查询语句本身有问题,根本没查到数据
这是最常见的原因!比如:- 字段名写错了:把
username写成user_name,或者password写成pwd,数据库里根本没这个字段,自然查不到; - 大小写敏感:如果你的数据库表排序规则是
utf8_bin这类区分大小写的,输入admin但数据库里存的是Admin,就会匹配失败; - 条件逻辑错误:比如把
AND写成了OR,或者多写了一个多余的条件。
建议你把实际执行的SQL语句打印出来,直接复制到phpMyAdmin或者Navicat这类数据库客户端里跑一遍,看看能不能查到数据。比如PDO可以用echo $stmt->queryString;输出实际执行的SQL,MySQLi可以用echo $mysqli->error;查看错误信息。
- 字段名写错了:把
预处理语句的参数绑定出错
如果你用了预处理语句(这是正确的做法!),但绑定参数时出了差错,就会导致查询条件不匹配:- 占位符和绑定的变量不对应:比如SQL里写的是
:username,但绑定的时候用了:user; - 绑定的类型错误:比如把密码(字符串类型)绑定成了整数类型;
- 忘记调用
execute():没执行语句就去调用rowCount(),结果肯定是0。
举个错误的例子:
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :user AND password = :pass"); $stmt->bindParam(':username', $input_username); // 这里占位符是:user,但绑定的是:username,完全不匹配! $stmt->execute();- 占位符和绑定的变量不对应:比如SQL里写的是
字符编码不一致导致隐形不匹配
有时候你输入的账号密码看起来和数据库里的一样,但实际编码不同,导致匹配失败。比如:- 数据库表用的是
utf8mb4编码,但PHP连接数据库时设置的是utf8; - 页面的编码是
gbk,输入的字符转码后和数据库里的存储值不一致。
解决方法是在数据库连接成功后,强制设置统一的编码:
// PDO可以在DSN里加charset=utf8mb4,或者执行这条语句 $pdo->exec("SET NAMES utf8mb4"); // MySQLi的话直接调用方法 $mysqli->set_charset('utf8mb4');- 数据库表用的是
密码存储与验证的逻辑错误
这个坑也很常见:- 数据库里存的是哈希后的密码,但你直接用输入的明文密码去和哈希值做字符串匹配;
- 反过来,数据库里是明文密码,但你对输入的密码做了哈希再去匹配。
正确的做法是:存储密码时用password_hash()生成哈希值,验证时用password_verify($input_pwd, $db_pwd)来判断,而不是把密码放到WHERE条件里直接比较。
结果集被提前读取导致rowCount()失效
如果你在调用rowCount()之前,已经用fetch()或fetchAll()把结果集取完了,有些驱动下rowCount()可能会返回0(虽然PDO的MySQL驱动一般不会,但也不排除特殊情况)。这种情况下,直接用count($results)统计取到的结果数组长度就好,比依赖rowCount()靠谱得多。
你可以先从「把SQL语句拿到数据库里跑一遍」这个步骤开始排查,这能最快确定是查询语句的问题,还是PHP代码的问题。
内容的提问来源于stack exchange,提问作者Ajay Rawat

