[ Follo-me en Twitter ]

Cómo paginar los resultados de una consulta

Parido por tupolev  |  Categoría: General, Internet

Este texto es más teórico que otra cosa, precisamente para mostrar unas pautas básicas sobre algo que muchas veces necesitamos y que puede resultar engorroso: La paginación o división en páginas de los resultados de una consulta a un origen de datos.

Trabajando con plataformas complejas, como J2EE o ASP.NET, o haciendo uso de frameworks con PHP, es probable que nos encontremos con clases que nos faciliten esta tarea, hasta el extremo de convertir nuestro objetivo en un simple “arrastra y suelta”, pero mi objetivo es mostrar precísamente lo que hay bajo ese tipo de componentes.

Para empezar, partimos de un listado de, por ejemplo, nombres (campo nombre) y teléfonos (campo tlf), en una tabla llamada agenda. La tabla contiene un total de 434 registros y queremos mostrarlos en las páginas necesarias para que queden 100 por página -una burrada, pero por decir xD -.

Esto lo haremos en dos partes. Primero, la consulta SQL en sí, de la que nos interesa una cláusula en concreto: LIMIT. LIMIT acota los resultados devueltos, según los argumentos que le siguen, el punto de inicio y la cantidad de registros a devolver.

SELECT id,nombre,tlf FROM agenda LIMIT 0,100

Esta sería la consulta que pasaríamos a la base de datos. 0 indica el punto de inicio de los resultados, en este caso, el primero. 100 es el número de registros máximos, a partir del indicado en el número anterior. La base de nuestro sistema de paginación es ese rango de registros. La primera página mostrará del 1 al 100; la segunda, del 101 al 201…
Para ello sustituiremos los dos argumentos por variables, que transmitiremos vía querystring.

Al inicio del proceso, recogeremos las dos variables de gestión, a las que llamaremos paginaActual y porPagina. Con ellas, calcularemos la página siguiente y la anterior, controlando que si estamos en la primera página, la anterior no esté disponible o sea la primera de nuevo. Asimismo con la última.

paginaSiguiente=paginaActual+porPagina
paginaAnterior=paginaActual-porPagina
SI paginaAnterior < 0 ENTONCES paginaAnterior=0

Recogidas las variables, las pasamos a la consulta, con el método que tengamos.

matrizResultados = ejecutarQuery(SELECT id,nombre,tlf FROM agenda LIMIT paginaActual,porPagina)

Desplegamos la tabla de resultados obtenidos.

pintarTabla(matrizResultados)

Y en la última fila, mostramos los enlaces para avanzar y retroceder. Para ello, anexaremos las variables de paginación, a la url actual completa, controlando que, si ya existen estas variables, se sustituya correctamente su valor.

pintarEnlaceAnterior($urlBase+sustituirVariables(paginaAnterior,porPagina)) | pintarEnlaceSiguiente($urlBase+sustituirVariables(paginaSiguiente,porPagina))

pintarEnlaceAnterior y pintarEnlaceSiguiente, devuelven un enlace en HTML, formado por:
-El nombre del módulo actual (listado.php o lo que sea).
-El conjunto de variables y valores que se han pasado en la actual llamada al módulo actual.Es decir, el Querystring actual.
-Las dos variables de paginación, junto con sus valores correspondientes, para la página a la que envían, siguiente o anterior.

El querystring actual será necesario analizarlo antes de devolverlo, pues se dará el caso de que ya existan nuestras dos variables de paginación y tengamos que sustituirlas por las que acabamos de generar. Para eso está la subrutina sustituirVariables(), cuyo código es fácil imaginar.

El resultado en pantalla sería:

Resultado por pantalla de la tabla con paginación

Pinchando en los enlaces, se recargaría la propia página, con los nuevos valores de paginación y, por tanto, el nuevo segmento de resultados de la consulta.

Con esto, tenemos montado nuestro sistema de paginación simple. No muestra el número de páginas resultantes, ni acceso directo a las mismas. Eso lo explicaré en otra ocasión…cuando consiga implementarlo xD

Tags: , , ,

Stewie dice: Quiero mis comentarios, tío!

¡Dime algo, cojones!