2012-02-24 15 views
15

Tengo problemas para pasar de los métodos SELECT de mysql a los métodos de PDO. Quiero iterar dos veces a través de una matriz extraída, ambas veces comenzando con la fila cero. En mysql usaría:Restablecer el puntero de matriz en los resultados de PDO

mysql_data_seek($result,0); 

Utilizando métodos PDO, no estoy seguro de cómo lograr lo mismo. El siguiente código es como trato de hacer esto. El primer ciclo while funciona bien, pero el segundo ciclo while no devuelve nada. ¿Puede alguien decirme por favor dónde me estoy equivocando?

$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] 
} 

Gracias por su ayuda.

Respuesta

23

Guarde los resultados en una matriz y luego bucle esa matriz dos veces.

$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 
} 
+0

Wow! Eso parece obvio. No sé por qué me quedé atrapado usando un ciclo while. Gracias por el puntapié en la cabeza! – user1028866

+0

Porque ignoró [la documentación] (http://php.net/manual/en/ref.pdo-mysql.php#pdo.constants.mysql-attr-use-buffered-query). – AnrDaemon

+0

Esto no es una buena idea cuando se trabaja con un gran conjunto de resultados. Todos los datos serán almacenados en una matriz. –

2
fetch — Fetches the next row from a result set 

así que cuando se sale de la primera, mientras que ya se llegó al último elemento de su conjunto resultado es por eso que el segundo mientras que los retornos nada.

use fetchAll para almacenar todos sus resultados y luego revisarlos.

+0

Gracias a todos. Está funcionando bien ahora. – user1028866

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

¿Puedes explicarlo en el texto de la respuesta? –

+0

El OP desea iterar dos veces a través de una matriz extraída. Solo puedo ver un ciclo en tu código. Entonces, ¿en qué medida su código es una solución al problema del PO? – honk

2

veces el almacenamiento del resultado de fetchAll() no es una opción. En su lugar, puede clonar el objeto pdo antes de llamar a fetchAll() de esta manera.

$pdo_copy = clone $pdo; 

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

Ahora todavía puedo usar el objeto pdo para hacer declaraciones como fetchObject();

1

De acuerdo con el manual php, puede emitir una consulta varias veces, si prepara un objeto PDOStatement usando PDO :: prepare(), puede emitir la instrucción con múltiples llamadas a PDOStatement :: execute(). Entonces su código se verá así.

$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] 
} 

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

+0

Te di mi +1, esta es la respuesta correcta, no queremos fetchAll() miles de filas, sin embargo, la pregunta era "Restablecer puntero de matriz en resultados PDO": esto realmente restablece el cursor a la primera fila, gracias . – Robert

Cuestiones relacionadas