当前位置: 首页 > 知识库问答 >
问题:

MySQLi不返回错误代码

能业
2023-03-14

在我的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(...);
  }
}

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

查询的执行返回false,执行进入if()循环。另外$db-

我不知道为什么当发生唯一密钥约束冲突时,mysqli不返回1062代码!

共有3个答案

万高轩
2023-03-14

第一步

确保表有唯一的键

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

如果存在唯一密钥名称(name)我们有一个唯一密钥

步骤二

试着改变你的代码

$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是重复的,则消息中将只返回遇到的第一个重复项。

干子瑜
2023-03-14

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

INSERT INTO语法如下(如文档中所述):

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;

像这样试试:

<?php
$sql="INSERT INTO table1 (id, name) VALUES ('10', 'John')";
...
养研
2023-03-14

我不能留下任何评论,所以我想在这里问你。

请提供SHOW CREATE TABLE TABLE 1的结果

我不能使用您的代码和下一个表再现您的问题:

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

 类似资料:
  • 在try/catch块中有三个sql查询。Autocommit是关闭的,并且所有三个查询都没有错误地运行,我已经验证了这一点(如果任何查询失败,它应该不会到达commit行,但是我已经通过xdebug验证了它,一次单步执行代码一行)。当代码到达commit()函数调用时,mysqli返回false,但没有错误消息。当前面的查询都工作时,提交怎么会失败呢? 代码基本上是这样的:

  • 我是JS的学生。我有一段代码返回了一个错误。 这是返回的语法错误。你们能解释一下我做错了什么吗?

  • 我有一个像这样的mysql表 但是我无法用这个函数检索“成人”和“儿童”的值 错误日志显示变量被正确地传递给函数: 为什么此函数返回?

  • 我在MVC应用程序中使用Ajax来在您单击注销按钮时发送回一个帖子。我想将用户送回登录页面,并将他们路由到控制器中的HttpPost方法。但是,在我的Ajax代码中,当我单击注销时会出现一个错误:找不到网址:http://localhost/myapp/error/error?code=22 PageHeader.cshtml AccountController.cs

  • 我试图开发一个android应用程序使用华为网站套件。我现在正在跟踪这个codelab:https://developer.huawei.com/consumer/en/codelab/hmssitekit/index.html#0我完全按照codelab说的做了一切,但是当我运行我的应用程序时,它抛出了一个错误,在日志中它说“错误代码6” 以前有人收到过同样的错误并解决了吗?请帮帮我

  • 基类控制器里有error方法,用于api的错误消息返回输出 /** * 操作错误跳转的快捷方法 * @access protected * @param mixed $msg 提示信息,若要指定错误码,可以传数组,格式为['code'=>您的错误码,'msg'=>'您的错误消息'] * @param mixed $data 返回的数据 * @par