0

次のように構築された 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 でデータを受信するまでの間に、すべてのキーの最後の角かっこが消えてしまいます。

なぜこれが起こるのか、そしてこの問題を解決するきちんとした方法があれば誰かが私に説明できますか?

解決策の基準が 1 つあります。それは、キーを変更できないことです ('table_name\[field_name\]' など)。

4

3 に答える 3

1

使ってみました$.serialize()か?

serialize を使用して、JavaScript オブジェクトを AJAX で簡単に送信できる文字列に変換します。次のようにします。

var ajaxableString = $(obj).serialize();
于 2013-02-06T15:41:18.563 に答える
0

JS オブジェクトを再構築することで、この問題を解決できます。

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

そうすれば、奇妙な命名規則を回避できます。

また、あなたは私たちに何かを隠しているのではないかと思います。this と PHP の間に何か (操作) があり、おそらく AJAX コードのどこかに、あなたが私たちに伝えていないことがあります。おそらく、このオブジェクトを文字列にシリアル化し、その文字列を 1 つのクエリ パラメータとしてサーバーに渡しています。このシリアル化手順が原因である可能性があります。

ただし、念のため、デバッガーの Net セクションを確認し、送信されたデータが完全にフォーマットされているかどうか要求ヘッダーを確認してください。

私の知る限りjQuery.ajax、JS オブジェクトをデータとして受け入れ、それをクエリ文字列に完全に変換します。そのため、手動でシリアル化する必要はありません。

于 2013-02-06T15:40:57.497 に答える
0

解決策は、 @fab のおかげで、データを JSON でエンコードすることです。

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

PHP の場合:

json_decode($_REQUEST['obj']);

これにより、保持されたキーを使用して、完全に適切な stdClass オブジェクトが出力されます。

于 2013-02-07T09:01:06.693 に答える