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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:13:39