使用jQuery 2.1.x向PHP7.1提交JS对象失败,后端接收空对象求助
问题分析与解决方案
嘿,这个坑我之前也踩过!核心原因是PHP默认不会自动解析application/json类型的请求体到$_POST数组——它只对application/x-www-form-urlencoded(表单默认编码)或者multipart/form-data类型的请求做自动解析。你在JS里设置了contentType: "application/json",还用JSON.stringify()把对象转成JSON字符串发送,所以PHP的$_POST自然是空的。
下面给你两种可行的解决方案:
方案一:改用表单编码格式发送(最简单)
不需要手动转JSON,直接把JS对象传给data参数,jQuery会自动帮你编码成PHP能识别的表单格式,同时可以去掉contentType配置(jQuery会默认设置正确的application/x-www-form-urlencoded):
修改后的JS代码:
$("#newTabLink").click(function(e) { ntn++; console.log('ntn = ' + ntn + ' / id =' + id); id++; var tabData = new Object(); var tc = $('#tabs').children().length; console.log('tc = ' + tc) tabData.label = 'New Tab ' + ntn; tabData.pos = tc; $.ajax({ url: 'services/save_obj.php', type: 'POST', data: tabData, // 直接传对象,不用JSON.stringify async: true, dataType: 'json', cache: false, // 去掉contentType配置,用jQuery默认值 encode: true, success: function(response) { if (response.success == true) { id = response.id; } else if (response.success == false) { alert('Aww, something went wrong!'); } } }); });
这样PHP端的$_POST就能正常获取到label和pos的值了,你的原有PHP代码不需要修改(不过注意你代码里的objsay、lng、loc这些字段在JS里没传,所以还是会返回null)。
方案二:保持JSON格式发送,PHP手动解析请求体
如果你因为某些原因必须用JSON格式发送(比如复杂嵌套对象),那PHP需要手动读取原始请求体并解析:
修改后的PHP代码:
// 读取原始JSON请求体 $rawData = file_get_contents('php://input'); // 解析成关联数组 $postData = json_decode($rawData, true); if ($postData) { $strvalue = isset($postData['label']) ? filter_var($postData['label'], FILTER_SANITIZE_STRING) : null; $position = isset($postData['pos']) ? filter_var($postData['pos'], FILTER_SANITIZE_STRING) : null; // 其他字段同理,注意JS里没传objsay、lng、loc,所以这些值会是null var_dump($postData); } else { echo json_encode(['success' => false, 'message' => 'Invalid JSON data']); }
这种方式下,你的JS代码不需要修改,保持原来的JSON.stringify()和contentType配置即可。
额外提醒
- 你JS里只传了
label和pos两个字段,PHP里的objsay、lng、loc是不存在的,所以不管哪种方案,这些字段的结果都会是null,记得要么在JS里补上这些字段,要么在PHP里做判断处理。 - 用方案一的话,jQuery会自动处理编码,不用担心特殊字符的问题;用方案二的话,要确保JSON格式正确,否则
json_decode会返回null。
内容的提问来源于stack exchange,提问作者fledglingCoder
相关产品推荐
相关产品推荐

