Foros del Web » Programando para Internet » PHP »

Tutorial: Paginador de resultados con consultas dinámicas.

Estas en el tema de Tutorial: Paginador de resultados con consultas dinámicas. en el foro de PHP en Foros del Web. Saludos. Gracias a sus artículos he podido superar un montón de problemas, asi que opté por retribuirles algo del crédito de lo que he aprendido ...
  #1 (permalink)  
Antiguo 08/02/2009, 16:37
Avatar de SCY-FOX  
Fecha de Ingreso: septiembre-2007
Ubicación: Chile
Mensajes: 139
Antigüedad: 12 años, 2 meses
Puntos: 5
De acuerdo Tutorial: Paginador de resultados con consultas dinámicas.

Saludos.

Gracias a sus artículos he podido superar un montón de problemas, asi que opté por retribuirles algo del crédito de lo que he aprendido enviándoles algo que me resulta súmamente cómodo al tener que hacer paginado de resultados desde una base de datos.

Imaginen que tienen una web, a la izquierda hay un menú que lista las categorias de una sección en particular, y al lado derecho una tabla con los encabezados de cara columna.

Además a la izquierda tengo un jumpmenu con un listado de los meses del año, para poder filtrar tanto por categoría como por meses o ambos.

Los resultados estan filtrados además para ciertos usuarios, por lo que hay que validar esto también al momento de hacer la consulta a la base de datos.

Según el click que hagan a la opción de la izquierda, se reflejan los cambios en la derecha, con el paginador asociado y listo para avanzar a la siguiente página sin tener que volver a presionar la categoría.

Código PHP:
// --Paginado-- inicio
if((!isset($_GET['page'])) || ($_GET['page'] < 1)) $page 1; else $page $_GET['page'];
if (isset(
$_GET["max"])) {$max $_GET["max"];} else { $max "";}
// Valores del salto por fecha
if (isset($_GET["mes"])){ $mes    =    $_GET["mes"]; } else {$mes '';}
if (isset(
$_GET["ti"])) {    $ti     =    $_GET["ti"]; } else {$ti 'all';} 
Primero, al inicio de la página php deben colocar esto, para que sepa que valores se mandan y debe mostrar según página y máximo de registros por página.

Después esto otro:

Código PHP:
/********** CONSULTA DINAMICA DE REGISTROS *******************/
/*
SI SE INGRESA CATEGORIA (TIPO) Y SIN MES, SE HACE CONSULTA PARA QUE BUSQUE REGISTROS CUYO DUEÑO SEA "CLIENTES" Y EL USUARIO
ACTIVO EN ESTE MOMENTO; SEGUN SU IDENTIFICADOR y CON ESOS RESULTADOS SE FILTRAN LA CATEGORIA ESCOGIDA
*/
if (($ti != 'all') and ($mes == ''))
    {
     
     
$sql             "SELECT * FROM (SELECT * FROM tabla
                                                                     WHERE iddueno = '1' OR iddueno = '"
.$_SESSION['iduser']."') AS ex 
                                                                         WHERE tipo = '$ti'"
//Con Tipo sin Mes
                                                                        
     //Cantidad total de filas para hacer paginado
          
$SQL_total    =    "SELECT COUNT(*) FROM (SELECT * FROM tabla
                                                                     WHERE iddueno = '1' OR iddueno = '"
.$_SESSION['iduser']."') AS ex 
                                                                         WHERE tipo = '$ti'"
;
     
$rec_total    mysql_query($SQL_total);
     
$total_results mysql_result($rec_total,0); 
     
    } 
/*
SI SE INGRESA CATEGORIA (TIPO) Y MES, SE HACE CONSULTA PARA QUE BUSQUE REGISTROS CUYO DUEÑO SEA "CLIENTES" Y EL USUARIO
ACTIVO EN ESTE MOMENTO; SEGUN SU IDENTIFICADOR y CON ESOS RESULTADOS FILTRA CATEGORIAS Y MES SELECCIONADOS.
*/        
    
