Quatre fonctions permettent de récupèrer le ou les enregistrements (ou tuples) retournés par une requête SELECT. Toutes ces fonctions travaillent de la même façon : elles renvoient un par un les enregistrements sélectionnés par la requête, puis NULL quand il n'y a plus rien.

Ce qui différencie ces fonctions c'est la forme sous laquelle les enregistrements sont renvoyés :

- mysqli_fetch_assoc() renvoie l'enregistrement sous la forme d'un tableau associatif : les clés du tableau sont les noms des champs des tables. Nous pouvons donc atteindre les valeurs par $enr['auNom'], $enr['auPrenom'], etc.
- mysqli_fetch_row() renvoie l'enregistrement sous la forme d'un tableau à indices numériques. Les champs sont indicés suivant l'ordre dans lequel ils apparaissent dans le SELECT. Nous pouvons atteindre les valeurs par $enr[0], $enr[1], etc.
- mysqli_fetch_array() renvoie, par défaut,l'enregistrement sous la forme d'un tableau associatif ET à indices numériques. Nous pouvons donc atteindre les valeurs par $enr['auNom'] ou par $enr[0]. N'utilisez jamais cette fonction sans lui transmettre de paramètre ou en lui transmettant la constante MYSQLI_BOTH, car dans ces cas-là elle consomme le double de mémoire que les autres.
- mysqli_fetch_object() renvoie l'enregistrement sous la forme d'un objet. Les champs deviennent des propriétés d'objet et on accède aux valeurs avec la syntaxe $objet->propriété, par exemple $enr->auNom.

mysqli_fetch_assoc() est la fonction à privilégier car :

- les champs sont facilement identifiables comme clé d'un tableau associatif,
- l'ordre des champs dans le SELECT n'a aucune influence sur les indices (contrairement à mysqli_fetch_row()) et les modifications en sont extrêmement simplifiées
- aucun gaspillage de ressources comme avec mysqli_fetch_array().

Exemples ...

Exemple : sélection simple
<?php ob_start(); require('bib_params.php'); require('bib_fonctions.php'); htmlDebut('Sélection simple : 1 livre'); $bd = bdConnecter(); //-- Requête ---------------------------------------- $sql = 'SELECT * FROM livres WHERE liID = 3'; $r = mysqli_query($bd, $sql) or bdErreur($bd, $sql); //-- Traitement ------------------------------------- $enr = mysqli_fetch_assoc($r); // Libération de la mémoire associée au résultat de la requête mysqli_free_result($r); infoTableau($enr); //-- Déconnexion ------------------------------------ mysqli_close($bd); htmlFin(); ?>
Exemple : sélection simple
<?php ob_start(); require('bib_params.php'); require('bib_fonctions.php'); htmlDebut('Sélection simple : 1 auteur'); $bd = bdConnecter(); //-- Requête ---------------------------------------- $sql = 'SELECT * FROM auteurs WHERE auID = 5'; $r = mysqli_query($bd, $sql) or bdErreur($bd, $sql); //-- Traitement ------------------------------------- $enr = mysqli_fetch_row($r); // Libération de la mémoire associée au résultat de la requête mysqli_free_result($r); infoTableau($enr); //-- Déconnexion ------------------------------------ mysqli_close($bd); htmlFin(); ?>
Exemple : sélection simple
<?php ob_start(); require('bib_params.php'); require('bib_fonctions.php'); htmlDebut('Sélection simple : 1 éditeur'); $bd = bdConnecter(); //-- Requête ---------------------------------------- $sql = 'SELECT * FROM editeurs WHERE edID = 2'; $r = mysqli_query($bd, $sql) or bdErreur($bd, $sql); //-- Traitement ------------------------------------- $enr = mysqli_fetch_object($r); // Libération de la mémoire associée au résultat de la requête mysqli_free_result($r); echo $enr->edID, '<br>', $enr->edNom, '<br>', $enr->edWeb; //-- Déconnexion ------------------------------------ mysqli_close($bd); htmlFin(); ?>

On ne teste pas les erreurs sur les fonctions mysqli_fetch_assoc(), mysqli_fetch_row(), mysqli_fetch_array() ou mysqli_fetch_object(). Les erreurs importantes pouvant survenir sont dans la requête SQL et interviennent donc dans la fonction mysqli_query().

Si une requête de sélection ne renvoie pas d'enregistrement (ie ne sélectionne rien), les fonctions renverront la valeur NULL.

Le test de "sélection vide" peut être fait comme dans l'exemple suivant.

Exemple : sélection ne renvoyant pas d'enregistrement
<?php ob_start(); require('bib_params.php'); require('bib_fonctions.php'); htmlDebut('Sélection ne renvoyant pas d\'enregistrement'); $bd = bdConnecter(); //-- Requête ---------------------------------------- $sql = 'SELECT * FROM livres WHERE liID = 12345'; $r = mysqli_query($bd, $sql) or bdErreur($bd, $sql); //-- Traitement ------------------------------------- $enr = mysqli_fetch_assoc($r); // Libération de la mémoire associée au résultat de la requête mysqli_free_result($r); if ($enr === NULL) { echo 'Aucun enregistrement sélectionné.'; } else { infoTableau($enr); } //-- Déconnexion ------------------------------------ mysqli_close($bd); htmlFin(); ?>

Le code

    $enr = mysqli_fetch_assoc($r);

    if ($enr === NULL) {
    	echo 'Aucun enregistrement sélectionné.';
    } else {
    	infoTableau($enr);
    }

peut aussi être écrit :

    if ($enr = mysqli_fetch_assoc($r)) {
    	infoTableau($enr);
    } else {
    	echo 'Aucun enregistrement sélectionné.';
    }

if ($enr = mysqli_fetch_assoc($r)) { est un "raccourci" souvent utilisé avec PHP :

- la fonction mysqli_fetch_assoc() est exécutée
- son résultat est affecté à la variable $enr
- si la valeur de $enr est évaluée comme TRUE le bloc if est exécuté,
- sinon le bloc else est exécuté.

Nous profitons ici du transtypage automatique fait par PHP qui évalue un tableau non vide comme TRUE, et qui évalue NULL comme FALSE.

Pour connaitre le nombre d'enregistrements sélectionnés par une requête de sélection nous pouvons utiliser la fonction mysqli_num_rows(), comme illustré dans l'exemple suivant.

Exemple : sélection ne renvoyant pas d'enregistrement
<?php ob_start(); require('bib_params.php'); require('bib_fonctions.php'); htmlDebut('Sélection ne renvoyant pas d\'enregistrement'); $bd = bdConnecter(); //-- Requête ---------------------------------------- $sql = 'SELECT * FROM livres WHERE liID = 12345'; $r = mysqli_query($bd, $sql) or bdErreur($bd, $sql); //-- Traitement ------------------------------------- if (mysqli_num_rows($r) == 0) { echo 'Aucun enregistrement sélectionné.'; } else { $enr = mysqli_fetch_assoc($r); infoTableau($enr); } // Libération de la mémoire associée au résultat de la requête mysqli_free_result($r); //-- Déconnexion ------------------------------------ mysqli_close($bd); htmlFin(); ?>