PHP / MySQLi - 捕获唯一ID冲突

时间:2014-08-10 00:26:16

标签: php mysql mysqli unique-constraint

我想知道在执行INSERT时,是否有一种简单的方法可以检查INSERT语句是否由于MySQL字段上的唯一索引而触发冲突。

例如,假设我将用户添加到数据库,username是唯一索引:

$sql = new MySQLi(...);
$res = $sql->query('INSERT INTO `users` (`username`) VALUES ("john_galt");');

名为john_galt的用户已存在,因此无法执行INSERT。但是,如何才能以最有效的错误回应用户(即已存在具有该用户名的用户;请选择一个唯一的名称。)

我想到了一些事情,比如检查insert_id是否已设置 - 如果查询生成错误则不应该这样做。但是这个错误可能是任何

类似地,我可以检查$sql->error是否为空,除了可能是任何东西 - 语法错误,或格式错误的值,或其他什么。显然,我不打算为最终用户打印出实际的MySQL错误。

我能想到的两个解决方案是:

  • 在运行INSERT之前,运行SELECT TRUE FROM ``users`` WHERE ``username`` = "john_galt";以查看数据库中是否已存在用户名,但我觉得我在字段中添加了一个唯一约束,这样我就不必这样做了 - 有点打败了目的。
  • strpos($sql->error, 'Duplicate entry') === 0 - 看起来非常可怕。

有没有更好的方法来确定使用PHP的MySQLi类?

1 个答案:

答案 0 :(得分:5)

您可以使用errno获取返回的错误代码并使用它,例如:

if($sql->errno === 1062) {
    //do something
}

以下是MySQL 5.5的错误代码列表:http://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html