php返回json给ajax需设header('content-type: application/json; charset=utf-8')、禁用错误显示、清理不可序列化数据、避免bom,前端须处理http状态与json解析异常。

PHP 返回 JSON 给 AJAX,关键不是“怎么 echo 一个 json_encode()”,而是确保 HTTP 响应头、编码、错误处理和前端解析全部对齐。很多问题其实出在 header 没设、中文乱码、或 PHP 报错混在 JSON 里。
必须设置 Content-Type: application/json
否则 jQuery 的 dataType: 'json' 或 fetch().json() 会失败或静默降级为字符串;浏览器开发者工具 Network 标签页里 Response Type 显示为 “document” 就是典型信号。
- 用
header('Content-Type: application/json; charset=utf-8');,charset=utf-8不能省,尤其含中文时 - 这行必须在任何输出(包括空格、BOM、
echo、var_dump)之前调用,否则报 “headers already sent” - 如果用了框架(如 Laravel、ThinkPHP),通常有现成的
response()->json()或$this->success(),它们内部已封装 header
json_encode() 前要清理数据和错误
常见现象:AJAX 收到的 response 是 null 或解析失败,但 Network 里看响应体像 JSON——大概率是 PHP 错误信息(如 Notice、Warning)被提前输出,导致 JSON 结构损坏。
- 开发期打开
error_reporting(0);或ini_set('display_errors', '0');,避免错误直接打到响应体 - 检查数组是否含资源(如
mysqli_result)、不可序列化对象,json_encode()会返回 false;可用json_last_error_msg()排查 - 中文字段显示为
\uXXXX?加JSON_UNESCAPED_UNICODE参数:json_encode($data, JSON_UNESCAPED_UNICODE)
AJAX 端必须匹配响应格式和错误逻辑
很多人只写 success 回调,忽略 HTTP 状态码非 200 或 JSON 解析失败的兜底。
立即学习“PHP免费学习笔记(深入)”;
- jQuery 示例:
$.ajax({ url: 'api.php', dataType: 'json', error: function(xhr) { console.log(xhr.status, xhr.responseText); } })——xhr.responseText能看到原始响应,比单纯弹 alert('error') 有用得多 - 原生 fetch 更需注意:
response.ok判断 HTTP 状态,await response.json()才真正解析,且它抛异常,要用 try/catch - 后端不要靠
die(json_encode(...))终止流程,而应统一 exit 前输出标准结构,比如['code'=>0, 'msg'=>'ok', 'data'=>[...]]
最常被忽略的是 BOM 头:UTF-8 文件开头的 3 字节 EF BB BF 会被当普通字符输出,紧贴在 JSON 前,导致前端解析失败。用编辑器(如 VS Code)确认文件编码为 “UTF-8 无 BOM”,或用 hexdump -C api.php | head 检查。











