Introduction - Résultats

Introduction - Résultats – Obtenir des données depuis une requête de résultats

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.

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().

A chaque appel

<?php
// Une fois que vous avez un objet DB valide nommé $db
$res =& $db->query('SELECT * FROM utilisateurs');

while (
$res->fetchInto($rowDB_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";
}
?>

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.

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($rowDB_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().

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 :

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());
?>

Vérification des erreurs

N'oubliez pas d'utiliser isError() pour vérifier si vos traitements retournent ou pas un objet DB_Error.

Exécuter des requêtes (Previous) Prépare et exécute des traitements 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.