webサービスでよく見かける、新規登録時のemailアドレス重複チェックを実装しました。
初学者でだいぶ時間がかかりましが、なんとかググりながらやりきりました。
今回の理解を忘れないために書いていきます。
考えたプログラムの流れ
1,[eamil][password][password再入力]の各項目入力
2,DBに接続
3,SQL文にてSELECTを用いemailを検索
4,if文で重複していればエラーメッセージ。重複がなければ新規登録しマイページへ。
実際のコード
if(empty($err_msg)){
$dsn = 'mysql:dbname=feel.share;host=localhost;charaset=utf8';
$user = 'root';
$password = 'root';
$options = array(
// SQL実行失敗時に例外をスルー
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
// デフォルトフェッチモードを連想配列形式に設定
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
// バッファードクエリを使う(一度に結果セットを全て取得し、サーバー負荷を軽減)
// SELECTで得た結果に対してもrowCountメソッドを使えるようにする
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
);
$dbh = new PDO($dsn,$user,$password,$options);
$query = $dbh->prepare('SELECT * FROM users WHERE email = :email limit 1');
$query->execute(array(':email' => $email));
$result = $query->fetch();
if($result > 0){
$err_msg['email'] = MSG06; //このE-mailは既に使用されています。
}else{
$stmt = $dbh->prepare('INSERT INTO users(email,pass,login_time) VALUES (:email, :pass, :login_time)');
$stmt->execute(array(':email' => $email,':pass' => $pass, ':login_time' => date('Y-m-d H:i:s')));
header("Location:mypage.php");
}
}
と言った具合です。
学んだこと
elseで条件分岐させること
最初、elseをつけずこのようなコードを書いていました。
if($result > 0){
$err_msg['email'] = MSG06; //このE-mailは既に使用されています。
}
$stmt = $dbh->prepare('INSERT INTO users(email,pass,login_time) VALUES (:email, :pass, :login_time)');
$stmt->execute(array(':email' => $email,':pass' => $pass, ':login_time' => date('Y-m-d H:i:s')));
header("Location:mypage.php");
}
考えはいたって単純で、ifで引っかかればそこで処理が終わるだろうと思ったからです。
だけど、同じemailでも登録されてしまってました。
正直な所その理由はまだ分かりません。
(elseを書いていないことで、そもそもifが実行されていなかったと思われる・・・多分)
が、elseをつけることにより、条件分岐ができ実装できました。
過去に一文でifは終わらせられるというのを聞いたことがあり、それでelseを書いていませんでした。
まとめ
プログラムの流れや、どの部分にコードを書けば良いのかを考え、ググりながら時間かけながらもなんとか1人で実装できました。
セキュリティー面などもちろんまだまだ未熟な点は多いですが1つずつクリアにしていこうと思います。
諸先輩方へ
もっと出来るようになりたいので、こうした方がいいなどのアドバイスがあれば是非教えてください。