为什么MySQL PDO不会在失败时引发错误

时间:2019-11-13 13:40:06

标签: php mysql sql pdo

我正在尝试使用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,效果很好。

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

再见!

[编辑]

我找到了解决方法。

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

2nd:当我在数据库中创建新触发器时,它每次都失败,并显示错误Cannot execute queries while other unbuffered queries are active。我正在使用$ pdo-> queries()添加它们。切换到$ pdo-> prepare()可以毫无问题地完成工作。

1 个答案:

答案 0 :(得分:2)

df使PDO发出警告而不是异常。

如果需要例外,请使用ERRMODE_WARNING

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