Я пишу некоторые процедуры БД и использую подготовленные операторы. Моя среда - PDO с PHP5.
Я понимаю, что подготовленные операторы в первую очередь обеспечивают выигрыш в производительности, а также некоторые вспомогательные бонусы, такие как отсутствие необходимости вручную экранировать входные данные SQL.
У меня вопрос по поводу исполнения.
У меня есть две реализации функции getPrice, которая берет идентификатор продукта и возвращает его цену.
getPrice_A повторно использует один и тот же объект PDOStatement при последующих вызовах в рамках одного и того же выполнения скрипта. Это необходимо или рекомендуется? Если да, есть ли способ избежать дублирования этого дополнительного кода в каждом get * () в каждой отдельной модели?
getPrice_B создает новый объект PDOStatement при каждом вызове. Примет ли СУБД, что это утверждение уже подготовлено, и все еще сможет пропустить какую-то работу? Другими словами, правильно ли эта реализация использует преимущества производительности подготовленных операторов?
Написав все это и прочитав его, я думаю, что 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";