为啥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 没有导出成员'ɵɵFactoryDeclaration'。构建项目时抛出错误?