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 :
Vous pouvez par exemple créer un tableau contenant les requêtes comme ceci :
<?php
$statement['db1']['INSERT_PERSON'] = "INSERT INTO person ( surname, name, age ) VALUES ( ?, ?, ? )" ;
$statement['db2']['INSERT_PERSON'] = "INSERT INTO person SET surname=?, name=?, age=?" ;
?>
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.
Maintenant, vérifiez quels paramètres doivent être remplacés lors de l'exécution du script. Substituez ces paramètres avec les marqueurs.
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.
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.
Insertion de données dans une base de données
<?php
$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 :
executeMultiple() fonctionne de la même façon mais nécessite un tableau à deux dimensions.
Utilisation de executeMultiple() au lieu de executeQuery()
<?php
...
$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é.