我想知道为什么 PDO 驱动程序 pgsql
和 mysql
之间关于准备好的语句有不同的行为(PDO::ATTR_EMULATE_PREPARES => false
).
为了证明我的意思,我准备了两个等效的查询(一个用于 pgsql
,一个用于 mysql
)和一个 PHP 单元测试用例。
以下查询,其中表有意不存在,会产生以下错误:
pgsql:
INSERT INTO "addresss" SELECT * FROM "address" WHERE "id" = 80
SQLSTATE[42P01]:未定义表:7 FEHLER:关系 »addresss« existiert nicht
mysql:
INSERT INTO `addresss` SELECT * FROM `address` WHERE `id` = 80
SQLSTATE[42S02]:找不到基表或 View :1146 表“地址”不存在
这是测试用例:
try
{
$stmt = self::$connection->getPdo()->prepare($sql);
$stmt->execute();
}
catch (\PDOException $exception){
echo $exception->getMessage();
}
在 mysql
的情况下,异常已经在 getPdo()->prepare($sql)
上抛出,但在 pgsql
的情况下它仅在 $stmt->execute()
上抛出。
为什么我知道?因为,当我省略 $stmt->execute()
并运行 pgsql
的测试用例时,测试成功了。但对于 mysql
仍然失败。
- 这是为什么?
- 有没有可能
PDO::ATTR_EMULATE_PREPARES => false
对pgsql
和mysql
都不起作用?因为当我将它设置为true
时,我突然对mysql
有了相同的行为,即异常仅在执行时抛出,而不是在准备时抛出。 - 我能否以某种方式强制设置某种设置,使 PDO 在使用
pgsql
准备语句时抛出错误,就像使用mysql
一样?
最佳答案
查看了 source PDO pgsql 驱动程序的代码,它似乎按照源中的注释将准备推迟到第一次执行:
/* we deferred the prepare until now, because we didn't
* know anything about the parameter types; now we do */
关于php - PDO 在 pgsql 与 mysql 中准备语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55144486/