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

PHP通过echo json_encode向AJAX传递数组无数据显示问题求助

解决PHP返回JSON给AJAX后前端无输出的问题

嘿,我帮你梳理一下可能导致这个问题的原因,咱们一步步来排查:

先确认AJAX请求是否真的成功

你现在只写了success回调,但如果请求本身出错(比如后端500错误、文件找不到、跨域),你根本看不到任何日志。先给AJAX补全error和complete回调,再加上dataType: 'json'让jQuery自动解析JSON:

var scard = $('#cardid').val();
$.ajax({
    type: 'GET',
    url: 'cardapi.php?scard=' + scard,
    dataType: 'json', // 让jQuery自动处理JSON解析,不用手动调用$.parseJSON
    success: function (data) {
        console.log('拿到的数据:', data);
        if (data.length === 0) {
            console.log('没有匹配的记录哦');
        }
    },
    error: function(xhr, status, error) {
        console.log('请求出错啦!');
        console.log('状态码:', xhr.status);
        console.log('错误信息:', error);
        console.log('后端返回的内容:', xhr.responseText); // 重点看这个,能直接看到后端的问题
    },
    complete: function(xhr) {
        console.log('请求完成,状态码:', xhr.status);
    }
});

检查PHP后端的输出是否合规

后端的任何额外输出(比如空格、警告、错误信息)都会破坏JSON格式,导致前端解析失败。咱们优化一下PHP代码:

1. 开启错误排查+避免多余输出

<?php
// 开发环境开启错误提示,方便找问题
error_reporting(E_ALL);
ini_set('display_errors', 1);
// 清空输出缓冲区,防止之前的空格/BOM头破坏JSON
ob_start();

// 先确认数据库连接是否正常
if (!$conn) {
    die(json_encode(['error' => '数据库连接失败:' . print_r(sqlsrv_errors(), true)]));
}

if (isset($_GET["scard"])) {
    $scard = $_GET["scard"];
    // !!!重要:避免SQL注入,一定要用参数化查询!!!
    $sql = "SELECT * FROM training_record WHERE cardref_no = ?";
    $params = [$scard];
    $q = sqlsrv_query($conn, $sql, $params);

    // 检查查询是否成功
    if (!$q) {
        die(json_encode(['error' => '查询失败:' . print_r(sqlsrv_errors(), true)]));
    }

    $data = [];
    while ($rw = sqlsrv_fetch_array($q, SQLSRV_FETCH_ASSOC)) {
        $data[] = [
            "employee_no" => $rw["employee_no"],
            "dept_id" => $rw["dept_id"],
            "name_th" => $rw["name_th"],
            "surname_th" => $rw["surname_th"],
            "signed_status" => 1,
        ];
    }

    // 清空缓冲区,确保没有多余输出
    ob_clean();
    // 设置正确的响应头,告诉浏览器这是JSON数据
    header('Content-Type: application/json; charset=utf-8');
    // 用JSON_UNESCAPED_UNICODE避免中文转义,更友好
    $jsonData = json_encode($data, JSON_UNESCAPED_UNICODE);
    // 检查JSON编码是否成功
    if ($jsonData === false) {
        die(json_encode(['error' => 'JSON编码失败:' . json_last_error_msg()]));
    }
    echo $jsonData;
    exit;
} else {
    ob_clean();
    header('Content-Type: application/json; charset=utf-8');
    echo json_encode(['error' => '缺少scard参数']);
    exit;
}
?>

这里几个关键优化点:

  • 参数化查询:直接把用户输入拼进SQL会有严重的注入风险,必须用占位符?和参数数组来处理。
  • 响应头设置:明确告诉浏览器返回的是UTF-8编码的JSON,避免解析混乱。
  • JSON编码检查:json_encode可能因为非UTF-8字符失败,加上检查能直接看到错误原因。
  • 清空缓冲区:防止PHP文件开头的空格、BOM头或者警告信息破坏JSON结构。

用浏览器Network面板抓包排查

打开浏览器F12开发者工具,切换到Network标签,找到你的cardapi.php请求,查看:

  • Status:如果是500,说明PHP有错误;404是文件路径错了;200才是正常。
  • Response:直接看后端返回的内容,如果是错误信息或者格式不对的JSON,就能一眼发现问题。
  • Request URL:确认scard参数有没有正确传进去。

其他可能的坑

  • 跨域问题:如果前端页面和cardapi.php不在同一个域名/端口,需要在PHP开头加跨域头:
    header("Access-Control-Allow-Origin: *"); // 开发环境可用,生产环境要指定具体域名
    
  • 无匹配数据:如果数据库里没有对应scard的记录,$data会是空数组,json_encode返回[],这时候console.log会输出空数组,看起来像“没内容”,其实是正常的,可以在success里判断一下。

按照这些步骤排查,应该能很快找到问题所在~

内容的提问来源于stack exchange,提问作者Meawmill

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 22:07:28