Ajax Jquery登录success回调首次失效,刷新后正常问题排查
登录表单AJAX返回错误但刷新后生效的问题排查与修复
核心问题:PHP未输出登录结果,导致AJAX接收不到正确响应
你的login()函数仅通过return 1或return 2返回结果,但PHP函数的返回值不会自动输出到HTTP响应中。AJAX请求实际接收到的是空响应,因此resp == 1的判断不成立,直接进入错误提示分支。
修复方法:
在ajax.php中调用login()函数时,需要将返回值输出:
// 假设调用逻辑如下,添加echo输出结果 echo $your_instance->login();
或者直接修改login()函数内部,将return替换为echo:
function login(){ extract($_POST); $qry = $this->db->query("SELECT * FROM users where email = '".$email."' and password = '".$password."' "); if($qry->num_rows > 0){ foreach ($qry->fetch_array() as $key => $value) { if($key != 'password' && !is_numeric($key)) $_SESSION['login_'.$key] = $value; } echo 1; // 替换return为echo输出结果 }else{ echo 2; // 替换return为echo输出结果 } }
次要问题:jQuery按钮选择器不匹配
你的HTML中登录按钮未设置type="button",默认类型为submit,但jQuery代码里用$('#login-form button[type="button"]')选择按钮,导致无法修改按钮的禁用状态和文本。
修复方法:
修改jQuery选择器,匹配正确的按钮类型:
// 匹配submit类型按钮 $('#login-form button[type="submit"]').attr('disabled',true).html('Logging in...'); // 或者直接使用类选择器,更可靠 $('.btn.btn-light').attr('disabled',true).html('Logging in...');
严重安全问题:SQL注入与明文密码存储
- SQL注入风险:直接将用户输入的
$email和$password拼接到SQL语句中,极易遭受注入攻击,必须使用预处理语句:
// mysqli预处理示例 $stmt = $this->db->prepare("SELECT * FROM users where email = ? and password = ?"); $stmt->bind_param("ss", $email, $password); $stmt->execute(); $result = $stmt->get_result(); if($result->num_rows > 0){ // 处理登录成功逻辑 }
- 明文密码存储:数据库中直接存储明文密码是严重安全漏洞,用户注册时需用
password_hash()加密密码,登录时用password_verify()验证:
// 注册时加密密码 $hashed_password = password_hash($password, PASSWORD_DEFAULT); // 登录时验证密码 $stmt = $this->db->prepare("SELECT * FROM users where email = ?"); $stmt->bind_param("s", $email); $stmt->execute(); $user = $stmt->get_result()->fetch_assoc(); if($user && password_verify($password, $user['password'])){ // 登录成功逻辑 }
额外注意事项
确保ajax.php文件开头已调用session_start();,否则无法在AJAX请求中正确设置SESSION(虽然刷新后能登录,但主页面的SESSION无法直接复用给AJAX请求,必须单独启动)。
内容的提问来源于stack exchange,提问作者bacon gy
相关产品推荐
相关产品推荐

