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

我的首个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 07:51:00