私はいくつかのDBルーチンを書いています。私は準備済みの文を使用しています。私の環境はPHP5のPDOです。準備文はどのように機能しますか?
私は、準備されたステートメントは、主に、パフォーマンス上の利点と、手動でSQLエスケープ入力データを必要としないなどのいくつかの補助ボーナスを提供することを理解しています。
私の質問は、パフォーマンスに関するものです。
下記のgetPrice関数の2つの実装では、製品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";