Foros del Web » Programando para Internet » PHP »

Tablas dinamicas con php y mysql

Estas en el tema de Tablas dinamicas con php y mysql en el foro de PHP en Foros del Web. Estoy realizando una aplicación web la cual dibuja unas tablas en html por años y estas a su vez están ordenadas por fecha y por ...
  #1 (permalink)  
Antiguo 28/03/2017, 20:43
 
Fecha de Ingreso: julio-2015
Ubicación: MEXICO
Mensajes: 46
Antigüedad: 8 años, 9 meses
Puntos: 0
Pregunta Tablas dinamicas con php y mysql

Estoy realizando una aplicación web la cual dibuja unas tablas en html
por años y estas a su vez están ordenadas por fecha y por titulo.
El problema que tengo es que no se como imprimirlas ya que lo e hecho de dos maneras pero de una manera duplica filas y de la otra manera no pone todas las filas acontinuacion les paso el codigo.

Codigo que duplica filas

Código PHP:
Ver original
  1. <?php
  2. $añotrabajando=0;
  3. $fecha=0;
  4.  
  5.  
  6. while ($recorre = mysql_fetch_array($total)) {
  7. $indicador=0;
  8. $añotrabajando=$recorre[0];
  9.                        
  10. echo'<table class="fancyTable  año" id="'.$recorre[0].'" cellpadding="0" cellspacing="0">
  11.       <thead>
  12.           <tr>
  13.               <th style="text-align:center">Descripción</th>
  14.               <th style="text-align:center">Fecha</th>
  15.           </tr>
  16.       </thead>
  17.       <tbody>';
  18. $tabla = $objMetro->query("SELECT * from documentos where idArea= ".$_REQUEST['area']." order by año desc , mes desc ,dia desc, titulo asc");
  19. while ($recorremos = mysql_fetch_array($tabla)) {
  20. if($recorre[0]==$recorremos[5]){
  21. if($recorremos[6]!=0   ){
  22. if($indicador==0){
  23. $indicador=1;
  24. echo '<tr><td colspan="2"  style="text-align:center; background:#B5E1A7"><b>';
  25. $titulo = $objMetro->query("SELECT * from titulos where idTitulo = ".$recorremos[6]);
  26. $titulo=mysql_fetch_array($titulo);
  27. echo $titulo[2];
  28. echo'</b></td></tr>';
  29. $filas = $objMetro->query("SELECT * from documentos where titulo= ".$recorremos[6]." and año= ".$recorremos[5]." and dia= ".$recorremos[3]." and mes= ".$recorremos[4]." order by año desc , mes desc ,dia desc, titulo asc");
  30. echo '<tr><td> <ul>';
  31. while ($filast = mysql_fetch_array($filas)) {
  32. echo'<li><a href="'.$filast[2].'" target="_blank">'.$filast[1].'</a></li><br>';
  33. }
  34. echo'</ul></td><td>'.$recorremos[3].'/'.$recorremos[4].'/'.$recorremos[5].'</td></tr>';
  35. }
  36. }else{
  37. echo '<tr><td>';
  38. echo'<a href="'.$recorremos[2].'" target="_blank">'.$recorremos[1].'</a>s<br>';
  39. echo'</td><td>'.$recorremos[3].'/'.$recorremos[4].'/'.$recorremos[5].'</td> </tr>';
  40. }  
  41. $indicador=0;
  42. //AQUI TERMINA IF
  43. }
  44. //AQUI TERMINA WHILE
  45. }
  46.                    
  47. echo ' </tbody></table>';
  48. }
  49.  
  50.  ?>

una imagen de eso seria esta


ahora el codigo que no muestra todo

