使用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
相关产品推荐
相关产品推荐

