PHP+MySQL+JSON登录验证查询功能异常求助
问题排查与修复方案
嘿,作为PHP新手遇到这个问题很正常,我帮你拆解下代码里的关键问题,一步步帮你修复:
1. PHP代码中的核心错误
你的connection-login.php里有两个致命逻辑问题,还有严重的安全隐患:
- 重复调用
mysqli_fetch_assoc且参数错误:你先执行$result = mysqli_fetch_assoc($qry);把查询结果的第一行取成了数组,接着又用$row = mysqli_fetch_assoc($result);——这里参数应该是原始查询结果集$qry,而且第一次fetch后结果集已经被耗尽,第二次肯定拿不到数据。 - 错误的结果判断逻辑:用
$row != 0判断登录是否成功完全不对,应该检查查询是否返回了匹配的行。 - SQL注入风险:直接把用户输入的账号密码拼进SQL语句,恶意用户能轻松篡改你的数据库,必须用预处理语句解决。
修复后的connection-login.php
<?php // 初始化响应数组 $response = []; $con = new mysqli("localhost", "root", "root", "solucionar_manutencoes_db"); // 检查数据库连接错误 if (mysqli_connect_errno()) { $response["error"] = "数据库连接失败: " . mysqli_connect_error(); echo json_encode($response); exit; } // 使用预处理语句彻底避免SQL注入 $lg_user = $_GET['user']; $lg_password = $_GET['pass']; // 准备带占位符的SQL语句 $stmt = $con->prepare("SELECT * FROM tb_login WHERE lg_user = ? AND lg_password = ?"); // 绑定参数(ss表示两个参数都是字符串类型) $stmt->bind_param("ss", $lg_user, $lg_password); // 执行查询 $stmt->execute(); // 获取结果集 $result = $stmt->get_result(); // 判断是否有匹配的用户 if ($result->num_rows > 0) { $response["success"] = 1; // 可选:返回用户信息,比如 $response["user"] = $result->fetch_assoc(); } else { $response["failed"] = 0; $response["message"] = "用户名或密码错误"; } // 清理资源 $stmt->close(); $con->close(); // 返回JSON响应 echo json_encode($response); ?>
2. JavaScript代码中的问题
你的JS没有阻止表单的默认提交行为,点击登录按钮后浏览器会自动刷新页面,AJAX请求还没完成就被中断了,必须添加e.preventDefault();来阻止默认跳转。
修复后的login.js
$(document).ready(function(){ $('#errorLogin').hide(); $('#formLogin').submit(function(e){ // 阻止表单默认提交,避免页面刷新 e.preventDefault(); var username=$('#inputUser').val(); var password=$('#inputPassword').val(); $.ajax({ type:'get', dataType: 'json', url: 'dist/php/connection-login.php', data: { user: username, pass: password }, success: function(response){ console.log(response); // 这里可以添加登录成功/失败的前端逻辑 if (response.success === 1) { // 比如跳转到主页:window.location.href = "home.php"; } else { $('#errorLogin').text(response.message).show(); } }, error: function(xhr, status, error) { // 处理请求失败的情况 console.error("请求出错:", error); $('#errorLogin').text("登录请求失败,请稍后重试").show(); } }); }); });
额外的重要建议
- 密码存储要加密:现在你是明文存密码,这极度不安全!注册用户时用
password_hash($password, PASSWORD_DEFAULT)生成哈希值存储,登录时查询到用户后用password_verify($lg_password, $user['lg_password'])来验证密码。 - 改用POST请求:登录请求建议用POST而不是GET,因为GET参数会暴露在URL里,密码会被记录在浏览器历史或服务器日志中——只需要把JS里的
type:'get'改成type:'post',PHP里用$_POST['user']和$_POST['pass']获取参数即可。
内容的提问来源于stack exchange,提问作者thatsadkatyperrymeme
相关产品推荐
相关产品推荐

