繁体   English   中英

pgsql 与 mysql 中的 PDO 准备语句

[英]PDO prepared statements in pgsql vs mysql

我想知道为什么 PDO 驱动程序pgsqlmysql关于准备好的语句( 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 => falsepgsqlmysql不起作用? 因为当我将它设置为true ,我突然对mysql有相同的行为,异常只在执行时抛出,而不是在准备时抛出。
  • 我可以通过某种设置以某种方式强制执行,PDO 在使用pgsql准备语句时已经抛出错误,就像使用mysql吗?

查看 PDO pgsql 驱动程序的代码,它似乎根据代码中的注释将准备推迟到第一次执行:

/* we deferred the prepare until now, because we didn't  
 * know anything about the parameter types; now we do */

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM