登录提示密码错误求助:注册正常但登录失败
问题排查与解决方案
我一眼就发现了导致登录密码验证失败的核心问题——你的注册代码里,存储到数据库的哈希密码后面多了一个多余的空格,这直接让存储的密码哈希值失效,登录时自然无法通过验证。
具体问题位置
看注册代码中的插入语句:
$sql = "INSERT INTO users (user_first, user_last, user_email, user_username, user_password) VALUES('$first','$last','$email','$username','$hashed_password ')";
注意最后一个字段值'$hashed_password ',变量$hashed_password后面多了一个空格。这会导致数据库中存储的哈希字符串末尾带有一个无效空格,而你登录时用password_verify($password, $row['user_password'])验证的是原始密码和带空格的哈希,结果必然是false,所以每次都会跳转到login=incorrect password。
修复步骤
修改注册代码里的INSERT语句,去掉变量后面的空格:
$sql = "INSERT INTO users (user_first, user_last, user_email, user_username, user_password) VALUES('$first','$last','$email','$username','$hashed_password')";
修改完成后,重新注册一个测试账号,再尝试登录,密码验证应该就能正常通过了。
额外优化建议
- 避免SQL注入+减少拼接错误:建议改用预处理语句代替字符串拼接的SQL写法,既能彻底防止SQL注入风险,也能避免这类低级的字符串空格错误。比如注册部分可以改写为:
$stmt = mysqli_prepare($conn, "INSERT INTO users (user_first, user_last, user_email, user_username, user_password) VALUES(?, ?, ?, ?, ?)"); mysqli_stmt_bind_param($stmt, "sssss", $first, $last, $email, $username, $hashed_password); mysqli_stmt_execute($stmt);
- 移除不必要的Session存储:登录代码里的
$_SESSION['user_password'] = $row['user_password'];完全没必要,还会带来安全风险,建议直接删除这一行。
内容的提问来源于stack exchange,提问作者yoshik karnawat
相关产品推荐
相关产品推荐

