Description
Objectif
prepareQuery()
et
executeQuery*()
vous fournissent plus de puissance et de flexibilité pour l'exécution
de vos requête. Vous pouvez les utiliser, si vous devez exécuter
plus d'une fois la même requête (i.e. ajout d'adresses dans une
base de données) ou si vous voulez supporter différentes bases
de données, qui ont une implémentation différente du
standard SQL.
Imaginons que vous voulez support deux bases de données
possédant une synthaxe différente pour l'INSERT :
db1 : INSERT INTO tbl_name ( col1, col2 ... ) VALUES ( expr1, expr2 ... )
db2 : INSERT INTO tbl_name SET col1=expr1, col2=expr2 ... |
Vous pouvez par exemple créer un tableau contenant les requêtes comme ceci :
$statement['db1']['INSERT_PERSON'] = "INSERT INTO person ( surname, name, age ) VALUES ( ?, ?, ? )" ;
$statement['db2']['INSERT_PERSON'] = "INSERT INTO person SET surname=?, name=?, age=?" ; |
Préparation
Pour utiliser les fonctionnalités ci-dessus, vous devez effectuer deux étapes.
La première est l'utilisation de la méthode
prepareQuery, la seconde est l'utilisation de
la méthode executeQuery.
Prepare()
doit être appelé
avec la requête générique au moins une fois. Il retourne un gestionnaire
pour cette requête.
La création d'une requête générique est simple. Écrivez la requête SQL,
comme d'habitude, i.e.
SELECT surname, name, age FROM person
WHERE name = 'name_to_find' AND age < 'age_limit' |
Maintenant, vérifiez quels paramètres doivent être remplacés lors
de l'exécution du script. Substituez ces paramètres avec les marqueurs.
SELECT surname, name, age FROM person WHERE name = ? AND age < ? |
Et... c'est tout ! Maintenant, vous avez une requête générique, nécessaire pour
la méthode
prepareQuery()
.
prepareQuery()
peut gérer des types différents de marqueurs ou de jokers.
? - (recommandé) place d'une valeur scalaire
comme une chaîne de caractères ou des nombres, la valeur sera
échappée, en fonction de la base de données utilisée.
|
! - place pour une valeur scalaire et sera
insérée dans la requête << tel que >>.
|
& - nécessite un nom de fichier existant,
le contenu de ce fichier sera inclu dans la requête
(i.e. pour la sauvegarde des données binaires d'un fichier graphique dans une
base de données)
|
Exécution / Exécution multiple
Après la préparation de la requête, vous pouvez exécuter la requête.
Cedci signifie que vous devez assigner les variables à la requête préparée.
Pour ce faire,
executeQuery() nécessite deux arguments,
le gestionnaire de requête de
prepareQuery()
et un tableau avec les valeurs à assigner.
Le tableau doit être numériquement ordonné. La première entrée
du tableau représente le premier joker, la seconde, le second joker, etc.
Exemple 34-1. Insertion de données dans une base de données $alldata = array( array(1, 'one', 'en'),
array(2, 'two', 'to'),
array(3, 'three', 'tre'),
array(4, 'four', 'fire'));
$sth = $dbh->prepareQuery("INSERT INTO numbers VALUES(?,?,?)");
foreach ($alldata as $row) {
$dbh->executeQuery($sth, $row);
} |
|
Dans cet exemple, la requête est exécutée quatre fois :
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') |
executeMultiple()
fonctionne de la même façon mais nécessite un tableau à
deux dimensions.
Exemple 34-2.
Utilisation de executeMultiple() au lieu de
executeQuery()
...
$alldata = array( array(1, 'one', 'en'),
array(2, 'two', 'to'),
array(3, 'three', 'tre'),
array(4, 'four', 'fire'));
$sth = $dbh->prepareQuery("INSERT INTO numbers VALUES(?,?,?)");
$dbh->executeMultiple($sth, $alldata);
} |
|
Le résultat est le même. Si un des enregistrements échoue,
les enregistrements non-terminés ne seront pas exécutés.
Si
executeQuery*()
échoue, une
MDB_Error sera émise, sinon MDB_OK sera retourné.