else if (($ti != 'all') and ($mes != ''))
        {
    
$sql         "SELECT * FROM ( SELECT * FROM tabla
                                                            WHERE iddueno = '1' OR iddueno = '"
.$_SESSION['iduser']."') AS ex
                                                                WHERE tipo = '$ti' AND (Month( publicado ) = '$mes')"
//Con Tipo con Mes
            //Cantidad total de filas para hacer paginado
    
$SQL_total    =    "SELECT * FROM ( SELECT * FROM tabla
                                                            WHERE iddueno = '1' OR iddueno = '"
.$_SESSION['iduser']."') AS ex
                                                                WHERE tipo = '$ti' AND (Month( publicado ) = '$mes')"
;
    
$rec_total    mysql_query($SQL_total);
    
$total_results mysql_num_rows($rec_total);
            
        } 
/*
SI NO SE INGRESA CATEGORIA (TIPO) Y SIN MES, SE HACE CONSULTA PARA QUE BUSQUE REGISTROS CUYO DUEÑO SEA "CLIENTES" Y EL USUARIO
ACTIVO EN ESTE MOMENTO; SEGUN SU IDENTIFICADOR
*/
        
else if (($ti == 'all') and ($mes == ''))// Sin Tipo, sin Mes
            
{                
                
$sql                 "SELECT * FROM tabla WHERE iddueno = '".$_SESSION['iduser']."' OR iddueno = '1'"
                
//Cantidad total de filas para hacer paginado
                
$SQL_total    "SELECT COUNT(*) AS cantidad FROM tabla WHERE iddueno = '".$_SESSION['iduser']."' OR iddueno = '1'";
                
$rec_total    mysql_query($SQL_total);
                
$total_results mysql_result($rec_total,0);
                        
            } 
/*
SI NO SE INGRESA CATEGORIA (TIPO) Y SI MES, SE HACE CONSULTA PARA QUE BUSQUE REGISTROS CUYO DUEÑO SEA "CLIENTES" Y EL USUARIO
ACTIVO EN ESTE MOMENTO; SEGUN SU IDENTIFICADOR y CON LOS RESULTADOS SE FILTRA EL MES SELECCIONADO.
*/        
            
else if (($ti == 'all') and ($mes != ''))// Sin Tipo con Mes
                
{
                    
$sql                 "SELECT * FROM ( SELECT * FROM tabla
                                                                                    WHERE iddueno = '1' OR iddueno = '"
.$_SESSION['iduser']."') AS ex
                                                                                        WHERE (Month( publicado ) = '$mes')"

                    
//Cantidad total de filas para hacer paginado
                    
$SQL_total    "SELECT * FROM ( SELECT * FROM tabla
                                                                                    WHERE iddueno = '1' OR iddueno = '"
.$_SESSION['iduser']."') AS ex
                                                                                        WHERE (Month( publicado ) = '$mes')"

                                        
                    
$rec_total    mysql_query($SQL_total);
                    
$total_results mysql_num_rows($rec_total);                
                }

/***********************************************************************************************************************/ 
Lo de arriba, permite que según la categoria y/o mes seleccionado, se ejecute la consulta correcta. Debes hacer una sub consulta en la Bd para que te consulte lo solicitado sólo en el grupo correcto de usuarios asignados para ver los resultados.

Primero asigna la consulta correcta a una variable llamada sql, que es la que luego mostrará los resultados, pero también debe volver a preguntar para poder obtener la cantidad de resultados que deberá paginar. Traté de hacer todo con 1 sola consulta, pero por algun error marciano, no me dejó. De seguro alguien más experimentado podrá decirles alguna forma de realizar esto más eficiente. (eso espero en todo caso :P )

Teniendo la consulta correcta y los valores de registros en variables separadas podemos continuar:

Código PHP:

*******************************************************************************/
/* Paginador de Resultados Dinámicos Marcianos por Orlando Caffarena                               */
/********************************************************************************/
                
// Calcula cantidad de campos según la consulta SQL entregada. Cuenta las cagas.
//$rec_total    = mysql_query($SQL_total);
//$total_results = mysql_num_rows($rec_total);                

            
// Definir el numero de paginas y los limites
//5 respuestas por página
$max_results 5;
$inf_limit $max_results * ($page 1);

