Position actuelle: Accueil> Derniers articles> Les appels mysqli_result fetch_ * sont plusieurs fois que l'ensemble de résultats est "mangé"? Que se passe-t-il

Les appels mysqli_result fetch_ * sont plusieurs fois que l'ensemble de résultats est "mangé"? Que se passe-t-il

M66 2025-05-18

Lors du développement à l'aide de la base de données MySQL, MySQLI_RESULT est une classe couramment utilisée qui fournit l'encapsulation des résultats de la requête, permettant aux développeurs d'extraire des données dans le résultat défini par une série de méthodes Fetch_ * . Cependant, de nombreux développeurs rencontrent un problème lors de l'utilisation de ces méthodes: après plusieurs appels vers la méthode Fetch_ * , les résultats de la requête semblent "disparaître" et ne sont pas accessibles. Que se passe-t-il? Jetons un look plus profond.

1. Le concept de base de Mysqli_result

Une fois la requête MySQL exécutée, l'ensemble de résultats renvoyé est encapsulé dans un objet MySQLI_RESULT . Dans PHP, nous pouvons lire les données ligne par ligne en appelant différentes méthodes Fetch_ * , telles que:

  • fetch_assoc () : Renvoie la ligne de résultat dans un tableau associatif.

  • fetch_row () : renvoie la ligne de résultat dans le chemin de l'indexation du tableau.

  • fetch_object () : renvoie la ligne de résultat en tant qu'objet.

Par exemple:

 $conn = new mysqli("localhost", "user", "password", "database");
$query = "SELECT * FROM users";
$result = $conn->query($query);

À l'heure actuelle, l'objet $ résultat est un mysqli_result , qui peut être utilisé pour appeler la méthode Fetch_ * ci-dessus.

2. Pourquoi plusieurs appels pour récupérer_ * font-ils «disparaître les résultats»?

Lorsque l'objet mysqli_result appelle la méthode fetch_ * , il lit en fait la ligne de données par ligne. Lorsque vous appelez la méthode Fetch_ * , le pointeur vers le jeu de résultats va de l'avant. Cela signifie que chaque fois que la récupération du temps est appelée, une ligne de données est consommée et que la position du pointeur est mise à jour. Si vous appelez la méthode Fetch_ * plusieurs fois, il lira la ligne par ligne jusqu'à ce qu'il n'y ait plus de données à lire.

Par exemple:

 while ($row = $result->fetch_assoc()) {
    // Traitement des données
}

while ($row = $result->fetch_assoc()) {
    // Aucune donnée n'est obtenue ici,Parce que la requête précédente a complètement consommé l'ensemble de résultats
}

Comme indiqué ci-dessus, le premier while Loop lit toutes les données et consomme l'intégralité de l'ensemble de résultats. Lorsque la deuxième boucle tandis que Loop essaie d'obtenir les données, l'ensemble de résultats a été "mangé" et ne peut donc pas obtenir les données.

3. Comment éviter cette situation?

Pour éviter cela, nous pouvons prendre les méthodes suivantes:

3.1 Utilisez la méthode MySQLI_DATA_SEEK ()

Si vous avez besoin de ré-transmettre l'ensemble de résultats, vous pouvez utiliser la méthode mysqli_data_seek () pour réinitialiser le pointeur de données. Par exemple:

 $result = $conn->query("SELECT * FROM users");

while ($row = $result->fetch_assoc()) {
    // Lisez les données pour la première fois
}

// Réinitialiser le pointage du réglage des résultats
$result->data_seek(0);

while ($row = $result->fetch_assoc()) {
    // Lisez les données pour la deuxième fois
}

En appelant Data_seek (0), vous pouvez réinitialiser le pointeur de données vers le début de l'ensemble de résultats, relisant ainsi les données.

3.2 Utilisation de la méthode MySQLI_Fetch_all ()

Si vous souhaitez obtenir toutes les données à la fois, vous pouvez utiliser la méthode mysqli_fetch_all () , qui extraire toutes les données dans un tableau à la fois, sans la lire Row par ligne comme Fetch_ * . Par exemple:

 $result = $conn->query("SELECT * FROM users");
$rows = $result->fetch_all(MYSQLI_ASSOC);

// Vous pouvez l'utiliser plusieurs fois $rows Données dans le tableau
foreach ($rows as $row) {
    // Traitement des données
}

Cette approche évite la situation où l'ensemble de résultats est lue par ligne et consomme l'ensemble de résultats, vous permettant d'utiliser les données de jeu de résultats à plusieurs endroits.

3.3 Résultats de la requête en magasin dans la mémoire

Si vos résultats de requête sont petits, vous pouvez également stocker les données dans un tableau et réutiliser les données dans le tableau. Par exemple:

 $result = $conn->query("SELECT * FROM users");
$data = [];

while ($row = $result->fetch_assoc()) {
    $data[] = $row;
}

// Vous pouvez l'utiliser plusieurs fois $data Tableau
foreach ($data as $row) {
    // Traitement des données
}

Cette méthode évite également la requête répétée de la base de données et évite également le problème de l'ensemble de résultats "mangé".

4. Résumé

Lorsque vous appelez la méthode Fetch_ * plusieurs fois, l'ensemble de résultats est lue ligne par ligne et consommé. Si vous souhaitez parcourir le résultat des résultats plusieurs fois, en utilisant MySQLI_DATA_SEEK () pour réinitialiser le pointeur du jeu de résultats, ou en utilisant MySQLI_Fetch_all () pour obtenir toutes les données à la fois, c'est un bon choix. Grâce à ces méthodes, vous pouvez éviter les problèmes "des ensembles de résultats" rencontrés "rencontrés pendant le développement et vous assurer que les données sont lues correctement.