14
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHP MySQLにて新規登録時のemail重複チェック

Posted at

webサービスでよく見かける、新規登録時のemailアドレス重複チェックを実装しました。
初学者でだいぶ時間がかかりましが、なんとかググりながらやりきりました。
今回の理解を忘れないために書いていきます。

考えたプログラムの流れ

1,[eamil][password][password再入力]の各項目入力
2,DBに接続
3,SQL文にてSELECTを用いemailを検索
4,if文で重複していればエラーメッセージ。重複がなければ新規登録しマイページへ。

実際のコード

new.acount.php

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をつけずこのようなコードを書いていました。

new.acount.php
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つずつクリアにしていこうと思います。

諸先輩方へ

もっと出来るようになりたいので、こうした方がいいなどのアドバイスがあれば是非教えてください。

14
12
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?