PHPに限らずサーバーサイドの言語では入力値を元に処理をすることが多いです。
formタグによる入力については、下記記事を参考にしてください。
入力されサーバーサイドに渡ってきたデータはチェックする必要があります。
例えばメールアドレスを入力するフォームに @ が無かったらダメです。
年齢を入力するフォームにひらがなが入っていたらダメです。
年齢に4桁入力されることはありません。
このように、まず使える文字や桁数などその項目単体でチェックすることを入力チェックと呼びます。
この入力チェックにはどんなものがあるのかについて説明します。
入力チェックの種類
入力チェックの種類ですが、以下の名前に関しては一般的なものでは無いかもしれません。
僕が過去に携わったプロジェクトでの呼び名です。
また、PHPでのサンプルコードも付けておきますので参考にどうぞ。
必須チェック
必須チェックは、入力が必須の項目に対し何も入力しなかった場合はエラーになるチェックです。
1 2 3 4 5 |
if (isset($_POST["youremail"]) && $_POST["youremail"] != "") { // 入力されている場合 } else { // 入力されていない場合 } |
または
1 2 3 4 5 |
if (empty($_POST["youremail"])) { // 入力されていない場合 } else { // 入力されている場合 } |
このように書きます。
文字種チェック
文字種チェックは、例えば名前だったら全角文字でのみ入力可能。
フリガナは、全角カタカナのみ入力可能。
出羽番号は半角数値とハイフン(-)のみ入力可能といったものです。
漢字、ひらがな、カタカナ、数値、アルファベット、記号の全角半角があります。
このチェックには正規表現を使います。
例えば入力値がひらがなの入力のみの場合には、
1 2 3 4 5 |
if(preg_match('/[^ぁ-んー]/u',$var)) { // 全てひらがなの場合 } else { // 全てひらがなでない場合 } |
のように書きます。
もしくはフレームワークを採用している場合にはそちらに既にチェックが実装されているかもしれません。
その場合はそれを使えば問題ないです。
形式チェック
形式チェックは、メールアドレスなど入力形式が決まっているもののチェックです。
電話番号の間にハイフンを必須にする場合もこれに当てはまります。
他には日付のフォーマットなどもあります。
日本のサイトでは例えば「2018/6/18」のように日付を入力します。
1つのフォームで全て入力する場合は「スラッシュ(/)が2つ入っていること」や「年は4桁、月は2桁、日は2桁」などをチェックします。
これを年と月と日を別々の入力フォームにする場合は数値チェックだけで問題ないです。
例えばメールアドレスチェックの場合は、
1 2 3 4 5 |
if (preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $mail)) { // メールアドレスである } else { // メールアドレスでない } |
のように書きます。
桁数チェック
桁数チェックは携帯電話の電話番号は11桁であることをチェックするようなものです。
他にも予め桁数が決まっているような項目でなくても、DBとの兼ね合いで桁数に上限が設けられている場合にも使います。
最大桁数だけでなく最低桁数もチェックする場合があります。
桁数チェックの場合、日本語には1バイト文字と2バイト文字があります。
DBの最大桁数はバイト数で指定することが多いと思うので、単純に文字数だけでなくバイト数でのチェックも注意する必要があります。
文字数チェックの場合は、
1 2 3 4 5 |
if (mb_strlen($var) =< 10) { // 10文字以下 } else { // 10文字より大きい } |
バイト数チェックの場合は、
1 2 3 4 5 |
if (strlen($var) =< 10) { // 10バイト以下 } else { // 10バイトより大きい } |
のように書きます。
最大値最小値チェック
最大値最小値チェックは、主に数値の入力に対して行います。
例えば保険の加入は20歳以上60歳未満だったら、年齢の入力フォームのチェックとして「20以上であること」「60未満であること」などをチェックします。
1 2 3 4 5 |
if (is_numeric($var) && $var >= 20 && $var < 60) { // 20歳以上60未満 } else { // 「20歳以上60未満」でない } |
画面からの入力値は数値でも文字列として渡ってくるかもしれません。(どうやったか忘れました。)
is_numeric() は文字列型の数値でも数値として判定してくれます。
これで数値であることを判定してから、最大値最小値のチェックをします。
リスト項目チェック
リスト項目とは、HTMLのインプット項目でセレクトボックスやチェックボックス、ラジオボタンなど予め値が決まっている場合のチェックを行います。
HTML上で値を改ざんして送信するなんてことは簡単に出来てしまうため、サーバー側でDBを更新する前にチェックする必要があります。
リスト表示は配列を作って、それに含まれているかのチェックをします。
例えばリストだったらHTMLでこういうものがあります。
1 2 3 4 5 6 |
<select name="ketsueki"> <option value="A">A型</option> <option value="B">B型</option> <option value="O">O型</option> <option value="AB">AB型</option> </select> |
このように value とラベルで設定されています。
この項目をPHPの配列にすると、
1 2 3 4 5 6 |
$ary = array( "A" => "A型", "B" => "B型", "O" => "O型", "AB" => "AB型" ); |
このように表せれます。
入力値が $var だとすると、
1 2 3 4 5 |
if (isset($ary[$var])) { // リストに設定された値 } else { // リストに設定されていない値 } |
のように書けます。
これで不正に改ざんされ想定外の値が入力されてもチェック出来ます。
入力チェックはフォーマットを用意すれば超簡単
入力チェックは、どんなシステムを作っても行うチェックの内容がほぼ同じです。
「ほぼ」というのは、稀に独自の入力チェックを用意している会社もあるからです。
それでも、上記で紹介したようなことはどこも行うと思います。
なので予め入力項目一覧のフォーマットを作成し、チェック処理も関数で作成しておくと便利です。
更に言えば設計書からチェック処理のコードを自動生成できるようにしておけばその分の開発工数を削減出来ます。
最初は完璧なものを作れなくても、想定外のチェックが入る度に自分の入力チェックフォーマットを更新していけば後々かなり便利です。
まとめ
入力チェックはその項目単体でのチェックなので比較的簡単です。
この入力チェックが全て通れば次は整合性チェックになります。
これはデータとして正しいかなどがあります。
入力チェックのようにテンプレートがあるものではありません。
仕様に合わせてチェック処理を作成していく必要があります。
コメントを残す