Chapter04 条件分岐

概要と目標 必須項目やメールアドレスなどの、
入力チェックが出来るようになろう。

ユーザーが送信したデータの空白チェックや、メールアドレスなどの形式のチェックなど、
様々なバリデーション機能を開発できるようになりましょう。

今回のゴール

RERUN

分岐(if文)とは 特定の条件によって、
処理の流れを変える。

条件式が truefalse によって処理の流れを変える制御構文。

if文は、条件がtrueがまたは、falseによって処理を分ける制御構文
if構文
if (条件式) {
  // 条件式が true の時の処理

} else {
  // 条件式が false の時の処理

}

else { } は省略可能。

比較演算子 2つの値を比較する。

2つの値を比較する時は、比較演算子を用いる。

主な比較演算子
演算子 説明
A > B A が B より大きい時 true
A < B A が B より小さい時 true
A >= B A が B 以上の時 true
A <= B A が B 以下の時 true
A == B A が B と等しい時 true
A != B A が B と異なる時 true
A === B A が B とデータ型も含めて等しい時 true
A !== B A が B とデータ型も含めて異なる時 true
比較演算子を使ったif文のサンプル
$age = 24;
if ($age >= 20) { // $age の中身が「20」以上なら true
  echo '利用可能';
} else {
  echo '利用不可';
}

必須項目チェック 比較演算子を使って、
必須項目のチェックを行う。

必須項目のチェックは、ユーザーの入力内容が、「空白」と等しいかをif文でチェックすれば良い。

if文を使って必須項目のチェックをやってみよう。

  1. 「chapter04」 › 「validate」フォルダ内の「index.html」をテキストエディタで開く
  2. 下記を参考に、入力フォームを作成
chapter04/validate/index.html
<form action="receive.php" method="post">
  <dl>
    <dt><label for="your_name">お名前(必須)</label></dt>
    <dd><input type="text" id="your_name" name="your_name"></dd>
  </dl>
  <p><input type="submit" value="入力確認"></p>
</form>
  1. 上書き保存
  2. 「chapter04」 › 「validate」フォルダ内の「receive.php」をテキストエディタで開く
  3. <?php?>の間に、受けった値が 空白 と等しいかをチェック
chapter04/validate/receive.php
// 必須項目チェック
if ( $_POST['your_name'] == '' ) {
  // $_POST['your_name'] が 空白 と等しい時の処理
  echo '<p>お名前を入力して下さい。</p>';
}
  1. 上書き保存
  2. ブラウザで「chapter04」 › 「validate」フォルダ内の「index.html」にアクセス
    http://localhost/php-lessons/chapter04/validate/index.html
  3. 空白のまま「入力確認」ボタンをクリックして、
    「お名前を入力して下さい。」と表示されることを確認
ブラウザでの表示例

RERUN

メールアドレスチェック メールアドレスの判断なら、
filter_var関数が便利。

メールアドレスやURLを判別するには、filter_var関数を用いると効率がよい。
この関数は第1引数で指定したデータが、第2引数で指定した形式と一致したら、
チェックしたデータを返し、一致しなければ、false を返す。

filter_var関数 ・・・ フィルタリングする関数 (PHP5 〜)
filter_var(チェックする値, 形式, オプション)
                            省略可

戻り値: 形式が一致 ・・・ チェックしたデータ
      形式が不一致 ・・・ false

引数はPHPマニュアルを参照

主な形式
定数 説明
FILTER_VALIDATE_EMAIL 妥当なメールアドレスの形式かを検証
FILTER_VALIDATE_URL URL形式かを検証

メールアドレスの形式チェックをやってみよう。

  1. 「chapter04」 › 「validate」フォルダ内の「index.html」をテキストエディタで開く
  2. 下記を参考に、メールアドレスの入力フィールドを追加
chapter04/validate/index.html
<form action="receive.php" method="post">
  <dl>
    <dt><label for="your_name">お名前(必須)</label></dt>
    <dd><input type="text" id="your_name" name="your_name"></dd>
    <dt><label for="your_email">メールアドレス</label></dt>
    <dd><input type="text" id="your_email" name="your_email"></dd>
  </dl>
  <p><input type="submit" value="入力確認"></p>
</form>
  1. 上書き保存
  2. 「chapter04」 › 「validate」フォルダ内の「receive.php」をテキストエディタで開く
  3. ?>の手前に、受け取った値が、メールアドレスの形式かをチェック
