Я хотел бы знать, почему между драйверами 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
?