将带括号的javascript对象作为键传递给PHP

Passing javascript objects with brackets as keys to PHP

本文关键字:PHP 对象 javascript      更新时间:2023-09-26

假设我在JavaScript中有这个对象,它是这样构建的:

var obj = {};
var fields = ['table_name[field_name]', 'tale_name[field_name_2]']
for(var i; i < fields.length; i++){
    obj[fields[i]] = someBulkOfData;
}

当登录控制台时,obj将输出

{
   table_name[field_name]   : {...},
   tabke_name[field_name_2] : {...}
}

这一切都很好,直到我通过jQuery.ajax().通过PHP传递对象

当我用PHP收到请求时,数组如下所示:

[
    ['table_name[field_name']   => ...,
    ['table_name[field_name_2'] => ...
]

因此,在发送AJAX请求和用PHP接收数据之间的某个地方,每个键的最后一个方括号都会消失。

有人能向我解释一下为什么会发生这种情况,以及是否有一个巧妙的方法来解决这个问题吗?

我有一个解决方案的标准,那就是我不能更改键(比如"table_name''[field_name'']")。

您尝试过使用$.serialize()吗?

使用serialize将javascript对象转换为可以使用AJAX轻松传输的字符串,如下所示:

var ajaxableString = $(obj).serialize();

您可以通过重组JS对象来解决这个问题:

{
  table_name : {
    field_name_1 : {...},
    field_name_2 : {...}
  },
  another_table : {
    ...
  }
}

这样就可以避免这种奇怪的命名约定。

此外,我怀疑您对我们隐瞒了一些事情。this和PHP之间有一些(操作),可能在您的AJAX代码中,您没有告诉我们。也许您正在将此对象序列化为字符串,并将字符串作为一个查询参数传递给服务器。此序列化步骤可能是原因。

但为了确定,如果发送的数据格式完美,您可以检查调试器的Net部分并检查请求标头。

据我所知,jQuery.ajax接受JS对象作为数据,并将其完美地转换为查询字符串。这样,您就不需要手动序列化它。

多亏了@fab,该解决方案可以使用JSON:对数据进行编码

$.ajax({
    data : {
        obj:JSON.stringify(obj)
    },
    ...
});

在PHP中:

json_decode($_REQUEST['obj']);

这将输出一个非常好的stdClass对象,并保留密钥。