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
相关产品推荐
相关产品推荐