Código PHP:
Ver original
  1. <?php
  2. $añotrabajando=0;
  3. $fecha=0;
  4.  
  5.  
  6. while ($recorre = mysql_fetch_array($total)) {
  7. $indicador=0;
  8. $añotrabajando=$recorre[0];
  9.                        
  10. echo'<table class="fancyTable  año" id="'.$recorre[0].'" cellpadding="0" cellspacing="0">
  11.       <thead>
  12.           <tr>
  13.               <th style="text-align:center">Descripción</th>
  14.               <th style="text-align:center">Fecha</th>
  15.           </tr>
  16.       </thead>
  17.       <tbody>';
  18. $tabla = $objMetro->query("SELECT * from documentos where idArea= ".$_REQUEST['area']." order by año desc , mes desc ,dia desc, titulo asc");
  19. while ($recorremos = mysql_fetch_array($tabla)) {
  20. if($recorre[0]==$recorremos[5]){
  21. if($recorremos[6]!=0   ){
  22. if($indicador==0){
  23. $indicador=1;
  24. echo '<tr><td colspan="2"  style="text-align:center; background:#B5E1A7"><b>';
  25. $titulo = $objMetro->query("SELECT * from titulos where idTitulo = ".$recorremos[6]);
  26. $titulo=mysql_fetch_array($titulo);
  27. echo $titulo[2];
  28. echo'</b></td></tr>';
  29. $filas = $objMetro->query("SELECT * from documentos where titulo= ".$recorremos[6]." and año= ".$recorremos[5]." and dia= ".$recorremos[3]." and mes= ".$recorremos[4]." order by año desc , mes desc ,dia desc, titulo asc");
  30. echo '<tr><td> <ul>';
  31. while ($filast = mysql_fetch_array($filas)) {
  32. echo'<li><a href="'.$filast[2].'" target="_blank">'.$filast[1].'</a></li><br>';
  33. }
  34. echo'</ul></td><td>'.$recorremos[3].'/'.$recorremos[4].'/'.$recorremos[5].'</td></tr>';
  35. }
  36. }else{
  37. echo '<tr><td>';
  38. echo'<a href="'.$recorremos[2].'" target="_blank">'.$recorremos[1].'</a>s<br>';
  39. echo'</td><td>'.$recorremos[3].'/'.$recorremos[4].'/'.$recorremos[5].'</td> </tr>';
  40. $indicador=0;
  41. }  
  42. //AQUI TERMINA IF
  43. }
  44. //AQUI TERMINA WHILE
  45. }
  46.                    
  47. echo ' </tbody></table>';
  48. }
  49.  
  50.  ?>

y su imagen



El problema con este es que si tengo 2 titulos juntos solo muestra 1 y el otro se lo brica hasta que haya filas sin titulos

haora dejo una imagen de mi base de datos



En ella se muestran como estan los datos

Infinitas gracias por su ayuda.
__________________
VENIMOS A APRENDER
  #2 (permalink)  
Antiguo 28/03/2017, 21:00
 
Fecha de Ingreso: julio-2014
Mensajes: 334
Antigüedad: 9 años, 9 meses
Puntos: 30
Respuesta: Tablas dinamicas con php y mysql

Lo primero que te aconsejo es que identes el codigo...
1- es mucho mas legible y mas facil de entender a golpe de ojo
2- te ahorras tener que marcar donde terminan los loops.

Lo 2o es.. que datos contiene exactamente la variable "recorremos"? Antes del primer while, no estas compartiendo la consulta pues en la base de datos hay 8 campos y el indice maximo que estas utilizando es 6 con lo cual nosotros no sabemos si hiciste un select * o un select campo1, campo2 .... campo6
  #3 (permalink)  
Antiguo 29/03/2017, 07:56
 
Fecha de Ingreso: octubre-2010
Ubicación: España
Mensajes: 1.007
Antigüedad: 13 años, 6 meses
Puntos: 123
Respuesta: Tablas dinamicas con php y mysql

Siento decirlo pero ese código es feo y poco legible además.
Para mi cualquier consulta dentro de un bucle debe ser siempre evitada, o ser el último recurso.

Ya que los datos están relacionados con FK por qué no intentar contruir una consulta que te traiga los datos que necesitas y luego los a cómodas con php, esto facilitará mucho el trabajo. Lo que no me queda claro es cuales son, ya que utilizas el * en tus consultas y el código es poco legible a primera vista.

Por ejemplo para traer todos los documentos y sus titulos:
Código SQL:
Ver original
  1. SELECT documentos.*, tablaArea.*, tablaTitulo.*
  2. FROM documentos
  3. INNER JOIN tablaTitulo ON documentos.titulo=tablaTitulo.id
  4. INNER JOIN tablaArea ON documentos.area=tablaArea.id
  5. WHERE documentos.ano=2016
  6. ORDER BY documentos.dia DESC

