古い(乱雑な)コードを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];
}
}