Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP/MySQLi-捕获唯一ID冲突_Php_Mysql_Mysqli_Unique Constraint - Fatal编程技术网

PHP/MySQLi-捕获唯一ID冲突

PHP/MySQLi-捕获唯一ID冲突,php,mysql,mysqli,unique-constraint,Php,Mysql,Mysqli,Unique Constraint,我想知道是否有一种简单的方法可以检查INSERT语句在执行INSERT时是否由于MySQL字段上的唯一索引而触发冲突 例如,假设我正在向数据库添加一个用户,用户名是唯一的索引: $sql = new MySQLi(...); $res = $sql->query('INSERT INTO `users` (`username`) VALUES ("john_galt");'); 名为john_galt的用户已存在,因此不会执行插入。但是,我如何才能最好地用一个有意义的错误来回应用户,即具

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

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

$sql = new MySQLi(...);
$res = $sql->query('INSERT INTO `users` (`username`) VALUES ("john_galt");');
名为john_galt的用户已存在,因此不会执行插入。但是,我如何才能最好地用一个有意义的错误来回应用户,即具有该用户名的用户已经存在;请选择一个唯一的名称

我想到了一些事情,比如检查是否设置了insert_id——如果查询生成错误,就不应该设置insert_id。但这个错误可能是任何东西

类似地,我可以检查$sql->error是否为空,但也可以是任何内容—语法错误、格式错误的值或其他内容。显然,我不会为最终用户打印出实际的MySQL错误

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

在运行INSERT之前,从``users``中运行SELECT TRUE,其中``username``=john\u galt;要查看数据库中是否已经存在用户名,但我觉得我在字段中添加了一个唯一的约束,这样我就不必这样做了,否则就有点违背了目的。 strpos$sql->error,'Duplicate entry'==0-看起来骇人听闻。 是否有更好的方法使用PHP的MySQLi类来确定这一点?

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

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

下面是MySQL 5.5的错误代码列表:

我建议在尝试插入之前先进行验证。比执行预期故障节省更多时间:好吧,这不会是一个意外的失败。。。如果我必须在插入另一行之前手动检查其存在性,那么拥有唯一字段(即除了主索引)有什么意义?我同意这是拥有唯一字段的意义所在,事先检查没有内在价值。在大多数情况下,有效的插入比冲突更常见,因此简单地执行插入并响应错误条件更有效。谢谢!我从没想过!如果PHP的MySQLi类在某个地方包含了这些常量,那么我就不会使用文字错误代码了。这不是说我可能需要得到那个特定的,但是也可以提取字段的名称,如果有多个具有唯一约束的字段,并且错误消息应该更具体?@MMiller除了使用某种正则表达式从返回的错误字符串中提取字段名之外,我不知道有什么方法可以做到这一点。使用这种方法的问题是,我认为即使存在多个重复的唯一字段,MySQL也只会为遇到的第一个字段返回一个错误。顺便说一下,如果您需要同时使用错误字符串和错误代码,请查看在一个数组中返回所有这些信息的方法。