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

PHP登录脚本异常:始终返回登录失败,求排查修复

登录失败问题的解决方案

我仔细看了你的代码,发现几个关键问题导致即使输入正确的账号密码也无法登录,下面逐个分析并给出修复方案:

1. 前端JavaScript未获取输入框的实际值

你的JS代码里只获取了输入框的DOM元素,没有拿到用户输入的内容:

var e = document.getElementById("log_email");
var p = document.getElementById("log_password");

应该改为获取元素的value属性,才能拿到用户输入的邮箱和密码:

var e = document.getElementById("log_email").value;
var p = document.getElementById("log_password").value;

不然你传给后端的是DOM元素对象,而非实际输入内容,后端自然无法匹配验证。

2. 后端密码验证逻辑错误

你当前的做法是对用户输入的密码重新哈希,再和数据库里的哈希值直接比较:

$p_hash = password_hash($p, PASSWORD_DEFAULT);
// ...
if($p_hash != $db_pass_str){
    echo "login_failed";
    exit();
}

但password_hash()每次生成的哈希值都是不同的(会自动生成随机盐),所以即使密码正确,这个比较也永远不相等。正确的做法是使用专门的验证函数password_verify():

// 移除这行无效的哈希代码:$p_hash = password_hash($p, PASSWORD_DEFAULT);
// ...
if(!password_verify($p, $db_pass_str)){
    echo "login_failed";
    exit();
}

这个函数会自动处理哈希中的盐值,正确验证密码是否匹配数据库存储的哈希值。

3. 一处废弃的MySQL函数调用

在重新激活账号的代码里,你使用了已经废弃的mysql_query()函数:

$account_reopen = mysql_query($db_con, "UPDATE users SET user_closed='no' WHERE email='$e'");

应该统一使用mysqli系列函数:

$account_reopen = mysqli_query($db_con, "UPDATE users SET user_closed='no' WHERE email='$e'");

否则这部分代码会报错,中断后续的会话设置流程。

额外优化建议

  • 后端查询数据库后,先检查是否查到有效用户:比如if(mysqli_num_rows($login_query) === 0),如果没查到直接返回登录失败,避免后续访问$row属性时出现警告。
  • 前端可以给输入值添加.trim(),避免用户输入前后空格导致的验证失败:var e = document.getElementById("log_email").value.trim();

修复这些问题后,你的登录功能应该就能正常工作,正确跳转到index.php了。

内容的提问来源于stack exchange,提问作者Aman Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:01:35