jQuery AJAX POST请求提交后服务器端$_POST数组为空求助
解决jQuery AJAX POST请求后PHP $_POST为空的问题
这种情况我碰到过好多次,别着急,咱们一步步排查:
1. 检查请求是否被重定向
打开Firebug的网络面板,查看这个POST请求的状态码。如果返回的是302 Found或者其他重定向状态,浏览器会自动把POST请求转换成GET请求跳转到新地址,这时候目标页面的$_POST自然是空的。
- 解决办法:确认
presupuesto_guardar.php没有做重定向操作,比如不要在这个文件里用header("Location: ...")。
2. 明确设置AJAX的Content-Type
虽然jQuery默认会为POST请求设置application/x-www-form-urlencoded的Content-Type,但有时候服务器的配置可能对这个头的识别有问题。你可以手动指定:
$.ajax({ type: 'POST', url: 'presupuesto_guardar.php', data: { 'data': '1' }, contentType: 'application/x-www-form-urlencoded; charset=UTF-8' // 手动指定 });
3. 尝试用字符串形式传递数据
有时候对象形式的data在序列化时可能出现意外(虽然概率很低),你可以换成字符串格式试试:
$.ajax({ type: 'POST', url: 'presupuesto_guardar.php', data: 'data=1' // 直接传键值对字符串 });
4. 检查PHP配置限制
如果服务器的PHP配置里post_max_size设置得太小,或者max_input_vars数量不够,也会导致POST数据无法被接收。你可以在presupuesto_guardar.php里先输出配置看看:
echo ini_get('post_max_size'); echo ini_get('max_input_vars');
- 解决办法:如果数值太小,修改php.ini里对应的配置项,或者联系服务器管理员调整。
5. 排查服务器安全拦截
有些服务器启用了mod_security或者其他防火墙插件,可能会误拦截你的POST请求。你可以临时关闭测试(如果有权限的话),或者检查服务器的错误日志,看有没有相关的拦截记录。
6. 直接查看原始请求数据
如果上面的方法都不行,你可以在PHP里直接读取原始的POST数据,确认数据到底有没有传到服务器:
$rawData = file_get_contents('php://input'); var_dump($rawData); // 看看输出的是什么
如果这里能看到data=1,那说明是PHP的$_POST解析有问题,可能和Content-Type或者配置有关;如果这里也空,那说明数据根本没发过来,得再检查AJAX代码。
内容的提问来源于stack exchange,提问作者user1077220




