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

PHP MySQL中PDO的rowCount()为何始终返回0?登录系统求助

问题分析与解决方案

核心错误原因

你在密码验证通过后,又执行了一次查询(不管是SELECT *还是SELECT count(*)版本),这里的$pwd是用户输入的明文密码,但数据库里存储的是哈希后的密码,所以这个查询永远匹配不到数据,导致rowCount()或fetchColumn()返回0——这就是问题的根源。

完整修正方案

既然已经通过password_verify验证了密码正确性,完全不需要执行第二次查询,直接用第一次查询获取的用户数据即可,简化后的逻辑如下:

// 1. 根据用户名查询用户数据(仅需一次查询)
$stmt = $this->connect()->prepare('SELECT * FROM accounts WHERE username = ?;');
if(!$stmt->execute(array($uname))){
    $stmt = null;
    header("Location: ../login.php?error=statement_failed");
    exit();
}

// 检查用户是否存在
$user = $stmt->fetchAll(PDO::FETCH_ASSOC);
if(empty($user)){
    $stmt = null;
    header("Location: ../login.php?error=user_not_found");
    exit();
}

// 2. 验证密码
$checkPwd = password_verify($pwd, $user[0]["password"]);
if($checkPwd === false){
    $stmt = null;
    header("Location: ../login.php?error=incorrect_password");
    exit();
}

// 3. 验证通过,创建会话与Cookie
session_start();
$_SESSION['id'] = $user[0]['id'];
$_SESSION['username'] = $user[0]['username'];
$_SESSION['user_type'] = $user[0]['user_type'];

setcookie('uname', $uname, time()+60*60*24*30, "/");
$stmt = null;

额外优化提示

  • 避免重复查询:仅通过用户名查询一次,既可以验证用户存在性,又能获取哈希密码做验证,完全不需要二次查询。
  • 安全原则:永远不要用明文密码去数据库做匹配,这是登录系统的基础安全要求。
  • 代码精简:去掉冗余的分支判断,让逻辑更清晰易懂。

内容的提问来源于stack exchange,提问作者Programming is life

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 10:10:28