php - 为什么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() 完成了这项工作,没有任何问题。
解决方案
ERRMODE_WARNING
导致 PDO 发出警告而不是异常。
如果您想要例外,请使用ERRMODE_EXCEPTION
.
有关更多信息,请参阅https://www.php.net/manual/en/pdo.error-handling.php。
推荐阅读
- python - 如何从函数中的数据框返回不是由函数计算的列?
- sql - 当我们同时执行查询时,如何从同一个 sql 查询中检索不同的数据?
- javascript - Codemirror 和 Xtext - 自动完成弹出窗口未显示
- python - amazon sagemaker 中自定义代码的增量培训
- php - 对 jqgrid 日期时间列进行排序
- python - Pandas:计算连续重复项(不带循环)并将列添加到原始 DataFrame
- pointers - 将布尔值分配给变量的地址
- google-chrome - 是否可以在 Chrome 浏览器上禁用“安装 gatsby-starter”
- vue.js - Vue router-link 更改 url 但不更改 router-view 组件
- python - 从 CSV 读取输入并将它们用于不同的功能