Lv1プログラマの誰得メモ

総務女子の趣味とか勉強に関係することのメモ

Ajax+PHPで連想配列を送受信(filter_input)

連想配列Ajax通信でPOSTするとfalseになった。

配列じゃないパターン(成功例)

javascript(クライアント)

var send_data = '01'

$.ajax({
    url: 'sample.php',
    type: 'POST',
    dataType: 'json',
    data: {
        'send': send_data
    }
});

PHP(サーバ)

//データの受け取り
$p_save = filter_input(INPUT_POST, 'send');

サーバ側で、以下のようなデータの受け取り方をするサンプル記事も多いですが、

$p_save = $_POST['save'];

スーパーグローバル$_POST配列に直接アクセスしないでください」とIDEで警告が出たりします。$_POSTの直接使用が推奨されない理由は、中の値が直接変更できちゃうからです。変更なんてしないよ~と思うかもしれませんが、一般的にはお勧めできないやり方なんだなとまずは飲み込んでください。代わりに使用するのがfilter_input()関数です。

PHP: filter_input - Manual

連想配列パターン(NG例)

javascript(クライアント)

var send_data = {};
send_data["firstName"] = "山田";
send_data["lastName"] = "太郎";
$.ajax({
    url: 'sample.php',
    type: 'POST',
    dataType: 'json',
    data: {
        'send': send_data
    }
});

PHP(サーバ)

//データの受け取り
$p_save = filter_input(INPUT_POST, 'send');

この場合、サーバ側の$p_saveの値はfalseになってしまいます。返り値がfalseになるのはフィルタリングに失敗した場合です。

連想配列パターン(成功例)

javascript(クライアント)

var send_data = {};
send_data["firstName"] = "山田";
send_data["lastName"] = "太郎";
$.ajax({
    url: 'sample.php',
    type: 'POST',
    dataType: 'json',
    data: {
        'send': send_data
    }
});

PHP(サーバ)

//データの受け取り
$p_save = filter_input(INPUT_POST, 'send', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);

filter_input()の第3、4引数も指定してあげます。第3引数でフィルタの指定(FILTER_DEFAULTは結果的に何もしない)、第4引数でフラグの指定(FILTER_REQUIRE_ARRAYは配列)です。
▼フィルタとフィルタのフラグについて

PHP: フィルタの型 - Manual

よく似た名前のfilter_input_array()というものもあります。大量データを扱うときに便利な関数ですが、内容については気が向いたら書きます。気が向いたら・・・