mysqli_query mysql_select_db mysql_connect diferencias clase php mysql mysqli

mysql_select_db - mysqli php 7



Restablecimiento del puntero de matriz en los resultados de PDO (6)

De acuerdo con el manual de php, puede emitir una consulta varias veces; si prepara un objeto PDOStatement utilizando PDO :: prepare (), puede emitir la declaración con varias llamadas a PDOStatement :: execute (). Así que tu 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

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

mysql_data_seek($result,0);

Usando métodos de DOP, no estoy seguro de cómo lograr lo mismo. El código de abajo es cómo estoy tratando de hacer esto. El primer bucle while funciona bien, pero el segundo bucle while no devuelve nada. ¿Alguien por favor me puede decir a dónde me voy mal?

$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 tu ayuda.


Guarde los resultados en una matriz y luego haga un bucle de 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 }


a veces almacenar el resultado de fetchAll () no es una opción. En su lugar, simplemente 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 sentencias como fetchObject ();


PDO::CURSOR_SCROLL indicar a la declaración que tiene que ser desplazable proporcionando la opción PDO::CURSOR_SCROLL como preparación. Y luego usas PDO::FETCH_ORI_FIRST para volver al primer elemento después de llegar al final para que puedas comenzar de nuevo.

Código completo:

$pdo = new PDO(''mysql:host='' . $host . '';dbname=''.$database, $username, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //Making cursor scrollable $options = array(PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL); $stmt = $pdo->prepare(''SELECT * FROM mytable WHERE active = 1 ORDER BY name ASC'', $options); $stmt->setFetchMode(PDO::FETCH_ASSOC); $stmt->execute(); while($row = $stmt->fetch()) { //do something starting with row[0] } //For the first row we use PDO::FETCH_ORI_FIRST //to get the first element again. This will also //move the cursor to that element $first = true; while($row = $stmt->fetch(null, $first ? PDO::FETCH_ORI_FIRST : PDO::FETCH_ORI_NEXT))) { $first = false; //do something else starting with row[0] }


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


fetch — Fetches the next row from a result set

de modo que cuando sale el primero, mientras ya llegó al último elemento de su resultado, es por eso que el segundo no devuelve nada.

Usa fetchAll para almacenar todos tus resultados y luego revísalos.