Formation PUB010 : PHP, 2022 Travailler avec les données

13.6 Lire les résultats de la requête MySQL


***** CETTE PAGE EST IMPORTANTE. PLACEZ-LA DANS VOS FAVORIS *****

Dans cette fiche :

Le résultat d'une requête lancée avec $mysqli->query() est un objet qui donne accès, entre autres, à un tableau à deux dimensions.

Chaque ligne du tableau représente un enregistrement qui répond à la requête et chaque colonne du tableau représente un champ.

Selon les données que vous avez entrées dans la table clients, le résultat de la requête pour trouver les clients de Victoriaville pourrait être le suivant :

1 Jacynthe Courtois
4 Axelle Demers
2 Marc Frenette
8 Line Jacques

Afin de pouvoir utiliser le résultat de la requête, il faut extraire les lignes du tableau à l'aide de fetch_row() ou fetch_assoc().

Chaque enregistrement sera un tableau à une dimension (vecteur) et chaque champ correspondra à un élément du tableau.

▼Publicité Le texte se poursuit plus bas

Exemple avec fetch_row()

Si vous utilisez fetch_row(), vous devrez utiliser un indice pour obtenir le champ désiré. Le premier champ mentionné dans la requête sera $enreg[0], le second champ sera $enreg[1], etc.

PHP < 8

Votre programme devra utiliser la structure de code suivante :

Syntaxe PHP

$requete = "...";
$resultat = $mysqli->query($requete);     // exécute la requête
 
if ($resultat) {    // si la requête a fonctionné
    if ($mysqli->affected_rows > 0) {    // si la requête a retourné au moins un enregistrement
        // balises devant être affichées avant l'ensemble des enregistrements
        echo ...

        // boucle pour chacun des enregistrements
        while ($enreg = $resultat->fetch_row()) {     // extrait chaque ligne une à une
            echo ...
        }

        // balises devant être affichées après l'ensemble des enregistrements
        echo ...
    }
    else {
        echo "<p class='message-avertissement'>...</p>";
    }
 
    $resultat->free();   // libère immédiatement la mémoire qui était allouée - seulement utile pour une requête SELECT
 
}
else {
    echo "<p class='message-erreur'>...</p>";
    echo_debug($mysqli->error);   // cette instruction sera expliquée dans une fiche plus loin
}

Ex :

PHP

$requete = "SELECT prenom, nomfamille FROM clients ORDER BY nomfamille, prenom";
$resultat = $mysqli->query($requete);     // exécute la requête
 
if ($resultat) {    // si la requête a fonctionné
    if ($mysqli->affected_rows > 0) {    // si la requête a retourné au moins un enregistrement
        echo "<ul>";

        while ($enreg = $resultat->fetch_row()) {     // extrait chaque ligne une à une
            echo "<li>$enreg[0] $enreg[1]</li>"; 
        }

        echo "</ul>";
    } 
    else {
        echo "<p class='message-avertissement'>Il n'y a aucun client dans le système.</p>";
    }
 
    $resultat->free();   // libère immédiatement la mémoire qui était allouée
 
}
else {
    echo "<p class='message-erreur'>Nous sommes désolés, les clients ne peuvent pas être affichés.</p>";
    echo_debug($mysqli->error);   // cette instruction sera expliquée dans une fiche plus loin
}

Pour mieux décoder ce qui vient de se passer, rappelez-vous que :

  • Chaque itération de la boucle place une ligne du tableau dans le vecteur $enreg
  • Le premier champ de la requête étant le prénom, nous pouvons retrouver cette information en utilisant $enreg[0]
  • Le second champ étant le nom de famille, on utilisera $enreg[1] pour le retrouver.
  • etc.

PHP 8 et plus

Votre programme devra utiliser la structure de code suivante :

Syntaxe PHP

$requete = "...";

try {
    $resultat = $mysqli->query($requete);     // exécute la requête
 
    if ($mysqli->affected_rows > 0) {    // si la requête a retourné au moins un enregistrement
        // balises devant être affichées avant l'ensemble des enregistrements
        echo ...

        // boucle pour chacun des enregistrements
        while ($enreg = $resultat->fetch_row()) {     // extrait chaque ligne une à une
            echo ...
        }

        // balises devant être affichées après l'ensemble des enregistrements
        echo ...
    }
    else {
        echo "<p class='message-avertissement'>...</p>";
    }
 
    $resultat->free();   // libère immédiatement la mémoire qui était allouée - seulement utile pour une requête SELECT
 
} catch (Exception $e) {
    echo "<p class='message-erreur'>...</p>";
    echo_debug($mysqli->error);   // cette instruction sera expliquée dans une fiche plus loin
}

Ex :

PHP

$requete = "SELECT prenom, nomfamille FROM clients ORDER BY nomfamille, prenom";

try {
    $resultat = $mysqli->query($requete);     // exécute la requête
 
    if ($mysqli->affected_rows > 0) {    // si la requête a retourné au moins un enregistrement
        echo "<ul>";

        while ($enreg = $resultat->fetch_row()) {     // extrait chaque ligne une à une
            echo "<li>$enreg[0] $enreg[1]</li>"; 
        }

        echo "</ul>";
    } 
    else {
        echo "<p class='message-avertissement'>Il n'y a aucun client dans le système.</p>";
    }
 
    $resultat->free();   // libère immédiatement la mémoire qui était allouée
 
} catch (Exception $e) {
    echo "<p class='message-erreur'>Nous sommes désolés, les clients ne peuvent pas être affichés.</p>";
    echo_debug($mysqli->error);   // cette instruction sera expliquée dans une fiche plus loin
}

Pour mieux décoder ce qui vient de se passer, rappelez-vous que :

  • Chaque itération de la boucle place une ligne du tableau dans le vecteur $enreg
  • Le premier champ de la requête étant le prénom, nous pouvons retrouver cette information en utilisant $enreg[0].
  • Le second champ étant le nom de famille, on utilisera $enreg[1] pour le retrouver.
  • etc.

Exemple avec fetch_assoc()

Si vous préférez travailler avec le nom des champs plutôt qu'un indice qui représente leur position dans la requête, fetch_assoc() sera votre ami.

Voici un second exemple qui utiise cette fois fetch_assoc().

Je vous présente seulement le corps de la boucle puisque le reste du code sera identique à celui de fetch_row().

Remarquez les accolades pour forcer l'interprétation de « $enreg['prenom'] » avant de l'inclure dans la chaîne de caractères.

PHP

while ($enreg = $resultat->fetch_assoc()) {
    echo "<li>{$enreg['prenom']} {$enreg['nomfamille']}</li>";  
}

Requête d'insertion, de suppression ou de modification des données

Lorsqu'une requête INSERT, DELETE ou UPDATE est lancée, il n'y aura pas de données à lire. Il faut cependant s'assurer que la requête ait été effectuée avec succès.

Comme ces requêtes ont à peu près toujours besoin de variables (pour les données à insérer ou pour l'identifiant de l'enregistrement à supprimer), une démonstration sera faite plus loin dans le chapitre sur les requêtes préparées.

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Par Christiane Lagacé
Dernière révision le 29 février 2024
Merci de partager !

Site fièrement hébergé chez A2 Hosting.

Soumettre