您在PDO中何时何地使用引用方法?我问这个问题,因为在PDO中,所有引用都是由PDO对象完成的,因此没有用户输入应该被转义/引用等。这让人不禁担心引用方法如果它不会被使用在一份准备好的声明中?
答案 0 :(得分:13)
将准备好的语句与PDO::prepare()
和PDOStatement::execute()
一起使用时,您没有任何引用:这将自动完成。
但是,有时,您不会(或不能)使用预准备语句,并且必须编写完整的SQL查询并使用PDO::exec()
执行它们;在这些情况下,您必须确保正确引用字符串 - 这是PDO::quote()
方法有用的时候。
答案 1 :(得分:2)
虽然这可能不是唯一的用例,但它是我唯一需要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 :(得分:0)
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预处理语句兼容。
如果有人知道避免这种困难的方法,那就很开心。
答案 3 :(得分:-3)
有点晚了,但有一种情况是,如果你从你的桌子中获得了大量的数据,那么你将会在以后放回来。
例如,我有一个函数可以从表中获取文本并将其写入文件。该文本可能稍后插入另一个表中。 quote()方法使所有报价都安全。真的很容易:
$safeTextToFile = $DBH->quote($textFromDataBase);