我正在将旧(杂乱)代码从 mysql_query() 更新为 PDO。
我知道使用准备好的语句对安全性和性能都有好处,但是要发挥性能方面的作用,必须先进行准备,然后再执行多次。这意味着对我的代码进行重大重写,这可能不值得提高性能,但后来我想知道我是否可以用另一种方式来做。
我提出的解决方案是将 PDO 类包装如下:
class PDOCached extends PDO {
private $PreparedStatementCache;
public function prepare($query) {
if (!isset($this->PreparedStatementCache[$query])) {
$this->PreparedStatementCache[$query]=parent::prepare($query);
}
return $this->PreparedStatementCache[$query];
}
}
它有效(即我得到相同的结果),但我不清楚它是否允许我利用性能提升。任何反馈/意见表示赞赏。
注意:我知道这没有考虑 $driver_options,但是对于这个练习来说这并不重要。
更新:
我已经修改了类以使缓存成为可选:
class PDOCached extends PDO {
private $PreparedStatementCache;
// WARNING: Does not take into account $driver_options
public function prepare($query, $cached=false) {
if (!$cached) return parent::prepare($query);
if (!isset($this->PreparedStatementCache[$query])) {
// WARNING: Assumes try/catch error handling
$this->PreparedStatementCache[$query]=parent::prepare($query);
}
return $this->PreparedStatementCache[$query];
}
}