Obtener gran cantidad de registros de mi BD MySQL mediante PHP

publicado por: Anonymous

Un cordial saludo.
Verán, tengo una tabla “movimientos” con aproximadamente 300 mil registros, los cuales deseo obtener mediante PHP, pero al momento de realizar mi consulta, no obtengo resultados, a menos que ponga un LIMIT.

Este es mi código:

$query = "SELECT * FROM movimientos";
$sql = $this->conex->prepare($query);
$sql->execute();
$movimientos = $sql->fetchAll(PDO::FETCH_ASSOC);
if($sql->rowCount()>0) var_dump($movimientos);
else echo "No hay movimientos";

El detalle es que, como ya comenté, no me arroja resultados, ni siquiera entra al “else”, sólo se queda en blanco mi script.

PERO, si modifico mi query a:

$query = "SELECT * FROM movimientos LIMIT 50000";

Entonces si obtengo mis resultados.

¿Por qué podría estar pasando esto?
He investigado un poco, y encontré algo relacionado a las variables post_max_size y memory_limit, del php.ini. Ya aumenté estos valores pero sigo sin obtener resultados.

Espero me puedan ayudar, de antemano gracias.
Saludos!


——————-Editado (Solución)—————–

Disculpen, no había tenido tiempo de compartir mi solución. Advierto que no sé si es lo más recomendable, uds opinarán … Pero fue lo que a mi me funcionó.

Primeramente, tuve que aumentar la variable memory_limit en mi php.ini a 3MB (lo sé, demasiado! … nada recomendable, pero creanme q sin esto no funciona mi script).
La variable set_time_limit (configurada a 1 min) no representaba problema, ya que el script no moría por tiempo, sino por tamaño de memoria/buffer (o así lo entendí); por lo que no tuve q aumentarla.

Después, tuve q hacer una adecuación en mi consulta, al obtener los resultados, gracias a la ayuda prestada en lawebdelprogramador, me sugirieron hacer estos cambios.

Yo tenía mi script de la forma mencionada anteriormente, y quedó así:

function prueba(){
 $query = "SELECT * FROM tarjetas";
 $sql = $this->conex->query($query); //Se ejecuta directo la consulta, ya que no hay parámetros
 $sql->setFetchMode(PDO::FETCH_ASSOC);
 $movs = array(); //array auxiliar para guardar los movimientos
 while ($row = $sql->fetch()) { //recomerremos una a una las filas obtenidas
    array_push($movs, $row); //guardamos el elemento en el array auxiliar
    unset($row); //eliminamos la fila para evitar sobrecargar la memoria
 }
    return $movs;
 }

Es así como quedó mi script, como repito, fue lo q a mi me funcionó. Espero a alguien le pueda servir, y puedan comentar acerca de ello. Saludos y gracias a todos!

solución

disculpen, no había tenido tiempo de compartir mi solución.
Advierto que no sé si es lo más recomendable, uds opinarán …
Pero fue lo que a mi me funcionó.

Primeramente, tuve que aumentar la variable memory_limit en mi php.ini a 3MB (lo sé, demasiado! … nada recomendable, pero creanme q sin esto no funciona mi script)
La variable set_time_limit (configurada a 1 min) no representaba problema, ya que el script no moría por tiempo, sino por tamaño de memoria/buffer (o así lo entendí); por lo que no tuve q aumentarla.

Después, tuve q hacer una adecuación en mi consulta, al obtener los resultados, gracias a la ayuda prestada en lawebdelprogramador, me sugirieron hacer estos cambios.

Yo tenía mi script de ésta forma:

public function prueba(){
    $query = "SELECT * FROM tabla"; //tabla con +300mil registros
    $sql = $this->conex->prepare($query); //primer error xD
    $sql->execute();
    $movimientos = $sql->fetchAll(PDO::FETCH_ASSOC); //Justo aqui moría mi   script
    $res = ($sql->rowCount()>0)  ? $movimientos : false; 
    return $res;
   }

Quedó de la sig forma:

function prueba(){
            $query = "SELECT * FROM tarjetas";
            $sql = $this->conex->query($query); //Se ejecuta directo la consulta, ya que no hay parámetros
            $sql->setFetchMode(PDO::FETCH_ASSOC);
            $movs = array(); //array auxiliar para guardar los movimientos
            while ($row = $sql->fetch()) { //recomerremos una a una las filas obtenidas
                array_push($movs, $row); //guardamos el elemento en el array auxiliar
                unset($row); //eliminamos la fila para evitar sobrecargar la memoria
            }
            return $movs;
        }

Es así como quedó mi script, como repito, fue lo q a mi me funcionó.
Espero a alguien le pueda servir, y puedan comentar acerca de ello.
Saludos y gracias a todos!

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *