MySQL错误:密钥3的重复条目'email@domain.com'

时间:2014-04-29 12:39:31

标签: mysql duplicate-data

这是我的表

enter image description here

这是我的php查询代码

// Check for unique username
    $quser = "SELECT user_id FROM users
        WHERE (username = '$u' AND email = 'e')
            ";

    $ruser = mysqli_query($dbc, $quser) or die("MySQL error: " .   mysqli_error($dbc) . "<hr>\nQuery: $quser");

if(mysqli_num_rows($ruser) == 0 ){

//do the INSERT INTO query
$q = " INSERT INTO users (lang_id, username, pass, email, active, registration_date)
               VALUES ( '$l','$u', SHA1('$p'), '$e', '$a', NOW() )
             ";

}else{

echo 'That email address has already been registered.';
}

当我通过在HTML表单中输入重复的电子邮件地址来测试它时(假设表单验证很好),它会返回错误,如下所示:

MySQL error: Duplicate entry 'email@domain.com ' for key 3
---------------------------------------------------------
Query: SELECT user_id FROM users WHERE (username = 'dsfdsf' AND email = 'e') 

当然,该值尚未输入表中。

这些是我一直在尝试的解决方案:

1 /我删除了用户名和电子邮件的唯一索引,数据被插入,但仍然重复,这是我从未预料到的。

2 /我尝试了重复的用户名,但不是电子邮件,同样的错误会返回。

我现在的问题是,为什么它不会返回我自定义的错误消息,如}} {部分,但服务器生成的那个?

你能帮忙吗?感谢

2 个答案:

答案 0 :(得分:1)

将您的请求更改为

$quser = "SELECT user_id FROM users
        WHERE username = '$u' 
           or email = '$e'
            ";

应该做的伎俩。 您错过了$电子邮件以及此查询仅返回值(如果两者都已设置...)因此不会捕获重复的电子邮件或重复的用户名。

也许你可以通过一些异常处理来捕获这些错误,以避免计时运气不好(2个进程同时插入数据)。

答案 1 :(得分:0)

$ruser = mysqli_query($dbc, " SELECT * user_id FROM users 
WHERE username like '$u' or  email like '$e' ");
选择查询电子邮件中的

应该是$ e而不仅仅是e

$res=mysql_query("select * from users 
where username like '$u' or email like '$e' ");

if(mysql_num_rows($res)==0)
mysql_query(" insert into users
(lang_id, username, pass, email, active,registration_date) values
('$l','$u','$p','$e','$a',NOW()) ");

else
echo "Duplicate entry";

这可能是错误
哦,问题是你的表中的user_id是主要的,它应该不是null,即使user_level不能为NULL,因此每次插入新行时都应插入user_id和user_level的值

mysql_query(" insert into users
(lang_id, username, pass, email, active,registration_date,user_id,user_level) 
values('$l','$u','$p','$e','$a',NOW(),$userid,'$user_level') ");

希望这能解决您的问题