You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 05:41:00