PDO подготовил заявления в pgsql против mysql - PullRequest
1 голос
/ 13 марта 2019

Я хотел бы знать, почему между драйверами PDO pgsql и mysql существует другое поведение в отношении подготовленных операторов (PDO::ATTR_EMULATE_PREPARES => false).

Чтобы продемонстрировать, что я имею в виду, я подготовил два эквивалентных запроса (один для pgsql, один для mysql) и тестовый блок PHP Unit.

Следующие запросы, в которых таблица специально не существует, выдают следующие ошибки:


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, что исключение выдается только при выполнении, а не при подготовке.
  • Могу ли я как-то принудительно принудительно установить с определенной настройкой, что PDO выдает ошибку уже при подготовке оператора с pgsql, как это происходит с mysql?

1 Ответ

1 голос
/ 13 марта 2019

Посмотрел код source драйвера PDO pgsql, и оказалось, что он откладывает подготовку к первому выполнению в соответствии с комментарием в источнике:

/* we deferred the prepare until now, because we didn't  
 * know anything about the parameter types; now we do */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...