2014-02-07 17 views
0

我搜索了谷歌,但没有太多的运气,所以也许这可以帮助。我正在为几个项目开发用户认证系统,并且需要确保电子邮件地址(也是用户名)是唯一的。如果在字段中找到指定的值,拒绝PDO MySQL语句?

我在MySQL查询中将字段设置为唯一,但我需要一种方法来取消SQL查询,并在提供的电子邮件与现有记录匹配时通知用户“指定的电子邮件已被使用”。

我可以做一个选择查询之前插入,但我想知道是否有办法编写SQL查询,以便执行插入如果不存在[email protected]在电子邮件或类似的东西。

然后,如果插入不执行,我需要知道,我需要能够告诉它除了另一个错误。

这可能吗?怎么样?

+2

您可以尝试插入并捕获'PDOException' /检查相应代码的MySQLi错误。 – Phil

+0

@Phil如何确保查询因为重复的电子邮件而失败? – Razick

+1

1)运行查询以查看是否存在$ email 2)如果您获取行,$ email存在,并且您输出拒绝内容。如果你没有返回行,它不存在,你做任何应该发生的事情。 –

回答

1

如果你使用的PDO,你可以捕获该异常,并检查状态代码,例如

// make sure you're set to throw exceptions 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

$stmt = $pdo->prepare('INSERT INTO `user` (`email`) VALUES (?)'); 
try { 
    $stmt->execute([$email]); 
} catch (PDOException $e) { 
    $errorInfo = $stmt->errorInfo(); // apparently PDOException#getCode() is pretty useless 
    if ($errorInfo[1] == 1586) { 
     // inform user, throw a different exception, etc 
    } else { 
     throw $e; // a different error, let this exception carry on 
    }   
} 

http://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html#error_er_dup_entry_with_key_name

如果使用的MySQLi

$stmt = $mysqli->prepare('INSERT INTO `user` (`email`) VALUES (?)'); 
$stmt->bind_param('s', $email); 
if (!$stmt->execute()) { 
    if ($stmt->errno == 1586) { 
     // inform user, throw a different exception, etc 
    } else { 
     throw new Exception($stmt->error, $stmt->errno); 
    } 
} 
的过程会是类似
+0

太棒了,只要计时器让我接受答案。谢谢。 – Razick

+1

错误代码也可能是[1062](http://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html#error_er_dup_entry)。我只是尝试一下,看看你回来了什么错误代码 – Phil

+0

嗯,我没有得到任何例外与我的代码。插入失败,但没有例外。 – Razick