1

PHP手册指出以下内容:

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

PHP PDO::准备

对于单个页面查询 - 说:

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

正在使用准备和执行,如:

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

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

4

1 回答 1

1

我不能说仅对单个查询使用准备好的语句时是否有任何性能影响。

每个查询都经过解析、分析和优化。这也适用于PDO:query()(and mysql_*, mysqli_*, ...)。准备好的语句 - 简单地说 - 将解析、分析、优化和查询计划与执行查询分开。我的(可能是幼稚的)假设是,对于单个查询来说,唯一的开销准备好的 statmenets 是准备好的结果的缓存。

不过,使用一个 API 执行查询应该会超过轻微的性能损失。如果您要使用PDO::query()而不是PDO::prepare()单个查询,您将错过开箱即用的参数绑定和自动转义prepare()优惠。如果您忘记了PDO::quote()您的数据,这可能会打开一个新的蠕虫罐。

我只PDO::query()用于无法以合理方式准备的东西(例如“静态”查询,例如SELECT foo FROM bar ORDER BY bla DESC LIMIT 1和大量使用IN()等的查询)。

于 2012-07-08T11:23:26.747 回答