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

password_verify()报未定义常量错误,PHP登录密码验证求助

问题排查与修复方案

咱们先拆解你遇到的几个核心问题,一步步把它搞定:

1. password_verify的用法完全搞错了

password_verify()的核心作用是验证用户输入的原始密码和数据库中存储的哈希值是否匹配,它的参数顺序是固定的:

password_verify(用户输入的原始密码, 数据库中取出的哈希密码);

它返回的是布尔值(true/false),不是生成哈希,更不能把PASSWORD_DEFAULT当第二个参数丢进去——PASSWORD_DEFAULT是给password_hash()用的哈希算法标识,不是密码哈希值。你之前的写法不仅参数顺序搞反,还误用了常量,这直接触发了未定义常量的错误。

2. 登录逻辑的核心错误

你原来想把password_verify的结果当成密码去查数据库,这完全不符合逻辑。正确的登录流程应该是:

  • 先根据用户名从数据库取出对应的用户记录(重点是存储的哈希密码)
  • 再用password_verify对比用户输入的密码和这个哈希值
  • 根据验证结果判断是否登录成功

3. 语法错误导致代码执行顺序混乱

看你登录部分的代码:

if (count($errors) == 0)
$password = password_verify($password, PASSWORD_DEFAULT);
{
    // ... 查询数据库的代码
}

这里的if后面没有加大括号,导致$password = ...是if的唯一执行语句,而后面的大段代码不管错误数量是否为0都会执行,逻辑完全乱了。


修复后的完整登录代码片段

把登录部分的代码改成下面这样:

// LOGIN USER
if (isset($_POST['login_user'])) {
    $username = mysqli_real_escape_string($db, $_POST['username']);
    $input_password = mysqli_real_escape_string($db, $_POST['password_1']); // 重命名变量避免混淆
    $errors = array(); // 重置错误数组
    if (empty($username)) { array_push($errors, "Username is required"); }
    if (empty($input_password)) { array_push($errors, "Password is required"); }

    if (count($errors) == 0) {
        // 第一步:先根据用户名查询用户的哈希密码
        $query = "SELECT password FROM loginsystem WHERE username='$username' LIMIT 1";
        $results = mysqli_query($db, $query);
        
        if (mysqli_num_rows($results) == 1) {
            // 取出数据库中存储的哈希密码
            $user = mysqli_fetch_assoc($results);
            $stored_hash = $user['password'];
            
            // 第二步:用password_verify验证输入密码和哈希是否匹配
            if (password_verify($input_password, $stored_hash)) {
                // 验证成功,设置会话并跳转
                $_SESSION['username'] = $username;
                $_SESSION['success'] = "You are now logged in";
                header('location: index.php');
                exit; // 跳转后一定要exit,避免后续代码继续执行
            } else {
                array_push($errors, "Wrong username/password combination");
            }
        } else {
            array_push($errors, "Wrong username/password combination");
        }
    }
}

额外优化建议

  • 变量命名:把用户输入的密码改成$input_password,和数据库的哈希密码明确区分,避免混淆
  • 跳转安全:调用header('location: ...')之后必须加exit;,防止脚本执行后续无关代码
  • 安全升级:虽然你用了mysqli_real_escape_string,但更安全的方式是使用预处理语句,彻底规避SQL注入风险
  • 隐私保护:不要区分“用户名不存在”和“密码错误”,统一提示“用户名/密码错误”,防止攻击者枚举有效用户名

内容的提问来源于stack exchange,提问作者Clout Cloud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:06:30