PHPで値をバリデーションする方法を現役エンジニアが解説【初心者向け】

初心者向けにPHPで値をバリデーションする方法について解説しています。指定のデータが適切な値であるかどうかをチェックすることをバリデーションといいます。バリデーションの利用例と書き方を学習しましょう。

TechAcademyマガジンは受講者数No.1のオンラインプログラミングスクールTechAcademy [テックアカデミー]が運営。初心者向けに解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。

PHPで値をバリデーションする方法について、TechAcademyのメンター(現役エンジニア)が実際のコードを使用して初心者向けに解説します。

ウェブサイトやウェブアプリケーションにユーザーが入力するフォームを設置したときは、データのバリデーションは必ず実行します。以下の記事を読みながらバリデーションの仕方を学びましょう。

 

そもそもPHPについてよく分からないという方は、PHPとは何なのか解説した記事を読むとさらに理解が深まります。

 

なお本記事は、TechAcademyのオンラインブートキャンプPHP/Laravel講座の内容をもとに紹介しています。

 

田島悠介

今回は、PHPに関する内容だね!

大石ゆかり

どういう内容でしょうか?

田島悠介

値をバリデーションする方法について詳しく説明していくね!

大石ゆかり

お願いします!

目次

 

PHPのバリデーションとは

バリデーションとは、データの妥当性をチェックすることを意味します。

例えば、ウェブページでお問い合わせ用のフォームを作成する場合、フォームに入力されたデータはサーバーに送信されます。そこでPHP等のプログラミング言語を使ってデータを処理することになりますが、送信データが正しい形式のデータであるかどうかや想定した文字数の範囲か、適切なデータ型なのかをチェックするのがバリデーション機能です。

 

[PR] PHPプログラミングで挫折しない学習方法を動画で公開中

バリデーションを行う理由

ユーザーがフォームに入力する値が必ずしも適切な値であるとは限りません。バリデーションを行うことで、正しい形式のデータのみを受け入れ可能にすることができます。また、ユーザーに誤ったデータを入力したことを伝えて、入力誤りを訂正する機会を提供できます。

入力値のバリデーションで確認する事項は主に以下の点です。

  • 必須項目があるか
  • 正しいデータ形式か
  • 項目内容に照らして、妥当な値か
  • 不正な内容が含まれているか

 

最後の不正な内容かどうかのチェックは、セキュリティ上求められる項目です。入力データにタグやコードが含まれていると、そのままデータを表示すると開発者の意図していない動作を行う危険があります。それを防ぐためには、バリデーションルールを細かく設定する、表示の際にエスケープ処理をするなどして、データを無害化することが大切です。

 

実際に書いてみよう

 

良く使う入力値チェックの方法

ここでは、フォームのデータによく使われるバリデーションの方法をコードで見ていきます。

 

必須データのチェック

if(empty($password)){
  echo 'パスワードは必須項目です。';
}

入力項目を必須項目にしたい場合に利用するのが empty() 関数です。

empty()関数は、引数の値がnullか0、falseのとき、trueを返します。$passwordに値が入っていなければ、エラーメッセージが表示されます。

 

文字列の長さをチェック

if(mb_strlen ($password) < 8){
  echo 'パスワードは8文字以上で入力して下さい。';
}

文字列の長さに制限を掛けたいときに使うのが、 mb_strlen() 関数です。

mb_strlen()関数は、引数に渡された文字列の長さを返します。返り値と上限・下限値を比較することで、文字列の長さが制限範囲内かどうか判断できます。

 

 

emailの形式をチェック

if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
  echo '正しいEメールアドレスを指定してください。';
}

Eメールアドレスには、一定の形式があります。入力された値が妥当なメールアドレスの書式かどうか判定するには、 filter_var() 関数が役に立ちます。この関数は、第2引数のフィルタの型を変えることで、様々なデータの検証に用いられます。Eメールアドレスの場合は、 FILTER_VALIDATE_EMAIL を使います。

 

リストの値のどれかに当たるかチェック

if(!in_array($gender, ['female','male'])){
  echo '性別を選択して下さい。';
}

入力値を特定のリストの値のみに制限したいこともあるでしょう。その場合は、 in_array() 関数を使って、入力値がリストの中に含まれていないかどうかを判定します。

 

カスタム形式

開発者が自由にパターンを設定して、そのパターンに当てはまる値のみ受け入れたい場合は、 preg_match() 関数を使います。

 

preg_match(正規表現パターン, 対象文字列);

第1引数に、正規表現パターンを、第2引数に調べたい対象となる文字列を渡します。文字列がパターンに当てはまっていれば1を、それ以外は0を返します。

