Outbook

HTML+CSS+JS, Accesibilidad, PHP y más

Inicio que contiene a Desarrollo web que contiene a PHP que contiene a PHP: Crear una paginación de resultados para una consulta MySQL

Datos de búsqueda

PHP: Crear una paginación de resultados para una consulta MySQL

Actualización 2010-03-10: Código de ejemplo corregido (faltaban algunos caracteres).

No es necesario copiar todos estos fragmentos de código: al final del artículo se muestra completo.

El primer paso es definir cuantos registros se quieren mostrar en cada página, en este caso se deja en 10:

// Registros a mostrar en cada página
$regVistos = 10;

Se define una consulta que recupere todos los registros que se vayan a mostrar, con los parámetros mínimos imprescindibles:

// Consulta que devuelve todos los registros
$lista0 = mysql_query(" SELECT * FROM registros");

Se cuentan los registros recuperados por la consulta MySQL:

// Se cuentan los registros devueltos por la consulta SQL $lista0
$totalSql = mysql_num_rows($lista0);

Con los registros que salen divididos por los que se quiere que se vean por cada página, se obtienen las páginas en las que se dividirá el listado de resultados. Se redondea siempre hacia arriba con ceil, ya que si, por ejemplo, salen 3,4 páginas, ese 0,4 que queda suelto, debe ocupar una página entera:

// Páginas que van a aparecer, redondeando los decimales siempre hacia arriba
$pagTotal = ceil($totalSql/$regVistos);

Son también necesarios los datos de la página actual, la anterior y la siguiente. En este ejemplo la página actual se recoge del parámetro de la URL pag. Si ese parámetro no está definido, se predetermina en 1. Las páginas anterior y siguiente se obtienen restando o sumando 1 según sea necesario:

// Se definen la página actual (desde el parámetro 'pag' de la URL) y las páginas anterior y siguiente
if (!isset($_GET['pag'])) {$pagActual=1;} else {$pagActual=$_GET['pag'];}
$pagAnterior = $pagActual-1;
$pagSiguiente = $pagActual+1;

Es el momento de realizar la consulta MySQL para mostrar los registros. En este caso la consulta devolverá los mismos registros que en la anterior, pero se le ha añadido ordenación descendente (es opcional) y el parámetro LIMIT. El parámetro LIMIT contiene dos números separados por comas: el primero es que el registro por el que se empieza el listado (la página actual menos 1 por los registros a mostrar en cada página), y el segundo el número de registros a mostrar. Ejemplo:

// Consulta SQL con la que se sacará el listado de registros
$lista1 = mysql_query(" SELECT * FROM registros ORDER BY campo DESC LIMIT ".(($pagActual-1)*$regVistos).",".$regVistos."");
// Bucle para generar el listado de registros
while($fila = mysql_fetch_assoc($lista1)) {
 // Aquí irá el código PHP que escriba los registros
}

Finalmente se genera el listado de páginas mediante una lista desordenada (UL).

El primer elemento de la lista será el enlace a la página anterior, mostrándose con la condición de que la página actual no sea la primera.

Se mostrarán los números de página mediante un bucle, destacando la página actual mediante un elemento strong.

Y el último elemento de la lista será el enlace a la página siguiente.

Ejemplo:

// Se inicia el listado de páginas
echo '<ul>';

// Si la página actual no es la primera, se muestra el enlace a la página anterior
if ($pagAnterior>0) {echo '<li class="anterior"><a href="lista.php?pag='.$pagAnterior.'"><span class="oculto">Página </span>Anterior</a></li>';}

// Se saca el listado de páginas mediante un bucle
$pgIntervalo = 3; // Páginas que aparecen antes y después de la actual
$pgMaximo = ($pgIntervalo*2)+1; // Máximo de páginas en el listado
$pg=$pagActual-$pgIntervalo;$i=0;
while ($i<$pgMaximo) {
 if ($pg==$pagActual) {$strong=array('<strong>','</strong>');} else {$strong=array('','');}
 if ($pg>0 and $pg<=$pagTotal) {
  echo '<li>'.$strong[0].'<a href="lista.php?p='.$_GET['p'].'&amp;pag='.$pg.'"><span class="oculto">Página </span>'.$pg.'</a>'.$strong[1].'</li>';
  $i++;
 }
 if ($pg>$pagTotal) {$i=$pgMaximo;} // Si la página que se va a mostrar se pasa de la cantidad de páginas definidas en $pagTotal se para la generación de elementos de lista
 $pg++;
}

