PHP接收AJAX JSON数据需用file_get_contents('php://input')读取原始体再json_decode;若要直接用$_POST,前端须发application/x-www-form-urlencoded格式。

PHP后端如何接收AJAX发送的JSON数据
AJAX前端发来的Content-Type: application/json请求,PHP默认不解析$_POST——因为php://input才是原始JSON体的唯一入口。
常见错误现象:$_POST为空、json_decode($_POST)报错、file_get_contents('php://input')返回空字符串(通常因前端没设Content-Type或用了FormData)。
- 先检查前端是否明确设置了
headers: {'Content-Type': 'application/json'} - 后端用
$raw = file_get_contents('php://input');读取原始体,再json_decode($raw, true) - 若
$raw为空但请求确实发出了,大概率是前端误用了FormData(它会自动设multipart/form-data,此时应改用$_POST)
用fetch发POST请求时,PHP为什么收不到$_POST参数
因为fetch默认不带Content-Type头,且发送JSON.stringify()后,PHP只在application/x-www-form-urlencoded或multipart/form-data下才填充$_POST。
使用场景:想继续用$_POST['name']直接取值,而非手动解析JSON。
立即学习“PHP免费学习笔记(深入)”;
- 前端改用
URLSearchParams构造表单数据:fetch('/api.php', { method: 'POST', body: new URLSearchParams({ name: 'alice' }) }) - 或手动加头:
headers: {'Content-Type': 'application/x-www-form-urlencoded'},再传name=alice&age=25字符串 - 避免混用:不要
JSON.stringify()+application/x-www-form-urlencoded,这会导致PHP收到乱码键名
XMLHttpRequest与fetch在PHP交互中的关键区别
区别不在PHP侧,而在前端如何触发PHP的解析逻辑——XMLHttpRequest容易被jQuery等库自动补全Content-Type,fetch则完全裸露,需手动控制。
性能影响几乎为零;兼容性上,XMLHttpRequest支持IE8+,fetch需polyfill(如whatwg-fetch)。
- jQuery的
$.post()默认发application/x-www-form-urlencoded,PHP能直接读$_POST -
fetch发application/json时,PHP必须走php://input;发application/x-www-form-urlencoded时,$_POST才可用 - 跨域场景下,若后端没配
Access-Control-Allow-Headers,自定义Content-Type会触发预检(OPTIONS),而application/x-www-form-urlencoded通常免预检
PHP返回JSON给AJAX时,为什么前端response.json()报错
根本原因:PHP输出了非JSON内容(如警告、BOM头、echo调试语句、多余空白),导致JSON结构损坏。
最容易被忽略的地方:PHP文件开头有UTF-8 BOM,或error_reporting(E_ALL)开启后触发了notice,PHP把warning直接打到响应体里。
- 务必在
json_encode()前调用header('Content-Type: application/json; charset=utf-8'); - 确保无任何
echo、var_dump、print_r在json_encode()之前或之后 - 用
ob_start()+ob_clean()兜底清除意外输出(仅限调试,上线应定位并删除源头) - 检查文件编码:保存为「UTF-8 无BOM」,编辑器里看不见的BOM会导致
response.json()SyntaxError



















