Description
Fonction fetch
L'objet DB_result fournit deux fonctions
pour traiter les rangées :
fetchRow() et
fetchInto().
fetchRow()retourne la rangée.
fetchInto()
a besoin d'une variable, à qui on assignerapar
référence le contenu de la rangée
du résultat et retournera
DB_OK.
Le pointeur de résultats se déplacera à
la ligne suivante à chaque
appel de cette méthode. NULL est retourné
lorsqu'il n'y a plus de résultat.
DB_Error est retourné si une erreur survient.
Exemple 33-1. Traiter les données d'un résultat <?php
// Créer un objet DB valide nommé $db
// au début de votre script...
require_once 'DB.php';
$db =& DB::connect('pgsql://usr:pw@localhost/dbnam');
if (PEAR::isError($db)) {
die($db->getMessage());
}
// Commencer par récupérer quelques données...
$res =& $db->query('SELECT * FROM mytable');
// Récupérer chaque ligne de données
// à chaque itération tant
// qu'il y a des lignes de disponible
while ($res->fetchInto($row)) {
// En supposant que le mode par défaut de DB est DB_FETCHMODE_ORDERED
echo $row[0] . "\n";
}
// Vous pouvez réaliser la même chose en utilisant fetchRow()
// while ($row =& $res->fetchRow()) {
// // En supposant que le mode par défaut de
// // DB est DB_FETCHMODE_ORDERED
// echo $row[0] . "\n";
// }
?> |
|
Sélectionner le format de la rangée traitée
Les données d'une ligne issu du résultat d'une requête
peuvent être placées
dans l'un de ces trois constructeurs :
un tableau trié
(avec les numéros des colonnes comme clés),
un tableau associatif (avec les noms des colonnes comme clés) ou
un objet (avec les noms des colonnes comme propriétés).
DB_FETCHMODE_ORDERED (défaut)
Array
(
[0] => 28
[1] => hi
) |
DB_FETCHMODE_ASSOC
Array
(
[a] => 28
[b] => hi
) |
DB_FETCHMODE_OBJECT
stdClass Object
(
[a] => 28
[b] => hi
) |
NOTE :
Lorsqu'une requête contient plus d'une colonne du même nom
(comme lorsque vous faîtes une jointure entre plusieurs tables
qui possèdent des noms de colonnes portant le même nom)
et que le mode est
DB_FETCHMODE_ASSOC ou
DB_FETCHMODE_OBJECT,
les données de la dernière colonne portant le même
nom seront les seules retournées.
Il y a deux options pour contourner ce problème :
|
Utilisez des alias dans votre requêtes, par exemple
People.Name AS PersonName
|
|
Changez le mode en DB_FETCHMODE_ORDERED
|
ASTUCE : Si vous êtes dans ce cas, c'est que votre schéma de
base de données n'est pas bien pensé.
Soit les données sont inutilement dupliquées, soit le
même nom est utilisé
pour des données différentes.
Comment définir le format de la rangée traitée
Vous pouvez définir le mode de récupération des
données à chaque appel à la méthode
et/ou vous pouvez définir le mode par défaut pour
l'ensemble de l'instance DB en utilisant la méthode
setFetchMode().
Exemple 33-2. A chaque appel <?php
// Une fois que vous avez un objet DB valide nommé $db
$res =& $db->query('SELECT * FROM utilisateurs');
while ($res->fetchInto($row, DB_FETCHMODE_ASSOC)) {
echo $row['id'] . "\n";
}
?> |
|
Exemple 33-3. Pour toute l'instance <?php
// Une fois que vous avez un objet DB valide nomé $db
$db->setFetchMode(DB_FETCHMODE_ASSOC);
$res =& $db->query('SELECT * FROM utilisateurs');
while ($res->fetchInto($row)) {
echo $row['id'] . "\n";
}
?> |
|
Récupérer les résultats par numéro
Le système de traitement de PEAR DB supporte également un
paramètre supplémentaire à la fonction de traitement.
Vous pouvez ainsi récupérer
les résultats par numéro.
C'est particulièrelent pratique si vous souhaitez montrer l'ensemble
du résultat
(par exemple pour construire des listes HTML sur plusieurs pages)
ou pour traiter les rangées dans un ordre spécial, etc.
Exemple 33-4. Traiter par nombre <?php
// Une fois que vous avez un objet DB valide nommé $db
// l'enregistrement à partir duquel le traitement commence
$from = 50;
// nombre de résultats par page
$resPage = 10;
// le dernier enregistrement à traiter sur cette page
$to = $from + $resPage;
foreach (range($from, $to) as $rowNum) {
if (!$res->fetchInto($row, DB_FETCHMODE_ORDERED, $rowNum)) {
break;
}
echo $row[0] . "\n";
}
?> |
|
Récupération de la totalité du jeu de résultats
L'objet DB_common fournit plusieurs méthodes pour
récupérer les données facilement en combinant ce que
vous avez défini comme mode pour le traitement de vos requêtes,
en mettant les données retournées dans une structure de
données PHP et en libérant de la mémoire les
résultats.
Ces méthodes incluent
getOne(),
getRow(),
getCol(),
getAssoc() et
getAll().
Libérer le résultat
Une fois que vous avez terminé d'utiliser le jeu de résultats,
si votre script continue son exécution, cela peut être une
bonne idée de libérer la mémoire allouée
à ce jeu de résultats en utilisant la fonction
free().
Exemple 33-5. Libération <?php
// Une fois que vous avez un objet DB valide nommé $db
$res =& $db->query('SELECT nom, adresse FROM clients');
while ($res->fetchInto($row)) {
echo $row['nom'] . ', ' . $row['adresse'] . "\n";
}
$res->free();
?> |
|
Obtenir plus d'informations du résultat d'une requête
Avec DB, il y a quatre manières de récupérer
des informations intéressantes des jeux de résultats :
Vérification des erreurs
N'oubliez pas d'utiliser
isError()
pour vérifier si vos traitements retournent
ou pas un objet DB_Error.