PHP 在获取请求中发送 FormData() 时 $_POST 变量为空
PHP $_POST variables are null when sending FormData() in a fetch request
我将 FormData()
发送到 PHP
脚本,其中 JS
:
async function callFetch(url, body, accept) {
let headers = accept ? {"Content-Type":"application/x-www-form-urlencoded;charset=UTF-8","Accept":"application/json"} : {"Content-Type":"application/x-www-form-urlencoded;charset=UTF-8"};
let stuff ={
method: "POST",
credentials: "same-origin",
mode: "same-origin",
cache: "no-cache",
referrerPolicy: "no-referrer",
headers: headers,
body: body,
};
console.log(stuff);
return fetch(url, stuff).then(r => r.text());
}
let proFormData = new FormData();
proFormData.append('pID',prodID);
proFormData.append('saveProduct','1');
callFetch('script.php',proFormData,1).then(r => {
//do stuff
console.log(r);
});
我可以通过控制台看到,proFormData
键和值已经设置并正在发送到 fetch
正文中。
在我的 PHP
脚本中,我正在测试以下内容:
<?php
echo print_r($_POST);
echo '@===@';
echo $_POST['pID'].'<- ID';
?>
在我的浏览器控制台中输出以下内容:
//What JS outputs from console.log(stuff):
Object { method: "POST", credentials: "same-origin", mode: "same-origin", cache: "no-cache", referrerPolicy: "no-referrer", headers: {…}, body: FormData }
body: FormData { }
cache: "no-cache"
credentials: "same-origin"
headers: Object { "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8", Accept: "application/json" }
method: "POST"
mode: "same-origin"
referrerPolicy: "no-referrer"
//What PHP outputs from console.log(r):
Array
(
[-----------------------------9849953071025538958714858089
Content-Disposition:_form-data;_name] => "pID"
33
-----------------------------9849953071025538958714858089
Content-Disposition: form-data; name="saveProduct"
1
-----------------------------9849953071025538958714858089--
)
1@===@<- ID
我正在为其他 PHP
脚本使用这个确切的设置并且它工作得很好。然而,对于这个特定的脚本,我遇到了阻力。
我不想发送FormData()
作为JSON
,我希望按原样发送,因为我一直其他脚本。
我不要想要php://input
解决方法,因为即使我尝试使用此方法也失败了。
"Content-Type":"application/x-www-form-urlencoded;charset=UTF-8"
不要那样做。您没有发送 URL 编码数据。让 fetch
从 FormData
对象推断出正确的 content-type,这样它就不会谎报发送的内容。那么PHP就能理解请求了。
我将 FormData()
发送到 PHP
脚本,其中 JS
:
async function callFetch(url, body, accept) {
let headers = accept ? {"Content-Type":"application/x-www-form-urlencoded;charset=UTF-8","Accept":"application/json"} : {"Content-Type":"application/x-www-form-urlencoded;charset=UTF-8"};
let stuff ={
method: "POST",
credentials: "same-origin",
mode: "same-origin",
cache: "no-cache",
referrerPolicy: "no-referrer",
headers: headers,
body: body,
};
console.log(stuff);
return fetch(url, stuff).then(r => r.text());
}
let proFormData = new FormData();
proFormData.append('pID',prodID);
proFormData.append('saveProduct','1');
callFetch('script.php',proFormData,1).then(r => {
//do stuff
console.log(r);
});
我可以通过控制台看到,proFormData
键和值已经设置并正在发送到 fetch
正文中。
在我的 PHP
脚本中,我正在测试以下内容:
<?php
echo print_r($_POST);
echo '@===@';
echo $_POST['pID'].'<- ID';
?>
在我的浏览器控制台中输出以下内容:
//What JS outputs from console.log(stuff):
Object { method: "POST", credentials: "same-origin", mode: "same-origin", cache: "no-cache", referrerPolicy: "no-referrer", headers: {…}, body: FormData }
body: FormData { }
cache: "no-cache"
credentials: "same-origin"
headers: Object { "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8", Accept: "application/json" }
method: "POST"
mode: "same-origin"
referrerPolicy: "no-referrer"
//What PHP outputs from console.log(r):
Array
(
[-----------------------------9849953071025538958714858089
Content-Disposition:_form-data;_name] => "pID"
33
-----------------------------9849953071025538958714858089
Content-Disposition: form-data; name="saveProduct"
1
-----------------------------9849953071025538958714858089--
)
1@===@<- ID
我正在为其他 PHP
脚本使用这个确切的设置并且它工作得很好。然而,对于这个特定的脚本,我遇到了阻力。
我不想发送FormData()
作为JSON
,我希望按原样发送,因为我一直其他脚本。
我不要想要php://input
解决方法,因为即使我尝试使用此方法也失败了。
"Content-Type":"application/x-www-form-urlencoded;charset=UTF-8"
不要那样做。您没有发送 URL 编码数据。让 fetch
从 FormData
对象推断出正确的 content-type,这样它就不会谎报发送的内容。那么PHP就能理解请求了。