2010-12-07 190 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