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

PHP登录系统中ResetPassword.php报错:旧密码不正确

排查重置密码时“Your old password is wrong”报错的思路

嘿,从你贴的代码片段来看,这个“旧密码错误”的报错大概率出在旧密码的验证环节,我整理了几个核心排查方向:


1. 旧密码的验证逻辑压根没写

看你当前的代码,在通过email和token确认用户存在后,直接拿了$_POST['cpass']当旧密码,但完全没做旧密码和数据库里存储密码的比对啊!如果你的系统要求重置密码前必须验证旧密码,那这一步是必不可少的:

// 在$data->num_rows > 0的判断块里加上这段验证逻辑
$user = $data->fetch_assoc();
// 先从数据库取出该用户的存储密码
$stmt = $connection->prepare("SELECT password FROM users WHERE id = ?");
$stmt->bind_param("i", $user['id']);
$stmt->execute();
$stored_pass = $stmt->get_result()->fetch_assoc()['password'];

// 假设你用的是PHP推荐的password_hash加密,用password_verify验证
if (!password_verify($old_pass, $stored_pass)) {
    die("Your old password is wrong"); // 这就是你看到的报错来源
}

要是你还在明文存密码(真心不建议!),那直接用==比对也行,但赶紧换成加密存储吧。

2. 密码加密方式不匹配

如果数据库里的密码是加密过的,但你直接拿明文去比对,肯定会失败。比如:

  • 错误操作:直接用$old_pass == $stored_pass(当$stored_pass是加密字符串时)
  • 正确操作:用password_verify($old_pass, $stored_pass)(对应password_hash加密)

要是你的系统用了MD5这类过时的加密方式(同样不推荐),那得先把输入的旧密码加密后再比对:

// 仅示例,不推荐使用MD5
if (md5($old_pass) !== $stored_pass) {
    die("Your old password is wrong");
}

3. 表单字段名不匹配

检查下前端表单里,旧密码输入框的name属性是不是cpass?要是前端写的是old_password或者别的名字,那$_POST['cpass']拿到的就是空值,自然比对失败。

4. 数据库查询出了问题

确认下你查询用户密码的SQL语句有没有问题:比如字段名是不是password(有些系统可能叫user_password),有没有拼写错误导致取不到正确的存储密码?


最后提个安全建议:你的代码现在有SQL注入风险,虽然用了real_escape_string,但更稳妥的是用预处理语句操作数据库,就像我上面示例里写的那样,能彻底避免注入问题。

内容的提问来源于stack exchange,提问作者Dee Boxer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:35:52