chapter04/validate/receive.php
// 必須項目チェック
if ( $_POST['your_name'] == '' ) {
  // $_POST['your_name'] が 空白 と等しい時の処理
  echo '<p>お名前を入力して下さい。</p>';
}

// メールアドレスの形式チェック
if ( filter_var($_POST['your_email'], FILTER_VALIDATE_EMAIL) === false ) {
  // $_POST['your_email'] のメールアドレス形式が false(データ型も含む) と等しい時の処理
  echo '<p>メールアドレスの形式が正しくありません。</p>';
}
  1. 上書き保存
  2. ブラウザで「chapter04」 › 「validate」フォルダ内の「index.html」にアクセス
    http://localhost/php-lessons/chapter04/validate/index.html
  3. メールアドレスの項目に、適当な文字列を入力してから「入力確認」をクリックし、
    「メールアドレスの形式が正しくありません。」と表示されることを確認
ブラウザでの表示例

RERUN


条件式の「○○ === false」は短くできる。

条件式の先頭に "!" を付けると、 条件が false の時、処理を実行する。

  1. 「chapter04」 › 「validate」フォルダ内の「receive.php」をテキストエディタで開く
  2. 下記を参考に、メールアドレスの形式チェックをしている if文 の条件式に
    「!」を使って「 === false」を省略する
chapter04/validate/receive.php
// 必須項目チェック
if ( $_POST['your_name'] == '' ) {
  // $_POST['your_name'] が 空白 と等しい時の処理
  echo '<p>お名前を入力して下さい。</p>';
}

// メールアドレスの形式チェック
if ( !filter_var($_POST['your_email'], FILTER_VALIDATE_EMAIL) ) {
  // $_POST['your_email'] のメールアドレス形式が false(データ型も含む) と等しい時の処理
  echo '<p>メールアドレスの形式が正しくありません。</p>';
}
  1. 上書き保存
  2. ブラウザで「chapter04」 › 「validate」フォルダ内の「index.html」にアクセス
    http://localhost/php-lessons/chapter04/validate/index.html
  3. メールアドレスの項目に、適当な文字列を入力してから「入力確認」をクリックし、
    「メールアドレスの形式が正しくありません。」と表示されることを確認
ブラウザでの表示例

RERUN

文字数のチェック 何文字入力されたかは、
mb_strlen関数でわかる。

mb_strlenという関数を使えば、文字数を取得できる。
後は比較演算子で、「○文字以上の時」や「○文字以下の時」などのように、文字数を比較すればよい。

mb_strlen関数 ・・・ 文字数を取得する関数
mb_strlen(文字数を調べたい文字列, 文字コード)
                                省略可

戻り値: 文字数

引数はPHPマニュアルを参照

文字数のチェックをやってみよう。

  1. 「chapter04」 › 「validate」フォルダ内の「index.html」をテキストエディタで開く
  2. 下記を参考にパスワードの入力フィールドを追加
chapter04/validate/index.html
<form action="receive.php" method="post">
  <dl>
    <dt><label for="your_name">お名前(必須)</label></dt>
    <dd><input type="text" id="your_name" name="your_name"></dd>
    <dt><label for="your_email">メールアドレス</label></dt>
    <dd><input type="text" id="your_email" name="your_email"></dd>
    <dt><label for="your_password">パスワード(4文字以上)</label></dt>
    <dd><input type="password" id="your_password" name="your_password"></dd>
  </dl>
  <p><input type="submit" value="入力確認"></p>
</form>
  1. 上書き保存
  2. 「chapter04」 › 「validate」フォルダ内の「receive.php」をテキストエディタで開く
  3. ?>の手前に、受け取った値が「4」文字より小さいかをチェック
chapter04/validate/receive.php
// 必須項目チェック
if ( $_POST['your_name'] == '' ) {
  // $_POST['your_name'] が 空白 と等しい時の処理
  echo '<p>お名前を入力して下さい。</p>';
}

// メールアドレスの形式チェック
if ( !filter_var($_POST['your_email'], FILTER_VALIDATE_EMAIL) ) {
  // $_POST['your_email'] のメールアドレス形式が false(データ型も含む) と等しい時の処理
  echo '<p>メールアドレスの形式が正しくありません。</p>';
}

