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
обект, който е увил.