PHP手册说明如下:
为语句调用PDO :: prepare()和PDOStatement :: execute() 将使用不同的参数值多次发出 通过允许驱动程序优化应用程序的性能 协商客户端和/或服务器端缓存查询计划和 元信息,并有助于防止SQL注入攻击 无需手动引用参数。
对于单个,一次页面查询 - 例如:
$query = "SELECT id, content FROM pages WHERE id = :id LIMIT 1";
使用准备和执行如下:
$statement = $connection->prepare( $query );
$statement->execute( array( ":id" => 5 ) );
最好的方式去?我从手册中得到一种感觉,我应该只对使用多次绑定的查询使用prepare()。如果是这种情况,还有哪些其他选择? (手动调用quote,然后可能是PDO :: query()?)
答案 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()
等全部查询。