// 文字数のチェック
if ( mb_strlen( $_POST['your_password'] ) < 4) {
  // $_POST['your_password'] の文字数が 4 より小さい時の処理
  echo '<p>パスワードは4文字以上で入力して下さい。</p>';
}
  1. 上書き保存
  2. ブラウザで「chapter04」 › 「validate」フォルダ内の「index.html」にアクセス
    http://localhost/php-lessons/chapter04/validate/index.html
  3. パスワードに4文字未満の文字を入力した後「入力確認」をクリックし、
    「パスワードは4文字以上で入力して下さい。」と表示されることを確認
ブラウザでの表示例

RERUN

エラーの有無を判別 エラーメッセージを変数に格納すれば、
変数の中身が空かどうかで判別できる。

一般的なフォームは、送信内容のどれか一つにでもエラーがあれば送信できない。
エラーがあったか、なかったかを判別するには、
エラーがあった項目のエラーメッセージを変数で管理する。
そして、その変数に何かしらのメッセージが入っていれば、「エラーあり」、
空っぽだったら、「エラーなし」と判断することができる。
変数の中身が空かどうかをチェックするには、empty関数を用いる。
この関数は変数の中身が空なら true 中身があれば、 false を返す。
このように、関数の中には戻り値に真偽値(boolean型)を返すものがある。
これを条件式に使い処理を分岐させることができる。

empty関数 ・・・ 変数の中身が空かを判断する関数
empty(チェックしたい変数)

戻り値: 空 ・・・ true
        空ではない ・・・ false

引数はPHPマニュアルを参照

エラーの有無を判別してみよう。

  1. 「chapter04」 › 「validate」フォルダ内の「receive.php」をテキストエディタで開く
  2. 下記を参考に、文字列の結合演算子を活用し、エラーメッセージを $error という変数で管理する仕様に変更
chapter04/validate/receive.php
// エラーメッセージを管理する変数を用意(空白を代入しておく)
$error = '';

// 必須項目チェック
if ( $_POST['your_name'] == '' ) {
  // $_POST['your_name'] が 空白 と等しい時の処理
  $error .= '<p>お名前を入力して下さい。</p>';
}

// メールアドレスの形式チェック
if ( !filter_var($_POST['your_email'], FILTER_VALIDATE_EMAIL) ) {
  // $_POST['your_email'] のメールアドレス形式が false(データ型も含む) と等しい時の処理
  $error .= '<p>メールアドレスの形式が正しくありません。</p>';
}

// 文字数のチェック
if ( mb_strlen( $_POST['your_password'] ) < 4) {
  // $_POST['your_password'] の文字数が 4 より小さい時の処理
  $error .= '<p>パスワードは4文字以上で入力して下さい。</p>';
}
  1. ?>の手前に、$error変数が空かをチェック
chapter04/validate/receive.php
// エラーメッセージを管理する変数を用意(空白を代入しておく)
$error = '';

// 必須項目チェック
if ( $_POST['your_name'] == '' ) {
  // $_POST['your_name'] が 空白 と等しい時の処理
  $error .= '<p>お名前を入力して下さい。</p>';
}

// メールアドレスの形式チェック
if ( !filter_var($_POST['your_email'], FILTER_VALIDATE_EMAIL) ) {
  // $_POST['your_email'] のメールアドレス形式が false(データ型も含む) と等しい時の処理
  $error .= '<p>メールアドレスの形式が正しくありません。</p>';
}

// 文字数のチェック
if ( mb_strlen( $_POST['your_password'] ) < 4) {
  // $_POST['your_password'] の文字数が 4 より小さい時の処理
  $error .= '<p>パスワードは4文字以上で入力して下さい。</p>';
}

// エラーの有無を判別
if ( empty( $error ) ) {
  // $error が 空 の時の処理 (エラーなし)
  echo 'エラーはありません';
} else {
  echo $error;
}
  1. 上書き保存
  2. ブラウザで「chapter04」 › 「validate」フォルダ内の「index.html」にアクセス
    http://localhost/php-lessons/chapter04/validate/index.html
  3. フォームをエラーがないように入力して「入力確認」をクリックすると、「エラーはありません」
    エラーがある状態で「入力確認」をクリックすると、エラーメッセージが表示されるかを確認
ブラウザでの表示例

RERUN

empty関数の注意点
empty関数は、変数の中身が "0" の場合、true となる。(「空」とみなされる)
"0" を空として判断したくない場合は、比較演算子を使った方法を使う。

論理演算子 条件式を組み合わせる。

