You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XMLHttpRequest无法向PHP发送POST数据,请求协助排查问题

问题出在POST数据的格式上!

你现在遇到的问题很典型——当你给XHR设置Content-Type: application/x-www-form-urlencoded时,send()方法不能直接传JavaScript对象,它需要的是符合URL编码格式的键值对字符串(就像地址栏里的查询参数那样)。

你当前代码里的ajax.send({user:'hello', password:'there'});传递的是一个对象,XHR不会自动帮你把它转换成服务器能解析的格式,所以PHP那边的$_POST自然是空数组。

修正方法有两种:

1. 手动拼接URL编码字符串

直接把参数写成key=value&key2=value2的格式:

function login() {
 let ajax = new XMLHttpRequest();
 ajax.open('POST', 'login.php', true);
 ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
 ajax.onload = function() {
 alert(this.response);
 };
 // 改成字符串格式
 ajax.send('user=hello&password=there');
}
document.getElementById('login-button').addEventListener('click', login)

2. 使用URLSearchParams自动处理(推荐)

如果参数比较多或者需要动态生成,用URLSearchParams会更省心,它会自动处理特殊字符的编码:

function login() {
 let ajax = new XMLHttpRequest();
 ajax.open('POST', 'login.php', true);
 ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
 ajax.onload = function() {
 alert(this.response);
 };
 // 用URLSearchParams构建参数
 const formData = new URLSearchParams();
 formData.append('user', 'hello');
 formData.append('password', 'there');
 ajax.send(formData);
}
document.getElementById('login-button').addEventListener('click', login)

改完之后再测试,PHP的var_dump($_POST)应该就能输出你预期的数组了。

另外补充一句:如果你想传递JSON格式的数据,那需要把Content-Type改成application/json,同时把对象转换成JSON字符串(用JSON.stringify()),但这时候PHP需要从php://input里读取数据,而不是用$_POST——不过你当前的场景用application/x-www-form-urlencoded更合适,所以上面的两种方法就足够解决问题啦。

内容的提问来源于stack exchange,提问作者Henry Floyd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 13:03:16