2010-12-07 181 views
2

我在一個網站上構建了一個表單,它捕獲了幾個字段,包括'email'並將它發佈到一個名爲'data'的表中的數據庫。我使用jQuery Validate插件來確保所有字段都是完整的,但我不能在數據庫中有重複的電子郵件地址。如何檢查數據庫中的重複條目?

插件想出了一個腳本命名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; 
?> 

這個片段只是檢查列出的電子郵件。有沒有辦法查詢數據庫搜索表'數據',並檢查'​​電子郵件',看看是否有重複,並希望發佈錯誤消息,如果是?

另外,當我使用任何示例電子郵件時,腳本似乎工作,所以它本質上是'工作'我只需要調整它來檢查數據庫。

回答

2

將唯一性約束放在電子郵件列上。

0

你只需要編寫一個查詢,以檢查電子郵件是表:

$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 

編輯意味着「回聲」而不是「回報」

1

首先,把UNIQUE電子郵件欄的限制。然後,在註冊時,運行以下查詢:

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

您也許可以做一個php代碼,使用mysql_num_rows命令檢查數據庫的現有值。

事情是這樣的:

$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」之間總是會有一個競爭條件,除非你在全局事務中,我懷疑是這種情況。

您應該在電子郵件列上設置UNIQUE約束,然後嘗試插入新記錄並捕獲唯一性SQL錯誤。您可以通過檢查錯誤代碼來捕獲錯誤,例如,根據驅動程序,MySQL爲1062或23000。

+0

我一直認爲通過設計捕捉錯誤是一個錯誤。 (我同意唯一性,但不確定捕捉錯誤是否是最乾淨的方式 - 通常我會做webbiedave建議+錯誤處理,以防兩個用戶在檢查後嘗試插入相同的電子郵件不存在)。 – Unreason 2010-12-07 16:47:46