【发布时间】:2012-02-13 06:17:13
【问题描述】:
我的问题将以电子邮件为例,但这可能适用于任何事情。
通常在注册新用户(包括插入他/她的电子邮件)之前,我会检查他/她的电子邮件是否已经存在于数据库中,如下所示:
$result = mysql_query("SELECT * FROM Users WHERE email = '".mysql_real_escape_string($email)"';");
if(!$result)
{
die(mysql_error());
}
if(mysql_num_rows($result) > 0)
{
die('<p>Email already in DB. <a....>Recover Email</a></p>');
}
else
{
//insert new user data into Users table
}
既然我已经将我的用户表中的email 字段限制为UNIQUE,那么尝试先插入会不会更快,如果失败,请检查错误?像这样的:
$result = mysql_query(...);//insert new user data into Users table
if(!$result)
{
if(mysql_errno()==$insert_unique_error)
{
$error = '<p>Email already in DB. <a....>Recover Email</a></p>';
}
else
{
$error = mysql_error();
}
die($die_str);
}
问题是我不知道$insert_unique_error 应该是什么。这些是唯一的错误代码I could find:
SQLSTATE 值的前两个字符表示错误类别:
Class = '00' 表示成功。
Class = '01' 表示警告。
Class = '02' 表示“未找到”。这与游标的上下文相关,用于控制游标到达数据集末尾时发生的情况。 SELECT ... INTO var_list 不检索任何行的语句也会出现这种情况。
Class > '02' 表示异常。
【问题讨论】:
-
你还在做一个单一的查询,那为什么呢?
-
@DamienPirsy 在正常情况下,我会在电子邮件不存在时进行两次查询(选择 + 插入),在电子邮件存在时进行一次查询(选择)。我建议的解决方案只查询电子邮件是否存在(插入)。
-
我认为是:错误:1092 SQLSTATE: HY000 (ER_INSERT_INFO) 消息:记录:%ld 重复:%ld 警告:%ld 您的邮件字段应该是唯一的。
-
@DamienPirsy 我刚刚意识到我在复制和粘贴后忘记编辑一个部分。我已经编辑了问题。
标签: php mysql error-handling insert unique-constraint