データベースに登録済みかを確認するのに何故、レコード件数が必要なのか
解決済
回答 3
投稿
- 評価
- クリップ 3
- VIEW 4,624
会員サイトにて、メールアドレスの重複を避けるための方法について調べてたら、あるサンプルソースにたどり着きなにやらレコード件数を取得しているように見えるのですが...
チェックしたいのは、
”フォームから入力されたアドレスとデータベースに登録されているアドレスの照合”
なんですが、何故、レコード件数を取得する必要があるのでしょうか?
≪サンプルソース≫
$sql = sprintf('SELECT COUNT(*) AS cnt FROM members WHERE email="%s"',
mysqli_real_escape_string($db, $_POST['email'])
);
$record = mysqli_query($db, $sql) or die(mysqli_error($db));
$table = mysqli_fetch_assoc($record);
if ($table['cnt'] > 0) {
$error['email'] = 'duplicate';
<?php if ($error['email'] == 'duplicate'): ?>
<p class="error">* 指定されたメールアドレスはすでに登録されています</p>
<?php endif; ?>
最近勉強し始めて書籍だけでは理解が追い付いておりませんが、解説頂けると助かります。
宜しくお願いいたします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+2
ご質問の趣意は
フォームから入力されたアドレスとデータベースに登録されているアドレスの照合
のためには、DBに該当のアドレスが1件でも存在するかどうかをチェックすればよいだけなのに
何故、レコード件数を取得する必要があるのでしょうか?
ということでしょうか?
であれば、私も不要だと思います。
単にSELECT 1 FROM members WHERE email = %s LIMIT 1
などとやり、レコードを1行、取得できるかどうかをチェックすれば十分だからです。
私が思いつく範囲では、サンプルソースがCOUNT(*)
している理由は以下の3つのいずれかだと思います。
1. サンプルソースでは、members
が MyISAM 形式のテーブルだから
MyISAM のテーブルは格納している行数を保持しているため、COUNT(*)
の実行が速いそうです。
http://nippondanji.blogspot.jp/2010/03/innodbcount.html
そもそもMyISAMのCOUNT()が速い(テーブルの行数を保持してる)のが特殊なのであって、
もし、これが正解だった場合、Masaya_Gotou様はかなり古い記事を参考にされている可能性があります。
なぜなら、最近のMySQLでは、特に形式を指定せずテーブルを作成すると InnoDB という形式が選択されるからです。
https://dev.mysql.com/doc/refman/5.6/ja/innodb-introduction.html
MySQL 5.5 の時点では、これ(InnoDB)がデフォルトの MySQL ストレージエンジンです。MySQL 5.6 では、ENGINE= 句を指定せずに CREATE TABLE ステートメントを発行すると、InnoDB テーブルが作成されます。
2. ご質問で提示されているコードとは別の場所で、同じメールアドレスが2つ以上登録されていないか、というエラーチェックもしている
if ($table['cnt'] > 1) {
print '何かおかしい';
}
といった具合です。
まぁ、これは無いでしょうねw
3. 単に"1."の習慣を改めていないだけ
個人的には、これがもっとも有力だと思っています。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
if ($table['cnt'] > 0) {
$error['email'] = 'duplicate';
ここの処理をするため、ですね。
その前のSQL文でWHERE句でWHERE email="%s"
とするということは、そのメールアドレスで登録されているデータを取得していることになります。
「そのメールアドレス」を条件にしているのですから、応答のレコードが存在すれば重複、0であれば未登録でしょう。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
checkベストアンサー
0
$sql = sprintf('SELECT COUNT(*) AS cnt FROM members WHERE email="%s"',
mysqli_real_escape_string($db, $_POST['email'])
);
は、SQL文を組み立てているだけです。
直後に、
var_dump($sql);
といれて、どんなSQL文になってるかチェックしてみてください。
中身がわかれば、
チェックしたいのは、
”フォームから入力されたアドレスとデータベースに登録されているアドレスの照合”なんですが、
について合点がいくかと思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.35%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/05/16 02:57
MyISAM 形式が分かりません...
調べれば調べるほどに色んな用語が出てきて大変ですが、覚えられるものは覚えていきたいと思います。