Estoy escribiendo algunas rutinas DB y estoy usando declaraciones preparadas. Mi entorno es PDO con PHP5.¿Cómo funcionan las declaraciones preparadas?
Entiendo que las declaraciones preparadas proporcionan principalmente un beneficio de rendimiento, así como algunas bonificaciones auxiliares, como no tener que escanear manualmente los datos de entrada de SQL.
Mi pregunta es sobre la parte del rendimiento.
Tengo dos implementaciones de una función getPrice a continuación que toma una identificación del producto y devuelve su precio.
getPrice_A reutiliza el mismo objeto PDOStatement en llamadas posteriores dentro de la misma ejecución del script. ¿Es esto necesario o recomendado? Si es así, ¿hay alguna forma de evitar la duplicación de este código adicional en cada get *() en cada modelo?
getPrice_B crea un nuevo objeto PDOStatement en cada llamada. ¿El DBMS reconocerá que esta declaración ya ha sido preparada y aún podrá omitir algún trabajo? En otras palabras, ¿esta implementación aprovecha adecuadamente los beneficios de rendimiento de las declaraciones preparadas?
Después de escribir todo esto y leerlo, me imagino que getPrice_B está bien y getPrice_A proporciona un beneficio insignificante además de eso, que puede o no valer la pena la complicación adicional.
Todavía me gustaría tener la certeza de alguien más conocedor.
Suponga que $pdo
es un objeto PDO válido y conectado en los ejemplos a continuación.
<?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";