Description
Objet
prepare() et
execute*() vous donne le plus
possible de puissance et de flexibilité pour
l'exécution des requêtes. Vous pouvez les
utiliser si vous devez faire plus qu'une simple requête
d'égalité (par ex.. ajouter une liste d'adreses
à votre base de donnée) ou si vous voulez supporter
plusieurs bases de données, qui ont différentes
implantations du SQL standard.
Imaginez que vous souhaitez gérer deux différentes
bases de données avec des syntaxes différentes pour INSERT:
db1: INSERT INTO tbl_name (col1, col2) VALUES (expr1, expr2)
db2: INSERT INTO tbl_name SET col1=expr1, col2=expr2 |
Au lieu de créer un script multi-langue, vous pouvez créer
un tableau comme celui-ci:
<?php
$statement['db1']['INSERT_PERSON'] = 'INSERT INTO person
(surnom, nom, age) VALUES (?, ?, ?)';
$statement['db2']['INSERT_PERSON'] = 'INSERT INTO person
SET surnom=?, nom=?, age=?';
?>
|
Prepare
Pour utiliser la fonctionnalité précédente, vous
devez suivre deux étapes. La première est de
preparer la requête et la seconde est de
l'exécuter.
Prepare() doit être appelée avec
la requête générique au moins une fois. Il retourne
une ressource pour la requête.
Créer une requête générique est aisé.
Ecrivez la requête SQL comme d'habitude, par exemple :
SELECT surnom, nom, age
FROM personne
WHERE nom = 'name_a_trouver' AND age < 'limite_d_age' |
Maintenant vérifiez que les paramètres peuvent être
remplacée durant l'exécution du script. Substituez ces
paramètres par un marqueur.
SELECT surnom, nom, age
FROM personne
WHERE nom = ? AND age < ? |
Maintenant, passez ce traitement SQL à
prepare(), qui retourne une ressource
de traitement à utiliser lors de l'appel à
execute().
prepare() peut gérer différents
types de marqueurs ou caractères jokers.
|
? - (recommendé) est mis pour une
valeur scalaire comme les chaînes ou les nombres.
La valeur sera automatiquement échappée et quotée
en accord avec les impératifs du DBMS courant.
|
|
! - est mis pour une valeur scalaire et
sera insérée dans la requête
<< telle quelle >>.
|
|
& - nécessite un nom de fichier existant,
le contenu du fichier sera inclu dans la requête
(par exemple pour sauvegarder les données binaires d'une image
dans la base de données)
|
Utilisez un anti-slash (\) pour échapper les
caractères à remplacer si vous ne voulez pas qu'ils soient
interprétés comme des caractères remplacables :
UPDATE foo SET col=? WHERE col='over \& under' |
Execute
Après avoir préparé la requête, vous pouvez l'exécuter.
Cela signifie assigner des valeurs aux variables de
la requête préparée. Pour se faire
execute() a besoin de deux arguments, la
ressource de la requête renvoyée
prepare() et un scalaire ou un tableau
avec les valeurs à insérer.
Lorsqu'une requête préparée a de multiples
caractères à remplacer, vous devez utiliser un tableau pour
passer les différentes valeurs à la fonction
execute().
La première entrée du tableau représente le premier
caractère à remplacer, la seconde entrée au second
caractère à remplacer, etc.
L'ordre est indépendant du type des caractères à
remplacer utilisé.
| Avertissement |
La valeur passée au paramètre $data
doit être litéral. Ne soumettez pas des fonctions SQL
(par exemple, CURDATE()).
Les fonctions SQL qui doivent être exécutées au
moment de l'exécution doivent être mises dans une
requête préparée. De la même façon, les identifiants
(i.e. noms de table et de colonnes) ne peuvent pas être
utilisés car les noms seront validés durant la phase de préparation.
|
Execute multiple
DB contient un procédé pour exécuter plusieurs
requêtes en une seule fois. Donc, plutôt que de les exécuter
une après l'autre, comme cela :
Exemple 39-3.
Passer un tableau à la fonction execute()
<?php
// On suppose que vous avez un objet valide nommé $db
$alldata = array(array(1, 'one', 'en'),
array(2, 'two', 'to'),
array(3, 'three', 'tre'),
array(4, 'four', 'fire'));
$sth = $db->prepare('INSERT INTO numbers VALUES (?, ?, ?)');
foreach ($alldata as $row) {
$db->execute($sth, $row);
}
?>
|
|
qui revient à exécuter quatre requêtes :
INSERT INTO numbers VALUES ('1', 'one', 'en')
INSERT INTO numbers VALUES ('2', 'two', 'to')
INSERT INTO numbers VALUES ('3', 'three', 'tre')
INSERT INTO numbers VALUES ('4', 'four', 'fire') |
vous pouvez utiliser la fonction
executeMultiple() pour appeler explicitement
l'exécution multiple dans l'exemple précédent :
Exemple 39-4.
Utilisation de la fonction executeMultiple()
au lieu de execute()
<?php
// On suppose que vous avez un objet valide nommé $db
$alldata = array(array(1, 'one', 'en'),
array(2, 'two', 'to'),
array(3, 'three', 'tre'),
array(4, 'four', 'fire'));
$sth = $db->prepare('INSERT INTO numbers VALUES (?, ?, ?)');
$db->executeMultiple($sth, $alldata);
?>
|
|
Le résultat est le même. Si une des requêtes
échoue, les requêtes restantes ne seront pas exécutées.
execute*() a 3 retours possibles :
un nouvel objet DB_result pour les requêtes retournant des
résultats (comme les requêtes SELECT),
DB_OK pour les requêtes qui manipulent des données
(comme les requêtes INSERT) ou
un objet DB_Error en cas d'échec.