PHPコーディング

PHPのfilter_inputとfilter_var関数

2017年10月30日
ダイソーの洗濯槽クリーナーで、数ヶ月間頑張って開発してきたソフトの発売延期を決定して早一週間・・・
別のソフト開発に取り掛かっています。
今度のソフトはPHPでコーディングしているので、かなり楽に、楽しんでコーディングできます。

PHPとのお付き合いもかなり長いですが、まだまだ知らないことだらけです。かなり前に派遣で行っていた会社で学んだPHPが私のPHPスキルの基盤になっています。その会社で使っていなかった機能や目にしなかった機能はまだまだ沢山あり、毎日が勉強です。時にはなかなな理解できず苦しいこともありますが、分からなかった事、できなかった事ができるようになるのは楽しい事です。

PHPでは未定義変数や未定義配列インデックスから値を読もうとすると、Noticeが発生します。致命的ではないので、何事もなかったように続けて処理ができるため、今まではいつか何とかしようと先延ばしにしていましたが、今回良い機会かと思い、潰すことにしました。

今コーディングしているフォームからPOSTされたデータについてNoticeを潰してみました。その過程で新しく【filter_input】と【filter_var】関数を知りました。

例えば、$_POST['name']が未定義だった場合、これを変数に入れるため、
$strName = $_POST['name'];
とやると、Noticeが発生します。
【isset】関数などで、存在するかどうかをチェックしてから変数に代入しなくてはいけないのですが、これを一発でやってくれる関数が【filter_input】なんだそうです。
$strName = filter_input(INPUT_POST, 'name');
で、値があればその値を、未定義ならNullを返してくれます。Noticeを発生させずに値を読めるわけです。
$_POSTの他に、$_GET、$_COOKIE、$_SERVER、$_ENVで使えます。
PHP: filter_input - Manual

この関数で、一番使いたいと思ったのが、メールアドレスチェックです。
【filter_input】関数の第3引数でフィルタを渡すと、形式チェックをしてくれるというのです。
$strMail = filter_input(INPUT_POST, 'mail', FILTER_VALIDATE_EMAIL);

メールアドレスを正規表現でチェックするのは、とてつもなく大変なんだそうで・・・
ビジネス的には不可能ですね(元が取れないので)。

ということで、【filter_input】関数のお世話になろうと思ったのですが、この関数は多次元配列が扱えないそうなんです。ううん、不細工なソースになるけど仕方ないかなと思ったら、【filter_var】関数でもメールアドレスチェックができるのだそうです。
filter_var($strMail, FILTER_VALIDATE_EMAIL);
メールアドレスでなければFalseを返してきます。
PHP: filter_var - Manual
RFC 822 に沿った形式かどうかをチェックするので、ドコモの【docomo.@example.com】形式ではFalseになります。

今回はこれで十分です。RFC 822 に沿ったアドレスを入力して貰えばいいだけなので、十分です。