// Si la página actual no es la última, se muestra el enlace a la página siguiente
if ($pagSiguiente<=$pagTotal) {echo '<li class="siguiente"><a href="lista.php?p='.$_GET['p'].'&amp;pag='.$pagSiguiente.'"><span class="oculto">Página </span>Siguiente</a></li>';}

// Se finaliza el listado de páginas
echo '</ul>';

Y de esta forma se obtiene una paginación en PHP.

Ejemplo completo

<?

// Registros a mostrar en cada página
$regVistos = 10;

// Consulta que devuelve todos los registros
$lista0 = mysql_query(" SELECT * FROM registros");

// Se cuentan los registros devueltos por la consulta SQL $lista0
$totalSql = mysql_num_rows($lista0);

// Páginas que van a aparecer, redondeando los decimales siempre hacia arriba
$pagTotal = ceil($totalSql/$regVistos);

// Se definen la página actual (desde el parámetro 'pag' de la URL) y las páginas anterior y siguiente
if (!isset($_GET['pag'])) {$pagActual=1;} else {$pagActual=$_GET['pag'];}
$pagAnterior = $pagActual-1;
$pagSiguiente = $pagActual+1;

// Consulta SQL con la que se sacará el listado de registros
$lista1 = mysql_query(" SELECT * FROM registros ORDER BY campo DESC LIMIT ".(($pagActual-1)*$regVistos).",".$regVistos."");
// Bucle para generar el listado de registros
while($fila = mysql_fetch_assoc($lista1)) {
 // Aquí irá el código PHP que escriba los registros
}

// Se inicia el listado de páginas
echo '<ul>';

// Si la página actual no es la primera, se muestra el enlace a la página anterior
if ($pagAnterior>0) {echo '<li class="anterior"><a href="lista.php?pag='.$pagAnterior.'"><span class="oculto">Página </span>Anterior</a></li>';}

// Se saca el listado de páginas mediante un bucle
$pgIntervalo = 3; // Páginas que aparecen antes y después de la actual
$pgMaximo = ($pgIntervalo*2)+1; // Máximo de páginas en el listado
$pg=$pagActual-$pgIntervalo;$i=0;
while ($i<$pgMaximo) {
 if ($pg==$pagActual) {$strong=array('<strong>','</strong>');} else {$strong=array('','');}
 if ($pg>0 and $pg<=$pagTotal) {
  echo '<li>'.$strong[0].'<a href="lista.php?p='.$_GET['p'].'&amp;pag='.$pg.'"><span class="oculto">Página </span>'.$pg.'</a>'.$strong[1].'</li>';
  $i++;
 }
 if ($pg>$pagTotal) {$i=$pgMaximo;} // Si la página que se va a mostrar se pasa de la cantidad de páginas definidas en $pagTotal se para la generación de elementos de lista
 $pg++;
}

// Si la página actual no es la última, se muestra el enlace a la página siguiente
if ($pagSiguiente<=$pagTotal) {echo '<li class="siguiente"><a href="lista.php?p='.$_GET['p'].'&amp;pag='.$pagSiguiente.'"><span class="oculto">Página </span>Siguiente</a></li>';}

// Se finaliza el listado de páginas
echo '</ul>';
?>

Comentarios del artículo

Los comentarios están cerrados.

Si el comentario no guarda relación con el tema del artículo o los comentarios previos, si la redacción del mismo es ilegible (estilo HOYGAN), o si contiene insultos u otros términos ofensivos, será borrado de inmediato. No se garantiza ningún soporte a los ejemplos de desarrollo web presentados en este sitio.

Hay 21 comentarios a “PHP: Crear una paginación de resultados para una consulta MySQL”

freakabronerd dice:

Fecha de comentario: 2009/03/25 20:05

Hola he seguido su ejemplo sobre paginacion, y al oarecer todo esta bien hasta el momento en que deberia de poner debajo las paginas que genera la consulta, me marca un error en la linea 143 Fatal error: Maximum execution time of 30 seconds exceeded in D:hshomevilchesguadalajaraguadalajara.comultimateletras.php on line 143, la linea 43 es la siguiente: if ($pg>$pagTotal) {$i=$pgMaximo;} // Si la página que se va a mostrar se pasa de la cantidad de páginas definidas en $pagTotal se para la generación de elementos de lista
$pg ;
espero me puedan ayudar no se que mas informacion necesiten, gracias.

Eduardo dice:

Fecha de comentario: 2010/01/28 20:58

