[PHP] filter_inputの使い方
filter_input
とは?
今まで、 POST や GET は、 isset
を使っていたが、 PHP5.2 以降 filter_input
の使用が推奨されていた。
if(!isset($_POST['hoge'])){
// エラー処理
}
POST や GET などの外部からの変数を、フィルターして無害な値にしてくれたり、弾いてくれる。 isset
やその他のバリデーションが 1 行で書けそう。 GET 、POST 、COOKIE 、SERVER などの変数を受け取ることができる。
filter_input
の使い方
第 3 引数にフィルターを指定。 省略も可能だが、その場合は FILTER_DEFAULT
( FILTER_UNSAFE_RAW
と同じ)が適用される。
第 3 引数に指定するフィルターは主に、 FILTER_VALIDATE
(検証フィルタ)と FILTER_SANITIZE
(除去フィルタ)があり、動きが異なる。
// $_GET['val']を受け取る
$val = filter_input(INPUT_GET, 'val');
// $_POST['num']を受け取る
if(!$num = filter_input(INPUT_POST,'num',FILTER_VALIDATE_INT)){
// INTではないない場合の処理
}
入力値ではない値をフィルタできる filter_var
もある。
FILTER_VALIDATE
の動き
VALIDATE に通ると(変数に)その値が代入される。 VALIDATE に引っかかると FALSE
、値がなかった場合は NULL
が返ってくる。
FILTER_NULL_ON_FAILURE
というフラグで、 VALIDATE に引っかかると NULL
、値がなかった場合 FALSE
と指定することも可能。
存在チェックとともに、型チェック等も行うことができ不正な値はエラーとしてはじくことが可能。
// 1をPOSTで送信
$num = filter_input(INPUT_POST,'num',FILTER_VALIDATE_INT);
// 1aをPOSTで送信
$str= filter_input(INPUT_POST,'text',FILTER_VALIDATE_INT);
var_dump($num); //int 1
var_dump($str); //boolean false
FILTER_SANITIZE
の動き
FILTER_VALIDATE
と違い、不正値を検出しない。特殊文字やタグなどを取り除いた値が返される。
全てが不正文字だと空文字、 int
とその他の値だと、 int
だけが返される。
また、 FILTER_VALIDATE
と違い、数値であっても String
型で返される。
// 10をPOSTで送信
$num = filter_input(INPUT_POST,'num',FILTER_SANITIZE_NUMBER_INT);
// aaをPOSTで送信
$str= filter_input(INPUT_POST,'text',FILTER_SANITIZE_NUMBER_INT);
// 1aをPOSTで送信
$mix= filter_input(INPUT_POST,'mix',FILTER_SANITIZE_NUMBER_INT);
var_dump($num); //string '10'
var_dump($str); //string ''
var_dump($mix); //string '1'
メールアドレスに FILTER_SANITIZE_EMAIL
(英字、数字および !#$%&’*+-=?^_`{|}~@.[] 以外のすべての文字を取り除く)を使うと、エラーを返せず意図したアドレスと異なったまま処理が進んでしまう。
// <mail>@/をPOSTで送信
$mail = filter_input(INPUT_POST,'mail',FILTER_SANITIZE_EMAIL));
var_dump($mail); //string 'mail@'
配列を受け取る
チェックボックスとかhidden
で、値を配列で送信し、 filter_input
で受け取る場合、第四引数に FILTER_REQUIRE_ARRAY
を書く。
<input type="hidden" name="hoge[]" value="1">
<input type="hidden" name="hoge[]" value="2">
<input type="hidden" name="hoge[]" value="3">
$hoge = filter_input(INPUT_POST, 'hoge', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
var_dump($hoge);
// array(3) { [0]=> string(1) "1" [1]=> string(1) "2" [2]=> string(1) "3" }
フィルタの種類
以上