为啥mysql PDO不会在失败时抛出错误[重复]

Posted

技术标签:

【中文标题】为啥mysql PDO不会在失败时抛出错误[重复]【英文标题】:Why mysql PDO do not throw error on failure [duplicate]为什么mysql PDO不会在失败时抛出错误[重复] 【发布时间】:2019-11-13 13:40:06 【问题描述】:

我正在尝试使用 php PDO 更新我的数据库,当发出错误的 sql 语句时它会失败,没有任何错误或在我的情况下出现异常。

请注意,我使用的不是$pdo->prepare(),而是$pdo->query()。 我使用 ERRMODE_EXCEPTION 选项。 我阅读了许多关于PDO::ATTR_EMULATE_PREPARES 选项的其他线程和示例(like this one。

让我写一些代码:

$Qs = <<<EOT
UPDATE my table where somevar = "this";
UPDATE my othertable where thisitem = "that";
INSERT INTO tablex (col1, col2,col3,invalid_col) VALUES (val1,val2,val3,val4);
INSERT INTO tabley (col1, col2,col3) VALUES (val1,val2,val3);
EOT;

$options = [
    PDO::ATTR_ERRMODE   => PDO::ERRMODE_EXCEPTION ,
    /* disabled ! PDO::ATTR_EMULATE_PREPARES => false,*/
];

$pdo = new PDO(dsn,user,password, $options);

try
  $pdo->query($Qs);
catch(exception $e)

  echo 'an error occurred' . $e->getmessage();

next_instruction();

在这段非常接近我的代码中,永远不会抛出异常! 为什么 ?如果我不使用准备! 请注意,如果我启用 ATTR_EMULATE_PREPARES,它会运行良好。

有人可以解释这种行为吗?我应该打开一个错误请求吗?

再见!

[编辑]

我找到了一些解决方法。

1st:我将每一行拆分为一个数组,然后针对 $pdo->query() 运行该数组。 然后我添加了我在错误时抛出的异常。我在某处读到 mysql 不接受同时多个查询。也许这就是我的 sql 查询错误时行为不正确的地方。

第 2 次:当我在数据库中创建新触发器时,每次都失败并出现错误 Cannot execute queries while other unbuffered queries are active。我正在使用 $pdo->queries() 添加它们。切换到 $pdo->prepare() 没有任何问题。

【问题讨论】:

这个问题过于宽泛和令人困惑,无法在 Stack Overflow 上讨论。目前还不清楚你的问题是什么。如果您仍有任何疑问,我的 PDO 教程中会解释所有内容,尤其是在 running multiple queries 部分。 【参考方案1】:

ERRMODE_WARNING 导致 PDO 发出警告而不是异常。

如果您需要例外,请使用ERRMODE_EXCEPTION

请参阅https://www.php.net/manual/en/pdo.error-handling.php 了解更多信息。

【讨论】:

请注意,这是演示代码中的错误,我在文本中写了我使用 ERRMODE_EXCEPTION。 好的。但是这个答案解释了为什么演示代码会这样。如果你想解释一些不同的代码,然后显示一些不同的代码:-)

以上是关于为啥mysql PDO不会在失败时抛出错误[重复]的主要内容,如果未能解决你的问题,请参考以下文章

没有抛出错误,但数据没有插入数据库(PHP PDO)[重复]

为啥进程列表时抛出 java.lang.UnsupportedOperationException [重复]

为啥它在运行迁移时抛出`GeoDjango Postgis 要求不满足得到错误?

为啥 SQL Server 在将 int 转换为数据类型 numeric 时抛出算术溢出错误?

在 oracle apex 中使用 sqlerm 和异常时抛出重复的错误代码

为啥@angular/core/core 没有导出成员'ɵɵFactoryDe​​claration'。构建项目时抛出错误?