para corregir el error de “Maximum execution time of 30 seconds exceeded in” solo cambie el valor de $i de 0 a 1 y funciona exelentemente, gracias por esta gran aporte.

$pg=$pagActual-$pgIntervalo;$i=0;
por
$pg=$pagActual-$pgIntervalo;$i=1;

Eduardo dice:

Fecha de comentario: 2010/01/28 21:01

a tambien se me olvidaba

$pgIntervalo = 3; // Páginas que aparecen antes y después de la actual
$pgMaximo = ($pgIntervalo*2) 1;

por

$pgIntervalo = 1; // Páginas que aparecen antes y después de la actual
$pgMaximo = ($pgIntervalo*1) ;

Maicoll dice:

Fecha de comentario: 2010/02/23 14:16

que es admin.php???

jervert dice:

Fecha de comentario: 2010/03/10 09:39

Los archivos con extensión PHP que aparecen en los enlaces son de ejemplo. Ahí tendrá que ir el nombre del PHP donde se esté aplicando la paginación.

Lewis dice:

Fecha de comentario: 2011/02/08 22:54

Amigo tengo un buscador y quiero paginar mis resultados pero estos los imprimo en la misma pagina donde esta la casilla de buscar me funciona bien pero no me lanza a la pagina dos, o sea no me muestra mas resultados sino los que salen en la primera pagina. tengo alrededor de 7000 registros y es imprescindible paginar. Echame una mano plis.

Álvaro Bassó dice:

Fecha de comentario: 2011/09/02 06:54

Muchas gracias, esta genial, me sirvió al 100%

isabel dice:

Fecha de comentario: 2011/11/04 20:46

quisiera que alguien me pueda ayudar con lo de paginacion esque no se como empezar a hacerlo como puedo empezar audenme

el_quick dice:

Fecha de comentario: 2011/11/23 15:57

Bueno yo les recomiendo esta clase para paginaciones, está muy buena y fácil de usar se llama kpaginate este es el link http://www.aprender-a-programar.com/paginacion-php Paginación PHP.

Saludos

leon dice:

Fecha de comentario: 2012/01/13 00:29

buenas sabes implemente tu script y estuve chevere pero tengo un detalle hay porque saca todos los productos sin distincion pero si quiero filtralo en una busqueda me muestra los primeros pero al darle sig pierde la consulta y muestre en blanco que crees pase hay, saludos

el_quick dice:

Fecha de comentario: 2012/01/17 00:20

@leon, seguro que estás programando tu búsqueda con el método POST en tu formulario O_o ! es una práctica que en lo personal no aconsejo, la paginación funciona en base a los parámetros encontrados en la url del sitio y por ende con el método GET.

Saludos!

carlos dice:

Fecha de comentario: 2012/01/26 00:58

buen aporte se le agradece mucho

Marcos dice:

Fecha de comentario: 2012/02/02 17:10

Hola, encontré este otro tutorial sobre paginación php, la explicación está bastante entendible.

Gabriel dice:

Fecha de comentario: 2012/02/17 18:03

Muy bueno de verdad pero tengo un error sera que puedes ayudarme no me sale los enlace de siguiente ni anterior almenos que en la url coloque la siguiente pagina y luego me sale el enlace a la pagina anterior pero para no a la siguiente

Gabriel dice:

Fecha de comentario: 2012/02/17 22:15

Ya encontré era un horror que cometí con una llave gracias me a sido de mucha ayuda funciona 100%

matias dice:

Fecha de comentario: 2012/04/19 19:14

Y los resultados donde los muestra? con este obtenemos el paginado, pero los resultados?

mary dice:

Fecha de comentario: 2012/09/01 23:43

buenas tardes me gustaria tener el linck para descargar los codigos ya que es muchisima ayuda para mi gracas

yeriqo dice:

Fecha de comentario: 2012/10/02 20:38

En esta pagina hacen un proyecto completo que lleva una paginacion que sirve para todas las paginas del proyecto. http://autodidactasenlared.blogspot.com/

miguel dice:

Fecha de comentario: 2013/03/12 15:27

variable ‘p’ no definida :/

Alexis dice:

Fecha de comentario: 2013/04/09 23:14

Amigo, ocupe PDO, además para contar los elementos que hay en la pagina es mejor consultar por COUNT(*)

andre bits dice:

Fecha de comentario: 2014/01/15 01:12

Hola, tu información me sirvió como base, en youtube encontré un video sobre consultas complejas en MySQL que sirvió bastante para un proyecto que tengo que entregar, espero sea de utilidad para los que lleguen a tu blog :) xO

Información del sitio