PHP
filter_input が微妙です
えだ
更新日:2021/08/05
最近、PHPバージョンアップに向けて水面下で動いている僕です。
filter_input が微妙…
「filter_input」や「filter_input_array」という関数があります。
リクエスト(GET、POST)、COOKIE、SERVER などから値を取得するのにフィルタリングしながら取得する関数のようです。
フラグやオプションを指定することで、異常値の除外や初期値の設定などが行えます。
個別でのissetチェック処理やis_stringチェック処理を省略するための便利な関数といったところでしょうか。
引数にはtype(GET、POST等のコード)を指定する仕様になっているので、スーパーグローバル変数への直接アクセスを避けるためのラッパーというところも狙っているのかもしれません。
こんなソースが
1 |
$aaa = $_POST['aaa']; |
こんな書き方になります。
1 |
$aaa = filter_input(INPUT_POST, ‘aaa’); |
たぶん実用的には処理だとこんなのが
1 2 3 4 5 |
// 処理 $aaa = ""; if (array_key_exists('aaa', $_POST) && is_string($_POST['aaa'])) { $aaa = $_POST['aaa']; } |
こんな書き方になります。
1 2 |
// 処理 $aaa = filter_input(INPUT_POST, ‘aaa’, FILTER_SANITIZE_STRING); |
ほほー、配列を一括処理できる「filter_input_array」もあるならこれは便利だな。と思ったのも束の間で。
2次元配列の処理がサッパリ意図した挙動になりません…。
たとえばこんなリクエスト
1 2 3 4 5 6 7 8 9 |
// 処理 $_POST = array( 'aaa' => string 'AAA' , 'bbb' => array ( 'ccc' => string 'CCC' 'ddd' => string '123' ) , ) |
これだとbbbのフィルターは全てスルーされてしまいますし、
1 2 3 4 5 6 7 8 |
// 処理 $args = array( 'aaa' =>FILTER_SANITIZE_STRING , 'bbb' => array( 'flags' => FILTER_REQUIRE_ARRAY ) ); $datas = filter_input_array(INPUT_POST, $args); |
こんなのも効かないようです。
1 2 3 4 5 6 7 8 9 10 |
// 処理 $args = array( 'aaa' =>FILTER_SANITIZE_STRING , 'bbb' => array( 'flags' => FILTER_REQUIRE_ARRAY , 'ccc' =>FILTER_SANITIZE_STRING , 'ddd' =>FILTER_VALIDATE_INT , ) ); $datas = filter_input_array(INPUT_POST, $args); |
結論:filter_input_array は多次元配列に使えない!
ちなみに僕はこの手のメソッドを一切使わず、自作のラッパーメソッドを利用しています。