Paginación de resultados con PHP

Cuando tenemos muchos registros y no queremos mostrar una lista de registro muy larga podemos usar paginación para mostrar los resultados de la consulta en distintas páginas. La paginación de resultados se puede conseguir con PHP.

En muchas ocasiones, cuando se presentan en una página web registros de una base de datos, se deberían mostrar demasiados registros como para colocarlos todos en una única página.

En estas ocasiones se suele paginar los resultados, quizás cientos, en distintas páginas con conjuntos de registros mucho menos numerosos. Por ejemplo, podríamos presentar los resultados en páginas de 10 elementos o 20, dependiendo de nuestras intenciones y el tipo de datos que se estén presentando. Este efecto lo has podido observar repetidas veces en los buscadores.

Para realizar este tarea es posible trabajar con PHP y MySQLi.

En el ejemplo en funcionamiento que hemos preparado para este tutorial mostramos el número total de artículos o elementos.

En cada página se muestran 6 artículos ordenados por fecha de actualización en formato descendente. En todo momento mostramos el número de página que estamos viendo.

Los enlaces de la paginación se pueden poner arriba o abajo. En el ejemplo hemos decidido ponerlo después de mostrar los artículos. Justo debajo se ve mejor y es más lógico por temas de usabilidad pero tu puedes ponerlo donde más desees.

Conexión con la base de datos

Para implementar lo que estamos comentando lo primero que debemos hacer es conectar con la base de datos que vamos a tratar y ejecutar la primera consulta. Al principio del todo, en tu archivo PHP, antes de abrir cualquier etiqueta HTML, coloca el siguiente código:

<?php 
require('config.php');
$result = $connexion->query('SELECT COUNT(*) as total_products FROM product WHERE active = 1');
$row = $result->fetch_assoc();
$num_total_rows = $row['total_products'];
?>

En esta porción de código que será lo primero que se ejecute, estamos incluyendo un archivo config.php que usamos para la configuración y conexión con la base de datos. Este archivo contiene:

<?php
define('DB_SERVER', 'localhost');
define('DB_SERVER_USERNAME', 'your_data_base_username');
define('DB_SERVER_PASSWORD', 'your_data_base_password');
define('DB_DATABASE', 'your_data_base_name');
define('NUM_ITEMS_BY_PAGE', 6);
 
$connexion = new mysqli(DB_SERVER, DB_SERVER_USERNAME, DB_SERVER_PASSWORD, DB_DATABASE);
?>

En él tan solo definimos varias constantes para conectar con la base de datos y definimos el número máximo de artículos por página. En este caso deseamos que los elementos sean paginados de 6 en 6.

Después de conectar con la base de datos, hacemos una consulta a la tabla de productos en este caso para obtener el número total de registros que depositamos en la variable $num_total_rows.

Paginación

El código más interesante debes colocarlo dentro del cuerpo de la página, dentro de la etiqueta <body>:

<?php
if ($num_total_rows > 0) {
    $page = false;
 
    //examino la pagina a mostrar y el inicio del registro a mostrar
    if (isset($_GET["page"])) {
        $page = $_GET["page"];
    }
 
    if (!$page) {
        $start = 0;
        $page = 1;
    } else {
        $start = ($page - 1) * NUM_ITEMS_BY_PAGE;
    }
    //calculo el total de paginas
    $total_pages = ceil($num_total_rows / NUM_ITEMS_BY_PAGE);
 
    //pongo el numero de registros total, el tamano de pagina y la pagina que se muestra
    echo '<h3>Numero de articulos: '.$num_total_rows.'</h3>';
    echo '<h3>En cada pagina se muestra '.NUM_ITEMS_BY_PAGE.' articulos ordenados por fecha en formato descendente.</h3>';
    echo '<h3>Mostrando la pagina '.$page.' de ' .$total_pages.' paginas.</h3>';
 
    $result = $connexion->query(
        'SELECT * FROM product p 
        LEFT JOIN product_lang pl ON (pl.id_product = p.id_product AND pl.id_lang = 1) 
        LEFT JOIN `image` i ON (i.id_product = p.id_product AND cover = 1) 
        WHERE active = 1 
        ORDER BY date_upd DESC LIMIT '.$start.', '.NUM_ITEMS_BY_PAGE
    );
    if ($result->num_rows > 0) {
        echo '<ul class="row items">';
        while ($row = $result->fetch_assoc()) {
            echo '<li class="col-lg-4">';
            echo '<div class="item">';
            echo '<h3>'.$row['name'].'</h3>';
            ...
            echo '</div>';
            echo '</li>';
        }
        echo '</ul>';
    }
 
    echo '<nav>';
    echo '<ul class="pagination">';
 
    if ($total_pages > 1) {
        if ($page != 1) {
            echo '<li class="page-item"><a class="page-link" href="index.php?page='.($page-1).'"><span aria-hidden="true">&laquo;</span></a></li>';
        }
 
        for ($i=1;$i<=$total_pages;$i++) {
            if ($page == $i) {
                echo '<li class="page-item active"><a class="page-link" href="#">'.$page.'</a></li>';
            } else {
                echo '<li class="page-item"><a class="page-link" href="index.php?page='.$i.'">'.$i.'</a></li>';
            }
        }
 
        if ($page != $total_pages) {
            echo '<li class="page-item"><a class="page-link" href="index.php?page='.($page+1).'"><span aria-hidden="true">&raquo;</span></a></li>';
        }
    }
    echo '</ul>';
    echo '</nav>';
}
?>

