Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Problema al obtener registros de mi BD

Estas en el tema de Problema al obtener registros de mi BD en el foro de PHP en Foros del Web. Hola amigos, pongo el tema en éste post porque sinceramente no creo q sea de myslq, quizá si, de ser así una disculpa. Verán, tengo ...
  #1 (permalink)  
Antiguo 09/12/2016, 17:55
 
Fecha de Ingreso: diciembre-2015
Ubicación: México
Mensajes: 280
Antigüedad: 8 años, 4 meses
Puntos: 20
Problema al obtener registros de mi BD

Hola amigos,
pongo el tema en éste post porque sinceramente no creo q sea de myslq, quizá si, de ser así una disculpa.

Verán, tengo una tabla con aprox 300mil registros (muy pocos a comparación de otras BD), el detalle es que, al realizar una consulta 'simple' (SELECT * FROM table) y hacer un var_dump, php no arroja nada, mi script se queda en blanco.
[Al agregar un limit de 100mil, si me obtiene resultados]

Realicé la misma consulta en phpmyadmin y obviamente si me regresa todos los datos.

Estuve investigando y al parecer también las variables del php.ini (post_max_size, memory_limit) tienen que ver, pero ya las modifiqué y aun así no obtengo resultados. (Disculpen si no lo obtuve de una fuente muy confiable)

De antemano gracias por sus respuestas y/o comentarios.
Saludos!!!
  #2 (permalink)  
Antiguo 09/12/2016, 20:20
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problema al obtener registros de mi BD

Cita:
hacer un var_dump, php no arroja nada, mi script se queda en blanco.
Sería bueno conocer cómo es dicho script, de otra forma es como tratar de adivinar con los ojos vendados.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 12/12/2016, 09:44
 
Fecha de Ingreso: diciembre-2015
Ubicación: México
Mensajes: 280
Antigüedad: 8 años, 4 meses
Puntos: 20
Respuesta: Problema al obtener registros de mi BD

Hola, primero q nada gracias por comentar.
Tengo una consulta de este tipo:

Código PHP:
Ver original
  1. $query = "SELECT * FROM movimientos";
  2. $sql = $this->conex->prepare($query);
  3. $sql->execute();
  4. $movimientos = $sql->fetchAll(PDO::FETCH_ASSOC);
  5. if($sql->rowCount()>0) var_dump($movimientos);
  6. else echo "No hay registros";

Donde mi tabla 'movimientos' tiene aproximadamente 300mil registros.
El detalle es que la consulta no me arroja nada, PERO si yo modifico mi query a:

Código PHP:
Ver original
  1. $query = "SELECT * FROM movimientos LIMIT 50000";

Entonces si me obtiene resultados.

Espero me puedan orientar, porque no tengo idea por donde pueda ir el asunto.
Saludos y gracias de antemano.
  #4 (permalink)  
Antiguo 13/12/2016, 21:14
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Problema al obtener registros de mi BD

Pues definitivamente será mucha información, ¿por qué mostrarla con var_dump() toda de golpe?

Creo que lo más lógico sería paginar, de otra forma no me imagino humano capaz de leer 300,000+ registros con formato de var_dump() ni de lejos.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 14/12/2016, 09:40
 
Fecha de Ingreso: diciembre-2015
Ubicación: México
Mensajes: 280
Antigüedad: 8 años, 4 meses
Puntos: 20
Respuesta: Problema al obtener registros de mi BD

Hola, gracias por responder.

Lo que pasa es que quería ver a donde se cortaba el script, y me di cuenta que es cuando trata de optener los registros:

$movimientos = $sql->fetchAll(PDO::FETCH_ASSOC);

Hasta ese punto llega; ya estuve investigando y configurando el php.ini así como el my.ini , y no he obtenido resultados.

Sí, ya intente paginar, mediante LIMIT, obteniendo de 500 en 500 registros, PERO se corta casi de inmediato.

Esta es mi "paginador" y mi consulta:

