Mysql
 sql >> Database >  >> RDS >> Mysql

PHP PDO con foreach e fetch

Un PDOStatement (che hai in $users ) è un cursore in avanti. Ciò significa che, una volta consumato (il primo foreach iterazione), non verrà riavvolto all'inizio del set di risultati.

Puoi chiudere il cursore dopo il foreach ed eseguire nuovamente l'istruzione:

$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/>";
}

Oppure puoi memorizzare nella cache utilizzando CachingIterator personalizzato con una cache piena:

$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/>";
}

trovi il CachedPDOStatement classe come sostanza . L'iteratore di memorizzazione nella cache è probabilmente più sano di memorizzare il set di risultati in un array perché offre ancora tutte le proprietà e i metodi di PDOStatement oggetto che ha avvolto.