2

これに関して他にもいくつか質問があることを認識しており、それらを読んで解決策を試みましたが、うまくいきません。jQuery/JavaScript でシリアル化されたフォーム全体を渡しているため、投稿を 2 回シリアル化している可能性があります。

私の PHP 配列は 2 次元ですか? ファイル名を含むもの:

$aDocumentFilesArrayFileName[0][0];

通常、PHPには1次元配列があるため、次を使用して渡します。

<input type="hidden" name="arrayName[]" value="$value[$i]"> // (while in a loop

最初の配列を名前で参照するときに使用する構文と、使用する値がわかりません。

値を serialize($aDocumentFilesArrayFileName) として使用し、反対側でデコードしようとしましたが、string expected found array? というエラーが表示されます。

** 編集 **

質問をより明確にすることもできたと思いますが、明確にするためです。これが私のjQuery Ajax送信関数です:

var conflictData = $("input, select", conflictsTable.fnGetNodes()).serialize(); // fnGetNodes is just a datatables function to go through every row in a table - don't worry about that

$.ajax(
{
    type: 'POST',
    url: 'sqlHandleConflictsDocumentRegister.php?node='+nodeType+'&id='+nodeId,
    cache: false,
    data: conflictData,
    success: function(result)
    {
        // Do stuff here
    }
});

PHP 入力ステートメントをシリアル化するのではなく、json_encode を使用するソリューションを試しました。それは機能していません。PHPフォームで使用する正確なコードを次に示します。この行は、フォーム内のテーブルの各行に対して発生するループ内にあることに注意してください。

<input type="hidden" name="arrayFileName[]" value="<?php echo json_encode($aDocumentFilesArrayFileName[$i]); ?>">

PHP ajaxスクリプトで使用するコードは次のとおりです。

$fileNames = json_decode($_POST['arrayFileName']);

エラー: json_decode() は、パラメーター 1 が文字列であると想定しています。配列は、65 行目の C:\wamp\www\document\sqlHandleConflictsDocumentRegister.php で指定されています

配列データのさまざまな次元を (JavaScript で) シリアライズしているという問題はありますか? 私の他の入力は、単純な配列データ (各行に 1 つの値) を持つ行からのもので、正常に動作します。この特定の配列入力には、テーブル行ごとに関連付けられたファイル名の数に制限がないため、入力値は配列です。

また、別の入力で (テーブルの行ごとに) ファイルの量の値を渡します。おそらく、これを使用して、反対側の配列を抽出することができます。

<input type="hidden" name="quantityFiles[]" value="<?php echo $aDocumentQuantityFiles[$i]; ?>">

** アップデート **

私は alert(conflictData) を使用しましたが、arrayFileName フィールドが空であることを除けば、配列データは正常であることがわかりました。json_encode($aDocumentFilesArrayFileName[$i]) をエコーすると、期待どおりの結果が得られます。

したがって、jQuery serialize() がこのデータを破壊しているように見えます。おそらく、ajax 送信用にデータ変数をより適切に準備する方法はありますか?

** 更新 2 **

皆様のご支援と回答への貢献に感謝いたします。私はすでに json_encode を使用して、そこで操作するためにデータを javascript に取得していたので、入力フィールドを使用してデータをシリアル化して送信することを断念し、代わりに $.ajax の data パラメータを直接使用して処理のために配列を送信しました。

明確に正しい解決策が提供されていないため、以下に解決策を投稿し、目的の PHP ファイルで多次元配列データを取得できるようになったため、正解としてマークします。

4

3 に答える 3

1

ajax(ユーザーが関与)を介したシリアル化は、ユーザーがオブジェクトのシリアル化を解除して実行しようとする可能性があるため、さまざまなセキュリティの脆弱性を引き起こします。

適切な関数 json、http://php.net/manual/en/book.json.phpを使用してみてください。Jsonは、Ajax(Javascript)で使用するための方法です。

于 2013-06-13T13:28:58.757 に答える
1

php の json_encode 関数を使用して、php 配列を javascript に送信できます。

使ってください

echo json_encode($phpArray);

$.post() メソッドを使用している場合、または $.ajax() メソッドを使用している場合は、設定する必要があるよりも $.post() の最後のパラメーターを「json」に設定する必要があります

データ型: 'json'

http://api.jquery.com/jQuery.post/

于 2013-06-13T13:32:11.707 に答える
0

このシナリオでは、jQuery シリアライズは通常の配列では正常に機能しますが、多次元配列では機能しません。さまざまな配列からのデータを混合すると、破損するようです。

解決:

多次元 PHP 配列データを json_encode し、以下のコードを使用して javascript に渡します。

<script>
    var aQuantityFiles = <?php echo json_encode($aDocumentQuantityFiles); ?>; // this is a regular array which is also related to the multidimensional array
    var aDocumentFilesArrayFileName = <?php echo json_encode($aDocumentFilesArrayFileName); ?>; // this is a multidimensional array
</script>

$.ajax リクエストで data パラメータを使用して、準備された javascript 変数を個別に渡します。

$.ajax(
{
    type: 'POST',
    url: 'sqlHandleConflictsDocumentRegister.php?node='+nodeType+'&id='+nodeId,
    cache: false,
    data: 
    {
        aQuantityFiles: aQuantityFiles,
        aDocumentFilesArrayFileName: aDocumentFilesArrayFileName 
    },
    success: function(result)
    {
         //Do Something
    }
});

宛先の PHP 側では、非常にシンプルになりました (デコードする必要はありません)。

<?php

    $aQuantityFiles = $_POST['aQuantityFiles'];
    $fileNames = $_POST['aDocumentFilesArrayFileName'];

    for ($i = 0; $i < $numberRows; $i++)
    {
        // This is the bigger loop cycling through the rows of data which contain the multiple files
        for ($j = 0; $j < $quantityFiles; $j++)
        {
            // Echo to illustrate that data is extracted multidimensionally as expected
            echo $fileNames[$i][$j];                 
            echo "<br/>";
        }
    }
?>

オプション

これで、多次元配列データは宛先 PHP ファイルで受け入れられますが、$.ajax で送信する前に、追加のフォーム データを拡張配列データとバンドルする必要がある場合があります。以下のサイトから $.param 関数を使用してこれを行う方法を見つけました。 http://www.jblotus.com/2011/07/12/combine-serialized-form-post-data-with-arbitrary-object-in-jquery/

于 2013-06-14T15:34:47.363 に答える