正規表現は文字列の複雑なパターンを一定のルールに従って表現したものです。詳しい使い方はこちらのサイト(https://techacademy.jp/magazine/11402)に分かりやすい解説があります。

 

preg_matchを使った実例

郵便番号の形式(000-0000)かどうかチェックしたいとします。

if(preg_match("/[0-9]{3}-[0-9]{4}/", $value) === 0){
  echo '郵便番号の書式(000-0000)で入力してください。';
}

郵便番号のパターンは /[0-9]{3}-[0-9]{4}/ で表せます。このパターンに当てはまらなければ0が返りますので、エラーメッセージが表示されます。

 

お問い合わせフォームを実際に書いてみよう

今までご紹介してきた方法を使って実際にフォームのバリデーションを書いてみましょう。

ここでは説明のために簡単に二つのファイルを用意します。

  1. contact.php お問い合わせフォームを表示
  2. validate.php フォームデータのバリデーションをして、結果を表示

次にフォーム項目とその項目に指定したいバリデーションの内容を決めます。

フォームの項目とバリデーション

項目名 name属性 バリデーション内容
氏名 name 必須項目
Eメール email 必須項目 Eメールの書式
性別 gender female 又は male
タイトル title 必須項目
お問い合わせ内容 content 必須項目 255文字以下

contact.php

お問い合わせフォームでは、上記の項目の入力欄を用意し、送信先をvalidate.phpに指定します。

 

<!DOCTYPE html>
<html lang="ja">
<head>
    <title>コンタクト</title>
</head>
<body>
    <h1>お問い合わせフォーム</h1>
    <p>* は必須項目です</p>
    <form action="validate.php" method="post">
        <label for="name">*お名前</label>
        <input type="text" name="name" id="name">
        <label for="email">*Eメール</label>
        <input type="text" name="email" id="email">
        <label for="gender">性別</label>
        <select name="gender" id="gender">
            <option value=""></option>
            <option value="male">男性</option>
            <option value="female">女性</option>
        </select>
        <label for="title">*タイトル</label>
        <input type="text" name="title" id="title">
        <label for="content">*お問い合わせ内容(255文字以内)</label>
        <textarea rows="10" name="content" id="content">
            </textarea>
        <input type="submit" value="送信">
    </form>
</body>
</html>

 

 

validate.php

送信先のファイル内では、フォームの各フィールドに対して適切なバリデーションを実行します。ここで、エラーがあった場合は、 $errors 変数に格納します。最後に、$errorsの内容があればリスト表示します。

<?php
// 使用する変数を初期化
$name = '';
$email = '';
$gender = '';
$title = '';
$content = '';

// エラー内容
$errors = [];

// 送信データをチェック
if (isset($_POST)) {
    // 氏名
    if (empty($_POST['name'])) {
        $errors[] = '氏名は必須項目です。';
    }
    // Eメール
    if (empty($_POST['email'])) {
        $errors[] = 'Eメールは必須項目です。';
    } elseif (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) {
        $errors[] = '正しいEメールアドレスを指定してください。';
    }
    // 性別
    if (!empty($_POST['gender']) && !in_array($_POST['gender'], ['female','male'])) {
        $errors[] = '性別を選択してください。';
    }
    // タイトル
    if (empty($_POST['title'])) {
        $errors[] = 'タイトルは必須項目です。';
    }
    // お問い合わせ内容
    if (empty($_POST['content'])) {
        $errors[] = 'お問い合わせ内容は必須項目です。';
    } elseif (mb_strlen($_POST['content']) > 255) {
        $errors[] = 'お問い合わせ内容は255文字以内でお願いします。';
    }
}

?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <title>バリデーション結果</title>
</head>
<body>
    <h1>バリデーション結果</h1>
    <?php if (empty($errors)): ?>
    <p>バリデーションエラーはありません。</p>
    <?php else: ?>
    <ul>
        <?php foreach ($errors as $msg): ?>
        <li><?= $msg ?>
        </li>
        <?php endforeach; ?>
    </ul>
    <?php endif; ?>
</body>
</html>

 

まとめ

バリデーションは、ユーザーが入力したフォームデータのチェックに必ず必要になる機能です。この記事やほかのまとめ記事を参考に、ご自分でウェブページにフォームを作成した際にお役立てください。

 

監修してくれたメンター

メンター安野

Webアプリケーションエンジニアとして長年健診業界で業務システムの開発に従事してきました。
TechAcademyではPHP/Laravelコースを担当しています。
開発実績: 健康診断システム、電話予約システム、検査管理システム、各種データ処理ツール

 

大石ゆかり

内容分かりやすくて良かったです!

田島悠介

ゆかりちゃんも分からないことがあったら質問してね!

大石ゆかり

分かりました。ありがとうございます!

 

TechAcademyでは、初心者でもPHPやフレームワークのLaravelを使ってWebアプリケーション開発を習得できるオンラインブートキャンプPHP/Laravel講座を開催しています。

挫折しない学習方法を知れる説明動画や、現役エンジニアとのビデオ通話とチャットサポート、学習用カリキュラムを体験できる無料体験も実施しているので、ぜひ参加してみてください。