複数の条件式が全て true 時だけ処理を実行し実行したり、
どちらかの条件式だけが true 時だけ処理を実行したりすることが出来る。
このように条件式を組み合わせるための演算子を論理演算子と呼ぶ。

主な論理演算子
演算子 説明
Aの式 && Bの式 A、B どちらの式も true の時に true
Aの式 and Bの式 A、B どちらの式も true の時に true
Aの式 || Bの式 A、B どちらかの式が true の時に true
Aの式 or Bの式 A、B どちらかの式が true の時に true
論理演算子を使ったif文のサンプル
$age = 24;
if ($age >= 20 && $age < 30) {
  // $age の中身が「20」以上 かつ $age の中身が「30」未満なら true
  echo '20代ですね';
}

ログインチェック メールアドレスとパスワード
どちらも一致したらログイン成功。

ログインチェックを行うには、予め登録したメールアドレスやパスワードと、
ログインフォームから入力された、メールアドレスやパスワードが一致しているかを確認する。

ログインチェックをやってみよう。

  1. 「chapter04」 › 「login」フォルダ内の「index.html」をテキストエディタで開く
  2. 下記を参考にログインフォームを作成
chapter04/login/index.html
<form action="receive.php" method="post">
  <dl>
    <dt><label for="your_email">メールアドレス</label></dt>
    <dd><input type="text" id="your_email" name="your_email"></dd>
    <dt><label for="your_password">パスワード</label></dt>
    <dd><input type="password" id="your_password" name="your_password"></dd>
  </dl>
  <p><input type="submit" value="ログイン"></p>
</form>
  1. 上書き保存
  2. 「chapter04」 › 「login」フォルダ内の「receive.php」をテキストエディタで開く
  3. <?php?>の間に、ログインするためのメールアドレスとパスワードを変数に代入
chapter04/login/receive.php
// 今回はログイン用のメールアドレスとパスワードを変数で管理
$email = 'dummy@dummy.com';
$password = 'dummy';
  1. ?>の手前に、受け取ったメールアドレス が 変数のメールアドレスと等しい かつ 受け取ったパスワード が 変数のパスワードと等しい かをチェック
chapter04/login/receive.php
// 今回はログイン用のメールアドレスとパスワードを変数で管理
$email = 'dummy@dummy.com';
$password = 'dummy';

// メールアドレスとパスワードどちらも合っているかをチェック
if ( $_POST['your_email'] == $email && $_POST['your_password'] == $password ) {
  // $_POST['your_email'] が $email と等しい かつ
  // $_POST['your_password'] が $password と等しい時の処理
  echo '<p>ログイン成功</p>';
} else {
  echo '<p>メールアドレスとパスワードが一致しません</p>';
}
  1. 上書き保存
  2. ブラウザで「chapter04」 › 「login」フォルダ内の「index.html」にアクセス
    http://localhost/php-lessons/chapter04/login/index.html
  3. 変数に代入したメールアドレスとパスワードを入力し「ログイン」をクリック
ブラウザでの表示例

RERUN

Noticeを回避する 変数が存在するか、
確認してから利用する。

PHPでは、存在しない変数を使おうとすると、Noticeという警告がでる。
Noticeが出ても動作はするが、極力出さないほうがいい。

isset関数 ・・・ 変数が存在するか確認する関数
isset(調べたい変数)

引数はPHPマニュアルを参照

Noticeを出してみる

  1. 「chapter04」 › 「notice」フォルダ内の「index.php」をテキストエディタで開く
  2. 下記を参考にinput要素のvalue属性に、
    送信したデータを初期値として設定している入力フォームを作成
    form 要素の action 属性を 空 にして自分自身にデータを送信する)
chapter04/notice/index.php
<form action="" method="post">
  <dl>
    <dt><label for="msg">ひとこと</label></dt>
    <dd><input type="text" id="msg" name="msg" value="<?php echo htmlspecialchars($_POST['msg'], ENT_QUOTES, 'UTF-8'); ?>"></dd>
  </dl>
  <p><input type="submit" value="つぶやく"></p>
</form>
  1. 上書き保存
  2. ブラウザで「chapter04」 › 「notice」フォルダ内の「index.php」にアクセス
    http://localhost/php-lessons/chapter04/notice/index.php
  3. ダイレクトでアクセスしたときには、$_POSTは存在しないので、
    「Notice」が出ることを確認
    $_POSTform要素内の送信ボタンを押されてから生成される)
