Paginación en PHP

Escrito por Mauro Rondinelli el Jueves 06 de Octubre de 2005 a las 00:00hs

Este articulo explica uno de los metodos mas faciles y eficientes para paginar resultados obtenidos de una base de datos en PHP.

Como primer tenemos nuestra base de datos, en nuestro caso la nombramos "noticias" y le a?adimos una tabla llamada "articulos" con la siguiente estructura...

CREATE TABLE `articulos` (
`id` INT NOT NULL AUTO_INCREMENT ,
`titulo` VARCHAR( 255 ) NOT NULL ,
`descripcion` TEXT NOT NULL ,
`contenido` TEXT NOT NULL ,
`fecha` DATE NOT NULL ,
`visible` TINYINT( 1 ) NOT NULL ,
PRIMARY KEY ( `id` )
);

Nosotros hemos cargado la tabla con los titulares de un diario, la paginaci?n final tiene este aspecto..

Pasemos a explicar el c?digo, primero hemos creado la funci?n de conexi?n a la base de datos...

function conectar()
{
$base_de_datos = "noticias";
$db_usuario = "root";
$db_password = "";

if (!($link = mysql_connect("localhost", $db_usuario, $db_password)))
{
echo "Error conectando a la base de datos.";
exit();
}
if (!mysql_select_db($base_de_datos, $link))
{
echo "Error seleccionando la base de datos.";
exit();
}
return $link;
}

No olviden modificar las variables $base_de_datos, $db_usuario y $db_password con sus correspondientes valores, esa funci?n puede ir en un include (seria lo mas recomendado), luego llamamos a la funcion...

$db = conectar();

Ya tenemos la variable $db apuntada a nuestra base de datos el siguiente paso es definir los valores por defecto, como por ejemplo cada cuantos art?culos paginar...

$registros = 3;

Y detectar si la variable $pagina (indica el numero de pagina actual) esta definida, si no es as? le damos el valor 1 ?sea que si no se paso por la url la variable $pagina (por ejemplo: "paginacion.php?pagina=2") entramos a la pagina 1 directamente...

$pagina = $_GET["pagina"];

if (!$pagina) {
$inicio = 0;
$pagina = 1;
}
else {
$inicio = ($pagina - 1) * $registros;
}

Como dato adicional la variable $inicio indica desde que registro empezar a mostrar los resultados. Pasemos al coraz?n de la paginaci?n, miremos primero el c?digo...

$resultados = mysql_query("SELECT id FROM articulos WHERE visible = 1");
$total_registros = mysql_num_rows($resultados);
$resultados = mysql_query("SELECT * FROM articulos WHERE visible = 1 ORDER BY fecha DESC LIMIT $inicio, $registros");
$total_paginas = ceil($total_registros / $registros);

Como ven realizamos 2 consultas similares en cuanto a su criterio de selecci?n ("WHERE visible = 1"). Con la primer consulta obtenemos el numero de resultados totales...

$resultados = mysql_query("SELECT id FROM articulos WHERE visible = 1");
$total_registros = mysql_num_rows($resultados);


Ese dato de $total_registros nos sirve para poder determinar la cantidad de paginas. La segunda consulta tiene en el SQL dos elementos a analizar, el primero es el ORDER BY que lo que hace es ordenar los resultados por fecha y de forma descendente ("DESC") en caso contrario usar?amos "ASC".

El segundo elemento a ver es LIMIT $inicio, $registros esa cl?usula SQL cumple la funci?n de limitar los resultados devueltos, el primer valor pasado como par?metro indica desde que registro empezar a devolver los resultados y el segundo par?metro indica la cantidad de registros que debe devolver desde $inicio.

Luego solo queda el bucle que devuelve los resultados...

while($articulo=mysql_fetch_array($resultados)) {

echo "".$articulo["titulo"]."
";
echo "".$articulo["descripcion"]."


";

}


Como parte final nos queda lo que seria el navegador de paginas...

El c?digo del navegador de paginas se divide en tres partes, primero la que muestra el link a la pagina anterior

if(($pagina - 1) > 0) {
echo "< Anterior ";
}


