Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.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 PDO不会在重复密钥插入时引发异常_Php_Mysql_Pdo - Fatal编程技术网

PHP PDO不会在重复密钥插入时引发异常

PHP PDO不会在重复密钥插入时引发异常,php,mysql,pdo,Php,Mysql,Pdo,我有一个奇怪的问题,PDO在插入重复值时没有抛出异常。在这种情况下,我确实预期会出现错误 有关守则: try { $db_conn = new PDO("mysql:host=".$config["database"]["hostname"].";charset=utf8", $config["database"]["username"], $config["database"]["password"], []); $db_conn->setAttribute(PDO::ATTR_

我有一个奇怪的问题,PDO在插入重复值时没有抛出异常。在这种情况下,我确实预期会出现错误

有关守则:

try
{
  $db_conn = new PDO("mysql:host=".$config["database"]["hostname"].";charset=utf8", $config["database"]["username"], $config["database"]["password"], []);
  $db_conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $db_conn->exec(file_get_contents("some_file_with_data.sql");
}
catch(Exception $e)
{
  // PDOException extends RuntimeException extends Exception so exceptions should be catched here
  // however for the duplicate key entry it will not throw an exception
}
包含SQL数据的文件包含多个插入,如下所示:

INSERT INTO `a` (`b`, `c`) VALUES
  (1, 1),
  (2, 2),
  (3, 2);

INSERT INTO `a` (`b`, `c`) VALUES
  (1, 1);
a
中的字段
b
被设置为主键。当我使用phpMyAdmin在完全相同的结构中插入完全相同的数据时,我得到了以下错误:
#1062-键“PRIMARY”的重复条目“65533”

为什么PDO在这种情况下不抛出错误?即使我将错误模式设置为异常

编辑: 这是用于此特定表的表结构

CREATE TABLE IF NOT EXISTS `a` (
  `b` smallint(5) unsigned NOT NULL,
  `c` smallint(5) unsigned NOT NULL,
  PRIMARY KEY (`b`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

<强>更新2018:DEVS不认为这是bug,而是预期的行为。 所以,PHP用户必须接受这一点,对于未来的任何问题,报告都将关闭…

这经常被报告为
PDO的bug

只有当FIRST语句无效时,它才会抛出异常。如果第一条语句运行平稳,则不会出现任何错误-并且第一条语句有效:

INSERT INTO `a` (`b`, `c`) VALUES
  (1, 1),
  (2, 2),
  (3, 2);
作为一种解决方法,或者根据用户删除的正确方法,您需要逐个处理行集(摘自bug reports注释):


我已经在try/catch块中有了它,让我更新我的代码来澄清这一点。表上设置的确切约束是什么?@deceze我已经用表结构更新了我的问题非常感谢!我不能完全确定我的代码是100%正确的,但我从来没有找到这个bug报告(当您没有在重复条目上得到异常时,谁会搜索“如果组的第一个SQL语句有效,则无PDO错误”:P)
$pdo->beginTransaction();
try {
    $statement = $pdo->prepare($sql);
    $statement->execute();
    while ($statement->nextRowset()) {/* https://bugs.php.net/bug.php?id=61613 */};
    $pdo->commit();
} catch (\PDOException $e) {
    $pdo->rollBack();
    throw $e;
}