Código PHP:
Ver original
  1. //Defino el # de registros a paginar
  2. $registros = 500;
  3.  
  4. //Obtengo el total de registros
  5. $total = $obj->getTotalMov();
  6.  
  7. //Calculo el # de ciclos, para saber cuantas veces lo voy a recorrer
  8. $numCiclos = floor($total/$registros);
  9.  
  10. //Ciclo "extra", lo obtengo mediante la función módulo
  11. $cicloext = $total%$registros;
  12.  
  13. //Si hay un residuo del total%registros, agrego un ciclo extra
  14. $numCiclos = ($cicloext>0) ? $numCiclos+=1 : $numCiclos;
  15.  
  16. //'Seteo' el # de registros (500)
  17. $obj->set_cuantos($registros);
  18.    
  19. //array auxiliar   
  20. $principal = array();
  21.  
  22. //empiezo el recorrido
  23.     for($i=0;$i<$numCiclos;$i++){
  24.                //seteo el limit para realizar la consulta
  25.         $limit = ($i==0) ? ($registros * $i) : (($registros*$i)+1);
  26.         $obj->set_limite($limit);      
  27.                $movs = $obj->getMov();
  28.         array_push($principal, $movs);
  29.        }
  30. echo count($principal);
  31.  
  32.  
  33. Mi consulta (en su respectiva clase):
  34. $query = "SELECT * FROM movimientos LIMIT $this->limite, $this->cuantos";
  35. $sql = $this->conex->prepare($query);
  36. $sql->execute();
  37. $result = $sql->fetchAll(PDO::FETCH_ASSOC);


Pero el script se queda en blanco, y de nuevo, si sólo recorro el ciclo una sóla vez, es decir, que me obtenga los primeros 500 registros solamente, lo hace perfecto.

Otra cosa que noté, esque en mi mismo phpmyadmin, al hacer un SELECT * FROM movimientos LIMIT 0,500 , se tarda más del tiempo que arroja al mostrar el resultado, se tarda aprox unos 10 seg, y en el resultado me aparece:
Mostrando filas 0 - 499 (total de 500, La consulta tardó 0.0632 seg)

Esto es normal?
Supongo que por ahí va también el asunto.

La estructura de mi tabla considero es sencilla, un id (primary key, autoincrement) y aprox 15 columnas.

Espero me puedan orientar, saludos y gracias de antemano.

Última edición por german_1441; 14/12/2016 a las 09:48
  #6 (permalink)  
Antiguo 14/12/2016, 16:04
 
Fecha de Ingreso: diciembre-2015
Ubicación: México
Mensajes: 280
Antigüedad: 8 años, 4 meses
Puntos: 20
Respuesta: Problema al obtener registros de mi BD

Bueno amigos, estoy peleandome aún con este tema.
Active los errores de PHP y obtengo:
Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 6 bytes)
Estuve investigando y tiene que ver con la variable memory_limit de mi php.ini
Ya la estuve elevando hasta 1024M y aún así persiste el error.
Podría aumentar el valor de dicha variable, PERO, que tal recomendable sería?
Esa seria una opcion válida? El tamaño de mi tabla puede cambiar y desde luego tendría que volver a aumentar ese valor,
Bueno, son los pequeños "avances" que he logrado, ojalá alguien me diera alguna pista.
Saludos!
  #7 (permalink)  
Antiguo 15/12/2016, 09:08
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: Problema al obtener registros de mi BD

Para mi sinceramente paginar de 500 en 500 me sigue pareciendo una burrada, creo que de 50 a 100, si es para mostrar por por el navegador es más que suficiente.

Por otro lado no estaría mal optimizar la consulta en la medida de lo posible, utilizar * esta desaconsejado lo mejor es escribir los nombres de los campos. También comentas que son aproximadamente unos 15 campos ¿son realmente relevantes todos los campos? No lo creo, es probable que con 4 o 5 sea más que suficiente para hacerse una idea del registro, y con esos campos se podría generar una nueva consulta para ver el detalle completo de un registro dado, en caso de ser necesario.

