Paginación con PHP+MySQL

Hoy me encontraba con la necesidad de hacer uso de la paginación en un desarrollo PHP. Nunca lo había hecho previamente en este lenguaje, aunque sí había tenido que hacerlo en VB.NET (tablas paginadas a gogo en mi paso por Nática SL) y en Java. Entre la experiencia con otros lenguajes y las búsquedas en San Google he encontrado como hacerlo.

Para esto vamos a utilizar dos funciones de MySQL: SQL_CALC_FOUND_ROWS, que nos permite calcular el número de resultados de una consulta sin LIMIT, y FOUND_ROWS, que nos permite recuperar el resultado de la última ejecución de la función anterior. Estos dos métodos nos ahorrarán hacer una consulta COUNT para saber el total de resultados, que necesitaremos para calcular la cantidad de páginas que se mostrarán.

Supongo que ya sabéis crear una conexión con una base de datos MySQL en PHP, así que es lo primero que debéis hacer.

Lo siguiente es definir una variable con el número máximo de resultados a mostrar por página:

 $max = 10

En mi caso la fijé en 10 resultados. Luego hay que definir qué página se mostrará, que en principio se pedirá usando el método GET:

$pagina = (int) $_GET[‘pag’];

if($pagina<1)

{

$pagina = 1;

}

$offset = ($pagina-1)*$max;

Luego viene la creación de la consulta paginada y de la consulta para conocer el total.

$sql = “SELECT SQL_CALC_FOUND_ROWS id, name FROM clientes LIMIT $offset, $max”;

$sqlTotal = “SELECT FOUND_ROWS() as total”;

Tras esto, recogemos los Result Set de ambas consultas, con los que podemos calcular el total y almacenar los resultados.

$resultSet = mysql_query($sql);

$rsTotal = mysql_query($sqlTotal);

$filasTotal = mysql_fetch_assoc($rsTotal);

$total = $filasTotal[‘total’];

Bueno, ahora sólo nos queda crear una tabla en la que mostrar los resultados, con los enlaces a las distintas páginas debajo.

border=”1″ bordercolor=”#0000EE”>
<thead>
<tr>
<td>Id</td>
<td>Name</td>
</tr>
</thead>
<tbody>
<?php
while ($fila = mysql_fetch_assoc($resultSet))
{
$id = $fila[“id”];
$name = htmlentities($fila[“nombre”]);
?>
<tr>
<td><?php echo $id; ?></td>
<!–?php echo $name; ?>–>
</tr>
<?php
}
?>
</tbody>
<tfoot>
<tr>
colspan=”2″>
<?php
$totalPag = ceil($total/$max);
$enlaces = array();
for( $i=1; $i<=$totalPag ; $i++)
{
$enlaces[] = “href=\”?pag=$i\”>$i“;
}
echo implode(” – “, $links);
?>
</td>
</tr>
</tfoot>
</table>

Tenéis que perdonar el deficiente sangrado del código, pero al ponerlo como comentario siempre queda descojonado. En cualquier caso podéis probar a copiar y pegar en un editor como Aptana Studio, donde el sangrado automático arreglaría la cuestión.

En fin, espero que esto os sea de ayuda.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s