Подготовленные заявления Php Включите эмуляцию

Существуют ли какие-либо побочные эффекты для отключения эмуляции при использовании подготовленных операторов с 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() для всех остальных случаев даже при включенной эмуляции.