En PDOStatement (som du har i $users ) är en framåtmarkör. Det betyder att en gång konsumerat (den första foreach iteration), spolas den inte tillbaka till början av resultatuppsättningen.
Du kan stänga markören efter foreach och kör satsen igen:
$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/>";
}
Eller så kan du cache med hjälp av skräddarsydd CachingIterator med en 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/>";
}
Du hittar CachedPDOStatement klass som en sammanfattning
. Caching-iteratorn är förmodligen mer förnuftig än att lagra resultatuppsättningen i en array eftersom den fortfarande erbjuder alla egenskaper och metoder för PDOStatement objekt som det har lindat.