Otra recomendación es que no utilices caracteres especiales en los nombres de columnas puede generar errores y quebraderos de cabeza, al igual que las fechas deberían ses tratadas como una única columna de tipo DATE.
__________________
Unset($vida['malRollo']);
  #4 (permalink)  
Antiguo 29/03/2017, 08:22
 
Fecha de Ingreso: julio-2015
Ubicación: MEXICO
Mensajes: 46
Antigüedad: 8 años, 9 meses
Puntos: 0
Respuesta: Tablas dinamicas con php y mysql

Cita:
Iniciado por xerifandtomas Ver Mensaje
Siento decirlo pero ese código es feo y poco legible además.
Para mi cualquier consulta dentro de un bucle debe ser siempre evitada, o ser el último recurso.

Ya que los datos están relacionados con FK por qué no intentar contruir una consulta que te traiga los datos que necesitas y luego los a cómodas con php, esto facilitará mucho el trabajo. Lo que no me queda claro es cuales son, ya que utilizas el * en tus consultas y el código es poco legible a primera vista.

Por ejemplo para traer todos los documentos y sus titulos:
Código SQL:
Ver original
  1. SELECT documentos.*, tablaArea.*, tablaTitulo.*
  2. FROM documentos
  3. INNER JOIN tablaTitulo ON documentos.titulo=tablaTitulo.id
  4. INNER JOIN tablaArea ON documentos.area=tablaArea.id
  5. WHERE documentos.ano=2016
  6. ORDER BY documentos.dia DESC

Otra recomendación es que no utilices caracteres especiales en los nombres de columnas puede generar errores y quebraderos de cabeza, al igual que las fechas deberían ses tratadas como una única columna de tipo DATE.


Gracias por las recomendaciones las tomare en cuenta. Tengo la consulta adentro de un bucle por que no todos los documentos tienen titulo, en tonces con el if comparo si es cero no tiene titulo y por lo tanto crea la fila en caso de que tengan titulo verifico si hay otros documentos con la misma fecha y el mismo titulo es hay donde no puedo hacer que se ejecute una solo vez es por lo mismo por el bucle.

Gracias por la ayuda.
__________________
VENIMOS A APRENDER
  #5 (permalink)  
Antiguo 29/03/2017, 08:27
 
Fecha de Ingreso: julio-2015
Ubicación: MEXICO
Mensajes: 46
Antigüedad: 8 años, 9 meses
Puntos: 0
Respuesta: Tablas dinamicas con php y mysql

Cita:
Iniciado por Triby2 Ver Mensaje
Lo primero que te aconsejo es que identes el codigo...
1- es mucho mas legible y mas facil de entender a golpe de ojo
2- te ahorras tener que marcar donde terminan los loops.

Lo 2o es.. que datos contiene exactamente la variable "recorremos"? Antes del primer while, no estas compartiendo la consulta pues en la base de datos hay 8 campos y el indice maximo que estas utilizando es 6 con lo cual nosotros no sabemos si hiciste un select * o un select campo1, campo2 .... campo6
Hola buen dia gracias por tus comentarios los tomare encuenta

la variable recorremos es un arreglo que trae los datos de esta consulta
SELECT * from documentos where idArea= 1 order by año desc , mes desc ,dia desc, titulo asc

y esa consulta me da los resultados que comparti en la imagen.

el problema es que hay unos documentos que tienen titulos y unos que no a su vez estos tienen que ir ordenados por fechas.
ya lo hago pero cuando hay varios documentos con la misma fecha y mismo titulo es el problema o no muestra todos o los duplica dependiendo el codigo por eso puse los dos codigos ya me llevo varios dias con esto

Gracias por tu ayuda
__________________
VENIMOS A APRENDER
  #6 (permalink)  
Antiguo 29/03/2017, 09:00
 
Fecha de Ingreso: julio-2014
Mensajes: 334
Antigüedad: 9 años, 9 meses
Puntos: 30
Respuesta: Tablas dinamicas con php y mysql

Vamos empezar por el principio, la base de datos.

Cuando trabajas con una BBDD, has de saber que la aplicación se construirá en base a BBDD, si la BBDD esta mal estructurada, el código estará mal construido, muy posiblemente feo y tendrás bugs que seguramente al repararlos aparecerán otros. Con lo cual la lógica y su estructura es lo más importante (para mi) cuando vas a construir una app con esa BBDD.

