Преимущество безопасности подготовленных заявлений над PDO :: цитата - PullRequest
0 голосов
/ 06 декабря 2018

Предоставляет ли подготовленный оператор какое-либо преимущество в безопасности по сравнению с PDO::quote в одноразовых запросах?

Например, если у меня есть следующий запрос, который будет выполнен только один раз, есть ли какой-либо недостаток по сравнению с подготовленным эквивалентомниже?

// Using PDO::quote
$stmt = $db->query("SELECT * FROM `config` WHERE name = {$db->quote($name)} LIMIT 1");

// Using prepared statement
$stmt = $db->prepare("SELECT * FROM `config` WHERE name = :name LIMIT 1");
$stmt->execute(['name' => $name]);

Я прочитал, что подготовленный оператор немного медленнее из-за двухэтапного выполнения.Начальный подготовительный шаг выполняется на сервере базы данных или обрабатывается расширением PDO?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Предоставляет ли подготовленный оператор какое-либо преимущество в безопасности по сравнению с PDO :: quote в одноразовых запросах?

Да: он работает как для числовых параметров, так и для строк.PDO::quote() работает только для строк и дат.

Я прочитал, что подготовленный оператор немного медленнее из-за двухэтапного выполнения.

Если это так, разница незначительна, если ваша сеть не работает очень медленно или не нуждается в ремонте.Не беспокойтесь об этом, если вы не работаете в очень, очень высоком масштабе (подсказка: вы не работаете в таком масштабе).

Первоначальный этап подготовки выполняется на сервере базы данных, илион обрабатывается расширением PDO?

Либо, в зависимости от атрибута PDO::ATTR_EMULATE_PREPARES.Если для этого параметра установлено значение true, то prepare() не используется (кроме сохранения строки SQL в переменной), а затем, когда вы execute(), интерполирует ваши параметры в строку SQL и выполняет запрос без подготовкиit.

Если PDO::ATTR_EMULATE_PREPARES имеет значение false, выполняется подготовка на стороне сервера.СУБД хранит некоторый объект в памяти для представления запроса и не может выполнить этот подготовленный запрос, пока вы не отправите значения параметров отдельно в вызове execute.

0 голосов
/ 06 декабря 2018

взято из документов :

Если вы используете эту функцию для построения операторов SQL, настоятельно рекомендуется использовать PDO :: prepare () для подготовки операторов SQLсо связанными параметрами вместо использования PDO :: quote () для интерполяции ввода пользователя в оператор SQL.Подготовленные операторы со связанными параметрами не только более переносимы, более удобны, невосприимчивы к SQL-инъекциям, но часто намного быстрее выполняются, чем интерполированные запросы, поскольку и на стороне сервера, и на стороне клиента могут кэшировать скомпилированную форму запроса.

...