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>
Suscribirse a:
Enviar comentarios (Atom)
0 comentarios:
Publicar un comentario