PHP中如何将register函数的$passHash传入login函数以使用password_verify
问题分析与解决方案
你的核心问题出在登录函数的SQL查询逻辑错误,根本不需要把register里的$passHash传到login——注册时哈希值已经存在数据库里了,只是你登录时的查询方式不对,导致拿不到正确的哈希值去验证。
错误原因
你当前的login SQL语句是SELECT * FROM UserData WHERE userEmail=? AND userPassword=?,这里直接用用户输入的明文密码$passUser和数据库里的哈希密码比对,肯定匹配不上,因为password_hash生成的哈希每次都不一样,不可能和明文相等,所以查询结果为空,后续的password_verify自然也无法正常工作。
修正后的Login函数代码
public function login($emailUser, $passUser) { // 只根据邮箱查询用户,不涉及密码比对 $sqlQuery = "SELECT * FROM UserData WHERE userEmail=?"; $stmt = $this->db->prepare($sqlQuery); $stmt->execute([$emailUser]); $result = $stmt->fetch(PDO::FETCH_ASSOC); // 先判断用户是否存在 if (!$result) { echo "用户不存在"; return; } // 用数据库里的哈希值验证用户输入的明文密码 $checkPassword = password_verify($passUser, $result["userPassword"]); if ($checkPassword) { echo "登录成功"; } else { echo "密码错误"; } }
关键改动说明
- 调整SQL查询,只通过邮箱获取用户信息,避免提前用明文和哈希比对
- 先判断查询结果是否为空,确认用户是否存在
- 拿到数据库中存储的哈希密码后,再用
password_verify验证用户输入的明文密码,这才是正确的验证流程
额外提示
- 注册函数的逻辑是对的,
password_hash生成的哈希值已经正确存入数据库,不需要改动 - 不要试图直接比对明文密码和哈希值,必须用
password_verify,因为哈希算法是加盐的,每次生成的哈希字符串都不同,但password_verify能正确验证明文和哈希的对应关系
内容的提问来源于stack exchange,提问作者Majkelele
相关产品推荐
相关产品推荐

