Een PDOStatement (die je hebt in $users ) is een voorwaartse cursor. Dat betekent dat, eenmaal geconsumeerd (de eerste foreach iteratie), zal het niet terugspoelen naar het begin van de resultatenset.
U kunt de cursor sluiten na de foreach en voer de instructie opnieuw uit:
$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/>";
}
Of u kunt cachen met behulp van op maat gemaakte CachingIterator met een volledige cache:
$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/>";
}
Je vindt de CachedPDOStatement klasse als kern
. De caching-iterator is waarschijnlijk verstandiger dan het opslaan van de resultaatset in een array, omdat het nog steeds alle eigenschappen en methoden van de PDOStatement biedt object dat het heeft ingepakt.