J'écris des routines DB et j'utilise des instructions préparées. Mon environnement est PDO avec PHP5. Je comprends que les instructions préparées fournissent principalement un avantage en termes de performances, ainsi que certains bonus auxiliaires, tels que l'absence de données d'entrée d'échappement SQL manuelles.Comment fonctionnent les instructions préparées?
Ma question concerne la partie performance.
J'ai deux implémentations d'une fonction getPrice ci-dessous qui prend un identifiant de produit et retourne son prix. GetPrice_A réutilise le même objet PDOStatement à travers les appels suivants au cours de la même exécution de script.
Est-ce nécessaire ou recommandé? Si oui, y a-t-il un moyen d'éviter de dupliquer ce code supplémentaire sur chaque get *() dans chaque modèle? GetPrice_B crée un nouvel objet PDOStatement à chaque appel.
Le SGBD reconnaîtra-t-il que cette déclaration a déjà été préparée et qu'il sera encore possible d'ignorer certains travaux? En d'autres termes, cette mise en œuvre tire-t-elle profit des avantages de performance des états préparés? Après avoir écrit tout cela et lu, j'imagine que getPrice_B est bien et getPrice_A offre un avantage négligeable en plus de cela, ce qui peut ou peut ne pas valoir la complication supplémentaire.
Je voudrais toujours entendre à coup sûr de quelqu'un plus bien informé cependant. Supposons que $pdo
est un objet PDO connecté et valide dans les exemples ci-dessous.
<?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";