Despabilando la MonoNeurona::Internet es de todos [Inicio] [Regresar]
WWW \ Paginación con PHP
WWW
Paginación con PHP

Este artículo ha sido consultado en 1,345 ocasiones.

Cuando una tabla tiene más de 50 registros comienza a volverse ’molesta’, pues tarda mucho en cargarse y desplegarse, además las páginas comienzan a volverse kilométricas. Esta situación es un costoso problema, pues el servidor tiene una gran carga de trabajo ante una consulta cualquiera.

Cuando nuestros datos se vuelven muy abundantes ha llegado el momento de paginar, es decir, de mostrar el cóntenido de una consulta en una página navegable al estilo de Google. Las librerías PEAR de PHP cuentan con la clase Pager que nos ayuda en esta tarea. (Si usted está en Debian asegúrese que el paquete php4-pear está instalado).

Note que en la línea 48 cargamos las opciones para conectarnos, si usted está usando MySQL cambie pgsql: por mysql:. En la línea 54 realizamos la conexión con PEAR. En la línea 77 obtenemos el array $data, que contiene todos los detalles para la paginación.

   1:<?
   2:/*
   3:* Paginacion de una tabla con PEAR
   4:* 
   5:* Manuel Montoya 2005 GPL  manuel@mononeurona.org
   6:* 
   7:* www.MonoNeurona.org
   8:* 
   9:*/
  10:
  11:require_once 'DB.php'; // La conexion PEAR a la BD
  12:
  13:require_once 'DB/Pager.php'; // La clase que realiza la paginacion
  14:
  15:$SELF = $_SERVER['PHP_SELF']; // La pagina actual
  16:
  17:?>
  18:
  19:<html>
  20:<head><title>Ejemplo Paginacion</title></head>
  21:<style type="text/css">
  22:img { 
  23:  border:0;
  24:}
  25:a {
  26:  color: #2d508a;
  27:  font-size: 12px;
  28:  font-family: Verdana, Arial, Helvetica, sans-serif; 
  29:  text-decoration:none;
  30:  text-align:left;
  31:}
  32:
  33:a:hover {
  34:  color: #f29503;
  35:  font-size: 12px;
  36:  font-family: Verdana, Arial, Helvetica, sans-serif;
  37:}
  38:</style>
  39:<body>
  40:<?
  41:
  42:$DATABASE   = "DBPROYECTOS";
  43:$DBUSER     = "postgres"; 
  44:$DBPASSWORD = "Mexik0L0ReS33"; 
  45:$DBHOST     = "localhost";
  46:$DBPORT     =  5432;
  47:
  48:$dsn = "pgsql://$DBUSER:$DBPASSWORD@$DBHOST/$DATABASE";
  49:    $options = array(
  50:          'debug'       => 2,
  51:          'portability' => DB_PORTABILITY_ALL,
  52:      );
  53:
  54:$conn =& DB::connect($dsn, $options);
  55:
  56:if (PEAR::isError($conn)) 
  57:         die($conn->getMessage());
  58:
  59:
  60:$sql="SELECT id, nombre, responsable FROM proyectos ORDER BY id";
  61:
  62:// La variable $_GET['from'] existe, no esta vacia y es un numero ?
  63:if (isset($_GET['from']) && $_GET['from'] != '' && is_numeric($_GET['from']))
  64:     $from = $_GET['from']; 
  65:else
  66:     $from = 0; 
  67:
  68:$limit = 10;       //  Despliega 10 paginas al estilo de Google 
  69:
  70:$maxpages = 10;    // El numero total de registros en el query
  71:
  72:$Q="SELECT count(*) FROM proyectos";  //Cuento los registros 
  73:
  74:$nrows =& $conn->getRow($Q);
  75:
  76:// La clase pager que me devuelve el array $data
  77:$data = DB_Pager::getData($from, $limit, $nrows[0], $maxpages);     
  78:
  79:echo '<table align="center" width="70%">';
  80:
  81:echo '<tr><td colspan="3"><p class="negrita"> 
  82:Pagina '. $data['current'] . ' de ' . $data['numpages'] . '</p></td></tr>'; 
  83:
  84:echo '<tr><td colspan="3" align="center">';
  85:
  86:
  87:// A menos que sea la primera pagina, muestra la liga de "<< Pagina Previa"
  88:if ( $data['current'] != $data['firstpage'] )  
  89:   echo '<a href="'. "$SELF?from=" . $data['prev'] . '">&lt; &lt; P&aacute;gina Previa</a>'; 
  90:
  91:       
  92:echo "&nbsp;&nbsp;";
  93:
  94:// A menos que sea la ultima pagina, muestra la liga de "Siguiente>>"
  95:if ( $data['current'] != $data['lastpage'] ) 
  96:  echo '<a href="'. "$SELF?from=" . $data['next'] . '">P&aacute;gina Siguiente &gt;&gt;</a>';
  97:
  98:
  99:echo '</td></tr>';
 100:
 101:// Ve por 10 registros usando la funcion de PEAR::DB limitQuery  
 102:$res = $conn->limitQuery($sql, $from, $limit); // Display the rows 
 103:
 104:
 105:$color1 = 'cccccc';  // Gris
 106:$color2 = 'fff';     // Blanco
 107:$row_count = 0;
 108:
 109://Pinto los registros
 110:while ($row = $res->fetchrow()) {
 111:        
 112:        $bgcolor = ($row_count % 2) ? $color1 : $color2;  // color del renglon 
 113:                
 114: print "<tr style=\"background-color:#$bgcolor;\">
 115:        <td class=\"boton\"><a href=\"editar.php?id=". $row[0]. "\">
 116:        <img src=\"images/editar.png\" title=\"Editar\" alt=\"Editar\"></a></td>
 117:        <td class=\"presenta\">". $row[1]. "</td>
 118:        <td class=\"boton\"><a href=\"borrar.php?id=". $row[0]. "\">
 119:        <img src=\"images/borrar.png\" title=\"Borrar\" alt=\"Borrar\";></a>
 120:        </td></tr>\n";
 121:     
 122:        $row_count++; 
 123:}
 124:
 125:
 126:echo '<tr><td colspan="3" style="text-align:center;">
 127:<span class="pequena">' . $data['numrows'] . ' Registros encontrados '; 
 128:
 129:echo 'Desplegando '. $data['limit'] . ' registros por p&aacute;gina</span></td></tr>'; 
 130:
 131:echo "<tr><td colspan=\"3\" style=\"text-align:center;\">
 132:<span class=\"pequena\">";    // Ligas directas a las paginas  
 133:
 134:
 135:foreach ($data['pages'] as $page => $start_row) {
 136:   echo "[ <a href='$SELF?from=$start_row'>$page</a> ] "; 
 137:} 
 138:
 139:echo '</td></tr>';
 140:?>
 141:
 142:<tr><td colspan="3"><br><br></td></tr>
 143:
 144:<tr><td>
 145:<form method="post" name="forma" action="menu.php">
 146:<input type="hidden" name="pagina" value="<?= $pagina; ?>">
 147:<input type="hidden" name="sec" value="proyect2">
 148:<input class="boton" type="submit" value="Nuevo registro">
 149:</form>
 150:</td><td></td><td style="text-align:right;">
 151:</form>
 152:
 153:</td></tr></table>
 154:
 155:</body>
 156:</html>

El resultado del código luce así:

Paginación

Y eso es todo, ¡hasta la próxima entrega!


Autor
Manuel Montoya es psicólogo y vive en la Ciudad de México. Desde 1998 se dedica a la consultoría de sistemas abiertos. Ha desarrollado aplicaciones Web para American Express, Bancomext, Aeroméxico y Ford. Actualmente trabaja en el Instituto de Investigaciones Biomédicas de la UNAM usando Python, PostgreSQL y PHP sobre NetBSD, además prepara el café de las mañanas. Jedit.org y WindowMaker son su editor y escritorio favoritos.
Manuel Montoya

Última actualización: 2007-04-29 10:56:59-05



ir arriba
The Queen is here Mozilla Firefox The Best DataBase CakePHP Framework CSS GNU Hacker