Где и когда вы используете метод котировки в PDO? Я прошу об этом в свете того факта, что в PDO все цитирование выполняется объектом PDO, поэтому пользовательский ввод не должен быть экранирован/процитирован и т.д. Это заставляет задуматься, почему беспокоиться о методе цитаты, если он не будет использоваться в подготовленном заявлении?
Метод PDO
Ответ 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);