готовые заявления - нужны ли они - PullRequest
3 голосов
/ 11 сентября 2011

Подготовленные отчеты добавляют значительное количество кода ... но я все еще слышу упоминания об их использовании ... какое значение добавляется при переходе от 1 строки кода к примерно 6?Это просто для защиты от SQL инъекций?

Подобный пост здесь .

php.net на подготовленные заявления здесь

Ответы [ 2 ]

6 голосов
/ 11 сентября 2011

Подготовленные операторы обеспечивают отличную защиту от внедрения SQL.

В дополнение к защите с использованием SQL-инъекций подготовленные операторы обеспечивают пониженную нагрузку на сервер базы данных, когда один и тот же запрос должен выполняться несколько раз, например в цикле INSERT.Оператор только один раз компилируется СУБД, и его не нужно компилировать каждый раз, как при вызове mysql_query().

Для различных API требуется разное количество кода для выполнения подготовленного оператора.Я считаю, что PDO может быть немного менее многословным, чем MySQLi, если, например, ваша ситуация позволяет использовать неявное связывание параметров внутри вызова execute().Это работает, только если все ваши параметры могут быть оценены как строки.

// PDO implicit binding example:
// Not many lines of code if the situation allows for it
$stmt = $pdo->prepare("SELECT * FROM tbl WHERE col1=? AND col2=? AND col3=?");
$stmt->execute(array($val1, $val2, $val3));
3 голосов
/ 11 сентября 2011

Нечестно сказать, что подготовленные операторы приводят к тому, что 1 строка кода взрывается до 6. На самом деле, чтобы использовать одну, вам нужно всего 2 строки: одна для подготовки оператора и одна для привязки параметров.Любой другой код, который вы пишете (выполнить запрос, связать результаты, получить результаты и т. Д.), Также будет необходим, даже если вы не используете подготовленные операторы.

Итак, по сути, мы говорим о том, что один дополнительная строка кода покупает вас.Он покупает две вещи:

  1. Защита от SQL-инъекций (которая также включает защиту от несанкционированных некорректных запросов, например, предотвращение прерывания запроса, если введенная переменная содержит одну кавычку)
  2. Возможные выигрыши в производительности, если вы в конечном итоге выполните один и тот же подготовленный оператор для различных введенных значений.

Точка # 2 может не всегда применяться, но учтите, что точка # 1 также спасает вас от необходимость вручную экранировать значения, которые будут введены в ваш запрос.Это будет дополнительный код (даже если вы можете сделать это встроенным в той же строке), который вам потребуется написать самостоятельно, если вы не используете подготовленные операторы.

Как я вижу, мы можем сделать вывод, что с подготовленными операторами выв конечном итоге получить безопасность и, возможно, производительность бесплатно .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...