Desarrollador Web, Gerente de la unidad de desarrollo de Maxnegocios.com.

Mejorando el paginador (PHP)

| miércoles, 30 de septiembre de 2009
Algo que es bastante comun al programar en php y mysql es la paginación de resultados. Si bien, no es una tarea dificil, muchos gastan la potencialidad de mysql para optimizar los recursos.

Para paginar resultados necesitamos saber 3 valores:

1. Número de Página: este valor lo pide el usuario, asi que es fácil obtenerlo.
2. Total de registros por página: normalmente lo define el programador con una constante
3. Total de registros: necesitamos saber el total de registros para poder crear la cantidad de enlaces necesarios por página.

Donde se desperdicia el potencial y malgasta recurso de MySQL normalmente es en el 3 valor. Pues muchos ejecutan una consulta con LIMIT y otra consulta con un COUNT sin el LIMIT. Y es allí donde es el error, ya que MySQL ofrece las funciones: SQL_CALC_FOUND_ROWS y FOUND_ROWS.

* SQL_CALC_FOUND_ROWS: calcula el número de resultados de una consulta sin LIMIT.
* FOUND_ROWS: obtiene el resultado del último SQL_CALC_FOUND_ROWS ejecutados.

Aunque con estas funciones debemos igual ejecutar dos consultas, el calculo y tiempo de respuesta es mucho más rápido que haciéndolo con COUNT.




<' ?php

$link = @mysql_connect("localhost", "usuario", "password");
mysql_select_db("base_de_datos", $link);

// maximo por pagina
$limit = 5;

// pagina pedida
$pag = (int) $_GET["pag"];
if ($pag <' 1)
{
$pag = 1;
}
$offset = ($pag-1) * $limit;


$sql = "SELECT SQL_CALC_FOUND_ROWS id, nombre FROM tabla LIMIT $offset, $limit";
$sqlTotal = "SELECT FOUND_ROWS() as total";

$rs = mysql_query($sql);
$rsTotal = mysql_query($sqlTotal);

$rowTotal = mysql_fetch_assoc($rsTotal);
// Total de regist ros sin limit
$total = $rowTotal["total"];

? >


<'tabIe border="1" bordercolor="#000">
<'t head>
<'t r>
<'t d>Id<'/t d>
<'t d>Nombre<'/t d>
<'/t r>
<'/t head>
<'tbody>

<' ?php
while ($row = mysql_fetch_assoc($rs))
{
$id = $row["id"];
$name = htmlentities($row["nombre"]);
? >

<'t r>
<'t d>
<' ?php echo $id; ? >
<'/t d>
<'t d>
<' ?php echo $name; ? >
<'/t d>
<'/t r>

<' ?php
}
? >

<'/tbody>
<'tfoot>
<'t r>
<'t d colspan="2">

<' ?php
$totalPag = ceil($total/$limit);
$links = array();
for( $i=1; $i<'=$totalPag ; $i++)
{
$links[] = "<'a href=\"?pag=$i\">$i<'/a>";
}
echo implode(" - ", $links);
? >

<'/t d>
<'/t r>
<'/tfoot>
<'/tabIe>

0 comentarios: