PDO报价方法

时间:2012-02-12 16:29:42

标签: php mysql pdo

您在PDO中何时何地使用引用方法?我问这个问题,因为在PDO中,所有引用都是由PDO对象完成的,因此没有用户输入应该被转义/引用等。这让人不禁担心引用方法如果它不会被使用在一份准备好的声明中?

4 个答案:

答案 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);