Así que reestructura la BBDD pues está bastante mal y eso que son pocos campos.

Esa tabla debería de ser:
-idDocumento
-TituloDocumento (tipo varchar, no números, no hay lógica de guardar un número para guardar el titulo en otro lado).
-Ruta
-Fecha (tipo datetime que guarda la fecha y la hora
- Titulo (no entiendo este campo pq no lo explicaste bien pero quizás sobre dependiendo de tu planteamiento)
- idArea

Para que te hagas una idea, de lo que solamente ganarías así, es que al tener un campo tipo datetime para almacenar la fecha de creación del documento, todos tus documentos podrán aparecer en orden ya que datetime = fecha y hora, con lo cual los documentos de un mismo día los podrás ordenar no solo por la fecha, por hora con un simple "ORDER BY Fecha ASC/DESC"

Explicanos el porque poner un numero en titulo documento y para qué sirve el campo titulo para ver si podemos mejorar tu BBDD y después nos podremos meter con el código.

En cuanto a lo que tomarás en cuenta nuestros consejos para mejorar el código... por mi experiéncia con otros compañeros, permiteme dudarlo así que te doy una idea de cómo debe de ser un código más o menos bonito.

Esto es tu mismo código, lo único que hize es identarlo con SublimeText menú Edit>Line>Reindent

Código PHP:
Ver original
  1. <?php
  2.  
  3. $añotrabajando=0;
  4. $fecha=0;
  5.  
  6.  
  7. while ($recorre = mysql_fetch_array($total)) {
  8.     $indicador=0;
  9.     $añotrabajando=$recorre[0];
  10.  
  11.     echo'<table class="fancyTable  año" id="'.$recorre[0].'" cellpadding="0" cellspacing="0">
  12.     <thead>
  13.         <tr>
  14.             <th style="text-align:center">Descripción</th>
  15.             <th style="text-align:center">Fecha</th>
  16.         </tr>
  17.     </thead>
  18.     <tbody>';
  19.  
  20.     $tabla = $objMetro->query("SELECT * from documentos where idArea= ".$_REQUEST['area']." order by año desc , mes desc ,dia desc, titulo asc");
  21.  
  22.     while ($recorremos = mysql_fetch_array($tabla)) {
  23.         if($recorre[0]==$recorremos[5]) {
  24.             if($recorremos[6]!=0) {
  25.                 if($indicador==0) {
  26.                     $indicador=1;
  27.  
  28.                     echo '<tr><td colspan="2"  style="text-align:center; background:#B5E1A7"><b>';
  29.  
  30.                     $titulo = $objMetro->query("SELECT * from titulos where idTitulo = ".$recorremos[6]);
  31.                     $titulo=mysql_fetch_array($titulo);
  32.  
  33.                     echo $titulo[2];
  34.                     echo'</b></td></tr>';
  35.  
  36.                     $filas = $objMetro->query("SELECT * from documentos where titulo= ".$recorremos[6]." and año= ".$recorremos[5]." and dia= ".$recorremos[3]." and mes= ".$recorremos[4]." order by año desc , mes desc ,dia desc, titulo asc");
  37.  
  38.                     echo '<tr><td> <ul>';
  39.  
  40.                     while ($filast = mysql_fetch_array($filas)) {
  41.                         echo'<li><a href="'.$filast[2].'" target="_blank">'.$filast[1].'</a></li><br>';
  42.                     }
  43.  
  44.                     echo'</ul></td><td>'.$recorremos[3].'/'.$recorremos[4].'/'.$recorremos[5].'</td></tr>';
  45.                 }
  46.             } else {
  47.                 echo '<tr><td>';
  48.                 echo'<a href="'.$recorremos[2].'" target="_blank">'.$recorremos[1].'</a>s<br>';
  49.                 echo'</td><td>'.$recorremos[3].'/'.$recorremos[4].'/'.$recorremos[5].'</td> </tr>';
  50.             }
  51.              
  52.             $indicador=0;
  53.         }
  54.     }
  55.     echo ' </tbody></table>';
  56. }

Última edición por Triby2; 29/03/2017 a las 09:09

Etiquetas: dinamicas, html, mysql, select, sql, tablas
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 04:50.