PDOStatement (които имате в $users ) е курсор напред. Това означава, че веднъж консумиран (първият foreach итерация), няма да се върне назад към началото на набора от резултати.
Можете да затворите курсора след foreach и изпълнете оператора отново:
$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/>";
}
Или бихте могли да кеширате с помощта на персонализиран CachingIterator с пълен кеш:
$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/>";
}
Вие намерете CachedPDOStatement клас като същност
. Итераторът за кеширане вероятно е по-разумен от съхраняването на набора от резултати в масив, защото все още предлага всички свойства и методи на PDOStatement обект, който е увил.