我想知道是否有一种简单的方法来检查INSERT语句在执行INSERT时是否因MySQL字段上的唯一索引而触发冲突。
例如,假设我正在向数据库添加一个用户,而
一个名为
我想到了几个方法,比如检查
同样,我可以检查
我能想到的两个解决方案是:
在运行INSERT之前,运行
是否有更好的方法来使用PHP的MySQLi类确定这一点?
例如,假设我正在向数据库添加一个用户,而
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
--似乎非常hackish。是否有更好的方法来使用PHP的MySQLi类确定这一点?
INSERT
之前先进行验证。这比预期的失败更节省时间。 :) - jhnferraris