我正在尝试使用 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 查询在错误时行为不正确的原因。
第二:当我在数据库中创建新触发器时,每次都会失败,并出现错误 Cannot execute queries while other unbuffered queries are active
。我使用 $pdo->queries() 来添加它们。切换到 $pdo->prepare() 完成工作,没有任何问题。
最佳答案
ERRMODE_WARNING
导致 PDO 发出警告而不是异常。
如果您想要异常(exception),请使用ERRMODE_EXCEPTION
。
参见https://www.php.net/manual/en/pdo.error-handling.php了解更多信息。
关于php - 为什么 mysql PDO 失败时不会抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58838437/