ajax serialize()与$_POST接收失效问题排查求助
问题原因及解决办法
核心原因:请求头Content-Type不匹配
- 使用
FormData时,浏览器会自动为AJAX请求设置正确的Content-Type: multipart/form-data,PHP会自动解析这种格式的请求体并填充到$_POST数组中。 - 而用
serialize()生成key=value&key2=value2格式的字符串后,默认AJAX请求的Content-Type不是PHP能自动解析的类型(通常是text/plain),这种情况下PHP不会将请求体内容解析到$_POST里,所以你会看到$_POST为空。
两种解决方式
方式1:手动设置正确的Content-Type
在AJAX配置里添加对应请求头:
// 原生AJAX写法 xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); // jQuery写法 $.ajax({ url: 'a.php', type: 'POST', data: $('form').serialize(), contentType: 'application/x-www-form-urlencoded; charset=UTF-8', success: function(res) { console.log(res); } });
设置后PHP就能正常解析序列化后的字符串到$_POST。
方式2:PHP端手动解析原始请求体
如果不想修改前端请求头,可以在a.php里直接读取原始请求数据并解析:
$rawData = file_get_contents('php://input'); parse_str($rawData, $postData); print_r($postData); // 这里就能拿到序列化后的键值对数据
内容的提问来源于stack exchange,提问作者William Jung
相关产品推荐
相关产品推荐

