今回は、メールアドレスとパスワードのチェックについて考えてみます。
パスワードのチェック欄を増設する
その前に、テストで作成したフォームを修正します。
テストでは、パスワードの入力欄は1つのみでしたが、入力欄を2つに分け、パスワード確認のために2回入力させるようにします。
1つ目のパスワード入力欄のnameは「password」
2つ目のパスワード入力欄のnameは「password2」としました。
続いて、メールアドレスのチェックを行います。
前回のメールアドレスチェックは、
- メールアドレスが空欄になっていないか
- 入力されたメールアドレスは、すでに使用されていないか
の2点のみチェックしました。
今回は、メールの書式チェックを行います。
ただ、メールの書式チェックは、一筋縄ではいきません。
メールアドレスの正規表現チェックに関する議論
dankogaiさんによるブログ記事「『PHP使いはもう正規表現をblogに書くな』と言わせないでくれ」に詳しく書かれていますが、メールアドレスの正規表現チェックは、正確に書くと非常に複雑になります。参考情報として
- http://www.rfc-editor.org/rfc/rfc2822.txt
- http://www.hde.co.jp/rfc/rfc5321.php
- http://www.din.or.jp/~ohzaki/perl.htm#Mail
- http://www.pahoo.org/e-soul/webtech/php05/php05-05-01.shtm
など拝見しましたが、正直、今の僕のレベルでは、一からメールアドレスの仕様を解釈して、正規表現を書くまで至りませんでした。
ここでは「ぱふぅ家のホームページ」さんの記事「正規表現でメールアドレスかどうかチェックする」を参考にさせていただきました。
elseif (!preg_match("/[0-9a-z!#\$%\&'\*\+\/\=\?\^\|\-\{\}\.]+@[0-9a-z!#\$%\&'\*\+\/\=\?\^\|\-\{\}\.]+/" , $email) ) { $regist_error .= "正しいemailアドレスを入力してください。<br />"; }
パスワードの仕様と入力値チェック
続いて、パスワードの入力チェックを行います。
パスワードのチェック仕様は以下のようにします。
- パスワードは全角文字を禁止する。半角英数および記号は利用可能
- パスワードの長さは6文字以上、32文字以下とする
- パスワードを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」のとき
パスワードをひとつしかいれていないとき
パスワードを「hoge」のみにしたとき
パスワードを「hogehoge」、確認用パスワードを「hugahuga」にしたとき
次回は入力情報の確認画面
次回は、入力情報の確認画面を設定します。
入力された値をセッションに保存して、値を使い回しながら、データ登録用プログラム、チェックプログラム、登録プログラムを分離して管理します。
usualoma
こんにちは、天野です。
練習用のサンプルだと思うのですが、
---------------------------------------------
$myDB -> getRow("SELECT username FROM auth WHERE username='$username' ");
---------------------------------------------
のところは、
---------------------------------------------
$myDB -> getRow("SELECT username FROM auth WHERE username=? ", array($username));
---------------------------------------------
と書かないと危ないと思います。
にっく
天野さん
にっくです。ご指摘ありがとうございます!
これは、プレースホルダいうものですね。
PHPのお作法、プログラムのお作法、いずれも勉強中の身なので、こういうご指摘は本当にありがたいです。
(自分の悪い点、間違っている点を指摘いただくのは、とても勉強になります。)
今後とも、お気づきの点はばしばしご指摘いただければありがたいです。
取り急ぎ、公開中のソースは、注記を入れて修正しようと思います。