8.101 Fonctions PDO
8 Référence des fonctions
Manuel PHP
. Introduction . Installation . Configuration à l'exécution . Drivers PDO . Connexions et gestionnaire de connexion . Transactions et validation automatique (auto-commit) ->Requêtes préparées et procédures stockées . Erreurs et gestionnaire des erreurs . Les objets larges (LOBs) . Classes pré-définies . Constantes pré-définies . PDO::beginTransaction . PDO::commit . PDO::__construct . PDO::errorCode . PDO::errorInfo . PDO::exec . PDO::getAttribute . PDO::getAvailableDrivers . PDO::lastInsertId . PDO::prepare . PDO::query . PDO::quote . PDO::rollBack . PDO::setAttribute . PDOStatement::bindColumn . PDOStatement::bindParam . PDOStatement::bindValue . PDOStatement::closeCursor . PDOStatement::columnCount . PDOStatement::errorCode . PDOStatement::errorInfo . PDOStatement::execute . PDOStatement::fetch . PDOStatement::fetchAll . PDOStatement::fetchColumn . PDOStatement::getAttribute . PDOStatement::getColumnMeta . PDOStatement::nextRowset . PDOStatement::rowCount . PDOStatement::setAttribute . PDOStatement::setFetchMode
|
8.101.7 Requêtes préparées et procédures stockées
La plupart des bases de données supporte le concepte des requêtes préparées.
Qu'est-ce donc ? Vous pouvez les voir comme une sorte de template compilée
pour le SQL que vous voulez exécuter, qui peut être personnalisé en utilisant
des variables en guise de paramètres. Les requêtes préparées offrent
deux fonctionnalités essentielles :
-
La requête ne doit être analysée (ou préparée) qu'une seule fois, mais peut
être exécutée plusieurs fois avec des paramètres identiques ou différents.
Lorsque la requête est préparée, la base de données va analyser, compiler
et optimiser son plan pour exécuter la requête. Pour les requêtes complexes,
ce processus peut prendre assez de temps, ce qui peut ralentir vos applications
si vous devez répéter la même requête plusieurs fois avec différents paramètres.
En utilisant les requêtes préparées, vous évitez ainsi de répéter le cycle
analyser/compilation/optimisation. Pour résumé, les requêtes préparées
utilisent moins de ressource et s'exécutent plus rapidement.
-
Les paramètres pour préparer les requêtes n'ont pas besoin d'être entre
guillemets ; le driver le gère pour vous. Si votre application utilise exclusivement
les requêtes préparées, vous pouvez être sûr qu'aucune injection SQL
n'est possible (Cependant, si vous construisez d'autres parties de la requête
en vous basant sur des entrées utilisateurs, vous continuez à prendre un risque).
Les requêtes préparées sont tellement pratiques que c'est l'unique fonctionnalité
que PDO émule pour les drivers qui ne les supportent pas. Ceci assure de pouvoir
utiliser la même technique pour accéder aux données, sans se soucier des capacités
de la base de données.
| Insertions répétitives en utilisant les requêtes préparées | |
Cet exemple effectue une requête INSERT en y substituant un
nom
et une
valeur
pour les marqueurs nommés.
|
| Insertions répétées en utilisant des requêtes réparées | |
Cet exemple effectue une requête INSERT en y substituant un
nom
et une
valeur
pour les marqueurs
?
.
|
| Récupération des données en utilisant des requêtes préparées | |
Cet exemple récupère des données basées sur la valeur d'une clé fournie
par un formulaire. L'entrée utilisateur est automatiquement échappée, il n'y a
donc aucun risque d'attaque par injection SQL.
|
Si le driver de la base de données le supporte, vous pouvez également lier
des paramètres aussi bien pour l'entrée que pour la sortie. Les paramètres de sortie
sont utilisés typiquement pour récupérer les valeurs d'une procédure stockée.
Les paramètres de sortie sont un peu plus complexe à utiliser que les paramètres d'entrée
car vous devez savoir la longueur d'un paramètre donné pourra atteindre lorsque vous
le liez. Si la valeur retournée est plus longue que la taille qui vous auriez suggéré,
une erreur sera émise.
| Appel d'une procédure stockée avec un paramètre de sortie |
<?php $stmt = $dbh->prepare("CALL sp_returns_string(?)"); $stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000);
// Appel de la procédure stockée $stmt->execute();
print "La procédure a retourné : $return_value\n"; ?>
|
Vous devez également spécifier les paramètres qui gèrent les valeurs
aussi bien pour l'entrée que pour la sortie ; la synthaxe est similaire aux
paramètres de sortie. Dans le prochain exemple, la chaîne 'Bonjour' est passée
à la procédure stockée et lorsqu'elle retourne la valeur, 'Bonjour' est remplacé
par la valeur retournée par la procédure.
| Appel d'une procédure stockée avec un paramètre d'entrée/sortie |
<?php $stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)"); $value = 'hello'; $stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000);
// appel de la procédure stockée $stmt->execute();
print "La procédure a retourné : $value\n"; ?>
|
|