Parece mucho código y complicado pero si te paras a mirarlo un momento es bastante sencillo de entender.

Lo primero que hacemos es establecer y calcular variables importantes para el proceso.

  • $page -> contiene el número de página actual. Puede ser falso si entramos por primera vez y estamos en la primera página.
  • $start -> se calcula para obtener el límite de la consulta y su valor dependerá de la página en la que estemos.
  • $total_pages -> Contiene el total de páginas.
  • NUM_ITEMS_BY_PAGE -> Está en el archivo config.php definida y representa el número de elementos por página.

El número de registros totales, el número de elementos por página y la página actual se muestran por pantalla.

A continuación realizamos la consulta donde sacamos todos los productos activos ordenados por fecha de actualización en formato descendente y limitado a 6 productos. Si hay datos, recorremos los resultados para mostrar la información que nos interese de los productos.

Después del bucle, solo queda agregar el código de la paginación, que no son más que enlaces dinámicos.

La maquetación o diseño de este ejemplo está basada en la tecnología Bootstrap 4.

Ver demo Descargar

Autor
Escrito por Jose Aguilar - Director ejecutivo y tecnológico en JA Modules. Experto programador PrestaShop y Experto programador WordPress.
Te ha servido? Valora esta entrada!
(61 votos, promedio: 5 de 5)
Comparte en las redes sociales
¿Buscas trabajo de programador?

