Introduction - Préparer et Exécuter

Introduction - Préparer et Exécuter – Prépare et exécute des traitements SQL

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.

Passer des scalaires à la fonction execute()

<?php
// On suppose que vous avez un objet valide nommé $db
$sth $db->prepare('INSERT INTO numbers (number) VALUES (?)');
$db->execute($sth1);
$db->execute($sth8);
?>

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é.

Passer un tableau à la fonction execute()

<?php
// On suppose que vous avez un objet valide nommé $db
$sth $db->prepare('INSERT INTO numbers VALUES (?, ?, ?)');

$data = array(1'one''en');
$db->execute($sth$data);
?>

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 :

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 :

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.

Obtenir des données depuis une requête de résultats (Previous) Prépare et exécute automatiquement une requête SQL (Next)
Last updated: Sun, 29 Aug 2010 — Download Documentation
Do you think that something on this page is wrong? Please file a bug report or add a note.
View this page in:

User Notes:

There are no user contributed notes for this page.