Php PDO报价方法

Php PDO报价方法,php,mysql,pdo,Php,Mysql,Pdo,在PDO中何时何地使用quote方法?我这样问是因为在PDO中,所有引用都是由PDO对象完成的,因此不应该转义/引用用户输入等。这让人想知道,如果quote方法无论如何都不会在准备好的语句中使用,为什么还要担心它 虽然这可能不是唯一的用例,但它是我唯一需要的quote。您只能使用PDO_Stmt::execute传递值,因此例如,此查询不起作用: SELECT * FROM tbl WHERE :field = :value quote的引入使您可以执行以下操作: // Example: fi

在PDO中何时何地使用quote方法?我这样问是因为在PDO中,所有引用都是由PDO对象完成的,因此不应该转义/引用用户输入等。这让人想知道,如果quote方法无论如何都不会在准备好的语句中使用,为什么还要担心它

虽然这可能不是唯一的用例,但它是我唯一需要的
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

在使用准备好的语句和时,您不需要进行任何引用:这将自动完成


但是,有时,您将不会(或不能)使用准备好的语句,并且必须编写完整的SQL查询并使用;在这种情况下,您必须确保字符串被正确引用——这是该方法有用的时候。

anwser有点晚了,但有一种情况是,如果您从表中获取了大量数据,稍后将放回表中,该方法会很有用

例如,我有一个函数,它从一个表中获取一堆文本并将其写入一个文件。该文本稍后可能会插入到另一个表中。quote()方法使所有的引号都是安全的

这很容易:

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

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_的内容,将其作为绑定上的一个选项,由单个驱动程序决定如何处理空集。当然,这与SQL准备的语句不再兼容


如果有人知道避免这种困难的方法,那就很高兴了。

确实不要担心“引用方法”(不知道那是什么)PDO中没有“引用方法”。我很难弄明白你在问什么。我会说“永远不会”。另请参见手册中的注释,基本上是这样写的:如果你想使用它,不要。(@tomalak:我怀疑这个方法是故意的?@Nanne啊!我被纠正了。PDO中有一个quote方法。只是这没什么意义。现在我也明白了这个问题。在的PHP PDO文档中,一位用户评论道:“如果您只提交一个查询,那么将PDO::query()与PDO::quote()一起使用要快得多。”因此,至少有人认为这个方法是有意义的。+1用于用例。在国际海事组织,任何人都不应该真正需要这个。无论何时使用实际的用户输入来构建SQL,应用程序设计都存在严重错误。(推论:如果用户输入已被彻底清除,则无需再引用
$column
。@ross。我懂了。所以这是为世界的其他部分query@tomalak我明白你的意思,但他的例子可以展示按区域排序的顺序,这对于用户修改是完全正常的。。。(即,按bestprice asc或desc等订购)。看看我的另一个问题,在我得到答案之前我已经开始了(这一个)[@John True。对于这些情况,我通常有一组准备好的固定字符串,我会逐字输入到查询中,并有一个switch语句从中进行选择。没有用户输入进入SQL。-1这个答案是错误的。PDO::quote()它不添加标识符分隔符,而是添加单引号。因此它不能用于表名或列名。它仅用于字符串值或日期值。它是否像上面的Ross代码一样-您不会(也不能)使用准备好的语句?实际上,我不认为
quote
方法的作用是引用标识符(像列名):它的目的是引用字符串值(例如:转义那些字符串中可能存在的字符串)不确定您最后一句话的意思。我认为quote仅用于sql标识的地方,例如列名、asc、desc关键字、表名等。因为PDO::prepare()不转义传递到其中的任何内容。当参数与某个bind…()调用绑定时,将转义参数,并且您只能绑定值,而不能绑定标识符。+1这是正确答案。Quote对插入字符串值很有用,但通常最好使用查询参数。它不会“使Quote安全”。当您向表中插入数据时,请使用prepared语句。我并没有说它会。我是说,如果您通过quote方法传递字符串,它将返回带有转义引号的字符串。请删除您的否决票。谢谢` the quote()方法使所有的引号都安全。如果我的眼睛没有看错的话,我可以阅读上面的内容。而且你的定义仍然是错误的,更不用说它已经过时并且容易出错。你的第一条评论是“它不能使引号安全”。当你在表中插入数据时-我从来没有说过在插入表时使用它。我说它返回一个带引号的字符串,您可以存储该字符串并稍后使用。这就是我使用它的方式,它工作得非常完美。我不是专家,请告诉我们它的用途。但您可以尝试,打开连接,并通过quote方法运行字符串,它是我将返回带有转义引号的字符串。simpleSorry bud,但“存储该字符串并稍后使用”会使