El link a la pagina anterior ser? visible siempre y cuando no estemos en la primer pagina ($pagina - 1) > 0). La segunda parte del navegador de paginas seria la que muestra la cantidad de paginas...

for ($i=1; $i<=$total_paginas; $i++){
if ($pagina == $i) {
echo "".$pagina." ";
} else {
echo "$i ";
} }


Y la tercer parte es la que muestra el enlace a la pagina siguiente...

if(($pagina + 1)<=$total_paginas) {
echo " Siguiente >";
}


En este caso muestra el enlace siempre y cuando no estemos en la ultima pagina (($pagina + 1)<=$total_paginas).

Podes descargar el ejemplo, lee el archivo leee.txt que esta dentro del ZIP para poder importar la base de datos y as? utilizar el ejemplo.


comentarios



  1. Hola: gracias por el ejemplo, pero tengo un problema mi base es access y accedo a ella utilizando adodb , en access no existe SELECT .... LIMIT ..
    Conocen la forma de lograr la painacion con access ?
    Desde ya muchas gracias



  2. Funciona de lujo ... gracias me ha servido mucho



  3. Hala, gracias por este simple pero completo script, la verdad me ayudo mucho ya que soy novato en esto, pero puede adaptarlo a lo que yo queria y me anda de LUJOOOO.

    Mucha suerte...



  4. Gracias, ya tenia rato que queria encontrar este script, otra vez gracias y saludos.



  5. El problema lo tienes si en la pagina que muestras el resultado añades algun criterio de filtrado y/o una condicion para ordenar :-(

    Un saludo y gracias



  6. Muy buen ejemplo excelente.



  7. hola amigos quisiera que me ayuden apesar de que he buscado mucho no ecncuentro la solucion a mi problema tengo un script que trabja muy bien en el se mustra el contenido de una tabla mysql todo funciona muy bien el problema es la estetica la tabla es muy grande y existen registros que tienen muchos caracteres por lo que hacen que las celdas se alarguen demasiado osea las celdas de la tabla se alargan mucho queria saber como hacer para que el contenido de la celda crezca hacia abajo y no hacia el lado para que la tabla no se se vea tan grande



  8. bacan compare funciona chevere lo adapte a mi script y quedo perfecto agradecido enormemente



  9. Muchas gracias estimado, excelente explicación.. ya he utilizado tu paginador para 2 proyectos ..


    :)



  10. Excelente. Y la explicación un lujo.



  11. Excelente.
    He usado su paginador en una pagina de juegos que recien estoy montando ahi dejo el link por si desean verlo en funcionamiento, solo modifique un tanto el codigo para ponerle unos cuadros a los numeros.
    Link: http://www.meaviso.com/juegos.html

    Ya habia probado anteriormente uno de los codigos del Guru (servidor web en VB)
    y como siempre sencillos de entender.

    Viva el minimalismo.



  12. Felicito a la persona que realizó esta tutoria, esta muy bien explica. mil gracias, entendi algo que me costo mucho trabajo entender.



  13. Hermano muchas gracias buscaba precisamente esto para resolver un problema que tenia con una aplicación. Muchas gracias por comparti con el resto de los internautas tus conocimientos.

    Saludos desde el otro lado del puente



  14. que sucede si a esta lista de registros deseo adjuntar una casilla de verificacion y un campo de "cantidad" para que almacene solo los registros que estan marcados e ingrese una cantidad de ese producto a la base de datos?

    espero respuesta gracias



  15. buen código y educativo



  16. "if ($total_paginas > 1){"



  17. hola!! muchisimas gracias por el codigo. Es simple, nada complicado y funciona!!pero tengo un problema con pasar a la siguiente pagina. Le doy a siguiente, pero no me va a ninguna parte, solo cambia la URL y pone pagina.php?pagina=2, pero me muestra los mismos resultados. Pq me ocurre esto? Tengo que decir que inicialmente no funcionava y le quité lo de visible=1 del mysql_query. es este el problema?

    gracias de antemano :)



  18. perdon por el post anterior!!! el problema era que me dejé una línia de codigo, YA FUNCIONA!!

    gracias otra vez



  19. Ola tengo un problema hice un ciclo medio y ara toy aciendo las practicas y me a mandado acr una pag en php y como es normal no me entero pero lo gordo ya llo tengo solo no entiendo el ejemplo. Lo de conectar la bd tiene que ir antes del . esq ni p.... idea.
    Gracias
    Rocio



  20. hola sandra a mi me ocurre lo mismo que ati no me salta a la siguiente página.Yo tengo el código del ejemplo en el zip y pasa eso. Cual es la linea que a ti te faltaba o donde está el error?

    Gracias de nuevo



  21. Ya esta solucionado por si le sirve a alguien lo pongo:

    en los zips falta esta linea:

    $pagina = $_GET["pagina"];

    hay que ponerla delante del If para que le pase el parametro por $_GET si no funciona

    Un saludo espero que le sirva a alguien.



  22. Hola, mi consulta es la siguiente,cómo para filtrar registros por fecha, ya que mi sistema me trae todos los registros. Gracias.



  23. Funciona, Gracias!!



  24. muy bueno el tutorial, pero tengo el siguiente problema:

    la base de datos que tengo que trabajar tiene miles de registros, y el menu de paginas ( [Anterior][1][2][3][4][5][6][Siguiente]) me va a quedar muy largo! :S

    como tendria que hacer para que me muestre 10 links ([1]) y despues la última pagina ([590]) y si me pase de 10, me muestre la primera, la ultima, las 5 anteriores, y las cinco siguientes?

    quedaria algo asi:

    [ANTERIOR][1][22][23][24][25][26][27][28][29][30][31][32][309][SIGUIENTE]

    o algo asi, sin la primera y la ultima:

    [ANTERIOR]...[22][23][24][25][26][27][28][29][30][31][32]...[SIGUIENTE]

    gracias!



  25. Hola buenas Un gran manual sencillo y muy bien explicado, pero tengo un problema:
    Me muestra los resultados pero no me cambia de pagina si doy a la pagina 2.. o cualquier otra no encuentra la pagina.
    añadi la linea que faltaba:
    $registros = 3;
    $pagina = $_GET['pagina'];
    if (!$pagina) {
    pero nada :( espero que me puedan ayudar Un saludo a todos y gracias



  26. Genial el tutorial, funcionó de maravilla!



  27. Hola ami me gustaría preguntaros como paginar por orden alfabetico. Osea lo mismo que se hace aqui pero con el alfabetico en ves de páginas.
    No encuentro nigun script por ningun sito.
    Me puede ayudar alguien??
    Le estaria muy agradecida

    Besitos artistas
    Irene



  28. Excelente! Funciona correctamente! :) Gracias!



  29. Q buen script muchas gracias lo implemente sin ningun contratiempo



  30. Tengo la misma consulta que Martín. ¿Cómo hacer para que cuando tenga muchas páginas, el paginador muestre de "x" a "x" página?

    [anterior]...[20][21][22][23][24][25]...[siguiente]

    Gracias.



  31. La respuesta para Martin y Victor seria usuando un script llamado "Paginator"

    Paginator es un script de paginación desarrollado en PHP para dividir resultados de consultas extensas a una base de datos MySql, en grupos de "n" registros por página. Como ejemplo de paginación podemos ver la página de google, donde se dice que hay 13,235 resultados, pero aparecen divididos en varias páginas de 20 resultados cada una.

    Paginator genera, además, una "barra de navegación" que contiene los enlaces a las diferentes páginas ().

    La característica principal de este script es su fácil utilización, ya que la forma de paginar es muy conocida y utilizada. Lo que se ha pretendido con este script es ordenarlo de tal forma que no sea necesario entenderlo ni editarlo, sino simplemente incluirlo después de definir al menos una variable.

    Aqui un ejemplo de como usar este script

    http://jpinedo.webcindario.com/scripts/paginator/ejemplos.html

    y para descargar el script .....

    http://jpinedo.webcindario.com/scripts/paginator/Paginator_v1.6.3.zip

    Espero haberlos ayudado en algo, saludos!!!



  32. Excelente aporte!!!

    Gracias me salvaste la vida jaaja



  33. Que bien viejito, me ayudo muchisimo.

    http://usuarios.lycos.es/compuwear



  34. Gracias!!!

    Salu2!



  35. Excelente la explicacion,
    Muchas gracias! :D



  36. muy bueno el codigo, pero yo necesito validar la busqueda con el campo de texto "txtbuscar". cuando digito la palabra a buscar en el campo de texto solo me muestra los primeros 3 registros y cuando doy clic en la segunda pagina no me muestra nada y en la base de datos tengo mas de 10 datos. Pareciera que el dato que hay en el campo de texto se borrara penas paso a la otra pagina. como podria solucionar eso???



  37. Un saludo Cordial para todos!
    Mi pregunta es: ¿cómo haría una paginación para el caso de un sólo registro en el que uno de sus campos es muy grande, y uno desearía presentar este campo de un único registro en forma paginada?
    Si no soy lo bastante claro me gustaría dar un ejemplo de lo que quisiera. aunque talvez termine enredando más las cosas.. jejejeje.
    ?…en un tabla donde tenemos tres campos el id, el titulo, y el desarrollo de un articulo. Bueno lo que yo quiero es mostrar el titulo, seguido de su desarrollo, pero en el caso de que este desarrollo sea muy largo, paginarlo. Digamos algo así como que muestre sólo cuatro párrafos por página.
    Cualquier ayuda será bienvenida. Muchas gracias de antemano.



  38. buen dia.
    me gustaria saber como hacer para que no me muestre la cantidad de paginas en caso de que hayan muchas paginas por mostrar, es decir si hay 500 paginas y lo estoy paginando de 10 registros por ventana, me va a mostrar 490 numeros que corresponde a las demas paginas. Me gustaria que solo me mostrara algo asi:
    asi hayan miles de paginas.



  39. Hola!! Que buen scrpt esta de lujo!!!

    Muchas felicidades y gracias por su aportacion a la comunidad de desarrolladores WEB

    Saludos



  40. El tutorial esta magnifico, explicado tan claramente que cualquiera lo puede usar. Mi problema es el mismo que algunos de mis compañeros:

    La paginacion me funciona perfecta pero cuando busco por filtro y le doy a alguna pagina siguiente pasa de mostrarme la pagina 2 (por ejemplo) de los resultados buscados a la pagina 2 de los resultados totales.


    Podrias ayudarme por favor.
    Muchas gracias



  41. Hola, alguien puede decirme que pasa con este ejemplo lo hago todo bien pero no me muestra nada o sea ningun Resultado, me muestra la pagina en blanco pero tampoco me sale error entonces que hago, o mejor dicho que estoy haciendo mal.



  42. hola, como hago para hacer un buscador en este script, de paso felicitaciones por el mismo muy bueno, el unico problema es que yo soy novato pero aun me salio bien, y no puedo buscar por medio de un formulario es decir este es un paginador mas no un buscador que hago.Gracias



  43. Lo probe en mi maquina y funciona bien, pero cuando lo subo al servidor no pagina, porque sera.



  44. Hola que tal, muchas felicidades por tu ejemplo de verdad esta muy chido y muy entendible, como así fueran todos los tutoriales.



  45. Hola amigo tengo un problema. hago toda la base de datos, el script le cambio la cantidad de registros por pagina, eso todo bien, pero cuando le doy a siguiente aparecen los mismo resultados de la pagina 1 y asi con todos los numeros dentro de la paginacion. Si me puedes ayudar,, graicas



  46. Hola a todos, tengo un problema ...veran,, estoy codificando un catálogo simple..les esxplico: tengo un catálogo( catalogo.php) en la parte izquierda listo a las categorías(Tubos, Bridas, etc.) y en el centro de la página. listo a los productos de cada categoría( 3 productos por página), la cateogía tubos tiene 5 a más productos las cuales se listan en dos páginas( 3 en la primera y las que siguen en la siguiente pág.) ahora cuando quier ver los productos de la categoría BRIDAS( tengo 6 productos) me lista los 3 productos en la primera pág. y en la siguiente página. ME LISTA LOS PRODUCTOS QUE ESTABAN EN LA SEGUNDA P?GINA DE LA CATEGOR?A TUBOS!!..es decir, el resto de productos de bridas no se listan, éstas son remplazadas por los productos que están en la segunda pág. de la categoría TUBOS.

    el codigo lo pueden descargar de: http://www.corpomarvision.com/catalogo.zip

    ESPERO QUE ME HAYAN ENTENDIDO.

    porfas ayuda!



  47. Hola eh repasado el codigo y este excelentisimo pero tengo una duda cuando paso a la pagina dos porque no me muestra las fotos siguientes y cuando regreso a la pagina1 se queda en blanco alguien podria ayudarme gracias!!!

    EXCELENTE POST!!



  48. El ejemplo esta muy bien, yo tengo hecho algo mas o menos parecido.. pero tengo un problema: cuando paso alguna variable con el post de un php a otro e intento hacer una paginacion de la busqueda poniendo cuando hago la consulta sql (where ..)
    Me muestra los datos de la primera pagina y en el pie las paginas que hay en total, hasta ahi bien, ahora en el momento q pincho para ver la segunda pagina es como si no me encontrara mas registros y si le doy anterior, tambien me pone 0 registros..

    No sé si en este caso cuando haces el navegador de paginas, como tu le dices, si ahi tengo q pasar alguna variable adicional o donde estará el fallo..

    A ver si alguien puede responderme gracias.



  49. Ahh se me olvidaba.
    Como le hago para que visible me de siempre 1?


    Gracias!



  50. He resuelto mi propia duda, ahora me surgio otra que es muy importante.
    Hice 15 articulos para prueba, poniendole que me de 5 por pagina, entonces
    todo queda bien, pero en lugar de que me muestre para 3 paginas (3x5=15)
    me muestra solo dos =S
    Intente con 20 articulos, 25, 30, etc. pero solo me muestra 2 paginas =(


    Ayuda por favor!



  51. Hola, tengo un problema, ya estube intentando de carias formas para paginar, pero no he podido, mi problema radica en que no pasa de la primera pagina, si muetra el siguienre link en la barra de estado, pero al darle click no lo hace... alguien me podria decir cual es mi error...¿?¿?



  52. muchas gracias por el ejemplo siempre me habia peleado con los paginadores y con este estuvo a la primera muy bien explicado me quedo lindisimo

    =P

    muchas gracias



  53. Muy buen aporte.
    Aplicaciones Web



  54. Como estas buenisimo el ejemplo, pero en el archivo para bajar te falta al inicio el valor, $pagina = $_GET["pag"];, si no esta no funciona porque no recibe ningun valor. y todo se arma por lo que viene por $_GET.


    Saludos y gracias.



  55. Ta mas mala la wea



  56. Muy buena explicacion, soy nuevo en esto y me la paso buscando en internet muchas gracias amigo



  57. Muy bueno y flexible para aplicar



  58. xD uhh Justo lo que buscaba GraXias



  59. funciona perfectamente gracias

    por cierto se podria publicar por aqui un script php tipo -publicar un comentario-

    gracias de nuevo.



  60. No está del todo bien.

    Falta seguridad para la pagina que se pasa por GET y el metodo para contar el número de registros total no es el adecuado ya que es mas eficente utilizando directamente el COUNT en la consulta.



  61. Excelente... muy buen codigo, facil y limpio... muy comodo de usar y adaptar...

    Gracias..



  62. A manera de ejemplo esta bien pero tiene una grab falla como lo indica el usuario @agustin en su comentario si la consulta es muy grande crearia un super menu de navegacion rompeindo con la estetica en otras palabras falta mejoralo

    Como dice el usuario @Mik:
    No tiene seguridad puede ser cierto que no sea del tema pero se debe indicar que problemas puede traer utilizarlo hoy en dia el sql injection es muy utilizado para manipular las consultas a traves de variables sin seguridad como las que pasan aqui por GET

agregar comentario


Se permiten las etiquetas HTML , y

. Si ingresa alguna direcci?n web o direcci?n de email ser?n convertidos en enlaces autom?ticamente.





publicidad

API DE FACEBOOK
GOOGLE CALENDAR API
GOOGLE MAPS API