Uma
PDOStatement
(que você tem em $users
) é um cursor para frente. Isso significa que, uma vez consumido (o primeiro foreach
iteração), ele não retrocederá para o início do conjunto de resultados. Você pode fechar o cursor após o
foreach
e execute a instrução novamente:$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 você pode armazenar em cache usando
CachingIterator
personalizado com cache completo:$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/>";
}
Você encontra o
CachedPDOStatement
classe como uma essência
. O iterador de cache é provavelmente mais sensato do que armazenar o conjunto de resultados em uma matriz porque ainda oferece todas as propriedades e métodos do PDOStatement
objeto que ele envolveu.