PDO报价方法

Ave*_*Joe 14 php mysql pdo

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

Pas*_*TIN 13

使用PDO::prepare()和使用预备语句时PDOStatement::execute(),您没有任何引用:这将自动完成.

但是,有时,您不会(或不能)使用预准备语句,并且必须编写完整的SQL查询并执行它们PDO::exec(); 在这些情况下,您必须确保正确引用字符串 - 这是PDO::quote()方法有用的时候.

  • 实际上,我不认为`quote`方法的作用是引用标识符*(例如列名)*:其目的是引用字符串值*(例如:转义可能在那些字符串中的字符串)* (2认同)
  • +1 这是正确答案。Quote 对于插入字符串值很有用,但通常最好使用查询参数。 (2认同)

Ros*_*oss -1

虽然这可能不是唯一的用例,但它是我唯一需要的用例quote。您只能使用 传递值PDO_Stmt::execute,因此例如此查询将不起作用:

SELECT * FROM tbl WHERE :field = :value
Run Code Online (Sandbox Code Playgroud)

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");
Run Code Online (Sandbox Code Playgroud)

并且仍然期望$column在查询中被安全地过滤。

  • -1 这个答案是错误的。PDO::quote() 不添加标识符分隔符,它添加单引号。所以它不能用于表名或列名。它仅适用于字符串值或日期值。 (18认同)