PHP登录功能故障排查:注册正常但登录失败,数据库连接正常
登录功能失败的问题排查与修复
核心问题分析
你的登录代码存在两个关键错误:
1. 预处理语句结果获取方式错误
使用mysqli_prepare创建的语句对象,不能直接通过$query->fetch()获取关联数组。需要先调用get_result()方法得到结果集对象,再从中取出数据行。
2. Session变量拼写错误
代码中$SESSION["user"] = $row;少了下划线,正确写法是$_SESSION["user"] = $row;,这会导致登录后Session无法正确保存用户信息。
修改后的Login.php代码
<?php require_once "config.php"; require_once "session.php"; $error = ''; if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['submit'])) { $email = trim($_POST['email']); $password = trim($_POST['password']) ; if (empty($email)) { $error .= '<p class="error">Please enter email.</p>'; } if (empty($password)) { $error .= '<p class="error">Please enter password.</p>'; } if (empty($error)){ if($query = $db->prepare("SELECT * FROM users WHERE email = ?")) { $query->bind_param('s',$email); $query->execute(); // 获取结果集对象 $result = $query->get_result(); $row = $result->fetch_assoc(); if ($row) { if (password_verify($password, $row['password'])) { $_SESSION["userid"] = $row['id']; $_SESSION["user"] = $row; header("location: index2.php"); exit; }else{ $error.= '<p class="error">The password is not valid.</p>'; } }else{ $error.= '<p class="error">Wrong mail.</p>'; } } $query->close(); } mysqli_close($db); } ?>
额外检查项
- 确认数据库中
users表的password字段长度至少为VARCHAR(255):bcrypt生成的哈希字符串长度为60,若字段过短会导致哈希值被截断,无法通过password_verify验证。 - 检查
session.php是否正确开启了Session(是否包含session_start();语句)。
内容的提问来源于stack exchange,提问作者Bernhard Alber
相关产品推荐
相关产品推荐

