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
相关产品推荐
相关产品推荐

