使用Fetch发送带参请求时PHP的$_POST为空问题排查
嘿,我知道这个问题的症结所在!你遇到的情况是因为PHP的$_POST超全局变量默认只会解析表单编码格式的请求数据,也就是application/x-www-form-urlencoded或者multipart/form-data类型的请求体,而你用Fetch发送的是application/json格式的数据,所以PHP不会自动把它填充到$_POST里,自然返回空数组啦。
下面给你两种解决办法,看你需求选就行:
方法一:PHP端读取原始JSON输入流
直接在PHP里读取请求的原始内容,然后解析成JSON数组。修改你的PHP代码如下:
// 读取原始请求体内容 $rawInput = file_get_contents('php://input'); // 解析JSON为关联数组(第二个参数true确保转成数组而非对象) $requestData = json_decode($rawInput, true); // 返回解析后的数据 echo json_encode($requestData);
这样你的JS代码不用做任何修改,就能正常拿到请求的数据了。
方法二:修改Fetch请求为表单编码格式
如果你更希望用$_POST直接获取数据,可以把Fetch的请求头和请求体改成表单编码的形式:
function json(response){ return response.json() } let data = {obj : 'value'}; fetch('http://localhost/Fetch_mysql_angular/requests.php', { method: 'post', headers: { 'Accept': 'application/json', "Content-type": "application/x-www-form-urlencoded" // 改为表单编码类型 }, body: new URLSearchParams(data) // 将数据转换为URL编码格式 }) .then(json) .then(function (data) { console.log(data); }) .catch(function (error) { console.log('Request failed', error); });
这时候你原来的PHP代码<?php echo json_encode($_POST); ?>就可以正常返回数据了。
简单总结下:application/json格式的请求体不会被PHP自动解析到$_POST,必须手动读取php://input;如果想用$_POST直接获取,就得采用表单编码的请求格式。
内容的提问来源于stack exchange,提问作者Alex Movchan




