入力されたメールアドレスとパスワードをチェックする(PHP+PEARでウェブサービス勉強記録・5)

今回は、メールアドレスとパスワードのチェックについて考えてみます。

パスワードのチェック欄を増設する

その前に、テストで作成したフォームを修正します。

テストでは、パスワードの入力欄は1つのみでしたが、入力欄を2つに分け、パスワード確認のために2回入力させるようにします。

1つ目のパスワード入力欄のnameは「password」

2つ目のパスワード入力欄のnameは「password2」としました。

form_modify

続いて、メールアドレスのチェックを行います。

前回のメールアドレスチェックは、

  • メールアドレスが空欄になっていないか
  • 入力されたメールアドレスは、すでに使用されていないか

の2点のみチェックしました。

今回は、メールの書式チェックを行います。

ただ、メールの書式チェックは、一筋縄ではいきません。

メールアドレスの正規表現チェックに関する議論

dankogaiさんによるブログ記事「『PHP使いはもう正規表現をblogに書くな』と言わせないでくれ」に詳しく書かれていますが、メールアドレスの正規表現チェックは、正確に書くと非常に複雑になります。参考情報として

など拝見しましたが、正直、今の僕のレベルでは、一からメールアドレスの仕様を解釈して、正規表現を書くまで至りませんでした。

ここでは「ぱふぅ家のホームページ」さんの記事「正規表現でメールアドレスかどうかチェックする」を参考にさせていただきました。

elseif (!preg_match("/[0-9a-z!#\$%\&'\*\+\/\=\?\^\|\-\{\}\.]+@[0-9a-z!#\$%\&'\*\+\/\=\?\^\|\-\{\}\.]+/" , $email) ) {

    $regist_error .= "正しいemailアドレスを入力してください。<br />";

    }

 

パスワードの仕様と入力値チェック

続いて、パスワードの入力チェックを行います。

パスワードのチェック仕様は以下のようにします。

  1. パスワードは全角文字を禁止する。半角英数および記号は利用可能
  2. パスワードの長さは6文字以上、32文字以下とする
  3. パスワードを2回入力させ、両者が完全に一致した場合のみ登録可能とする

まずは、パスワード入力欄が2つとも入力されているか(空ではないか)をチェックします。

    if(empty($password) || empty($password2)) {
        
        $regist_error .= "パスワードが正しく入力されていません。<br />";
        
    } 

 

次に、全角文字以外のパスワードチェックです。

ユーザーIDとは違い、記号も許可させたいので、前回の半角英数文字にプラスして、各種記号をマッチングさせればよいかな・・・ と思っていたところ、Layer8さんのブログ記事を発見。「asciiコード上でのマッチング」という方法に気が付きました。

これを参考に、入力されたパスワードが半角英数記号かどうかを確認します。

/* 入力されたパスワードが半角英数記号のみかどうかをチェック */

 

elseif (!preg_match( "/[\@-\~]/" , $password)) {

$regist_error .= "パスワードは半角英数字及び記号のみ入力してください。<br />"; }

 

パスワードの入力文字数チェックは、ユーザーID同様、文字数の長さをチェックします。

    /* 入力されたパスワードの長さが6文字以上、32文字以下かどうかをチェック*/

      elseif(mb_strlen($password) < 6) {

    $regist_error .= "パスワードは6文字以上で設定してください<br />";
    
    } elseif (mb_strlen($password) > 32) {
    
    $regist_error .= "パスワードが長すぎます。32文字以下で設定してください。<br />";

    }

 

最後に、入力されたpassword及びpassword2が完全に一致しているかどうかをチェックします。比較演算子で、値及び型の完全一致を確認します。

 

     elseif($password !== $password2) {
    
        $regist_error .= "入力されたパスワードが一致しません。<br />";
    }

 

前回のユーザーIDチェックを含め、上記をまとめたのが、以下になります。

registCheck.php

<?php