No se que tipo de datos almacenas en la tabla, pero no es igual de costoso, guardar en memoria un entero que un full text de varios párrafos.

Igualmente es posible que estés malgastando memoria en tu Script, es recomendable eliminar (unset) inmediatamente todas las variables una vez que han dejado de ser útiles, en lugar de dejarlas morir, sobre todo cuando hablamos de arrays multidimensionales y objetos. Incluso cuando reciclamos una variable para asignarle un valor completamente nuevo es preferible eliminarla antes de hacerlo.

Todo esto lo digo sobre hipótesis pues desconozco tu código completo.
__________________
Unset($vida['malRollo']);
  #8 (permalink)  
Antiguo 15/12/2016, 10:55
 
Fecha de Ingreso: diciembre-2015
Ubicación: México
Mensajes: 280
Antigüedad: 8 años, 4 meses
Puntos: 20
Respuesta: Problema al obtener registros de mi BD

Hola amigo, gracias por responder.

No quiero mostrar los registros en el navegador.
El script está pensado para extraer los +300mil registros de la BD y acomodarlos en sus respectivas tablas.

No me hago cargo de la subida de los registros, únicamente puedo obtenerlos y procesarlos. En este caso, una consulta con un WHERE no me ayuda mucho en el proceso de filtrado, (sí en algunos casos, PERO, de todos modos arroja resultados de +100mil registros, pero aún así no logro obtenerlos)

La tabla tiene únicamente campos int y varchar, de no más de 100 caracteres; y sí, necesito traer TODOS los campos, aunque probaré tu sugerencia de especificar campo por campo en lugar de *.

Al igual probaré tu sugerencia de eliminar/vaciar las variables que se vayan descartando.
Muchas gracias por los comentarios.
Saludos!
  #9 (permalink)  
Antiguo 16/12/2016, 10:54
 
Fecha de Ingreso: diciembre-2015
Ubicación: México
Mensajes: 280
Antigüedad: 8 años, 4 meses
Puntos: 20
Respuesta: Problema al obtener registros de mi BD

Bueno amigos,
Creo que no es para nada recomendable, pero para dar una solución;
tuve que incrementar la variable memory_limit en mi archivo php.ini
Y cambiar un poco la estructura de mi consulta

Gracias a la ayuda prestada en lawebdelprogamador, me sugirieron cambiar:

Código PHP:
Ver original
  1. $query = "SELECT * FROM movimientos";
  2. $sql = $this->conex->prepare($query);
  3. $sql->execute();
  4. $result = $sql->fetchAll(PDO::FETCH_ASSOC);
  5. return $result;

a

Código PHP:
Ver original
  1. $query = "SELECT * FROM movimientos";
  2. $sql = $this->conex->prepare($query);
  3. $sql->execute();
  4. $arrayaux = [];
  5. while($row=$sql->fetch()){
  6.    array_push($arrayaux,$row);
  7.    unset($row);
  8. }
  9. $result = $arrayaux;
  10. return $result;

No sé si la opción de incrementar el memory_limit fue muy acertado, pero bueno, es lo que se pudo hacer (aparte del cambio en la consulta)
Saludos!
  #10 (permalink)  
Antiguo 16/12/2016, 12:10
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: Problema al obtener registros de mi BD

Yo añadiría después del while un free para liberar la memoria asociada al resultado de la consulta;
Código PHP:
Ver original
  1. $sql->free();
__________________
Unset($vida['malRollo']);
  #11 (permalink)  
Antiguo 16/12/2016, 17:24
 
Fecha de Ingreso: diciembre-2015
Ubicación: México
Mensajes: 280
Antigüedad: 8 años, 4 meses
Puntos: 20
Respuesta: Problema al obtener registros de mi BD

Hola amigo
Ok, gracias por el tip!
También lo aplicaré ;)
Saludos!

Etiquetas: bd, registro, registros, select, tabla, variable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:35.