MySQLi不返回错误代码

时间:2015-01-19 20:35:56

标签: php mysql mysqli

在我的MySQL数据库中,我有一个表“table1”,在“name”列上设置了唯一约束 - 我想防止重复名称。

如果表格中已经有'John'这个代码:

$db=new mysqli(...);

$sql="INSERT INTO table1 SET id=10,name='John'";

if(!$db->query($sql))
{
  if($db->errno==1062)
  {
    throw new InsertNonUniqueException(...);
  }
  else
  {
    throw new InsertException(...);
  }
}

应抛出InsertNonUniqueException()(我自己的异常)。相反,它会抛出InsertException()。

执行查询返回false并且执行进入if()循环。另外$ db-> row_affected是-1,但问题是$ db-> errno总是O(它应该是1062)!所以我无法检测到我的插入错误是由违反名称列上的唯一键约束引起的!

我不知道为什么mysqli在发生唯一键约束违规时不会返回1062代码!

4 个答案:

答案 0 :(得分:1)

我无法发表评论,因此会在这里问你。

请提供SHOW CREATE TABLE table1;

的结果

我无法使用您的代码和下表重现您的问题:

CREATE TABLE `table1` (
`name` varchar(11) COLLATE utf8_unicode_ci NOT NULL,
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

答案 1 :(得分:1)

我是唯一一个在这里认为你的SQL语法你有错误吗?在{{SET中没有空间1}},因为你只能在INSERT INTO语句中使用SET(假设你在5.5或更低版本中使用MySQL)。

UPDATE语法如下(作为described in the docs):

INSERT INTO

OR

INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name [(col_name,...)]
    SELECT ...
    [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]

试试这样:

INSERT INTO tbl_temp2 (fld_id)
  SELECT tbl_temp1.fld_order_id
  FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;

答案 2 :(得分:0)

第1步

确保该表具有唯一键

SHOW CREATE TABLE table1

预期结果

CREATE TABLE `table1` (
    `id` INT(11) default NULL,
    `name` varchar(11) COLLATE utf8_general_ci NOT NULL,
    PRIMARY KEY (id),
    UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci

如果UNIQUE KEY name (name)我们有一个唯一的密钥

第2步

尝试更改您的代码

$db  = new mysqli(...);

// first insert
if( !$db->query("INSERT INTO table1 (id, name) VALUES (10, 'John')") ) {
  throw new Exception($db->error);
}

// second insert (for me raise:  Duplicate entry 'John' for key 'name')
if( !$db->query("INSERT INTO table1 (id, name) VALUES (11, 'John')") ) {
  throw new Exception($db->error);
}

请尝试以下两个步骤

附注:如果您将名称和ID作为重复项,则只会在邮件中返回遇到的第一个重复项。

答案 3 :(得分:0)

我对您的代码唯一的问题是:

设置表格和列。

我在桌面上设置了一个唯一索引。我在两列表上做了..确保它有效。

您错过了'new'  当你'抛出异常'时的关键字。 这是我发现的代码中唯一的错误。

即:抛出新的异常('除以零。'); //来自PHP手册的例子。