首页 > 解决方案 > 为什么mysql PDO不会在失败时抛出错误

问题描述

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

请注意,我没有使用 $pdo->prepare(),而是使用$pdo->query(). 我使用 ERRMODE_EXCEPTION 选项。我阅读了许多其他有关PDO::ATTR_EMULATE_PREPARES选项的线程和示例(例如这个.

让我写一些代码:

$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 它运行良好。

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

再见 !

[编辑]

我找到了一些解决方法。

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

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

标签: phpmysqlsqlpdo

解决方案


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

如果您想要例外,请使用ERRMODE_EXCEPTION.

有关更多信息,请参阅https://www.php.net/manual/en/pdo.error-handling.php


推荐阅读