PHP登录功能未校验数据库信息问题排查求助
看来你这登录功能踩了好几个坑啊——先是完全跳过数据库校验直接放行,改代码的时候又搞混了SQL语句类型,还漏了定义结果变量。别急,咱们一步步把这些问题修好:
先解决核心登录逻辑问题
原始代码的最大问题是根本没去数据库验证账号密码,而且表名还和注册逻辑不匹配:
- 注册数据存在
loginsystem表,但登录查的是users表,就算想校验也查不到正确数据 - 只做了非空检查就直接设置SESSION跳转,等于任何人随便输点东西就能登录
再修复修改代码时出现的MySQLi错误
你改代码时犯了两个低级错误:
- 用了
INSERT语句而不是SELECT——登录是要查询用户数据,不是新增数据 - 没执行查询并赋值
$result就直接调用mysqli_fetch_assoc(),导致变量未定义和参数错误
正确的登录逻辑代码示例
下面是修复后的完整登录处理代码,我加了注释说明每个关键点:
// 处理登录请求(假设你已经有数据库连接$db) if (isset($_POST['login_btn'])) { // 获取表单输入,先做SQL注入防护 $username = mysqli_real_escape_string($db, trim($_POST['username'])); $password = trim($_POST['password']); // 非空校验 $errors = []; if (empty($username)) { $errors[] = "请输入用户名"; } if (empty($password)) { $errors[] = "请输入密码"; } // 没有输入错误的话,查询数据库 if (empty($errors)) { // 注意表名是loginsystem,和注册逻辑统一 $query = "SELECT id, username, password FROM loginsystem WHERE username = '$username'"; // 执行查询并把结果赋值给$result,这一步不能漏! $result = mysqli_query($db, $query); // 先检查查询是否成功,再看有没有匹配的用户 if ($result && mysqli_num_rows($result) > 0) { $user = mysqli_fetch_assoc($result); // 验证密码——这里假设你注册时用了password_hash加密密码(必须这么做!) if (password_verify($password, $user['password'])) { // 登录成功,设置SESSION $_SESSION['user_id'] = $user['id']; $_SESSION['username'] = $user['username']; $_SESSION['logged_in'] = true; header('Location: home.php'); exit(); // 跳转后一定要exit,防止后续代码执行 } else { $errors[] = "用户名或密码错误"; } } else { $errors[] = "该用户名不存在"; } } // 如果有错误,可以把$errors传递到前端显示 // 比如$_SESSION['errors'] = $errors; 然后跳回登录页显示 }
几个关键的注意事项
- 密码安全:绝对不能存明文密码!注册时一定要用
password_hash($_POST['password'], PASSWORD_DEFAULT)加密,然后登录时用上面的password_verify验证 - SQL注入防护:我用了
mysqli_real_escape_string,但更安全的是用预处理语句,比如:$stmt = $db->prepare("SELECT * FROM loginsystem WHERE username = ?"); $stmt->bind_param("s", $username); $stmt->execute(); $result = $stmt->get_result(); - 错误处理:要把
$errors数组的内容显示在登录页面,让用户知道哪里错了 - 数据库连接:确保你的
$db变量是正确初始化的(比如$db = mysqli_connect('localhost', 'user', 'pass', 'dbname');)
这样应该就能解决你的所有问题了——既实现了正确的数据库校验,也修复了MySQLi的错误提示。
内容的提问来源于stack exchange,提问作者Clout Cloud
相关产品推荐
相关产品推荐

