【问题标题】:PHP PDO does not throw exception on duplicate key insertPHP PDO 不会在重复键插入时抛出异常
【发布时间】:2015-12-12 19:59:52
【问题描述】:

我有一个奇怪的问题,即插入重复值时 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 - Duplicate entry '65533' for key 'PRIMARY'

为什么在这种情况下 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;

【问题讨论】:

  • 我已经在 try/catch 块中有它,让我更新我的代码来澄清这一点。
  • 对表设置的确切约束是什么?
  • @deceze 我已经用表格结构更新了我的问题

标签: php mysql pdo


【解决方案1】:

2018 年更新:开发者不认为这是一个错误,而是预期的行为。 因此,PHP 用户必须忍受这一点,报告已关闭,以后有任何问题...

这经常被报告为PDO 的错误:https://bugs.php.net/bug.php?id=61613

只有当 FIRST 语句无效时才会抛出异常。如果第一条语句运行顺利,您将不会收到任何错误 - 并且您的第一条语句是有效的:

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

作为一种解决方法 - 或根据 user deleted 正确的做法 - 您需要一个接一个地处理行集(取自错误报告 cmets):

$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;
}

【讨论】:

  • 非常感谢!我不完全确定我的代码是否 100% 正确,但我从未找到此错误报告(当您在重复条目上没有出现异常时,谁搜索“如果组的第一个 SQL 语句有效,则没有 PDO 错误”: P)
猜你喜欢
  • 1970-01-01
  • 2010-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 1970-01-01
相关资源
最近更新 更多