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 |
$statement['db1']['INSERT_PERSON'] = 'INSERT INTO person (surnom, nom, age) VALUES (?, ?, ?)'; $statement['db2']['INSERT_PERSON'] = 'INSERT INTO person SET surnom=?, nom=?, age=?'; |
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' |
SELECT surnom, nom, age FROM personne WHERE nom = ? AND age < ? |
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' |
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.
Exemple 34-1. Passer des scalaires à la fonction execute()
|
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é.
Exemple 34-2. Passer un tableau à la fonction execute()
|
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. |
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 34-3. Passer un tableau à la fonction execute()
|
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') |
Exemple 34-4. Utilisation de la fonction executeMultiple() au lieu de execute()
|
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.
Précédent | Sommaire | Suivant |
Introduction - Résultats | Niveau supérieur | Introduction - autoPrepare et autoExecute |