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

使用AJAX从PHP返回JSON数据时多结果行解析失败

问题分析

你遇到的核心问题是输出了多个独立的JSON数组,而非一个合法的JSON结构。当查询返回多行时,你的PHP代码在每次循环里都执行echo json_encode($data);,导致最终输出是两个JSON数组直接拼接(比如[...][...]),这不符合JSON语法规范——JSON要求顶层只能是一个对象或数组,所以JavaScript的dataType:'json'会无法解析这种格式,尽管直接访问PHP脚本能看到内容,但它不是有效的JSON。

解决方案

修正PHP代码,先把所有行的数据收集到一个大数组里,最后一次性输出整个数组的JSON编码结果,同时添加正确的响应头:

<?php
require 'login.php';
// 设置JSON响应头,确保浏览器正确识别内容类型
header('Content-Type: application/json; charset=utf-8');

$connection = new mysqli($host, $user, $pword, $database, 3306);
// 检查数据库连接错误
if ($connection->connect_error) {
    // 输出错误信息的JSON格式,避免破坏响应结构
    echo json_encode(['error' => '数据库连接失败: ' . $connection->connect_error]);
    exit;
}

$insertquery = $connection->prepare("SELECT tracking_type, tracking_change_date, vessel_fcm_new, vessel_hull_id_new, vessel_name_new, vessel_length_new, vessel_manufacturer_new, vessel_manufacturer_id_new, vessel_year_new, vessel_value_new, owner_id_new, loss_payee_id_new, policy_id_new, policy_start_date_new, policy_end_date_new FROM tracking WHERE tracking_type = ?");
$insertquery->bind_param("i", $trackingtype);
$trackingtype = 1; // 这里可以替换为$_POST['value'],注意做参数校验

if (!$insertquery->execute()) {
    echo json_encode(['error' => '查询执行失败: ' . $insertquery->error]);
    exit;
}

$insertquery->bind_result($tracking_type, $tracking_change_date, $vessel_fcm_new, $vessel_hull_id_new, $vessel_name_new, $vessel_length_new, $vessel_manufacturer_new, $vessel_manufacturer_id_new, $vessel_year_new, $vessel_value_new, $owner_id_new, $loss_payee_id_new, $policy_id_new, $policy_start_date_new, $policy_end_date_new);

// 创建一个空数组,用来存储所有行的数据
$results = [];
while ($insertquery->fetch()){
    $data = array(
        $tracking_type, 
        $tracking_change_date, 
        $vessel_fcm_new, 
        $vessel_hull_id_new, 
        $vessel_name_new, 
        $vessel_length_new, 
        $vessel_manufacturer_new, 
        $vessel_manufacturer_id_new, 
        $vessel_year_new, 
        $vessel_value_new, 
        $owner_id_new, 
        $loss_payee_id_new, 
        $policy_id_new, 
        $policy_start_date_new, 
        $policy_end_date_new
    );
    // 将当前行的数据添加到大数组中
    $results[] = $data;
}

// 一次性输出整个大数组的JSON编码结果
echo json_encode($results);

// 关闭查询和连接
$insertquery->close();
$connection->close();
?>
额外建议
  • 当使用$_POST['value']时,建议先做参数校验(比如检查是否存在、是否为合法整数),避免SQL注入风险(虽然你用了预处理语句,但参数校验能提升健壮性)。
  • 添加错误处理逻辑(比如连接失败、查询执行失败),这样前端能收到明确的错误信息,便于调试。
  • 可以考虑将每行数据改为关联数组(用字段名作为键),这样前端处理数据时更直观,比如:
    $data = [
        'tracking_type' => $tracking_type,
        'tracking_change_date' => $tracking_change_date,
        // ...其他字段
    ];
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:13:51