126 respuestas a “Paginación de resultados con PHP”

  1. Emmanuel Velazquez Alvarez dice:

    Hola, podrías facilitar la estructura de las tablas de la base de datos porfa

    • Jose Aguilar dice:

      Hola, me gustaría poder pasarte la base de datos pero se está sacando la información de una base de datos real. La estructura la puedes ver una una instalación limpia de la plataforma ecommerce PrestaShop.

  2. renny delado dice:

    Saludos buen aporte.

    Queria saber si me puedes proporcionar la base de datos del ejemplo cuando descargo el archivo no veo la base de datos.

    • Jose Aguilar dice:

      Hola,

      Lamento decir que no puedo pasarte la base de datos como tal ya que se trata de información de un sitio real.

      Si te interesa, puedo localizarte la estructura de la tabla «product» pero sin contenido

      Saludos

  3. Alvaro dice:

    Muchas gracias por la información, yo tengo 15 000 productos y en cada pagina muestro de 10 en 10. Obviamente me salen 1500 páginas arriba en el índice. ¿Cómo puedo hacer para que solo me aparezcan 10 o 20?

    • Jose Aguilar dice:

      En este caso, tienes que armar la lógica para mostrar en el paginador a algo como lo que sigue:

      1 2 3 4 5 … 1495 1496 1497 1498 1499

      En algún proyecto lo he hecho pero no recuerdo en cual. Solo tienes que pensar y cambiar la lógica de visualización de los números de la paginación.

      Me lo anoto para hacer un tutorial con una solución para esto

  4. leonardo jimenez dice:

    tengo un problema con la paginación, cuando traigo valores desde la base por un filtro, en la primer pagina me muestra los elementos de la consulta, pero cuando paso a la siguiente pagina se borra la consulta que se realizo y se muestra todo lo que contiene la base de datos, espero puedan ayudarme.

  5. Carlos Santaella dice:

    esta bien pero le falto poner esa páginación en los comentarios xD

  6. Rodrigo Acosta dice:

    Hola José antes que nada quiero darte las gracias porque siempre me salvas en lo que necesito. Ahora te quería hacer una consulta para llevarlo esto a SQL Server cambie hasta llegar a la consulta y la limitación de registros. Como ahí es diferente la estructura en vez de LIMIT se utiliza el TOP pero no me funciona igual ya que los mismos primeros tres registros muestra en todas las paginas quería saber si habría otra solución?

    • Jose Aguilar dice:

      Hola Rodrigo,

      Lamento decir que en SQL Server no podría darte mucho soporte ya que nunca lo he utilizado.

      Si el SQL Server funciona con SQL lo de TOP no me cuadra.

      Saludos

  7. Chris dice:

    Excelente post, funciona a la perfección con mysqli y php.

    El problema que tengo es al «traducir» las sentencias mysql a wordpress, podrías ayudarme con esto:

    mysql
    $result = $connexion-> query(‘SELECT COUNT(*) as total_countries FROM pais’);
    $row = $result->fetch_assoc();
    $result = $wpdb->get_results(«SELECT * FROM $table_papi_clients LIMIT 1,5»);
    $num_total_rows = $row[‘total_countries’];

    wordpress
    global $wpdb;
    $tabla_paises = $wpdb->prefix . ‘paises’;
    $row = $wpdb->get_results(«SELECT * FROM $table_paises»);
    $num_total_rows = $wpdb->get_var(«SELECT COUNT(*) FROM $table_paises»);

    El problema viene aquí, como sería una sentencia válida en wordpress?

    //Lista con cada item
    $result = $connexion->query(‘SELECT * FROM wp_pais LIMIT ‘.$start.’, ‘.NUM_ITEMS_BY_PAGE);
    $result = $wpdb->get_results(«SELECT * FROM $table_paises LIMIT $start,NUM_ITEMS_BY_PAGE»);
    $num_rows = $wpdb->get_var(«SELECT COUNT(*) FROM $table_papi_clients LIMIT $start,NUM_IT…»);
    if ($num_rows > 0) {
    echo »;
    while ($row = $result) {
    ?¿?¿?¿? Si lo anterior estuviera bien, me faltaría mostrar los resultados de la página

    Gracias de antemano

    • Jose Aguilar dice:

      Hola,

      Sería questión de probar.

      La primera prueba que haría sería cambiar esto;

      $num_total_rows = $wpdb->get_var(«SELECT COUNT(*) FROM $table_paises»);

      y poner:

      $num_total_rows = count($row);

      e ir probando cosas hasta que des con el resultado.

      Saludos

  8. Sergio dice:

    ¿algún modo de hacer que cuando salgan tantas páginas que no quepan en lo ancho de la pantalla la paginación se autoajuste y muestre solo las que quepan? En mi caso salen 320 páginas mostrando de 20 en 20, y pues no cabe la tira de páginas en la pantalla.

  9. Francisco dice:

    Hola
    Solo paso a agradecer te tu aporte, me funciono al 100%.
    https://meridaelite.com/blog/

  10. benjamin dice:

    hola por favor hay la posibilidad de adjuntar su base de datos esto nos ayudaria entende mejor.

    • Jose Aguilar dice:

      Hola,

      Lamento decir que no hay posibilidad de facilitar los datos de esta base de datos ya que estoy interactuando directamente con una tienda en linea.

      Si necesitas ver la estructura de las tablas puedes descargar un PrestaShop última versión (1.7) para fijarte en las tablas ps_product y ps_product_lang.

      Saludos

  11. Jack More dice:

    Hola, no entiendo muy bien la parte de
    << echo '’.strip_tags(utf8_encode($row[‘description_short’])).»;
    echo ».round($row[‘price’], 2).’ EUR’; >>
    Esto es cuando muestras todos los resultados, dos preguntas;
    Yo tengo una base muy simple en phpmyadmin. Que campos tengo que cambiar? aqui donde se hace la llamada, al texto guardado,(la llamada he visto que se hace antes, pero que es todo en conjunto?)
    la otra pregunta es; el diseño de como se muestran donde esta especificado, en el style.css, o en eso que pone .col-sm-4.

    Me gusta mucho esto, fue gracias a un amigo que me recomendo esta pagina web.

    • Jose Aguilar dice:

      Hola,

      Gracias por tu mensaje.

      Es posible que los campos que se usan en este ejemplo no sean iguales a los de tu base de datos. Tan solo los debes cambiar según tu necesidad.

      Para el diseño estamos usando la tecnología Bootstrap y para alguna especialización el archivo styles.css que viene incluido en la descarga.

      Los col-sm-4 son clases de Bootstrap.

      Saludos

  12. Nicolas dice:

    Soy muy novato en esto, quisiera saber si este código me sirve para esta página:

    https://nicolasvesga.github.io/mariacamilaperez/index.html

    No sé como implementarlo para mostrar 5 fotos por página,

    • Jose Aguilar dice:

      Hola,

      No hemos podido ver el enlace indicado. Quizás no está disponible temporalmente.

      De todas formas, si las imágenes vienen de una base de datos no creo que tengas problemas para adaptar este tutorial a tu código.

      Saludos

  13. Hola Jose Aguilar la verdad me sirvio y funciona al 100 solo tengo una duda como puedo hacer para agrupar el paginador ya que si tengo no se 100 paginas se ven en lineas los numeros de las paginas y mas bien separarlas para que se vean de no se 10 en 10 paginas no se si me doy a entender gracias de antemano

    • Jose Aguilar dice:

      Hola,

      Para resolver este problema tienes 2 posibilidades:

      1- Mostrar más artículos por página para disponer de menos números en el paginador.
      2- Modificar el código para mostrar los números de páginas de 5 en 5, en vez de 1 o 1 como en el ejemplo en funcionamiento.

      Saludos

  14. Andres dice:

    Me sirvió amigo gracias

  15. Carloss Enrique Mercado Poveda dice:

    Jose gracias por tu publicacion me has salvado un resto, tengo el problema cuando he traido los valores de la base de datos filtrados por una categoria especifica, me sale el resultado en la primera pagina, pero en la segunda se pierde el filtro, que puedo hacer? gracias

  16. Daniel dice:

    y como hacemos para que no muestre las 16 paginas sino que valla mostrando digamos de 5 en 5

  17. Javier Eduardo dice:

    Hola.
    Tengo un error en cuanto a los registros de la BD, ya puse los numeros para la paginacion pero la tabla no se divide, se queda tal y como esta, ¿que debo hacer?

  18. luis dice:

    una pregunta donde se encuentran la base de datos

    • Jose Aguilar dice:

      Hola buenos días,

      La base de datos la debes crear en tu servidor. Lo que te puede facilitar es el código de creación de la tabla que se usa en el ejemplo que es la siguiente:

      CREATE TABLE `noticias` (
      `idNoticia` int(10) NOT NULL,
      `seccion` int(10) NOT NULL,
      `titulo` varchar(75) NOT NULL,
      `resumen` text NOT NULL,
      `cuerpo` text NOT NULL,
      `metadescripcion` text NOT NULL,
      `keywords` varchar(255) NOT NULL,
      `imagen` varchar(75) NOT NULL,
      `lecturas` int(10) NOT NULL,
      `fecha_insercion` datetime NOT NULL,
      `fecha_modificacion` datetime NOT NULL,
      `destacado` int(10) NOT NULL
      ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

  19. Margarita dice:

    Hola, muchas gracias por tu aporte, me está siendo de utilidad, pero tengo un problema y es que me muestra bien la primera página de paginación, pero cuando intento acceder a las demás me da un error 404. La página donde muestro la paginación es un template. Cómo puedo hacerlo?

  20. alex dice:

    Excelente explicacion sr. Aguilar.

    Saludos!

  21. Carlos Gil dice:

    Hey te pasaste mil gracias por quitarme un dolor de cabeza, graciasss….

  22. aninimo dice:

    Como lo uso? 🙁

  23. oswldo dice:

    hola buen aporte muchas gracias!, te queria hacer la pregunta si tienes una paginacion con letras y numeros

  24. luis ramirez dice:

    buenas noches excelente aporte.. una pregunta te dejo si quisiera agregarle un select .. como seria??
    saludos

  25. Sergio dice:

    Buenos días, mil gracias por el aporte.

    En lugar de imprimir 10 registros por página imprime todos los registros de la BD. 111 en total.

    A parte la paginación siempre esta en el uno (1), 2, 3, 4, 5, 6… no me deja avanzar página, en cambio en la url si me detecta la id (paginas.php?pagina=2,3,4,5…).

    Por decirle algo más no me da ningún error, ni en la consulta, ni variables no definidas o de sintaxis.

    Gracias de nuevo!!

  26. Andy dice:

    Hola José llevo tiempo estudiando por mi propia cuenta y todo lo que he aprendido fue leyendo libros viejos porque ni internet tenia, En mis quebraderos de cabeza logre hacer un paginado sin mirar ningún ejemplo, como digo yo un paginado de piedra, bien rustico y tosco pero que al final me funciono, por otro lado tiene el doble de código que el tuyo, Ahora que veo el tuyo y lo simple que es hacerlo te doy las gracias por eso. Ahora estoy incursionando en la POO y en los frameworks en PHP y MySQL si puedes sugerirme video tutoriales o libros te lo agradecería. De casualidad tienes una versión de este paginador en POO?? Saludos desde Cuba.

  27. Rafael dice:

    Buenas, muy buen aporte.
    Pero si cargo los resultados en un div luego el panel de navegacion me redirije a una pagina en blanco en la que carga los resultados, me gustaria que siguiese en el div, alguna ayudita? 😮

  28. eduardo genud dice:

    bien pelao..

  29. Claus dice:

    me da el valido xD
    gracias sufri mucho por encontrar algo bien explicado te lo agradezco muchisimo!!!

  30. Pedro dice:

    Gracias José, Me ha ayudado muchisimo, sigue así…

  31. Sergio dice:

    En esta parte me da problemas
    «$total_paginas = ceil($num_total_registros / $TAMANO_PAGINA);»
    por que si tengo digamos 13 campos y mi variable $TAMANO_PAGINA vale 5, el resultado es 2, con residuo de 3, por lo tanto no me muestra el número con la página que contiene los últimos 3 elementos.

    • nacho dice:

      En principio al utilizar ceil no debería darte ese problema puesto que redondea hacia arriba el valor más cercano, por lo tanto si cuentas con 13 registros y sólo dejas 5 registros por cada página, el resultado de dividir 13/5 sería 2,6 por tanto debe redondear a 3 páginas.

      Muy bien explicado Jose, me ha ayudado mucho.

  32. Chiara dice:

    Hola josé,
    Muchas gracias por compartir el codigo, funciona de maravillas y esta perfectamente explicado.
    Te hago una consulta nomas, estoy tratando de adaptarlo para que los resultados aparezcan en 4 columnas pero no logro hacerlo, siempre me queda un resultado debajo del otro ya sea que use tablas o listas.
    Tendras algun ejemplo de como encolumnar el resultado???
    Ej, que quede una grilla de 4×4 en cada pagina, no uno debajo del otro.
    Muchisimas gracias
    Saludos y que tengas muy buen dia
    Chiara

  33. Lorena Ramirez dice:

    Mil gracias, me fue de gran ayuda. Ya tenia un sistema en funcionamiento y actualice el wamp y se me daño la paginación que tenia. Este codigo me funcionó perfectamente 😀

  34. Carmela dice:

    Undefined index: pagina

  35. saul dice:

    hola como puedes mostrar el numero de paginas en 10 en 10 e ir aumentando en tu ejemplo se muestran de 1,2,3,4,5,6… hasta 16 pero al tener 32 se muestran 1,2,3,4,5…32 te imaginas si tengo 100 como le puedo hacer para hacerlo mas practico

    • Jose Aguilar dice:

      Si, es posible, solo tienes que modificar un poco el código condicionando los enlaces a mostrar cuando superen x páginas.

      • Williams A. dice:

        Hola Jose, buenas tardes… oye me encanto tu post y me esta ayudando bastante. quisiera saber si podrias ayudarme con una cosita mas. como haces para linkear el contenido que muestra cada pagina como lo hiciste en el ejemplo en funcionamiento? si se supone que el contenido lo muestra con un while, como hiciste para crear un id linkeado en cada registro consultado con el que redireccionas al darle click, sin que al darle click te redireccione al ultimo id como resultado del while. espero hayas entendido la pregunta y espero puedas ayudarme 😉

        • Jose Aguilar dice:

          Hola, es lo último que explico en el post. El tema de la paginación. Tan solo debes hecharle un vistazo más detenidamente al código y verás que lo acabarás entendiendo. Estamos como dividiendo en partes el resultado del while. La clave del asunto está en el uso de LIMIT en la consulta. Si te queda claro siempre puedes enviarnos un email a blog@jose-aguilar.com donde podemos llegar a un acuerdo para planificar una explicación más personalizada. Saludos

      • saul dice:

        pero no logro hacerlo aunque la idea es de 10 en 10 o sea
        si es la segunda pagina la numeracion es 2,3,4,5,6,7,8,9,10,11
        si es la tercera pagina seria asi 3,4,5,6,7,8,9,10,11,12

        eso es lo que trato de hacer pero no puedo, alguien que pueda ayudarme??

  36. jose perez dice:

    como puedo darle estilo a los numeros de las paginas (1,2,3 etc) y a las flechas? porque le aplico css a los numeros pero nada que puedo cambiar la posicion de los mismos

    • Jose Aguilar dice:

      hola, para añadirle estilo a los números antes deberás añadirle al enlace el atributo class=»number» por ejemplo:

      a href=»#» class=»number» rel=»nofollow»

      y luego en la hoja de estilo:

      a.number {
      color: red;
      }

      Saludos

  37. Gustavo dice:

    Hello!!
    realice el siguiente cambio y me funciona OK!
    $pagina = «»;

    if(isset($_GET[«pagina»])){
    $pagina = (int)$_GET[«pagina»];
    }

    if ($pagina ==0 || $pagina==»» ){
    $inicio= 0;
    $pagina= 1;
    }else{
    $inicio =($pagina -1) * $TAMANO_PAGINA;
    }

  38. Gustavo dice:

    Buenas, no he entendido el tema de la pagina = $_GET[‘pagina’] me sigue mostrando el error: Undefined index: pagina
    es el unico error que me muestra el codigo, podrian darme una explicación sencilla sobre el tema?

  39. k dice:

    tengo el siguiente problema :
    Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\prueba.php on line 36
    1
    Notice: Undefined variable: url in C:\xampp\htdocs\prueba.php on line 50
    2
    Notice: Undefined variable: url in C:\xampp\htdocs\prueba.php on line 53

    que es lo que hago mal??

    • Jose Aguilar dice:

      Hola buenas tardes,

      Vemos que en el código del ejemplo falta definir la url. En el caso del ejemplo:
      $url = «http://www.jose-aguilar.com/scripts/php/paginacion/index.php»;

      En tu caso tendrás que poner la ruta completa + prueba.php

      Saludos

  40. genesis dice:

    gracias por la información es muy buen he estado buscando por todos lados y me alegro de haber llegado a tu pagina solo tengo la siguiente inquietud y desesperación espero que por favor me ayudes con esto…

    cuando sigo tu codigo me sale error en la parte de :

    $pagina=$_GET[«pagina»]; no se que hace ahi

    y lo otro

    es que solo me muestra las 10 primera pero cuando le doy siguiente no me salen las demas

    ayudaaaaaa

  41. Victor Manuel dice:

    Muchas gracias por el tutorial muy bueno y me sirvio saludos

  42. Jesus Bolivar dice:

    Hola porfavor podrias ayudarme, estoy haciendo una tienda virtual y quiero hacer una paginacion para los productos de mi tienda, hasta ahora he hecho el codigo al pie de la letra como tu lo posteas pero el problema es que no se que colocar en el $_GET[] en tu caso es pagina pero en mi caso es algo como

    ?section=catalogo pero me dice undefined index y no se que hacer. Esa url que tengo esta en un servidor xampp y la obtengo de esa forma porque utilize un switch en mi index dentro de mi etiqueta section para hacer el contenido dinamico, el codigo del switch es algo asi:

    <?php
    if (! isset($_GET['section'])){
    include('inicio.php');
    }else{
    $section= $_GET['section'];
    switch($section){
    case 'inicio':
    include('inicio.php');
    break;
    case 'quienes_somos':
    include('quienes_somos.php');
    echo "document.title=’.:Quienes Somos:.’;»;
    break;
    case ‘catalogo’:
    include(‘catalogo.php’);
    echo «document.title=’.:Cata\u0301logo:.’;»;
    break;
    case ‘contactanos’:
    include(‘contactanos.php’);
    echo «document.title=’.:Conta\u0301ctanos:.’;»;
    break;
    default:
    include(‘inicio.php’);
    break;
    }
    }
    ?>

  43. pablo dice:

    Hola, te hago una consulta, probé tu script y funciona muy bien, sin embargo cuando uso url amigables, no funciona, me muestra siempre la primera pagina, porque puede ser?

  44. Gonzalo dice:

    Excelente José!! una vez más me ahorraste un montón de tiempo. Te felicito y muchas gracias. Saludos

  45. Guillermo dice:

    Hola José, voy a utilizar tu ejemplo para hacer una consulta.
    Ya tengo la paginación, el problema es que cuando google entra en un articulo que tengo paginado, en tu ej. seria «Toggle Content», quiero tener un link para ir a la pagina donde se encontraría «Toggle Content». Supongamos que es la 7.
    Como hago para saber en que pagina está el registro o articulo «Toggle Content» para armar el link a la paginación. (Como se que está en la 7)
    Quiero saber en que pagina cae el articulo, luego armo el link a esa pagina.
    Esto es para google porque el usuario puede usar el back.

  46. gabriel vazquez dice:

    a este script se le podria adaptar que los resultados sean 123…20?

    saludos

  47. Josue dice:

    hola oye me marca erro tu codigo en esta pare:

    $query_num_ratings = mysql_query(«SELECT COUNT(*) as num FROM services_rating WHERE rating_id=».$row_services[‘service_id’], $conexion);
    $num_ratings = mysql_result($query_num_ratings, 0, «num»);

    $query_sum_ratings = mysql_query(«SELECT SUM(rating_num) as sum FROM services_rating WHERE rating_id=».$row_services[‘service_id’], $conexion);

    espero me puedas ayudar o asesorar vale muchas gracias.

  48. pedro dice:

    buenas jose una pregunta ese codigo solo se utiliza con php o hay que incluir ajax?

    • Jose Aguilar dice:

      Hola buenos días,

      Esta es una forma de hacerlo únicamente con php recargando la página.

      Saludos

  49. Marcelo P dice:

    Mil gracias !!! solo es remplazar codigo, cambiar direccion de imagen de las flechas, yo personalmente le agregue la variable $url=»miPagina.php»; MUCHAS GRACIAS

  50. jhampoll dice:

    pagina

  51. jhampoll dice:

    me podrías explicar donde defino la variable búsqueda

    Notice: Undefined variable: pagina

    • Jose Aguilar dice:

      Puedes definirla inicialmente con valor null o vacío en el caso de que no exista el parámetro en la url, es decir, $_GET[‘pagina’]

  52. Kristopher Simbeck dice:

    Hola,

    mucho gusto y antes que nada felizidades por el trbajo que relizar en el tema de programacion,

    pero ahora me apoyo de ti para saber si me puedes sacar de un aporo y es que no he logrado el metodo de paginar este script:

    tabla.php

    $row[‘Codigo_de_Sistema’],
    ‘Proyecto’ => $row[‘Proyecto’],
    ‘Fecha_de_operacion_Inicio’ => $row[‘Fecha_de_operacion_Inicio’],
    ‘Fecha_de_operacion_Fin’ => $row[‘Fecha_de_operacion_Fin’],
    ‘Tickets_Emitidos’ => $row[‘Tickets_Emitidos’],
    ‘Tickets_Cobrados’ => $row[‘Tickets_Cobrados’],
    ‘Importe_Total_Cobrado’ => $row[‘Importe_Total_Cobrado’],
    ‘Tickets_Cortesia’ => $row[‘Tickets_Cortesia’],
    ‘Ticket_Promedio’ => $row[‘Ticket_Promedio’]
    );
    }
    echo json_encode($datos);
    }

    ?>

    js.js)

    // JavaScript Document
    var ordenar = »;
    $(document).ready(function(){

    // Llamando a la funcion de busqueda al
    // cargar la pagina
    filtrar()

    var dates = $( «#del, #al» ).datepicker({
    yearRange: «-50»,
    defaultDate: «+1w»,
    changeMonth: true,
    changeYear: true,
    onSelect: function( selectedDate ) {
    var option = this.id == «del» ? «minDate» : «maxDate»,
    instance = $( this ).data( «datepicker» ),
    date = $.datepicker.parseDate(
    instance.settings.dateFormat ||
    $.datepicker._defaults.dateFormat,
    selectedDate, instance.settings );
    dates.not( this ).datepicker( «option», option, date );
    }
    });

    // filtrar al darle click al boton
    $(«#btnfiltrar»).click(function(){ filtrar() });

    // boton cancelar
    $(«#btncancel»).click(function(){
    $(«.filtro input»).val(»)
    $(«.filtro select»).find(«option[value=’0′]»).attr(«selected»,true)
    filtrar()
    });

    // ordenar por
    $(«#data th span»).click(function(){
    var orden = »;
    if($(this).hasClass(«desc»))
    {
    $(«#data th span»).removeClass(«desc»).removeClass(«asc»)
    $(this).addClass(«asc»);
    ordenar = «&orderby=»+$(this).attr(«title»)+» asc»
    }else
    {
    $(«#data th span»).removeClass(«desc»).removeClass(«asc»)
    $(this).addClass(«desc»);
    ordenar = «&orderby=»+$(this).attr(«title»)+» desc»
    }
    filtrar()
    });
    });

    function filtrar()
    {
    $.ajax({
    data: $(«#frm_filtro»).serialize()+ordenar,
    type: «POST»,
    dataType: «json»,
    url: «/Nueva_Pagina/Acosta_Verde/Resultados/Tabla_Resultados_Plaza las Torres Cd Juarez.php?action=listar»,
    success: function(data){
    var html = »;
    if(data.length > 0){
    $.each(data, function(i,item){
    html += »
    html += »+item.Fecha_de_operacion_Inicio+»
    html += »+item.Proyecto+»
    html += »+item.Tickets_Emitidos+»
    html += »+item.Tickets_Cobrados+»
    html += »+item.Importe_Total_Cobrado+»
    html += »+item.Tickets_Cortesia+»
    html += »+item.Ticket_Promedio+»
    html += »;

    });
    }
    if(html == ») html = ‘No se encontraron registros..’
    $(«#data tbody»).html(html);
    }
    });
    }

    en el index.php he insertado:

    Fecha
    Proyecto o Estacionamiento
    Tickets Emitidos
    Tickets Cobrados
    Importe Total Cobrado
    Tickets Cortesia
    Ticket Promedio

    Todo sale muy bien me da los resultados y el filtro si se aplica correctamente el tema es que la paginación no funciona adecuadamente.

    Por lo que reitero la solicitud de tu apoyo.

    Agradeciéndote infinitamente

    Kristopher Simbeck De México

  53. Pablo dice:

    Hola, excelente post. Tengo un problema. Al hacer la prueba en la raiz de la web no hay problema ninguno. Muestra los resultados paginados sin problema.

    Cuando quiero hacerlo en /pagina-de-prueba

    no funciona, la url cambia para /pagina-de-prueba?pagina=2
    pero no cambia el resultado mostrado sigue siendo lo mismo.

    alguna solución?

    he probado definiendo la variable url de dos formas

    $url = «http://www.miwebsite.com/pagina-de-prueba»;
    $url = «/pagina-de-prueba»;

    y no me funciona con ninguna.

    Help me please

  54. Lorenzo dice:

    Gracias por tu aporte me facilito el adaptarlo a MS SQL Server.
    Muchas Gracias..!!

  55. juve dice:

    tengo un problema el código me funciona pero me sale el error Undefined variable: url y no encuentro el error

  56. Ángel dice:

    ¡Muchas gracias, ha sido de gran ayuda y una solución fácil de entender!

  57. CIMO dice:

    Excelente post, Ademas la estructura de tu codigo es muy entendible. Gracias por compartirlo 😉

  58. EdoCL dice:

    EXCELENTE APORTE!!!
    Busqué por varias páginas, pero la tuya fue la más clara.

    Muchas gracias por el tiempo dedicado!

    Saludos!

  59. Carlos dice:

    Buenas tardes, he hecho todos los pasos descritos en la web y al buscar, me muestra los primeros 10 resultados, me pone el numero de paginas que tendria la web de manera correcta pero al pasar de página no me muestra ningun resultado, me muestra la web como si no hubiera buscado nada.

    ¿Alguien sabe donde estaria el fallo?

    Un saludo y gracias por el tutorial

  60. Ernesto dice:

    Mil gracias!!!! No sabes cómo me salvaste las papas, ja.
    Abrazo.

  61. Francisco dice:

    ¿A qué hueco de seguridad se refiere Richard?

  62. Richard dice:

    Si van a usar esto, editenlo hasta el punto de no tener fugas en la paginación, jose aguilar con ese ejemplo puede ser vulnerada tu pagina web, tiene un hueco gigantisimo de seguridad y manteniendolo en tu web, tu web tambien lo tiene, retiralo antes de que venga un troll y te dañe tu web 🙂 saludos!

  63. Vellenger dice:

    Muchas Gracias..
    Justo lo que que necesitaba…
    lo probe y funciona perfecto..

  64. Musiker dice:

    Hola José Aguilar, gracias por el código, pero en mi caso me muestra todo (es decir, número de registros, número de páginas etc) pero no muestra los propios resultados. En mi caso no son enlaces, sino números o palabras. ¿Por qué puede ser?

    Gracias por adelantado

  65. Ana dice:

    Hola,
    en la parte final no se qué estoy haciendo mal, porque me dice que no encuentra la página siguiente al intentar pasar a cualquier otra página.
    La url está bien, no se qué estoy haciendo mal 🙁

    Un saludo y gracias por anticipado.

  66. Junior dice:

    Hola te queria pregunta es un problema con el lo ultimo al hacer el menu de la paginacion cuando doy a siguiente o a otro numero se me empieza a duplicar en la url el: ?pagina=1?pagina=2?pagina=3 y asi todo el tiempo sabes por que sera? gracias por adelantado.

    • Jose Aguilar dice:

      Si, algo estás haciendo mal con la variable $pagina. Revísate el tutorial

    • Jose Garcia dice:

      HOla debe acegurarte que en la url le agregues esto: url?pagina=’1’&bla bla bla debes tener en cuenta que la siguiente pagina no tome la url de la anterior porque tu problema radica en que la url esta tomando la url anterior en la siguente… un saludo..

  67. Marc dice:

    Muchas gracias por el tutorial! Me ha ido super bien! 🙂

  68. Ezequiel dice:

    disculpa me puedes decir de donde sale esto $pagina = $_GET[«pagina»];
    me marca un error, me dice: Undefined index

  69. futmx dice:

    Excelente, muy bien aporte, me has ayudado mucho.

  70. carlospe dice:

    buen aporte amigo pero estoy tratando de hacer un catalogo para una tienda online y me preguntaba si se podrá adaptar para lo que yo quiero y como podría hacerlo

    • Jose Garcia dice:

      Amigo este tutorial de paginacion se adapta a cualquier proyecto.. la unica deficiencia es que no marca 123…293031…200

  71. Luis Hillon dice:

    Genial, fácil y efectivo.

  72. ayose dice:

    Hola, estupenda información pero como se podria poner para que saliera el indice de esta manera:

    1.2.3….14.15.16.

    Gracias y un saludo.

    • Javier García dice:

      Después de

      if ($pagina != 1)

      cambiar la etiqueta por una lista con estilos css, así lo hice yo:

      if ($pagina != 1)
      echo ‘ << ‘;

      for ($i=1;$i<=$total_paginas;$i++) {
      if ($pagina == $i)
      //si muestro el �ndice de la p�gina actual, no coloco enlace
      echo " {$pagina} «;
      else
      //si el �ndice no corresponde con la p�gina mostrada actualmente,
      //coloco el enlace para ir a esa p�gina
      echo ‘ ‘.$i.’ ‘;

      }
      if ($pagina != $total_paginas)
      echo ‘ >> ‘;

      Gracias por la explicación, muy clara y al punto.

  73. Daniel Báez dice:

    Gracias Jose, sencillo y preciso, te felicito!!! muy buen blog

  74. Danny Altrogge dice:

    Hello There. I discovered your blog the usage of msn. This is a really smartly written article. I will be sure to bookmark it and return to learn more of your useful info. Thank you for the post. I will certainly comeback.

  75. alan dice:

    m,y buen aporte, no sabes el quebradero de cabeza que estaba teniendo con esto de la paginacion me funciono en segundo gracias!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Ver más sobre