我想知道在执行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错误。
我能想到的两个解决方案是:
SELECT TRUE FROM ``users`` WHERE ``username`` = "john_galt";
以查看数据库中是否已存在用户名,但我觉得我在字段中添加了一个唯一约束,这样我就不必这样做了 - 有点打败了目的。strpos($sql->error, 'Duplicate entry') === 0
- 看起来非常可怕。有没有更好的方法来确定使用PHP的MySQLi类?
答案 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