PHP PDO Подготовить запросы

Я читал о PDO, и я искал в StackOverFlow о pdo и подготовил заявление. Я хочу знать, каковы / являются преимуществами или с помощью инструкции подготовки. например:

$sql = 'SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour'; $sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)); $sth->execute(array(':calories' => 150, ':colour' => 'red')); $red = $sth->fetchAll(); 

против

 $sql = "SELECT name, colour, calories FROM fruit WHERE calories < $calories AND colour = $colour"; $result = $connection->query($query); $row = $result->fetch(PDO::FETCH_ASSOC); 

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

благодаря

Solutions Collecting From Web of "PHP PDO Подготовить запросы"

Подготовленные заявления:

  1. Безопаснее : PDO или базовая библиотека базы данных позаботятся об экранировании связанных переменных для вас. Вы никогда не будете подвержены атакам SQL-инъекций, если вы всегда используете подготовленные операторы.
  2. (Иногда). Быстрее : многие базы данных будут кэшировать план запроса для подготовленного оператора и ссылаться на подготовленный оператор символом вместо повторной передачи всего текста запроса. Это наиболее заметно, если вы готовите заявление только один раз, а затем повторно используете подготовленный оператор с различными переменными.

Из этих двух, № 1 гораздо важнее и делает подготовленные заявления незаменимыми! Если вы не использовали подготовленные заявления, единственная нормальная вещь – повторная реализация этой функции в программном обеспечении. (Как я уже делал несколько раз, когда я был вынужден использовать драйвер mysql и не мог использовать PDO .)

Подготовьтесь быстрее при использовании большого количества запросов (вы уже подготовили запрос), и это более безопасно.

Второй код, вероятно, не сработает – вы используете параметры в запросе, но не определяете их.

С запросом () вы должны заполнить запрос вручную, используя quote () – это больше работает и, как правило, делает программистов неосторожными.

Подготовительные и связывающие параметры предназначены для предотвращения внедрения sql,
является act любит экранирование переменной перед отправкой в ​​базу данных,
в то время как ваш второй запрос не защищает вас.

Существует третий вариант, который вы пропустили:

 $stmt = $dbh->prepare( ' SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour '); $stmt->bindParam( ':calories', $calories, PDO::PARAM_INT ); $stmt->bindParam( ':colour', $colour, PDO::PARAM_STR, 64 ); if ( $sth->execute() ) { $data = $sth->fetchAll( PDO::FETCH_ASSOC); } 

Может быть, я что-то упустил, но настройки курсора кажутся немного бессмысленными, если вы все равно закончите делать fetchAll() .