2

jQueryのメソッドを使用してphpスクリプトにデータを渡しています。非常に複雑なJSONオブジェクトをデータとして渡します。サーバー側では、すべてphp形式に変換された変数のデータを受け取ります。 .ajax$_POST

この変換はどのように行われますか?それはクライアント側で起こりますか、それともサーバー側で起こりますか?このプロセスに関連するモジュール。完全なプロセスを深く理解するためのあらゆる情報源。

クライアントのリクエスト:

var data = {
              foo:  123,
              bar:  456,
              rows: [
                      {
                        column1 : 'hello',
                        column2 : 'hola',
                        column3 : 'bonjour',
                      },
                      {
                        column1 : 'goodbye',
                        column2 : 'hasta luego',
                        column3 : 'au revoir',
                      },
                    ],
              test1:{
                      test2: {
                               test3:  'baz'
                             }
                    }
            };

$.ajax({
        type:           'post',
        cache:          false,
        url:            './ajax/',
        data:           data
       });

サーバーサイドで私の'$_POST' var:

Array
(
    [foo] => 123
    [bar] => 456
    [rows] => Array
        (
            [0] => Array
                (
                    [column1] => hello
                    [column2] => hola
                    [column3] => bonjour
                )

            [1] => Array
                (
                    [column1] => goodbye
                    [column2] => hasta luego
                    [column3] => au revoir
                )

        )

    [test1] => Array
        (
            [test2] => Array
                (
                    [test3] => baz
                )

        )

)

このコードスニペットはここから取得されます。

4

3 に答える 3

1

JqueryはデータをHTTP形式に変換しています。http://en.wikipedia.org/wiki/POST_%28HTTP%29

このリンクは、配列がどのようにエンコードされるかを示しています:http: //php.net/manual/en/function.http-build-query.php

PHP自体を使用してHTTP形式を生成できます。配列をPHP形式に変換しました。

$data = array(  'foo' => 123,
                'bar' => 456,
                'rows' => array(    0 => array( 'column1' => 'hello',
                                                'column2' => 'hola',
                                                'column3' => 'bonjour'),
                                    1 => array( 'column1' => 'hello',
                                                'column2' => 'hola',
                                                'column3' => 'bonjour')),
                'test1' => array('test2' => array('test3' => 'baz')) );

次に、次のようにHTTPを生成できます。

echo http_build_query($data);

次の結果が得られました。

foo=123&bar=456&rows%5B0%5D%5Bcolumn1%5D=hello&rows%5B0%5D%5Bcolumn2%5D=hola&rows%5B0%5D%5Bcolumn3%5D=bonjour&rows%5B1%5D%5Bcolumn1%5D=hello&rows%5B1%5D%5Bcolumn2%5D=hola&rows%5B1%5D%5Bcolumn3%5D=bonjour&test1%5Btest2%5D%5Btest3%5D=baz
于 2013-03-23T21:12:27.690 に答える
1

JSONは、(その仕様をサポートするすべての言語に対して)ユニバーサルなデータ交換形式です。JSONデータは、データを送信する言語によってメモリオブジェクトからJSON形式の文字列にエンコードされ、受信する言語によって(文字列からオブジェクトに)デコードされます。

jQueryとJavaScriptについて話すときの重要なポイントは、JSONの構文はJavaScriptに似ているということですが、実際には通常のJavaScriptオブジェクトの構文よりも厳密です( JSONとJavaScriptオブジェクトの違いは何ですか?を参照)。たとえば、上記で投稿したJavaScriptオブジェクトリテラルは有効なJSONではありません。これは、キーと値の両方が引用符で囲まれていないためです。さらに、技術的にはJSONオブジェクトのようなものはありません。JSONデータのグロブは、実際にはJavaScriptのオブジェクト表記のサブセットで記述された単なる文字列です。

したがって、PHPのjson_encode($ object)関数とjQueryのencodeJSON([Object])関数は、それぞれの言語のメモリオブジェクトを、両方の言語(およびもちろん他の言語)がデータとして受け入れることができる文字列に変換します。PHPとjQueryのjson_decode($ string)関数とparseJSON([String])関数は、それぞれJSON文字列を受け取り、それをオブジェクトとしてメモリにコミットします。

于 2013-03-23T21:26:10.050 に答える
0

jQueryは、オブジェクトデータをキーと値のペアとしてエンコードします。たとえば、次の場合です。

var data = {
          foo:  123,
          bar:  456,
          rows: [
                  {
                    column1 : 'hello',
                    column2 : 'bonjour',
                  },
                  {
                    column1 : 'goodbye',
                    column2 : 'au revoir',
                  },
                ]
           };

jqueryはそのオブジェクトを次の文字列にエンコードします

foo=123&bar456&rows[][column1]=hello&rows[][column2]=bonjour&rows[][column1]=goodbye&rows[][column2]=au+revoir

PHPはその文字列を配列に変換し、リクエストに応じて$_GETまたは$_POST配列に割り当てます。

于 2013-03-23T21:53:19.293 に答える