PHP PDO Подготовка запросов - PullRequest
       41

PHP PDO Подготовка запросов

7 голосов
/ 27 ноября 2011

Я читал на 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);

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

спасибо

Ответы [ 4 ]

12 голосов
/ 27 ноября 2011

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

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

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

1 голос
/ 27 ноября 2011

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

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

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

0 голосов
/ 27 ноября 2011

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

$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().

0 голосов
/ 27 ноября 2011

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

...