与PDO :: quote

时间:2018-12-06 16:44:01

标签: mysql pdo prepared-statement

在单次使用查询中,准备好的语句是否比PDO::quote更具安全优势?

例如,如果我有以下查询仅执行一次,那么与下面准备的等效查询相比有什么不利之处吗?

// Using PDO::quote
$stmt = $db->query("SELECT * FROM `config` WHERE name = {$db->quote($name)} LIMIT 1");

// Using prepared statement
$stmt = $db->prepare("SELECT * FROM `config` WHERE name = :name LIMIT 1");
$stmt->execute(['name' => $name]);

我已经读到,由于执行了两步,所以准备好的语句稍微慢一些。 准备的初始步骤是在数据库服务器上执行的还是由PDO扩展处理的?

2 个答案:

答案 0 :(得分:3)

摘自docs

  

如果使用此函数构建SQL语句,则强烈建议您使用PDO :: prepare()来准备带有绑定参数的SQL语句,而不是使用PDO :: quote()来将用户输入插值到SQL语句中。具有绑定参数的预备语句不仅更可移植,更方便,不受SQL注入的影响,而且执行起来通常比插值查询快得多,因为服务器端和客户端都可以缓存查询的编译形式。

答案 1 :(得分:3)

  

与单次使用查询中的PDO :: quote相比,预备语句是否提供任何安全优势?

是:它适用于数字参数以及字符串。 PDO::quote()仅适用于字符串和日期。

  

我已经读到,由于执行了两步,所以准备好的语句稍微慢一些。

如果是这样,除非您的网络非常慢或需要维修,否则差异不大。除非您以非常非常高的规模运行,否则不要担心(提示:您不会以这种规模运行)。

  

初始准备步骤是在数据库服务器上执行还是由PDO扩展程序处理?

取决于PDO::ATTR_EMULATE_PREPARES属性。如果将其设置为true,则prepare()是空操作(将SQL字符串保存在变量中除外),稍后在execute()时,它将参数插入到SQL字符串中并执行没有准备的查询。

如果PDO::ATTR_EMULATE_PREPARES为假,它将进行服务器端准备。 DBMS在内存中保留了一些对象来表示查询,除非您在execute调用中分别发送参数值,否则DBMS无法执行准备好的查询。