(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0)
PDOStatement::fetch — Récupère la ligne suivante d'un jeu de résultats PDO
$mode = PDO::FETCH_DEFAULT, int $cursorOrientation = PDO::FETCH_ORI_NEXT, int $cursorOffset = 0): mixed
Récupère une ligne depuis un jeu de résultats associé à une instance de
PDOStatement.
Le paramètre mode détermine la façon dont PDO retourne la ligne.
mode
Contrôle comment la prochaine ligne sera retournée à l'appelant.
Cette valeur doit être une des constantes
PDO::FETCH_*,
et par défaut, vaut la valeur de PDO::ATTR_DEFAULT_FETCH_MODE
(qui vaut par défaut la valeur de la constante PDO::FETCH_BOTH).
PDO::FETCH_ASSOC : retourne un tableau indexé par
le nom de la colonne comme retourné dans le jeu de résultats.
PDO::FETCH_NAMED : retourne un tableau de la même
forme que PDO::FETCH_ASSOC,
excepté que s'il y a plusieurs colonnes avec le même nom,
la valeur pointée par cette clé sera un tableau de toutes les valeurs
de la ligne qui portent ce nom de colonne.
PDO::FETCH_NUM : retourne un tableau indexé par le
numéro de la colonne comme retourné dans le jeu de résultats,
en commençant à la colonne 0.
PDO::FETCH_BOTH : retourne un tableau indexé
à la fois par le nom de la colonne et par son numéro, commençant à 0,
comme retournés dans le jeu de résultats.
Il s'agit en pratique d'une combinaison de
PDO::FETCH_NUM et de
PDO::FETCH_ASSOC.
PDO::FETCH_BOUND : retourne true et assigne
les valeurs des colonnes du jeu de résultats aux variables PHP auxquelles
elles sont liées avec la méthode
PDOStatement::bindColumn().
PDO::FETCH_OBJ : retourne une instance de
stdClass dont les noms de propriétés correspondent
aux noms des colonnes retournés dans le jeu de résultats.
PDO::FETCH_CLASS : retourne une nouvelle instance
de la classe demandée. À moins que la classe n'ait été définie avec
PDOStatement::setFetchMode(), ce mode doit être
combiné avec PDO::FETCH_CLASSTYPE, auquel cas
la classe à instancier est déterminée par la valeur de la
première colonne.
Par défaut, l'objet est initialisé en mappant les colonnes du jeu de
résultats aux propriétés de la classe.
Ce processus se produit avant l'appel du constructeur,
ce qui permet de peupler les propriétés indépendamment de leur visibilité
ou de leur marqueur readonly, tant que
le constructeur ne les initialise pas lui-même.
Si une propriété n'existe pas dans la classe, la méthode magique
__set()
sera invoquée si elle existe ; sinon, une propriété publique
dynamique sera créée.
Il est possible de modifier ce comportement en utilisant le drapeau
PDO::FETCH_PROPS_LATE afin d'appeler le
constructeur avant que les propriétés ne soient peuplées.
Les valeurs des colonnes ne sont pas passées en arguments
au constructeur, que PDO::FETCH_PROPS_LATE soit utilisé ou non.
Seuls les arguments donnés à
PDOStatement::setFetchMode() sont passés.
PDO::FETCH_INTO : met à jour une instance existante
de la classe demandée, en mappant les colonnes du jeu de résultats aux
propriétés nommées de la classe.
PDO::FETCH_LAZY : combine
PDO::FETCH_BOTH et
PDO::FETCH_OBJ,
et retourne un objet PDORow
qui crée les noms de propriété de l'objet au fur et à mesure de leur accès.
cursorOrientation
Pour un objet PDOStatement représentant un
curseur scrollable, cette valeur détermine quelle ligne sera retournée
à l'appelant. Cette valeur doit être une des constantes
PDO::FETCH_ORI_*,
et par défaut, vaut PDO::FETCH_ORI_NEXT.
Pour demander un curseur scrollable pour l'objet
PDOStatement,
l'attribut PDO::ATTR_CURSOR doit être défini à
PDO::CURSOR_SCROLL lorsque la requête SQL est
préparée avec la fonction PDO::prepare().
cursorOffset
Si la valeur du paramètre cursorOrientation
est PDO::FETCH_ORI_ABS, cette valeur spécifie
le numéro absolu de la ligne dans le jeu de résultats qui doit être
récupérée.
Si la valeur du paramètre cursorOrientation
est PDO::FETCH_ORI_REL, cette valeur spécifie la ligne
à récupérer relativement à la position du curseur avant l'appel à la fonction
PDOStatement::fetch().
La valeur retournée par cette fonction en cas de succès dépend du type récupéré.
Dans tous les cas, false est retourné si une erreur survient ou s'il n'y a plus de lignes.
Émet une erreur de niveau E_WARNING si l'attribut PDO::ATTR_ERRMODE est défini
à PDO::ERRMODE_WARNING.
Lève une exception PDOException si l'attribut PDO::ATTR_ERRMODE est défini
à PDO::ERRMODE_EXCEPTION.
Exemple #1 Récupération de lignes en utilisant différentes méthodes
<?php
$db = new PDO('sqlite::memory:');
$db->exec("CREATE TABLE fruit (nom VARCHAR(100), couleur VARCHAR(100))");
$db->exec("INSERT INTO fruit (nom, couleur) VALUES
('apple', 'red'),
('banana', 'yellow'),
('orange', 'orange'),
('kiwi', 'green')");
$sth = $db->prepare("SELECT nom, couleur FROM fruit");
$sth->execute();
/* styles PDOStatement::fetch */
echo "PDO::FETCH_ASSOC: ";
echo "Retourne la ligne suivante sous la forme d'un tableau indexé par le nom des colonnes\n";
$result = $sth->fetch(PDO::FETCH_ASSOC);
var_dump($result);
echo "\n";
echo "PDO::FETCH_BOTH: ";
echo "Retourne la ligne suivante sous la forme d'un tableau indexé par le nom et le numéro de la colonne\n";
$result = $sth->fetch(PDO::FETCH_BOTH);
var_dump($result);
echo "\n";
echo "PDO::FETCH_LAZY: ";
echo "Retourne la ligne suivante sous la forme d'un objet PDORow ayant les noms de colonnes comme propriétés\n";
$result = $sth->fetch(PDO::FETCH_LAZY);
var_dump($result);
echo "\n";
echo "PDO::FETCH_OBJ: ";
echo "Retourne la ligne suivante sous la forme d'un objet stdClass ayant les noms de colonnes comme propriétés\n";
$result = $sth->fetch(PDO::FETCH_OBJ);
var_dump($result);
echo "\n";
?>L'exemple ci-dessus va afficher :
PDO::FETCH_ASSOC: Retourne la ligne suivante sous la forme d'un tableau indexé par le nom des colonnes
array(2) {
["nom"]=>
string(5) "apple"
["couleur"]=>
string(3) "red"
}
PDO::FETCH_BOTH: Retourne la ligne suivante sous la forme d'un tableau indexé par le nom et le numéro de la colonne
array(4) {
["nom"]=>
string(6) "banana"
[0]=>
string(6) "banana"
["couleur"]=>
string(6) "yellow"
[1]=>
string(6) "yellow"
}
PDO::FETCH_LAZY: Retourne la ligne suivante sous la forme d'un objet PDORow ayant les noms de colonnes comme propriétés
object(PDORow)#3 (3) {
["queryString"]=>
string(30) "SELECT nom, couleur FROM fruit"
["nom"]=>
string(6) "orange"
["couleur"]=>
string(6) "orange"
}
PDO::FETCH_OBJ: Retourne la ligne suivante sous la forme d'un objet stdClass ayant les noms de colonnes comme propriétés
object(stdClass)#4 (2) {
["nom"]=>
string(4) "kiwi"
["couleur"]=>
string(5) "green"
}
Exemple #2 Récupération des lignes avec un curseur scrollable
<?php
function readDataForwards($dbh) {
$sql = 'SELECT hand, won, bet FROM mynumbers ORDER BY BET';
$stmt = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
$stmt->execute();
while ($row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT)) {
$data = $row[0] . "\t" . $row[1] . "\t" . $row[2] . "\n";
print $data;
}
}
function readDataBackwards($dbh) {
$sql = 'SELECT hand, won, bet FROM mynumbers ORDER BY bet';
$stmt = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL));
$stmt->execute();
$row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_LAST);
do {
$data = $row[0] . "\t" . $row[1] . "\t" . $row[2] . "\n";
print $data;
} while ($row = $stmt->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_PRIOR));
}
print "Lecture en avant :\n";
readDataForwards($conn);
print "Lecture en arrière :\n";
readDataBackwards($conn);
?>L'exemple ci-dessus va afficher :
Lecture en avant : 21 10 5 16 0 5 19 20 10 Lecture en arrière : 19 20 10 16 0 5 21 10 5
Exemple #3 Ordre de construction
Lorsque des objets sont récupérés via PDO::FETCH_CLASS,
les propriétés de l'objet sont assignées en premier, puis le constructeur
de la classe est appelé. Cependant, lorsque PDO::FETCH_PROPS_LATE est également spécifié,
cet ordre est inversé, c'est-à-dire que le constructeur est d'abord appelé, puis
les propriétés sont assignées.
<?php
class Person
{
private $name;
public function __construct()
{
$this->tell();
}
public function tell()
{
if (isset($this->name)) {
echo "Je suis {$this->name}.\n";
} else {
echo "Je n'ai pas encore de nom.\n";
}
}
}
$sth = $dbh->query("SELECT * FROM people");
$sth->setFetchMode(PDO::FETCH_CLASS, 'Person');
$person = $sth->fetch();
$person->tell();
$sth->setFetchMode(PDO::FETCH_CLASS|PDO::FETCH_PROPS_LATE, 'Person');
$person = $sth->fetch();
$person->tell();
?>Résultat de l'exemple ci-dessus est similaire à :
Je suis Alice. Je suis Alice. Je n'ai pas encore de nom. Je suis Bob.