Я читал о 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);
оба запроса возвратят тот же результат, поэтому зачем использовать подготовку, для меня это похоже, что он будет медленнее, так как вам нужно выполнить дополнительный шаг.
благодаря
Подготовленные заявления:
Из этих двух, № 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()
.