PHP手册说明如下:
为以下语句调用PDO::prepare()和PDOStatement::execute()将使用不同的参数值多次发布通过允许驱动程序优化应用程序的性能协商查询计划的客户端和/或服务器端缓存,以及元信息,并通过从而消除了手动引用参数的需要。
PHP PDO::准备
对于单个,一次一页的查询-比如:
$query = "SELECT id, content FROM pages WHERE id = :id LIMIT 1";
正在使用准备和执行类似:
$statement = $connection->prepare( $query );
$statement->execute( array( ":id" => 5 ) );
最好的方法是什么?我从手册中得到的感觉是,我应该只对将被多次绑定的查询使用prepare()。如果是这样的话,还有其他选择吗?(手动调用quote,然后可能调用PDO::query()?)
我不能说当只对单个查询使用准备好的语句时是否会对性能产生任何影响。
每个查询都经过解析、分析和优化。这也适用于PDO:query()
(以及mysql_*
、mysqli_*
…)。Prepared Statements(简单地说)将解析、分析、优化和查询计划与执行查询分离开来。我(可能是天真的)假设是,为单个查询准备的statmenets带来的唯一开销是缓存准备好的结果。
不过,使用一个API执行查询应该超过轻微的性能损失。如果对单个查询使用PDO::query()
而不是PDO::prepare()
,则会错过参数绑定和自动转义prepare()
提供的开箱即用功能。如果你忘记PDO::quote()
你的数据,这可能会打开一个新的蠕虫罐头。
我只将PDO::query()
用于无法以合理方式准备的事情(例如,像SELECT foo FROM bar ORDER BY bla DESC LIMIT 1
这样的"静态"查询和大量使用IN()
的查询等等)。