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

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

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

6664閲覧

データベースに登録済みかを確認するのに何故、レコード件数が必要なのか

earnest_gay

総合スコア615

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

3クリップ

投稿2016/05/15 17:02

会員サイトにて、メールアドレスの重複を避けるための方法について調べてたら、あるサンプルソースにたどり着きなにやらレコード件数を取得しているように見えるのですが...

チェックしたいのは、
”フォームから入力されたアドレスとデータベースに登録されているアドレスの照合”

なんですが、何故、レコード件数を取得する必要があるのでしょうか?

≪サンプルソース≫ $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; ?>

最近勉強し始めて書籍だけでは理解が追い付いておりませんが、解説頂けると助かります。

宜しくお願いいたします。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ご質問の趣意は

フォームから入力されたアドレスとデータベースに登録されているアドレスの照合

のためには、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つ以上登録されていないか、というエラーチェックもしている

php

1if ($table['cnt'] > 1) { 2 print '何かおかしい'; 3}

といった具合です。

まぁ、これは無いでしょうねw

3. 単に"1."の習慣を改めていないだけ

個人的には、これがもっとも有力だと思っています。

投稿2016/05/15 17:35

KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

earnest_gay

2016/05/15 17:57

回答ありがとうございます。 MyISAM 形式が分かりません... 調べれば調べるほどに色んな用語が出てきて大変ですが、覚えられるものは覚えていきたいと思います。
guest

0

PHP

1 if ($table['cnt'] > 0) { 2 $error['email'] = 'duplicate';

ここの処理をするため、ですね。
その前のSQL文でWHERE句でWHERE email="%s"とするということは、そのメールアドレスで登録されているデータを取得していることになります。

「そのメールアドレス」を条件にしているのですから、応答のレコードが存在すれば重複、0であれば未登録でしょう。

投稿2016/05/15 17:07

kaz.Suenaga

総合スコア2037

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

earnest_gay

2016/05/15 17:53

ご回答ありがとうございます。 >>その前のSQL文でWHERE句でWHERE email="%s"とするということは、そのメールアドレスで登録されているデータを取得していることになります。 まずここからが理解していないのかもしれません... 個人的にはsprintfに着目しており、これは書式を揃えるファンクションみたいで sprintf('%04d年 %02d月 %02d日', 2010,1,23) の様に使うようなのです。 それを前提にソースを見ていると SELECT COUNT(*) AS cnt FROM members WHERE email="%s"' ≪memberというテーブルからデータベースに登録されているだけのemailをchar型で件数取得しますよ≫ という解釈なのですがどうなのでしょうか? よくよく見ると、 sprintf('SELECT COUNT(*) AS cnt FROM members WHERE email="%s"', mysqli_real_escape_string($db, $_POST['email']) ); sprintfファンクション内にmysqli_real_escape_string($db, $_POST['email']も入っているのですが、$_POST['email']が入ってるのでこれは入力してくるアドレスだと思います。 その入力してくるアドレスと SELECT COUNT(*) AS cnt FROM members WHERE email="%s"' で取り出そうとしてるであろう登録済みアドレスとをsprintfファンクションはどうしようとしているのでしょうか? ロジックがくっつきません...
kaz.Suenaga

2016/05/16 08:34

SQL文の意味が理解できていないようですね。 sprintf 関数の動作はそのとおりで、入力されたメールアドレスを使って実行するSQL文を作っています。 ──── SELECT [結果に表示する列:数式なども化] FROM [データが格納されているテーブル] WHERE [FROMで指定されているテーブル中の、抽出対象とするデータの条件] ──── を意味します。 つまり、 FROM:[members] テーブルの WHERE: [email]列が入力されたメールアドレスのものを抽出し SELECT: その件数(COUNT関数の結果)を出力する というSQL文を実行することになります。 ソースコードの上から読み下すと、 --- ・SQL文を作る ・そのSQL文を実行して結果を取得する ・取得した結果行の cnt 列が >0 だったら(つまり既にデータがあったら)、 ・ $error['email'] = 'duplicate'; としていることになります。
guest

0

ベストアンサー

$sql = sprintf('SELECT COUNT(*) AS cnt FROM members WHERE email="%s"',
mysqli_real_escape_string($db, $_POST['email'])
);

は、SQL文を組み立てているだけです。
直後に、

var_dump($sql);

といれて、どんなSQL文になってるかチェックしてみてください。
中身がわかれば、

チェックしたいのは、
”フォームから入力されたアドレスとデータベースに登録されているアドレスの照合”

なんですが、

について合点がいくかと思います。

投稿2016/05/15 18:33

TetsujiMiwa

総合スコア1124

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問