Ver Mensaje Individual
  #1 (permalink)  
Antiguo 21/11/2012, 17:58
Avatar de metacortex
metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 20 años, 6 meses
Puntos: 832
Ejemplo de paginación en PHP

Un ejemplo práctico de paginación en PHP.

1. Abre una nueva base de datos e ingresa este contenido:

Código MySQL:
Ver original
  1. -- phpMyAdmin SQL Dump
  2. -- version 3.2.0.1
  3. -- http://www.phpmyadmin.net
  4. --
  5. -- Servidor: localhost
  6. -- Tiempo de generación: 03-12-2010 a las 10:56:04
  7. -- Versión del servidor: 5.1.36
  8. -- Versión de PHP: 5.3.0
  9.  
  10. SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
  11.  
  12.  
  13. /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
  14. /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
  15. /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
  16. /*!40101 SET NAMES utf8 */;
  17.  
  18. --
  19. -- Base de datos: `pruebas_paginacion`
  20. --
  21.  
  22. -- --------------------------------------------------------
  23.  
  24. --
  25. -- Estructura de tabla para la tabla `articulos`
  26. --
  27.  
  28. CREATE TABLE `articulos` (
  29.   `id` int(11) NOT NULL AUTO_INCREMENT,
  30.   `titulo` varchar(255) NOT NULL DEFAULT '',
  31.   `descripcion` text NOT NULL,
  32.   `contenido` text NOT NULL,
  33.   `fecha` date NOT NULL DEFAULT '0000-00-00',
  34.   `visible` tinyint(1) NOT NULL DEFAULT '0',
  35.   PRIMARY KEY (`id`)
  36. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;
  37.  
  38. --
  39. -- Volcar la base de datos para la tabla `articulos`
  40. --
  41.  
  42. INSERT INTO `articulos` (`id`, `titulo`, `descripcion`, `contenido`, `fecha`, `visible`) VALUES
  43. (1, ' Abierta de nuevo la tienda de "estilo" WordPress', 'Ya puedes encargar tus accesorios favoritos con la marca WordPress en la tienda WordPress Swag. ¿Cuantas veces has querido hacer apología de tu CMS favorito y no has podido o te has tenido que buscar la vida en tiendas locales de personalización?, pues nada, se acabó, ya tenemos lista la nueva tienda oficial.', '', '2005-10-04', 1),
  44. (2, 'Menciones de Twitter como comentarios', '¿Te quedaste huérfano con la muerte de Backtype connect?, ¿no quieres animarte con Disqus?, pues nada, puedes recuperar parte de la conversación que se va a las redes sociales con el plugin Twitter mentions as comments.', '', '2005-10-04', 1),
  45. (3, 'Pronto WordPress para Windows Phone', '¿Os acordáis que hace poco nos anunciaron que WordPress estaría disponible para otras plataformas móviles?, si, cuando se anunció WordPress para Nokia.', '', '2005-10-05', 1),
  46. (4, 'Qué es hotlinking y cómo protegerte', 'El hotlinking es quizás una de las prácticas más utilizadas y menos comprendidas por los bloggers. O sea, todos sabemos que "compartir es bueno", que "hay que enlazar" y todas esas cosas que hacen que la web sea hipertextual, hasta ahí de acuerdo.', '', '2005-10-06', 1),
  47. (5, ' Rambo usa WordPress', 'De verdad, no es coña. Silvester Stallone, Rambo, usa en su sitio oficial WordPress, con el tema iA3, ofreciendo un sitio sencillo, casi minimalista pero efectivo en lo que respecta a navegación y SEO. Personalmente habría usado otro tipo de tema más orientado a sitios de noticias y fans pero al menos en el CMS no se ha equivocado.', '', '2005-10-05', 1),
  48. (6, 'Karim Osman en WordCamp', 'Nunca es buena idea perderte una WordCamp  pero este año tenemos Automattic por partida doble. Repite Zé Fontainhas, al que no descarto que adoptemos en España en un futuro cercano (jeje), pero este año se nos suma nada menos que Karim Osman, "happiness enginer" de Automattic, que nos contará las interioridades de la empresa que hace posible cada día WordPress.com.', '', '2005-10-06', 1),
  49. (7, 'Novedades de WordPress 3.1', 'Si ya te estás mordiendo las uñas por saber que nos traerá WordPress 3.1, y no quieres esperar a que nos lo cuente Zé Fontainhas en WordCamp, aquí tienes las más importantes novedades de esta versión que, si no cambia la programación, estará disponible  en su versión definitiva para finales de este año o principios de 2.011.', '', '2005-10-06', 0),
  50. (8, ' WordPress y Tumblr', 'Seguro que no se te ha escapado el detalle de que WordPress está últimamente incorporando funcionalidades que hasta ahora distinguían a Tumblr.', '', '2005-10-07', 1),
  51. (9, 'Descubre a quien le gustan tus entradas', 'Ya casi es monotema hablar de WordPress.com pero es que en Automattic están desbocados últimamente con novedades, y la de hoy es - aunque parezca poca cosa - muy importante.', '', '2005-10-08', 1);

2. Crea tu index.php y copia este código. No olvides conectarlo a la base de datos:

Código PHP:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>Indice</title>
  6. <style type="text/css">
  7. * { margin: 0; padding: 0; }
  8. body { font: normal normal normal 11px/20px Verdana, Tahoma, Arial, Helvetica, sans-serif; color: #444; background: #fff; }
  9. h1 { font: bold normal normal 13px/17px Verdana, Tahoma, Arial, Helvetica, sans-serif; color: #777; margin: 0 0 4px; clear: both; text-align: left; border-bottom: 1px solid #ddd; padding-bottom: 6px; }
  10. h2 { font: normal normal normal 13px/17px "Lucida Sans Unicode", "Lucida Grande", "Trebuchet MS", Trebuchet, Arial, Helvetica, sans-serif; text-transform: uppercase; color: #0077b2; margin: 0 0 4px; clear: both; }
  11. a { text-decoration: none; color: #0077b2; }
  12. p { margin-bottom: 10px;}
  13. ul { text-align: center; list-style: none; margin: 20px auto; height: 20px; overflow: hidden; }
  14. li { width: 20px; height: 20px; text-align: center; background: #4ca0c9; color: #fff; font-weight: bold; display: block; float: left; margin-right: 6px; }
  15. li a { width: 20px; height: 20px; line-height: 20px; display: block; background: #eaeaea; }
  16. li a:hover { background: #0077b2; color: #fff; }
  17. li.anterior, li.siguiente, li.anterior a, li.siguiente a { width: 100px; display: block; }
  18. #contenedor { width: 600px; margin: 50px auto; }
  19. </style>
  20. </head>
  21. <body>
  22. <div id="contenedor">
  23. <h1>Script para paginar en PHP</h1>
  24. <?php
  25. /*  Script para paginar en PHP
  26.     2005 - Originalmente creado por Mauro Rondinelli de http://www.elguruprogramador.com.ar
  27.     2010 - Actualizado por Darío Ferrer de http://www.darioferrer.com
  28.     Función para convertir caracteres a utf-8: Guillermo Pérez (@mayid).
  29.     Textos de ejemplo tomados de: www.AyudaWordPress.com
  30.  
  31.     Copyright 2005 - 2010
  32.  
  33.     This program is free software; you can redistribute it and/or modify
  34.     it under the terms of the GNU General Public License as published by
  35.     the Free Software Foundation; either version 2 of the License, or
  36.     (at your option) any later version.
  37.  
  38.     This program is distributed in the hope that it will be useful,
  39.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  40.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  41.     GNU General Public License for more details.
  42.  
  43.     You should have received a copy of the GNU General Public License
  44.     along with this program; if not, write to the Free Software
  45.     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  46. */
  47.  
  48. $bd = ''; // nombre de tu base de datos
  49. $usuario = ''; // usuario de la base de datos
  50. $clave = ''; // clave de la base de datos
  51. $url = 'http://localhost/pruebas/paginacion-php/'; // URL raiz de tu archivo
  52. $registros = 2; // Número de ítems por página.
  53.  
  54. function conectar() {
  55.     global $bd, $usuario, $clave;
  56.     if ( !( $link = mysql_connect('localhost', $usuario, $clave) ) ) {
  57.         echo 'Error conectando a la base de datos.';
  58.         exit();
  59.     }
  60.     if ( !mysql_select_db($bd, $link) ) {
  61.         echo 'Error seleccionando la base de datos.';
  62.         exit();
  63.     }
  64.     return $link;
  65. }
  66.  
  67. function codif($in_str) {
  68.     /* Función para convertir a utf-8 en caso necesario, por Guillermo Pérez (@mayid) */
  69.     $cur_encoding = mb_detect_encoding($in_str);
  70.     if( $cur_encoding == 'utf-8' && mb_check_encoding($in_str,'utf-8') )
  71.         return $in_str;
  72.     else
  73.         return utf8_encode($in_str);
  74. }
  75. $db = conectar();
  76. $pagina = isset($_GET['pagina']) ? $_GET['pagina'] : null;
  77. $html = null;
  78. $paginador = null;
  79. if (!$pagina) {
  80.     $inicio = 0;
  81.     $pagina = 1;
  82. } else
  83.     $inicio = ($pagina - 1) * $registros;
  84.  
  85.     $reg = mysql_query('SELECT id FROM articulos WHERE visible = 1');
  86.     $total_registros = mysql_num_rows($reg);
  87.     $resultados = mysql_query('SELECT * FROM articulos WHERE visible = 1 ORDER BY fecha ASC LIMIT '. $inicio .' , '. $registros);  
  88.     $total_paginas = ceil($total_registros / $registros);                  
  89.     if($total_registros) {
  90.         //Código del paginador
  91.         $paginador .='
  92.         <ul class="paginador">';
  93.         if(($pagina - 1) >= 2)
  94.             $paginador .='<li class="anterior"><a href="'. $url .'?pagina='. ($pagina - 1) .'">&laquo; Anterior</a></li>' . "\n";
  95.         elseif(($pagina - 1) == 1)
  96.             $paginador .='<li class="anterior"><a href="'. $url .'">&laquo; Anterior</a></li>' . "\n";
  97.         for ($i = 1; $i <= $total_paginas; $i++) {
  98.             if ($i == $pagina)
  99.                 $paginador .='<li class="actual">'. $pagina .'</li>' . "\n";
  100.             elseif($i == 1)
  101.                 $paginador .='<li><a href="'. $url .'" title="ir a la página 1">1</a></li>' . "\n";
  102.             else
  103.                 $paginador .='<li><a href="'. $url .'?pagina='. $i .'" title="ir a la página '. $i .'">'. $i .'</a></li>' . "\n";
  104.         }
  105.         if( ($pagina + 1) <= $total_paginas )
  106.             $paginador .='<li class="siguiente"><a href="'. $url .'?pagina='. ($pagina + 1) .'">Siguiente &raquo;</a></li>' . "\n";
  107.         $paginador .='</ul>';
  108.         // Fin paginador
  109.         $html .= $paginador;
  110.         while( $articulo = mysql_fetch_array($resultados) ) {
  111.             $html .= '
  112.             <h2>'.codif($articulo['titulo']).'</h2>
  113.             <p class="contenido">'. codif($articulo['descripcion']) .'</p>';
  114.         }
  115.     } else
  116.         $html .='
  117.         <p class="sin-resultados">(No hay resultados para mostrar)</p>';
  118. $html .= $paginador;
  119. echo $html;
  120. ?>
  121. </div>
  122. </body>
  123. </html>
Hace tiempo necesitaba hacer una paginación y me dediqué a probar varios scripts. Encontré éste y -a pesar de que fue necesario modificarlo- me pareció el mejor debido a su sencillez y eficacia.