【发布时间】:2010-09-08 11:20:06
【问题描述】:
我正在编写一些数据库例程,并且正在使用准备好的语句。我的环境是使用 PHP5 的 PDO。
我了解预处理语句主要提供性能优势,以及一些辅助好处,例如不必手动 SQL 转义输入数据。
我的问题是关于性能部分。
下面我有两个 getPrice 函数的实现,它接受一个产品 ID 并返回它的价格。
getPrice_A 在同一脚本执行中的后续调用中重用同一 PDOStatement 对象。这是必要的还是推荐的?如果是这样,有什么方法可以避免在每个模型的每个 get*() 中重复这个额外的代码?
getPrice_B 在每次调用时创建一个新的 PDOStatement 对象。 DBMS 是否会识别该语句已经准备好并且仍然可以跳过一些工作?换句话说,这个实现是否正确地利用了预处理语句的性能优势?
写完所有这些并仔细阅读后,我想 getPrice_B 很好,而 getPrice_A 提供的好处可以忽略不计,这可能值得,也可能不值得额外的复杂性。
不过,我仍然希望听到更博学的人的肯定。
假设$pdo 在下面的示例中是一个有效的连接 PDO 对象。
<?php
class Product {
static function &getPrice_A($id) {
static $stmt;
if (!$stmt) {
$stmt = $pdo->prepare('SELECT price FROM products WHERE id = ?');
}
$stmt->execute(array($id));
return $stmt->fetchColumn(0);
}
static function &getPrice_B($id) {
$stmt = $pdo->prepare('SELECT price FROM products WHERE id = ?');
$stmt->execute(array($id));
return $stmt->fetchColumn(0);
}
}
// example usage:
$price = Product::getPrice(4982);
echo "Product 4982 costs $price\n";
【问题讨论】: