Подтвердить что ты не робот

Метод PDO

Где и когда вы используете метод котировки в PDO? Я прошу об этом в свете того факта, что в PDO все цитирование выполняется объектом PDO, поэтому пользовательский ввод не должен быть экранирован/процитирован и т.д. Это заставляет задуматься, почему беспокоиться о методе цитаты, если он не будет использоваться в подготовленном заявлении?

4b9b3361

Ответ 1

Хотя это может быть не единственный вариант использования, он нужен только для quote для. Вы можете передавать значения только с помощью PDO_Stmt::execute, поэтому, например, этот запрос не будет работать:

SELECT * FROM tbl WHERE :field = :value

quote входит, чтобы вы могли сделать это:

// Example: filter by a specific column
$columns = array("name", "location");
$column = isset($columns[$_GET["col"]]) ? $columns[$_GET["col"]] : $defaultCol;

$stmt = $pdo->prepare("SELECT * FROM tbl WHERE " . $pdo->quote($column) . " = :value");
$stmt->execute(array(":value" => $value));

$stmt = $pdo->prepare("SELECT * FROM tbl ORDER BY " . $pdo->quote($column) . " ASC");

и по-прежнему ожидать, что $column будет безопасно отфильтровываться в запросе.

Ответ 2

При использовании подготовленных заявлений с PDO::prepare() и PDOStatement::execute(), у вас нет никаких цитат: это будет сделано автоматически.

Но иногда вы не будете (или не можете) использовать подготовленные инструкции и должны будете писать полные SQL-запросы и выполнять их с помощью PDO::exec(); в этих случаях вам нужно убедиться, что строки указаны правильно - это когда метод PDO::quote() полезен.

Ответ 3

В системе PDO нет (насколько я могу найти) любого механизма привязки переменной массива в PHP к набору в SQL. Это ограничение SQL также подготовило заявления... таким образом, вы остаетесь с задачей сшить вашу собственную функцию для этой цели. Например, у вас есть следующее:

$a = array(123, 'xyz', 789);

Вы хотите в итоге:

$sql = "SELECT * FROM mytable WHERE item IN (123, 'xyz', 789)";

Использование PDO:: prepare() не работает, потому что нет способа привязать переменную массива $a к набору. Вы в конечном итоге нуждаетесь в цикле, где вы отдельно указываете каждый элемент в массиве, а затем склеиваете их вместе. В этом случае PDO:: quote(), вероятно, лучше, чем ничего, по крайней мере, вы правильно задаете детали набора символов.

Было бы отлично, если бы PDO поддерживал более чистый способ справиться с этим. Не забывайте, что пустой набор в SQL является отвратительным специальным случаем... что означает, что любая функция, которую вы создаете для этой цели, становится более сложной, чем вы хотите. Что-то вроде PDO:: PARAM_SET как опция для привязки, с отдельным драйвером, решающим, как обрабатывать пустой набор. Конечно, это больше не совместимо с подготовленными SQL-запросами.

Счастлив, если кто-то знает способ избежать этой трудности.

Ответ 4

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

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

Это просто:

$safeTextToFile = $DBH->quote($textFromDataBase);