ブラウザでの表示例

RERUN


Noticeが出ないようにしてみよう

  1. 「chapter04」 › 「notice」フォルダ内の「index.php」をテキストエディタで開く
  2. 下記を参考に、isset()関数を用いて、$_POSTが存在しているかを確認してから、
    初期値を出力する仕様に変更
chapter04/notice/index.php
<form action="" method="post">
  <dl>
    <dt><label for="msg">ひとこと</label></dt>
    <dd><input type="text" id="msg" name="msg" value="<?php if ( isset($_POST['msg']) ) { echo htmlspecialchars($_POST['msg'], ENT_QUOTES, 'UTF-8'); } ?>"></dd>
  </dl>
  <p><input type="submit" value="つぶやく"></p>
</form>
  1. 上書き保存
  2. ブラウザで「chapter04」 › 「notice」フォルダ内の「index.php」にアクセス
    http://localhost/php-lessons/chapter04/notice/index.php
  3. 「Notice」が出ないことを確認
ブラウザでの表示例

RERUN

Noticeを設定で非表示する方法
下記のコードをページの冒頭に記述することで、そのページのNoticeを非表示にする設定ができます。
ただし、本来はNoticeを出さないようにプログラミングする方が好ましいです。
error_reporting(E_ALL & ~E_NOTICE);

練習問題 今回の理解度をチェック。

完成例を参考に「tranig」フォルダ内の「receive.php」を完成させて下さい。

ブラウザでの表示例

RERUN

「receive.php」の問題

    • 必須項目のチェック
      • お名前: 「お名前を入力して下さい。」
      • メールアドレス: 「メールアドレスを入力して下さい。」
      • お問い合わせ内容: 「お問い合わせ内容を入力して下さい。」
    • 形式のチェック
      • メールアドレス: 「メールアドレスの形式が正しくありません。」
    • 表示場所: 文字列「入力確認」の下
    • 表示形式: 順不同型リスト
    • 文字列「お名前」
      • 表示するデータ: お名前
    • 文字列「メールアドレス」
      • 表示するデータ: メールアドレス
    • 文字列「お問い合わせ内容」
      • 表示するデータ: お問い合わせ内容
解答例
chapter04/training/receive.php
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>練習問題4</title>
</head>
<body>
  <h1>入力確認</h1>
  <?php
    // エラーメッセージを格納する変数を初期化
    $error = '';

    // お名前の入力チェック
    if ( $_POST['your_name'] == '' ) {
      $error .= '<li>お名前を入力して下さい。</li>';
    }

    // メールアドレスの入力チェック
    if ( $_POST['your_email'] == '' ) {
      $error .= '<li>メールアドレスを入力して下さい。</li>';
    }

    if ( $_POST['your_email'] != '' && !filter_var($_POST['your_email'], FILTER_VALIDATE_EMAIL) ) {
      $error .= '<li>メールアドレスの形式が正しくありません。</li>';
    }

    // お問い合わせ内容の入力チェック
    if ( $_POST['inquiry'] == '' ) {
      $error .= '<li>お問い合わせ内容を入力して下さい。</li>';
    }

    // エラーの有無を判別
    if ( !empty($error) ) {
      echo '<ul>' . $error . '</ul>';
    } else {
  ?>

  <dl>
    <dt>お名前</dt>
    <dd>
      <?php echo htmlspecialchars($_POST['your_name'], ENT_QUOTES, 'UTF-8'); ?>
    </dd>
    <dt>メールアドレス</dt>
    <dd>
      <?php echo htmlspecialchars($_POST['your_email'], ENT_QUOTES, 'UTF-8'); ?>
    </dd>
    <dt>お問い合わせ内容</dt>
    <dd>
      <?php echo htmlspecialchars($_POST['inquiry'], ENT_QUOTES, 'UTF-8'); ?>
    </dd>
  </dl>

  <?php
    }
  ?>
  <p><a href="./">入力フォームに戻る</a></p>
</body>
</html>

解答例は全問題のチェックボックスが on になるとご覧いただけます。

まとめ 入力チェックは、if文で出来る。

if文は条件式に応じて処理を分ける制御構文です。
入力チェックなどでよく使うので覚えておきましょう。

  • if文は、条件によって処理を分ける制御構文。
  • 2つの値を比較するときは比較演算子を使う。
  • 条件式を組み合わせるときは論理演算子を使う。
  • Noticeはisset関数で対策できる。