質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.19%

DBへ登録されているアドレスが自分以外のアドレスと重複した場合、登録できないを実現するには

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,411

earnest_gay

score 403

とある会員サイト制作において、ユーザー登録ページで他の人のアドレスと重複して登録できないように下記のようにして対応していましたが、
現在プロフィール更新ページを作成しており、
例えば、住所は変えるがアドレスは変えない場合、
下記のままでは、自分のアドレスが既に登録されていることになり、弾かれてしまいます。

「DBへ登録されているアドレスが自分以外のアドレスと重複した場合、登録できない」
と、文章にするのは簡単なのですが、どういった工夫を加えると良いでしょうか?

$sql = 'select count(*) as cnt from user_data where email=?';
    $stmt = $pdo->prepare($sql);

    $arrParam = array();
    $arrParam[] = $email;
    $stmt->execute($arrParam);

    $row = $stmt->fetch(PDO::FETCH_ASSOC);
    if (0 < $row['cnt']) {
        $this->error['email_registered'] = '<div class="errorMessage">' . "{$email}は既に登録されています" . '</div>';
    }

参考にですが

input1.php
input2.php
preview.php
thanks.php

と最後で一括更新させる構造になっています。


ログインしている人のidはまだ確立していませんが、仮の数字を入れてテストすることでこれでいけました。

public function isRegisterd(){
        if (is_null(filter_input_array(INPUT_POST))) {
            return $this;
        }

        $email = filter_input(INPUT_POST, 'email');

        $dsn = 'mysql:dbname=test;host=localhost;charset=utf8';
        $user = 'root';
        $password = '';
        $option = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION);
        $pdo = new PDO($dsn, $user, $password, $option);

        $sql = 'SELECT count(*) AS cnt FROM user_data WHERE email=? AND id != ログインしてる人のid';
        $stmt = $pdo->prepare($sql);

        $arrParam = array();
        $arrParam[] = $email;
        $stmt->execute($arrParam);

        $row = $stmt->fetch(PDO::FETCH_ASSOC);
        if (0 < $row['cnt']) {
            $this->error['email_registered'] = '<div class="errorMessage">' . "{$email}は既に登録されています" . '</div>';
        }
        return $this;
    }
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • azurite2016

    2016/06/30 22:51

    input1.php
    input2.php
    preview.php
    thanks.php

    と3遷移目で更新するのですが、thanks.phpで初めてerrorがでては遅いといいますか、それなら初めのinput1.phpで登録できないことを知らせたいのです。

    ↑の様な事を追記してください。
    また。それぞれのPHPでどんな処理をしたいのかも記載してほしいです。

    キャンセル

  • earnest_gay

    2016/06/30 22:55

    すいません。1つ1つ片づけていきたいので、現時点の問題点は自分のアドレス以外登録できなくすることです。

    キャンセル

回答 2

checkベストアンサー

0

user_data に id的なカラムはないのでしょうか。
もしあるなら、それを除いて存在チェックを
かけるといいと思います。
なかったら、なんか個人を特定できるカラムで
同様なことをすればいいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/30 22:14

    なるほど!

    PHPであればif(!empty)などと逆を指定することは出来ますがSQLではそういったものはないのでしょうか?

    WHERE id = !2のような...
    これは試してもダメでした...

    キャンセル

  • 2016/06/30 22:23 編集

    where id != 2 でいけると思います。

    キャンセル

  • 2016/06/30 22:25

    できました!
    結構参考になりそうです!
    ありがとうございます

    キャンセル

0

なんの為にRDBを使っているのか思い出しましょう。

PHPではなく、DBのユニーク制約にひっかけて、エラーにするのが良いかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/30 22:49

    それじゃあダメなんです...

    input1.php
    input2.php
    preview.php
    thanks.php

    と3遷移目で更新するのですが、thanks.phpで初めてerrorがでては遅いといいますか、それなら初めのinput1.phpで登録できないことを知らせたいのです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.19%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • PHPに関する質問
  • DBへ登録されているアドレスが自分以外のアドレスと重複した場合、登録できないを実現するには