PHP向Ajax JS文件发送响应为空,登录错误传递失败
问题描述
我尝试在登录流程中,将用户可能遇到的错误类型字符串从login.php传递至signin.ajax.js,以便根据错误类型调整URL,但始终得到空响应。已尝试添加控制台日志、try-catch块调试,问题仍未解决。
相关代码
login.php
<?php if (isset($_POST['signin'])) { $data = json_decode(file_get_contents("php://input")); $name = $data->username; $password = $data->password; // 实例化LoginContr类 include '../classes/LoginController.class.php'; $login = new LoginController($name, $password); // 执行错误处理和用户处理 $login->loginUser(); if ($login->getError()) { $response = ['error' => $login->getError()]; } else { $response = ['success' => 'Logged in successfully']; } header('Content-Type: application/json'); echo json_encode($response); }
signin.ajax.js
const loginButton = document.getElementById("login"); loginButton.addEventListener('click', loginUser); function loginUser(e) { e.preventDefault(); let username = document.getElementById("login-username").value; let password = document.getElementById("login-password").value; let loginParams = { "username": username, "password": password } let jsonString = JSON.stringify(loginParams); let xhr = new XMLHttpRequest(); xhr.open("POST", "../includes/login.php", true); xhr.setRequestHeader("Content-type", "application/json"); xhr.onload = function () { if (xhr.status === 200) { let response; try { // 解析前检查响应是否非空 if (xhr.responseText.trim() !== "") { response = JSON.parse(xhr.responseText); } else { console.log("Empty response"); return; } } catch (error) { console.log("Error parsing JSON:", error); return; } if (response.error) { // 处理错误 window.location.href = "../pages/loginRegister.page.php?error=" + encodeURIComponent(response.error); } else if (response.success) { // 登录成功 window.location.href = "../pages/loginRegister.page.php"; } else { console.log("Unknown response format"); } } else { console.error("Request failed. Status: " + xhr.status); } }; xhr.send(jsonString); }
LoginController.class.php
<?php include 'LoginModel.class.php'; class LoginController extends LoginModel { private $name; private $password; private $error; public function __construct($name, $password) { $this->name = $name; $this->password = $password; $this->error = null; } public function loginUser(){ if($this->emptyInputUsernameAndPassword() == false) { $this->error = 'emptyInputUsernameAndPassword'; } if($this->emptyInputUsername() == false){ $this->error = 'emptyInputUsername'; } if($this->emptyInputPassword() == false) { $this->error = 'emptyInputPassword'; } $this->getUser($this->name, $this->password); } private function emptyInputUsername() { if (empty($this->name)) { $result = false; } else { $result = true; } return $result; } private function emptyInputPassword() { if (empty($this->password)) { $result = false; } else { $result = true; } return $result; } private function emptyInputUsernameAndPassword() { if (empty($this->name) && empty($this->password)) { $result = false; } else { $result = true; } return $result; } public function getError() { return $this->error; } }
解决方案
1. 修复login.php的请求判断逻辑
前端用JSON格式发送请求,$_POST数组中不会存在signin字段,导致整个代码块未执行,返回空响应。修改判断逻辑:
<?php // 检查是否为POST请求且有JSON数据 if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty(file_get_contents("php://input"))) { $data = json_decode(file_get_contents("php://input")); // 添加JSON解析失败的处理 if (json_last_error() !== JSON_ERROR_NONE) { header('Content-Type: application/json'); echo json_encode(['error' => 'invalid_json']); exit; } // 确保$data->username和$data->password存在 if (!isset($data->username) || !isset($data->password)) { header('Content-Type: application/json'); echo json_encode(['error' => 'missing_fields']); exit; } $name = $data->username; $password = $data->password; include '../classes/LoginController.class.php'; $login = new LoginController($name, $password); $login->loginUser(); if ($login->getError()) { $response = ['error' => $login->getError()]; } else { $response = ['success' => 'Logged in successfully']; } header('Content-Type: application/json'); echo json_encode($response); }
2. 修复LoginController的错误覆盖问题
原代码中多个if会覆盖error值,比如用户名和密码都为空时,最后一个if会把错误改成emptyInputPassword,改用else if按优先级判断:
public function loginUser(){ if($this->emptyInputUsernameAndPassword() == false) { $this->error = 'emptyInputUsernameAndPassword'; } else if($this->emptyInputUsername() == false){ $this->error = 'emptyInputUsername'; } else if($this->emptyInputPassword() == false) { $this->error = 'emptyInputPassword'; } // 只有没有错误时才执行登录逻辑 if (!$this->error) { $this->getUser($this->name, $this->password); } }
3. 可选:优化前端调试
在xhr.onerror和xhr.onprogress添加日志,排查请求是否发送成功:
xhr.onerror = function() { console.error("Network error occurred"); }; xhr.onprogress = function(event) { console.log("Received bytes:", event.loaded); };
内容的提问来源于stack exchange,提问作者Mjbr
相关产品推荐
相关产品推荐