// Cantidad total de registros segun limites.
// Obtiene pines UNICOS que han recargado alguna vez
$recargados "";
$recargados $sql" LIMIT $inf_limit, $max_results";

// Ejecuta la consulta SQL sólo con los parámetros indicados al inicio.
$resulcarga "";
$resulcarga mysql_query($recargados);

// Obtiene la cantidad de páginas disponibles según la fórmula matemática Total resultados / Max resultados. Redondeado a más usando la funcion CEIL().
//NOTA: Ceil() redondea a más. Floor() redondea a menos.
$total_pages "";
$total_pages ceil($total_results $max_results);


/* DEBUG DE VARIABLES PARA VER SI RECIBEN LOS DATOS CORRECTOS. ELIMINAR AL MOMENTO DE SUBIR A SERVIDOR DE PRODUCCION.
echo $recargados." = Consulta SQL";
echo $total_results." = TOTAL FILAS";
echo $total_pages." = TOTAL PAGINAS";
*/
// - Fin - paginado--Fin


/**************************************************************/ 
Ya tenemos todo listo, ahora debemos crear la fila usando un while bajo la cabecera de la tabla HTML para que muestre y procese los resultados de la consulta.

Código PHP:
if ((!$resulcarga) or ($total_results == 0))
                            {
                                echo 
"<tr>\n";
                                echo 
"<td colspan='7'>No existen archivos asociados</td>";
                                echo 
"</tr>\n";
                            } else {
                                 while (
$valor mysql_fetch_array($resulcarga))
                                 {
                                    echo 
"<tr>\n";
                      echo 
"<td>".tipo_productos($valor[1])."</td>\n";
                      echo 
"<td>".$valor[2]."</td>\n";
                      echo 
"<td>".$valor[3]."</td>\n";
                      echo 
"<td>".$valor[4]."</td>\n";
                      echo 
"<td>".$valor[5]."</td>\n";
                      echo 
"<td><a href='download.php?path=".$valor[6]."' title='Descargar' class='descarga'>&nbsp;</a></td>\n";
                      echo 
"<td>".$valor[7]."</td>\n";
                        echo 
"</tr>\n";
                                    }
                            }
                            
?> 
Finalmente y bajo la tabla de resultados, escribimos una tabla que dinámicamente creará la cantidad de páginas disponibles.

Tiene un estilo similar al que tiene google. Genera hasta 5 numeros, dejando en negrita la página actual. en caso de que escogas la página 2, el rango será sólo de las páginas 23456- O sea, avanza uno hacia adelante y esconde el 1. Además tiene los links para adelante, atrás, primera y ultima páginas.

el formato final se vería asi.

|<< 1 2 3 4 5 > >|

(Sigue abajo)....

Última edición por SCY-FOX; 08/02/2009 a las 16:42 Razón: cambie el tag code por php
  #2 (permalink)  
Antiguo 08/02/2009, 16:38
Avatar de SCY-FOX  
Fecha de Ingreso: septiembre-2007
Ubicación: Chile
Mensajes: 139
Antigüedad: 12 años, 2 meses
Puntos: 5
Respuesta: Tutorial: Paginador de resultados con consultas dinámicas.

Todo está mejorado con CSS.

Código PHP:
<!--PAGINADOR-->
        <div id="paginador">
            <!-- INICIO Cantidad de Paginas-->
<table width="100%" height="22"  border="0" align="center" cellpadding="0" cellspacing="0">
 <tr>
  <td align="right" valign="middle" class="cabecera"><? 
//--Estilo de Paginacion Sepsy
$intervalo ceil ((10/2)-1); // el ceil del numero de paginas a mostrar/2 - 1 
        // Calculamos desde qué número de página se mostrará 
    
$desde $page $intervalo
    
// Calculamos hasta qué número de página se mostrará 
    