/* 入力されたユーザーIDとパスワードを変数に取得 */

$username = $_POST["username"];
$email = $_POST["email"];
$password = $_POST["password"];
$password2 = $_POST["password2"];

/* PEAR::DBを利用してユーザー名とメールアドレスの有無を取得 */

require_once("DB.php");

$dsn = "mysqli://pear:peartest@localhost/pear";

$myDB = DB::connect($dsn);
	
$user_exist = $myDB -> getRow("SELECT username FROM auth WHERE username='$username' ");
$email_exist = $myDB -> getRow("SELECT email FROM auth WHERE email='$email' ");


/* エラーメッセージ用変数 $regist_error 初期化 */

    unset($regist_error);

/* データ登録モードの場合、処理に入る */

if ($_POST["mode"] == check ) {

/* 入力されたIDが空か、もしくは適切でないかをチェック */


      if(empty($username)) {

      $regist_error = "IDは必須です。<br />";

    } elseif (!empty($user_exist)) {

    $regist_error .= "IDに入力した ".$username."はすでに使用されています。<br />";

    } elseif (!preg_match("/^[a-zA-Z0-9]+$/", $username)) {

    $regist_error .= "IDには半角英数字のみ使用してください。<br />";

    }

/* 入力されたIDの長さが4文字以上、32文字以下かどうかをチェック*/

      elseif(mb_strlen($username) < 4) {

    $regist_error .= "IDは4文字以上で設定してください<br />";
    
    } elseif (mb_strlen($username) > 32) {
    
    $regist_error .= "IDが長すぎます。32文字以下で設定してください<br />";

    }
    
/* 入力されたメールアドレスが空か、もしくは適切でないかをチェック */

        if(empty($email)) {

        $regist_error .= "emailは必須です。<br />";

    }   elseif (!empty($email_exist)) {

    $regist_error .= "メールアドレスに入力した ".$email."はすでに使用されています。<br />";

    }  
    
/* 入力されたメールアドレスの正規表現チェック  */
    
    elseif (!preg_match("/[0-9a-z!#\$%\&'\*\+\/\=\?\^\|\-\{\}\.]+@[0-9a-z!#\$%\&'\*\+\/\=\?\^\|\-\{\}\.]+/" , $email) ) {

    $regist_error .= "正しいemailアドレスを入力してください。<br />";

    }

/* 入力されたパスワードが空か、もしくは適切でないかをチェック */

    if(empty($password) || empty($password2)) {
        
        $regist_error .= "パスワードが正しく入力されていません。<br />";

    }
    
/* 入力されたパスワードが半角英数記号のみかどうかをチェック */
    
    elseif (!preg_match( "/[\@-\~]/" , $password)) {

        $regist_error .= "パスワードは半角英数字及び記号のみ入力してください。<br />";

    }

/* 入力されたパスワードの長さが6文字以上、32文字以下かどうかをチェック*/

      elseif(mb_strlen($password) < 6) {

    $regist_error .= "パスワードは6文字以上で設定してください<br />";
    
    } elseif (mb_strlen($password) > 32) {
    
    $regist_error .= "パスワードが長すぎます。32文字以下で設定してください。<br />";

    }

/* 入力されたパスワードおよび確認用パスワードが一致しているかをチェック */

     elseif ($password !== $password2) {
    
        $regist_error .= "入力されたパスワードが一致しません。<br />";
    }

}

?>

 

メールアドレスが「ほげ@hoge.com」のとき

mail_hiragana

パスワードをひとつしかいれていないとき

error_password_single

パスワードを「hoge」のみにしたとき

error_password_short

パスワードを「hogehoge」、確認用パスワードを「hugahuga」にしたとき

error_password_different

 

 

次回は入力情報の確認画面

次回は、入力情報の確認画面を設定します。

入力された値をセッションに保存して、値を使い回しながら、データ登録用プログラム、チェックプログラム、登録プログラムを分離して管理します。