Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

PHP PDO com foreach e fetch


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.