Lire plusieurs fois toutes les données récupérées avec fetch en PDO
Vous connaissez tous la méthode suivante pour lire une série de données enregistrées via MySQL :
$listeRep = $bdd->query("SELECT * FROM registre ORDER BY id DESC"); while($listeData = $listeRep->fetch()) { echo $listeData['nom']; }
Vous savez aussi qu'il est parfois utile de lire plusieurs fois ces données dans deux boucles différentes, et plutôt que d'executer une nouvelle requête de lecture de la base de données on serait tenté par faire la chose suivante :
$listeRep = $bdd->query("SELECT * FROM registre ORDER BY id DESC"); while($listeData = $listeRep->fetch()) { echo $listeData['nom']; } while($listeData = $listeRep->fetch()) { echo $listeData['nom']; }
Mais si vous essayez cette méthode, vous vous rendrez compte que seule la première boucle est fonctionnelle. La deuxième ne retourne aucune donnée.
Pourquoi ? Simplement parce que fetch() fonctionne par curseur. Il permet de lire les données lignes par lignes, et une fois qu'il est arrivé au bout des données présente dans la table, le curseur ne se réinitialise pas. Donc lorsque vous exécutez une nouvelle fois la boucle, vous n'avez pas une nouvelle fois les données.
Une solution simple pour résoudre se problème, c'est d'enregistrer les données dans un tableau à l'aide de fetchAll(), et il sera ensuite possible de les lires plusieurs fois :
$listeRep = $bdd->query("SELECT * FROM registre ORDER BY id DESC"); $liste = $listeRep->fetchAll(); foreach($liste as $listeData) { echo $listeData['nom']; } foreach($liste as $listeData) { echo $listeData['nom']; }
Par Guillaume le 31/03/2015 à 22:41