php - PDO 在 pgsql 与 mysql 中准备语句

标签 php mysql postgresql pdo

我想知道为什么 PDO 驱动程序 pgsqlmysql 之间关于准备好的语句有不同的行为(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 => falsepgsqlmysql 都不起作用?因为当我将它设置为 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/

相关文章:

php - 如何使用 date() 在 php 中将时间戳转换为日期而不扭曲数据?

mysql - phpmyadmin 正在将“保存”到 mysql 数据库而不是“从 cakephp

mysql - 多个表上的多个排序字段,无需连接sql

hibernate - 使用 IN 运算符运行 JPQL 查询时出现 sql 错误

mysql - mySQL 和 postgreSQL 中的 Group by 子句,为什么 postgreSQL 出错?

postgresql - 有没有一种方法可以在 postgres 12 中对一个巨大的表执行 ALTER Column 而无需等待一生?

php - 通过隧道的 HTML 表单 PUT 方法,我不明白的东西

php - 什么时候应该在 require/include 语句中使用括号?

javascript - 使用单选按钮数组的文本框可见性

php - 我认为这段代码很容易受到攻击。可能是什么原因?