私はいくつかのDBルーチンを作成しており、プリペアドステートメントを使用しています。私の環境はPHP5を使用したPDOです。
プリペアドステートメントは、主にパフォーマンス上の利点と、入力データを手動でSQLエスケープする必要がないなどの補助的なボーナスを提供することを理解しています。
私の質問はパフォーマンスの部分についてです。
以下に、製品IDを取得してその価格を返すgetPrice関数の2つの実装があります。
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";