【PHP】配列も対応!filter_input関数の使い方
- 作成日:2018/06/09
スーパーグローバル変数を扱うときによく使われるfilter_input関数についてまとめました。 配列の場合のみ知りたい方は目次の1,2は読み飛ばして構いません。
スーパーグローバル変数の直接アクセス
スーパーグローバル変数から値を取得する場合、簡単な書き方は以下のようになります。
$tmp = $_POST['pData'];
非常にシンプルで単純な方法ですが、この方法だと$_POST['pData']に中身が設定されていないと 「Notice: Undefined index」という警告メッセージがでます。
この警告は変数または配列に値が設定されていない時に使用しようとしたときにでるものです。 エラーではなく警告なのでプログラムは動作しますが解決しておくのが望ましいです。
これを解決するにはisset関数を使って最初に変数の中身が設定されているかどうかを確認しておく必要があります。 具体的には以下のようにします。
if( isset($_POST['pData'])==true ){
//値あり
$tmp = $_POST['pData'];
} else{
//値なし
$tmp = null;
}
これは$_POST['pData'])の値が設定されていたらその値を$tmpに代入し、 設定されていなければnullで初期化しています。 値が設定されているか否かはisset関数で簡単にわかります。
bool isset($var)
変数の中身が設定されているか調べる
- $var:調査する変数
- 中身あり:TRUE
- 中身なし、またはNULL:FALSE
スーパーグローバル変数から値を取得する前にisset関数で中身を調査してTRUEが返ってくれば安心して値を取得できるわけですね。
ただ、予め値をチェックしておいても$_POST['pData']というスーパーグローバル変数に直接アクセスしていることは実はあまり好ましくありません。
スーパーグローバル変数は関数内外どこからでも変更できる変数なので、 予期せぬ動きを避けるためにも間接的に扱うのが良いとされています。
スーパーグローバル変数に直接アクセスしないで値を取得するにはfilter_input関数を使います。
filter_input関数の使い方
スーパーグローバル変数から値を取得するには isset関数で中身をチェックする必要がありました。
しかし、変数を取得する度にあのような長いコードを書くのは面倒ですし、 スーパーグローバル変数に直接アクセスしているのも良くありません。
そこで登場するのがfilter_input関数です。 この関数を使えばあの長いisset判定文が僅か1行で済みます。
$tmp = filter_input(INPUT_POST, 'pData');
このように書けば、わざわざisset関数を使い中身をチェックする必要はありません。 具体的な仕様を見てみましょう。
filter_input($type, $value, $filter, $options)
指定した変数を受け取り、フィルタリングする
- $type:入力タイプ(INPUT_GET、INPUT_POST、 INPUT_COOKIE、INPUT_SERVERなど)
- $value:フィルタリングする変数名
- $filter:フィルターの種類。省略可
- $options:オプション。省略可
- フィルタリング成功:変数の中身
- フィルタリング失敗:false
- 変数の中身が空:null
フィルタリングとは値が正しいかどうかチェックすることです。入力チェックともいいますね。 チェックする値・タイプ・種類などを引数に指定することで、値をチェックをしてくれる関数です。
一見難しそうですが、スーパーグローバル変数の取得に利用する場合は簡単です。
filter_input関数はフィルタリングする種類を省略すると何もフィルタリングせずに、 値があればそれを取得し、空ならばnullを返します。 単純にスーパーグローバル変数から値を取得するだけなら第3、第4引数は省略して書くことが多いみたいです。
よって、filter_input関数を使うときは入力タイプと変数名を指定してあげるだけで良いのです。
$tmp = filter_input(INPUT_POST, 'pData');
$tmp = filter_input(入力タイプ, '変数名');
入力タイプは扱うスーパーグローバル変数により異なります。$POSTならばINPUT_POSTとなり、 $GETならばINPUT_GETですね。変数名はキー値をシングルコーテーションで囲めばOKです。
コードが短くて済むメリットがある以外にも、 filter_input関数を利用することでスーパーグローバル変数に直接アクセスしないで済むため、 安全に値が取得できます。
少し話は逸れますが、一般的に入力チェックは意図しないデータを弾くチェック方法より、 正しいデータを通すようなチェック方法が望ましいとされています。
変数が配列の場合
次は変数が配列となっているときのfilter_input関数の使い方です。 配列の場合は今までと同じようにやっても値が取得できません。
配列の場合は以下のようにfilter_input関数にオプションを追加する必要があります。
$tmp = filter_input(INPUT_POST, 'pData', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
filter_input関数の第3引数はフィルターの種類を指定するのでした。 ただ、ここで指定したFILTER_DEFAULTはフィルタリングをしません。 第3引数を省略した時もFILTER_DEFAULTが自動的に使われてフィルタリングされません。
省略しても良いのになぜ書くのかというと、第4引数のFILTER_REQUIRE_ARRAYをつけるためです。 変数が配列の場合は第4引数にFILTER_REQUIRE_ARRAYを指定する必要があるので、 第3引数も何かしら値を入れないといけないわけですね。
値があれば$tmpには配列が格納され、中身が空ならばNULLが返されます。