2011-05-22 207 views
4

我似乎无法确定如何检查电子邮件是否存在于我的数据库中。目前用户使用他们的电子邮件地址用密码登录我的网站,但目前用户可以使用相同的电子邮件地址注册多次,这在我的网站上造成了很大的问题。已经做了一些研究,但似乎无法解决问题。如何检查电子邮件地址是否存在。验证

任何人都可以帮助我吗?

<?php  

if(isset($_POST['add'])) 
{ 
$dbhost = 'localhost'; 
$dbuser = 'user'; 
$dbpass = 'pass'; 
$db = "db"; 
$conn = mysql_connect($dbhost, $dbuser, $dbpass); 
if(! $conn) 
{ 
    die('Could not send your enquiry at this time please try again later.'); 
} 


$phone = mysql_real_escape_string((string)$_POST['phone']); 
$email = mysql_real_escape_string((string)$_POST['email']); 
$password = mysql_real_escape_string((string)$_POST['password']); 
$firstname = mysql_real_escape_string((string)$_POST['firstname']); 
$surname = mysql_real_escape_string((string)$_POST['surname']); 
$country = mysql_real_escape_string((string)$_POST['country']); 
$nationality = mysql_real_escape_string((string)$_POST['nationality']); 
$yearofbirth = mysql_real_escape_string((string)$_POST['yearofbirth']); 
$profession = mysql_real_escape_string((string)$_POST['profession']); 
$status = mysql_real_escape_string((string)$_POST['status']); 
$membertype = 'Registered'; 
$dateregistered = mysql_real_escape_string((string)$_POST['dateregistered']); 
$agreedtoterms = mysql_real_escape_string((string)$_POST['agreedtoterms']); 

$sql = "INSERT INTO members 
     (phone, email, password, firstname, surname, country, nationality, yearofbirth, profession, uniquepin, status, membertype, dateregistered, agreedtoterms) 
     VALUES('$phone', '$email', '$password', '$firstname','$surname','$country','$nationality','$yearofbirth','$profession','$uniquepin','$status','$membertype','$dateregistered', '$agreedtoterms')"; 


mysql_select_db($db); 
$retval = mysql_query($sql, $conn)or die(mysql_error()); 

?> 
+5

第一ü可以使这个领域在你的数据库表独树一帜,以确保邮件不存在一个以上的时间,像http://stackoverflow.com/questions/5038040/mysql-make-a-field-unique – 2011-05-22 10:17:31

+2

那些你真正的连接细节?最好避免使用真实值。 – alex 2011-05-22 10:20:33

+1

用户输入始终是PHP中的字符串,因此不需要全部投射。 – alex 2011-05-22 10:21:26

回答

5

你可以使email列具有唯一约束 - 然后试图插入查询的时候会失败。

你也可以只进行查询....

SELECT `email` 
    FROM `members` 
WHERE `email` = '$email' 
LIMIT 1 

如果你得到一个结果,电子邮件的存在。

-1
$query_ch_email = mysql_query("SELECT email FROM members WHERE email = '$email' LIMIT 1") or die(mysql_error()); 

    if (mysql_num_rows($query_ch_email) > 0) 
    { 
    $notices['register'][] = 'Your e-mail already exist'; 
    } 

    if (!count($notices['register'])) 
    { 
    $sql_insert = "INSERT INTO members (

     phone 
    , email 
    , password 
    , firstname 
    , surname 
    , country 
    , nationality 
    , yearofbirth 
    , profession 
    , uniquepin 
    , status 
    , membertype 
    , dateregistered 
    , agreedtoterms 

    ) VALUES (

     '$phone' 
    , '$email' 
    , '$password' 
    , '$firstname' 
    , '$surname' 
    , '$country' 
    , '$nationality' 
    , '$yearofbirth' 
    , '$profession' 
    , '$uniquepin' 
    , '$status' 
    , '$membertype' 
    , '$dateregistered' 
    , '$agreedtoterms' 

    )"; 

    mysql_query($sql_insert)or die(mysql_error()); 
    } 
+0

-1用于sql注入。 – Kzqai 2012-04-14 23:27:16

+0

哎呀,我猜如果mysql_real_escape_string被用作上面的折叠,那么不会有sql注入问题。不幸的是不能改变我的投票。 – Kzqai 2012-04-15 03:24:41

1

此前添加唯一约束上的登录表,他需要巩固重复的电子邮件记录(约束,否则将失败)到一个单一的记录,并通知受影响的用户。

由于电子邮件在数据级别是唯一的,他可以添加约束。最后,在创建任何新的登录记录之前,他运行查询来查看是否存在电子邮件添加。

应该是一个SO线程这样的:基于电子邮件的登录101; - )

相关问题