【问题标题】: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 部分。

标签: php mysql sql pdo


【解决方案1】:

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

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

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

【讨论】:

  • 请注意,这是演示代码中的错误,我在文本中写了我使用 ERRMODE_EXCEPTION。
  • 好的。但是这个答案解释了为什么演示代码会这样。如果你想解释一些不同的代码,然后显示一些不同的代码:-)
猜你喜欢
  • 1970-01-01
  • 2014-11-13
  • 2018-04-09
  • 2018-03-02
  • 2014-11-07
  • 1970-01-01
  • 1970-01-01
  • 2019-08-03
  • 2021-03-14
相关资源
最近更新 更多