filter_input 使ってみた
PHP5系で書かれたコードってPHP8にすると結構、変数の未定義や値が空って事でエラー出ちゃいますよね。
こんな時、isset
の様なチェックをしてくれて、更にバリデーションも行ってくれる filter_input
は超便利。
今回、PHP5.6で動いてたツールのコードを PHP8で動く様にして欲しいと頼まれました。
まぁ何年も前に書かれた様で、こんな感じ↓
$flg = $_GET["flg"];
$status = (!isset($flg) && $flg == '') ? 0 : $flg;
if ($status !== 0) {
何かの処理;
}
当然、PHP8になると $_GET["flg"]
が空だと、そんなキーはない!と怒られますよね。
Warning: Undefined array key "flg" in Your Path
エラー回避する為には、$_GET["flg"]
に値が入ってるか isset
したり、値のチェックしたりと少々面倒。
あと、
-
$_GET["flg"]
にどんな値が入るか明確でない。 - バリデーションもしていない。
-
$status
が 0 以外に処理とか曖昧すぎ。
など、この5行だけでも改善点がありあり。
filter_input 使いましょ
確認したところ、$_GET["flg"]
は 0 か 1 しか送られてこない事が分かったので、
$range = ['min_range' => 0, 'max_range' => 1, 'default' => 0];
$status = filter_input(INPUT_GET, 'flg', FILTER_VALIDATE_INT, ['options' => $range]);
if ($status === 1) {
何かの処理;
}
これで解決!
[説明]
- filter_input :
HTTP通信のGETやPOSTで送信されたデータを検証したり、処理するための関数です。
- FILTER_VALIDATE_INT :
検証フィルタ。値が整数であるかどうか検証します。
- オプション
min_range
,max_range
,default
:
オプションを設定する事で、取得する値の範囲と初期値が設定出来ます。
今回の場合、GETデータで送られて来た flg
は 0 か 1 が送られてくる、というのが分かります。
それ以外の数値は初期値の 0 が返されます。
また、それ以外に英字や日本語など数値以外のものが送られてきても初期値の 0 を返します。
わざわざ、is_int
とか is_numeric
とか 0 or 1
みたいなチェックしなくてもいいですね。
まとめ
他に用意されている 検証フィルタ では、ドメインかどうか、Emailかどうか、IPアドレスかどうか、などの検証も可能です。
filter_input
積極的に使っていきましょー。