Mysql
 sql >> Base de données >  >> RDS >> Mysql

PHP PDO avec foreach et fetch

Une PDOStatement (que vous avez dans $users ) est un curseur avant. Cela signifie qu'une fois consommé (le premier foreach itération), il ne reviendra pas au début du jeu de résultats.

Vous pouvez fermer le curseur après le foreach et exécutez à nouveau l'instruction :

$users       = $dbh->query($sql);
foreach ($users as $row) {
    print $row["name"] . " - " . $row["sex"] . "<br/>";
}

$users->execute();

foreach ($users as $row) {
    print $row["name"] . " - " . $row["sex"] . "<br/>";
}

Ou vous pouvez mettre en cache en utilisant CachingIterator personnalisé avec un fullcache :

$users       = $dbh->query($sql);

$usersCached = new CachedPDOStatement($users);

foreach ($usersCached as $row) {
    print $row["name"] . " - " . $row["sex"] . "<br/>";
}
foreach ($usersCached as $row) {
    print $row["name"] . " - " . $row["sex"] . "<br/>";
}

Vous trouvez le CachedPDOStatement classe en tant qu'essentiel . L'itérateur de mise en cache est probablement plus sain que de stocker le jeu de résultats dans un tableau car il offre toujours toutes les propriétés et méthodes de PDOStatement objet qu'il a enveloppé.