$hasta $page $intervalo
        if(
$desde 1){ 
        
// Le sumamos la cantidad sobrante al final para mantener el número de enlaces que se quiere mostrar.  
        
$hasta -= ($desde 1); 
        
// Establecemos $_pagi_nav_desde como 1. 
        
$desde 1
    } 
   if(
$hasta $total_pages){ 
        
// Le restamos la cantidad excedida al comienzo para mantener el número de enlaces que se quiere mostrar. 
        
$desde -= ($hasta $total_pages); 
        
// Establecemos $_pagi_nav_hasta como el total de páginas. 
        
$hasta $total_pages
        
// Hacemos el último ajuste verificando que al cambiar $_pagi_nav_desde no haya quedado con un valor no válido. 
        
if($desde 1){ 
            
$desde 1
        }  

//FIN Estilo Paginado Sepsy 
    
    
echo "&laquo; Pag. ".$page." de ".$total_pages." &raquo;";
    
//Primera Página (INICIO)
if ($total_pages != 1)
{
    echo 
" - <a id ='primero' href=".$_SERVER['PHP_SELF']."?page=1&max=0&ti=$ti&mes=$mes></a>&nbsp;\n";
}
// Build Previous Links
if($page 1)

    
$prev = ($page 1); 
    echo 
"<a id='anterior' title='Anterior' href=".$_SERVER['PHP_SELF']."?page=$prev&max=$max&ti=$ti&mes=$mes></a>&nbsp;\n"
}
//for($i=1;$i<$total_pages+1;$i++)
for ($i=$desde$i<=$hasta$i++) { 
$max    =    $max_results * ($i-1);
    if (
$i%25 == 0) echo "<br>";
    if((
$page) == $i){
        echo 
"<span class='pagination'>&nbsp;<b> $i </b>&nbsp;</span>"
        }else{
            echo 
"&nbsp;<a class='pagination' href=".$_SERVER['PHP_SELF']."?page=$i&max=$max&ti=$ti&mes=$mes>$i</a>&nbsp;\n"
            }

// Build Next Link 
//Flechita para avanzar
if($page $total_pages){ 
    
$next = ($page 1); 
    echo 
"<a id='siguiente' title='Siguiente' href=".$_SERVER['PHP_SELF']."?page=$next&max=$max&ti=$ti&mes=$mes></a>\n"
}  
//Ultima Página
if($total_pages != 1)
{
$max_fin    =    $max_results * ($total_pages -1);
echo 
"<a id='ultimo' href=".$_SERVER['PHP_SELF']."?page=$total_pages&max=$max_fin&ti=$ti&mes=$mes></a>\n";
}

?></td>
            </tr>
          </table>
<br />
<!-- FIN de Cantidad de Páginas--></div>
        <!--END PAGINADOR-->
el CSS es el siguiente:

Código:
/*PAGINADOR*/
#paginador{text-align: right; margin: 0px; padding: 5px; font-size: 10px; color: #000;}
#paginador a:link, #paginador a:visited{color: #000; text-decoration: none; margin: 0px 3px;}
#paginador a:hover, #paginador a:active{color: #000; text-decoration: underline;}
#paginador #anterior{background: url(../images/ic_anterior.gif) no-repeat 0px 2px; padding: 0px 0px 0px 20px;}
#paginador #siguiente{
	background: url(../images/ic_siguiente.gif) no-repeat 0px 2px;
	padding: 0px 0px 0px 20px;
}
#paginador #primero {
	background-image: url(../images/flecha.png);
	background-repeat: no-repeat;
	background-position: 0px 1px;
	padding-top: 0px;
	padding-right: 0px;
	padding-bottom: 0px;
	padding-left: 20px;
}
#paginador #ultimo {
	background-image: url(../images/flecha-copy.png);
	background-repeat: no-repeat;
	background-position: 0px 1px;
	padding-top: 0px;
	padding-right: 0px;
	padding-bottom: 0px;
	padding-left: 20px;
}
Y las imágenes son las siguientes:

h**p://img162.imageshack.us/img162/7053/icanterioryx4.gif
h**p://img162.imageshack.us/img162/8997/icanteriorfinpb1.jpg
h**p://img162.imageshack.us/img162/6857/icsiguientecx5.gif
h**p://img27.imageshack.us/img27/1688/flechacopydd8.png

Listo.

Muchas gracias otra vez, Foros del Web.
Espero que alguien le sea de utilidad este tutorial.

Silla!


Scyfox

Última edición por SCY-FOX; 08/02/2009 a las 16:43 Razón: cambie el tag cade por php
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 13:33.