2010-12-07 18 views
2

私は「電子メール」を含むいくつかのフィールドを取得し、「データ」という名前のテーブルを持つDBに投稿するフォームを構築しました。私はdb内の電子メールアドレスを重複させることはできませんが、すべてのフィールドが完全であることを確認するためにjQuery Validateプラグインを使用しています。DBの重複したエントリをチェックする方法は?

プラグインは、それはフィールドデータを検証する際に呼び出し、ここのコードだというスクリプトemails.php付属:

<?php 
$request = trim(strtolower($_REQUEST['email'])); 
$emails = array('[email protected]', '[email protected]', '[email protected]'); 
$valid = 'true'; 
foreach($emails as $email) { 
if(strtolower($email) == $request) 
    $valid = '"Thats already taken."'; 
} 
echo $valid; 
?> 

このコードはリストされている電子メールをチェックしています。 DBをクエリして 'データ'テーブルを検索し、 '電子メール'をチェックして重複があるかどうかを確認し、もしあればエラーメッセージを投稿する方法はありますか?

また、サンプルの電子メールを使用するとスクリプトが動作するように見えるため、本質的に「動作しています」ということでDBを確認するだけです。

答えて

2

電子メール列に一意制約を設定します。

0

は、あなただけの電子メールがテーブルにあるかどうかを確認するためにクエリを記述する必要がありますUNIQUE電子メール列の制約。次に、サインアップ時に、次のクエリを実行します。

SELECT COUNT(*) as 'count' FROM `data` WHERE email = '[email protected]'; 
1

まず、置く「エコー」とない「リターン」に意味

$query = SELECT count(*) AS `total` FROM `data` WHERE `email` = '{$request}' 
$row = mysql_fetch_assoc(mysql_query($query)); 
if($row['total']) echo false; //exists 
else echo true; //doesn't exist 

編集

0

あなたは多分はmysql_num_rowsコマンドを使用して、既存の値のためのDBをチェックするPHPコードを行うことができます。このような

何か:

$result = mysql_query("SELECT email from accounts where email = $email_to_check"); 
$found = mysql_num_rows($result); 

if ($found > 0) { echo "Email already exists"; } 
else ..... 
2

欠陥 "SELECT INSERTの前に" のアプローチを使用しないでください。あなたがグローバル取引をしていない限り、あなたの "SELECT"とそれに続く "INSERT"との間には常に競争条件が存在します。

電子メール列にUNIQUE制約を設定し、新しいレコードをINSERTして一意性SQLエラーをキャッチする必要があります。エラーコードをチェックすることでエラーをキャッチすることができます。たとえば、MySQLの場合、ドライバに応じて1062または23000です。

+0

私は設計によってエラーをキャッチすることがエラーであると考えてきました。 (私は一意性に同意するが、エラーをキャッチすることは実際には最もクリーンな方法であるとは確信していない - 通常、2人のユーザーが同じ電子メールを挿入しようとした場合に、webbiedaveは+エラー処理を提案する。 – Unreason

+0

特定の既知のエラーをキャッチすることは有効な設計です。すべてのエラーをキャッチして無視するのはエラーです。あなたが気に入らなければ、他の解決策があります。たとえば、MySQLではINSERT IGNOREを実行し、影響を受ける行の数を確認できます(0行はINSERTが失敗したことを意味します)。 – rustyx

関連する問題