使用PDO :: prepare()与PDOStatement :: execute()单个查询的正确选项?

时间:2012-07-08 08:43:00

标签: php pdo

PHP手册说明如下:

  

为语句调用PDO :: prepare()和PDOStatement :: execute()   将使用不同的参数值多次发出   通过允许驱动程序优化应用程序的性能   协商客户端和/或服务器端缓存查询计划和   元信息,并有助于防止SQL注入攻击   无需手动引用参数。

PHP PDO::prepare

对于单个,一次页面查询 - 例如:

$query = "SELECT id, content FROM pages WHERE id = :id LIMIT 1";

使用准备和执行如下:

$statement = $connection->prepare( $query );
$statement->execute( array( ":id" => 5 ) );

最好的方式去?我从手册中得到一种感觉,我应该只对使用多次绑定的查询使用prepare()。如果是这种情况,还有哪些其他选择? (手动调用quote,然后可能是PDO :: query()?)

1 个答案:

答案 0 :(得分:1)

我不能说在为单个查询使用预准备语句时是否存在性能影响。

每个查询都经过解析,分析和优化。这也适用于PDO:query()(和mysql_*mysqli_*,...)。准备好的陈述 - 简单地说 - 从执行查询开始单独解析,分析,优化和查询计划。我的(可能是naiive)假设是,单个查询的唯一开销准备的statmenet是缓存准备好的结果。

但是,使用一个API执行查询应该会超过轻微的性能损失。如果您使用PDO::query()代替PDO::prepare()进行单个查询,则会错过参数绑定和自动转义prepare()优惠。如果忘记PDO::quote()您的数据,这可能会打开新的蠕虫病毒。

我只使用PDO::query()来处理无法以合理方式准备的内容(例如SELECT foo FROM bar ORDER BY bla DESC LIMIT 1等“静态”查询以及使用IN()等全部查询。