我的首个PHP登录系统密码验证功能失效,该如何排查解决?
问题排查与修复方案
核心错误原因
- 密码校验逻辑没有正确拿到数据库存储的密码哈希值:你定义的第二个SQL查询语句
SELECT password FROM accounts WHERE username =:s中没有:pw占位符,绑定:pw到$upw的操作完全无效,同时你也没有执行这条查询、没有从结果中取出数据赋值给$upw,$upw属于未定义的空变量,所以密码校验永远返回失败 - 存在不必要的重复查询:第一次校验用户是否存在的查询已经可以同时取出密码哈希值,不需要二次请求数据库
- 注意事项:请确认你
accounts表的password字段存储的是通过PHP原生password_hash()函数生成的标准哈希值,而非明文密码,否则password_verify()无法正常工作;session_start()建议放在代码最顶部,避免提前输出内容导致会话初始化报错
修复后可运行的PHP代码
<?php // 会话初始化放在代码最顶部 session_start(); $user = $_POST['namex']; $inputpass = $_POST["pwx"]; $host = "localhost"; $username = "root"; $password = ""; $dbname = "mydb"; // 新增charset配置避免编码问题 $db = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $username, $password); // 一次查询同时完成用户存在校验和密码哈希获取 $stmt = $db->prepare("SELECT password FROM accounts WHERE username = :s"); $stmt->bindParam(':s', $user); $stmt->execute(); if($stmt->rowCount() == 1) { // 取出数据库存储的密码哈希 $userInfo = $stmt->fetch(PDO::FETCH_ASSOC); $upw = $userInfo['password']; if(password_verify($inputpass, $upw)){ $_SESSION["namex"] = $user; echo "Youre logged in"; // header("Location:loggedin.php"); exit; } else { echo "Password incorrect!"; } } else{ echo "This Account doesnt exists!"; } ?>
内容的提问来源于stack exchange,提问作者DirtyyyDan
相关产品推荐
相关产品推荐

