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

Mostrando entradas con la etiqueta ue. Mostrar todas las entradas
Mostrando entradas con la etiqueta ue. Mostrar todas las entradas

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>