gpt4 book ai didi

PHP PDO 不会在重复键插入时抛出异常

转载 作者:可可西里 更新时间:2023-11-01 06:30:02 24 4
gpt4 key购买 nike

我有一个奇怪的问题,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;

最佳答案

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

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

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

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

作为解决方法 - 或者根据 用户删除 的正确方法 - 您需要一个接一个地处理行集(取自错误报告评论):

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

关于PHP PDO 不会在重复键插入时抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32605095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com