Redefinir ponteiro da matriz em resultados PDO

Estou tendo problemas para mudar de methods SELECT mysql para methods PDO. Eu quero iterar através de uma matriz obtida duas vezes, ambas as vezes começando com a linha zero. No mysql eu usaria:

mysql_data_seek($result,0); 

Usando methods PDO, não tenho certeza de como fazer o mesmo. O código abaixo é como eu estou tentando fazer isso. O primeiro loop while funciona bem, mas o loop while while não retorna nada. Alguém pode me dizer onde eu estou indo errado?

 $pdo = new PDO('mysql:host=' . $host . ';dbname='.$database, $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->prepare('SELECT * FROM mytable WHERE active = 1 ORDER BY name ASC'); $stmt->setFetchMode(PDO::FETCH_ASSOC); $stmt->execute(); while($row = $stmt->fetch()) { //do something starting with row[0] } while($row = $stmt->fetch()) { //do something else starting with row[0] } 

Obrigado pela ajuda.

Salve seus resultados em uma matriz e, em seguida, encaminhe essa matriz duas vezes.

 $pdo = new PDO('mysql:host=' . $host . ';dbname='.$database, $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->prepare('SELECT * FROM mytable WHERE active = 1 ORDER BY name ASC'); $stmt->setFetchMode(PDO::FETCH_ASSOC); $stmt->execute(); $rows = $stmt->fetchAll(); foreach ($rows as $r) { // first run } foreach ($rows as $r) { // seconds run } 
 fetch — Fetches the next row from a result set 

então, quando ele sai o primeiro enquanto já chegou ao último elemento do seu resultado, é por isso que o segundo não retorna nada.

Use fetchAll para armazenar todos os seus resultados e depois passar por eles.

às vezes armazena o resultado de fetchAll () não é uma opção. Em vez disso, você pode simplesmente clonar o object pdo antes de chamar fetchAll () assim.

 $pdo_copy = clone $pdo; $num_rows = count($pdo_copy->fetchAll()); 

Agora, eu ainda posso usar o object pdo para fazer declarações como fetchObject ();

De acordo com o manual do php, você pode emitir uma consulta várias vezes, se você preparar um object PDOStatement usando o PDO :: prepare (), você pode emitir a declaração com várias chamadas para PDOStatement :: execute (). Então seu código parecerá assim.

 $stmt = $pdo->prepare('SELECT * FROM mytable WHERE active = 1 ORDER BY name ASC'); $stmt->setFetchMode(PDO::FETCH_ASSOC); //First execute $stmt->execute(); while($row = $stmt->fetch()) { //do something starting with row[0] } //Second execute $stmt->execute(); while($row = $stmt->fetch()) { //do something else starting with row[0] } 

fonte: http://php.net/manual/en/pdo.query.php

 if($stmt->fetchColumn() >= 0) { $stmt->execute(); //Reset cursor while($rs = $stmt->fetchObject()) { echo "Data: ".$rs->data; } } else { echo '0'; }