【PHPでのwebアプリの作り方】入力データのバリデーションを解説編

keybord Webエンジニア

webアプリにはユーザーによる何らかの入力がされることがほとんどです。その際に意図しない入力ははじくようなバリデーションを実装する必要があります。

今回はそのバリデーションについて詳しく見ていきたいと思います。

どんなバリデーションがある?

まずは思いつくところでどんなバリデーションがあるかを書いてみます。

  • 必須入力
  • 二回入力して値が一致している
  • メールアドレスとして正しい形か判定
  • 数字で入力されているか判定
  • 半角英数字で入力されているか判定
  • 全角カタカナで入力されているか判定
  • その他

必須入力

空白のまま進めない、絶対に入力が必須な項目に対してのバリデーションです。登録に際して必須入力な情報は色々とあると思います。

判定は空白か否かで出来るのでかなり簡単な部類の実装になります。

二回入力して値が一致している

メールアドレスやパスワードなど、間違えていると困るような情報を二回入力させることで間違いを防ぐためのバリデーションになります。

特にパスワードは基本入力内容が見えなくなっているので、万が一入力を間違えて進んでいると後でログインできないなど致命的です。

項目を「パスワード」「パスワード(もう一度入力)」などにして二回入力させ、二つの値が一致しているかを判定する実装になりますが、これも簡単な方ですね。

メールアドレスとして正しい形か判定

メールアドレスは基本「xxxx@yyyy.zzz」といった形ですよね。ここに「aiueo」とか入力したらそれで登録できてしまうではなくはじく必要があります。

メールアドレスとして正しいかの判定は正規表現(preg_match関数)を使うことになるので少し難しい実装になります。しかしサンプルは検索すればたくさん出てきます。

ただメールアドレスは色々な形式があるため、完全な判定は難しいとされている分野のようです。簡単に実装できる以下を試すのも良さそうです。

filter_var('xxxx@yyyy.zzz', FILTER_VALIDATE_EMAIL);

数字で入力されているか判定

年齢や価格など半角数字でしか入力を許さない部分に対応するバリデーションになります。

こちらも正規表現(preg_match関数)を使うことになるでしょう。

preg_match("/^[0-9]+$/", $text)

PHPには数字かを判定するis_numeric関数というものもあるのですが、これだと「1e2」といった16進数まで数字と判定されるので、フォームに通常の10進数が入力されているかの判定は正規表現にすることが多いのかなと思います。

半角英数字で入力されているか判定

ユーザーIDなんかで半角英数字のみといった制限の入力項目がありますよね、これも正規表現での判定になると思います。

一応調べてきたサンプルを載せますが、こういったものは実際に使う際には色々値を入れて検証して、想定するものと違えば自分で手直ししつつ使うようご注意ください。

preg_match("/^[a-zA-Z0-9]+$/", $text)

preg_matchですが、一致すればtrue、他はfalseが返ってくるので、これをif文で判定して分岐させる処理を実装する形になります。

全角カタカナで入力されているか判定

日本語特有の漢字やカタカナ、ひらがなのみの入力となってくるとさらに難しい正規表現になってきます。

こちらも絶対的な正解を見つけるのは難しいと思うので、色々と検索して試しながら試行錯誤してみてください。

特に日本語は文字コードにも気を付けないと正しい判定ができないなんてこともあるので注意が必要です。

その他

その他、場合によって色々なバリデーションが必要になってくると思います。

例えば都道府県で東京を選んでいなければ、市区町村で港区を選択してきてはいけないなど他の項目と連携してチェックする項目が変わるなんて場合もあるでしょう。

こちらは送信側のjavascriptで制御することも多いパターンかと思いますが、サーバー側でのチェックもやはり必要になります。

その都度必要なパターンに応じて最適な実装方法を考えてみてください。

まとめ

バリデーションを色々と見てきましたが、実はこのあたりはフレームワークを使うとそのフレームワーク独自のバリデーションが用意されていることがほとんどです。

フレームワークではそのバリデーションを利用するので、自分でイチから正規表現でバリデーションを書くことって特殊なケース以外ではないかもしれません。

興味のある方はフレームワークの公式ドキュメントのバリデーションの部分を読んでみるとわかりやすいと思います。