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.
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";
// }
?>
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 :
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.
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().
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";
}
?>
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";
}
?>
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.
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";
}
?>
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().
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().
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();
?>
Avec DB, il y a quatre manières de récupérer des informations intéressantes des jeux de résultats :
numRows() retourne le nombre de lignes disponibles dans le jeu de résultats issu d'une requête SELECT
<?php
// Une fois que vous avez un objet DB valide nommé $db
$res =& $db->query('SELECT * FROM phptest');
echo $res->numRows();
?>
numCols()retourne le nombre de colonnes disponibles dans le jeu de résultats issu d'une requêteSELECT
<?php
// Une fois que vous avez un objet DB valide nommé $db
$res =& $db->query('SELECT * FROM phptest');
echo $res->numCols();
?>
affectedRows() retourne le nombres de lignes affectées par une requête du type INSERT, UPDATE ou DELETE
<?php
// Souvenez-vous que cette requête
// ne retourne pas d'objet de résultats
$db->query('DELETE * FROM clients');
echo 'I have deleted ' . $db->affectedRows() . ' clients';
?>
tableInfo() retourne un tableau associatif contenant des informations sur les colonnes issues d'un résultat de requête du type SELECT
<?php
// Une fois que vous avez un objet DB valide nommé $db
$res =& $db->query('SELECT * FROM phptest');
// Syntaxe valide pour DB < 1.6.0
print_r($db->tableInfo($res));
// Syntaxe valide pour DB => 1.6.0
print_r($res->tableInfo());
?>