Zend_Db_Statement
En plus des méthodes telles que fetchAll() et insert()
documentée dans , vous pouvez utiliser un objet statement
pour l'analyser de manière plus complète et récupérer vos résultats. Cette section décrit la
marche à suivre pour obtenir un statement et utiliser ses méthodes propres.
Zend_Db_Statement est basé sur l'objet PDOStatement dans l'extension PHP PHP Data Objects (PDO).
Créer un statement
Cet objet est typiquement retourné par la méthode query() de votre
objet adaptateur de base de données. Cette méthode prépare un statement SQL : le premier
argument est une chaîne représentant la requête préparée, le second, un tableau de
paramètres liés.
Création d'un objet statement avec query()
query($sql, array('goofy', 'FIXED'));
]]>
L'objet statement représente un statement SQL qui a été préparé, et exécuté une
fois avec les paramètres de liaison ("bind") spécifiés. S'il s'agissait d'une requête
SELECT par exemple, alors les résultats sont prêts à être récupérés.
Vous pouvez créer un statement avec son constructeur, mais c'est assez peu usuel.
Passez alors l'objet adaptateur en premier argument, et la chaîne représentant la
requête en second. Un fois construit, le statement est préparé automatiquement, mais pas
exécuté.
Utilisation du constructeur de statement
Exécuter un statement
Vous aurez besoin d'exécuter un statement si vous l'avez crée explicitement avec
son constructeur. Utilisez sa méthode execute() pour ceci. Le seul argument
que cette méthode accepte est le tableau de "binds" (paramètres préparés).
Si vous utilisez les paramètres positionnés, ceux utilisés
avec le point d'interrogation (?), passez simplement les valeurs dans le
tableau.
Exécuter un statement avec des paramètres positionnés
execute(array('goofy', 'FIXED'));
]]>
Si vous utilisez les paramètres nommés, ceux définis avec un
identifiant chaîne de caractère précédée d'un (:), passez les valeurs liées
sous forme de tableau associatif.
Exécution d'un statement avec paramètres nommés
execute(array(':reporter' => 'goofy', ':status' => 'FIXED'));
]]>
Les statements PDO acceptent les paramètres positionnés, ou nommés, mais pas les
deux types en même temps. Certaines classes Zend_Db_Statement pour les extensions non
PDO peuvent ne supporter qu'un seul de ces types.
Récupérer des résultats depuis un statement SELECT
Vous disposez de méthodes sur l'objet statement lorsque celui-ci a été exécuté sur
une requête SQL de type SELECT, SHOW, DESCRIBE ou EXPLAIN (qui produisent des
résultats). Aussi, INSERT, UPDATE et DELETE sont des exemples de requêtes ne produisant
pas de résultats. Vous pouvez donc les exécuter avec Zend_Db_Statement, mais vous ne
pourrez pas appeler les méthodes de récupération de résultats.
Récupérer un enregistrement unique depuis un statement
La méthode fetch() permet de ne récupérer qu'un seul résultat
dans le statement précédemment exécuté. Trois paramètres sont disponibles pour cette
méthode, tous optionnels :
Fetch style en premier, permet de spécifier le
mode de capture du résultat. C'est la structure dans laquelle celui-ci vous
sera retourné. Voyez
pour une description des valeurs valides et de la forme des résultats alors
renvoyés.
Cursor orientation est le second paramètre. Par
défaut il vaut Zend_Db::FETCH_ORI_NEXT, ce qui
signifie que chaque appel futur à fetch() retourne
l'enregistrement suivant.
Offset, en troisième paramètre. Si le paramètre
"cursor orientation" est réglé sur
Zend_Db::FETCH_ORI_ABS, alors le numéro d'offset est
le numéro du résultat à retourner, dans le statement. Si c'est
Zend_Db::FETCH_ORI_REL, le numéro d'offset est
relatif à la position du curseur avant l'appel à
fetch().
fetch() retourne FALSE si il n'y a plus de résultats
restants dans le statement.
Utiliser fetch() dans une boucle
query('SELECT * FROM bugs');
while ($row = $stmt->fetch()) {
echo $row['bug_description'];
}
]]>
Voyez aussi PDOStatement::fetch().
Récupérer un jeu de résultat complet
Pour récupérer tous les résultats d'un statement, utilisez
fetchAll(). Ceci est équivalent à appeler fetch() dans un
boucle et retourner tous les résultats dans un tableau. La méthode
fetchAll() accepte deux paramètres. Le premier est le mode de capture
(fetch style), le deuxième est le numéro de la colonne à retourner, si
Zend_Db::FETCH_COLUMN est utilisé.
Utilisation de fetchAll()
query('SELECT * FROM bugs');
$rows = $stmt->fetchAll();
echo $rows[0]['bug_description'];
]]>
Voyez aussi PDOStatement::fetchAll().
Changer le mode de capture (Fetch Mode)
Par défaut l'objet statement retourne les colonnes du jeu de résultat en tant
que tableau associatif, en faisant correspondre les noms des colonne et leur valeur.
Vous pouvez cependant spécifier un format différent, comme il est possible de faire
avec la classe de l'adaptateur. La méthode setFetchMode() permet ceci.
Indiquez un mode de capture en utilisant les constantes de la classe Zend_Db :
FETCH_ASSOC, FETCH_NUM, FETCH_BOTH, FETCH_COLUMN, et FETCH_OBJ. Voyez pour plus d'informations sur ces
modes de capture. Les appels suivants à fetch() ou
fetchAll() utiliseront le mode spécifié auparavant.
Paramétrer le mode de capture (fetch mode)
query('SELECT * FROM bugs');
$stmt->setFetchMode(Zend_Db::FETCH_NUM);
$rows = $stmt->fetchAll();
echo $rows[0][0];
]]>
Voyez aussi PDOStatement::setFetchMode().
Récupérer une colonne simple depuis un statement exécuté
Pour retourner une colonne de résultat depuis un statement, utilisez la
méthode fetchColumn(). Le paramètre optionnel est un entier
représentant l'index de la colonne désirée, par défaut zéro. Cette méthode retourne
un type scalaire, ou FALSE s'il n'y a plus de résultats dans le
statement.
Notez que cette méthode se comporte différemment de fetchCol() de
l'adaptateur. La méthode fetchColumn() du statement retourne une seule
valeur d'un seul résultat. fetchCol() de l'adaptateur retourne un
tableau de valeurs issues de la première colonne du jeu résultat.
Utiliser fetchColumn()
query($sql);
$bug_status = $stmt->fetchColumn(2);
]]>
Voyez aussi PDOStatement::fetchColumn().
Récupérer un résultat (Row) sous forme d'objet
Pour récupérer une ligne de résultat en tant qu'objet, depuis un statement
exécuté, utilisez la méthode fetchObject(). Celle-ci prend deux
paramètres optionnels. Le premier est une chaîne indiquant le nom de la classe que
l'on souhaite se voir retourner, par défaut il s'agit de "stdClass". Le
deuxième paramètre est un tableau de paramètres qui sera passé au constructeur de
cette classe.
Utiliser fetchObject()
query($sql);
$obj = $stmt->fetchObject();
echo $obj->bug_description;
]]>
Voyez aussi PDOStatement::fetchObject().