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
相关产品推荐
相关产品推荐

