PHP/MySQLi - 捕获唯一ID冲突

M M*_*ler 2 php mysql mysqli unique-constraint

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

例如,假设我正在向数据库添加用户,并且username是一个唯一索引:

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

名为的用户john_galt已存在,因此不会执行INSERT.但是,如何才能以最有意义的错误对用户做出最佳响应(即具有该用户名的用户已经存在;请选择一个唯一的名称.)?

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

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

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

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

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

Sta*_*isG 5

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

if($sql->errno === 1062) {
    //do something
}
Run Code Online (Sandbox Code Playgroud)

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