Существуют ли какие-либо побочные эффекты для отключения эмуляции при использовании подготовленных операторов с pdo? Я использую select * и ограничиваю результаты, которые нужно обрабатывать как int, а не строку. Я могу сделать одну из двух вещей.
$conn->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
Или привязать эти переменные явно с типом param:
$stm = $pdo->prepare('SELECT * FROM table LIMIT ?, ?'); $stm->bindParam(1, $limit_from,PDO::PARAM_INT); $stm->bindParam(2, $per_page,PDO::PARAM_INT); $stm->execute(); $data = $stm->fetchAll();
-$stm = $pdo->prepare('SELECT * FROM table LIMIT ?, ?'); $stm->bindParam(1, $limit_from,PDO::PARAM_INT); $stm->bindParam(2, $per_page,PDO::PARAM_INT); $stm->execute(); $data = $stm->fetchAll();
Любые плюсы или минусы? Очевидно, что выключение эмуляции позволит сэкономить много привязки.
Подготовленные утверждения являются характеристикой драйвера базы данных низкого уровня. База данных сначала принимает структуру запроса и получает переменные параметры отдельно. Опять же, это функция, фактически поддерживаемая самой базой данных.
«Эмулированные подготавливает» означает, что вы используете один и тот же API на стороне PHP, с отдельными вызовами prepare()
и bind
/ execute
, но что драйвер PDO просто внутренне экранирует и конкатенирует строки, отправляя старую длинную длинную строку SQL в базы данных. База данных не может использовать функцию встроенного параметризованного запроса.
Превращение эмулируемой готовит отряды PDO для использования встроенной параметризованной функции запроса базы данных. Вы должны только включать / выключать эмулируемую подготовку, если ваша база данных (-driver) не поддерживает встроенные параметризованные запросы. Эмулированные подготавливаются только для поддержки старой базы данных (-drivers), она не изменяет, как вы связываете параметры в вашем PHP-коде.
Эмулированные подготовительные документы могут выявлять недостатки безопасности при определенных обстоятельствах, так же, как и все клиентские стороны, способные к утечке и конкатенации. Если запрос и данные остаются разделенными вплоть до базы данных, эти недостатки невозможны.
Нет, никаких плюсов и минусов не стоит упоминать.
Очевидно, что выключение эмуляции позволит сэкономить много привязки.
Не так много. Вы можете использовать привязку только для таких случаев с LIMIT и продолжать использовать ленивую привязку в execute()
для всех остальных случаев даже при включенной эмуляции.