[英]PDO prepared statements in pgsql vs mysql
我想知道为什么 PDO 驱动程序pgsql
和mysql
关于准备好的语句( PDO::ATTR_EMULATE_PREPARES => false
)有不同的行为。
为了说明我的意思,我准备了两个等效的查询(一个用于pgsql
,一个用于mysql
)和一个 PHP 单元测试用例。
下面的查询,其中表有意地不存在,产生以下错误:
pgsql :
INSERT INTO "addresss" SELECT * FROM "address" WHERE "id" = 80
SQLSTATE[42P01]: Undefined table: 7 FEHLER: Relation »addresss« existiert nicht
mysql :
INSERT INTO `addresss` SELECT * FROM `address` WHERE `id` = 80
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'addresss' doesn't exist
这是测试用例:
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
有相同的行为,异常只在执行时抛出,而不是在准备时抛出。pgsql
准备语句时已经抛出错误,就像使用mysql
吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.