Páginación de resultados
Tuesday, April 19th, 2005La paginación de resultados es la única solución adecuada para poder mostrar al usuario los 4281 resultados que ha devuelto su búsqueda… ¿pero como hacerlo?
Bien, ya sabes lo que quieres. Quieres paginar resultados. ¿Pero como hacerlo? ¿Cuantos resultados por página? ¿Cuantas páginas? ¿Y si resultan que me salen 1000 páginas… muestro un enlace a cada una de ellas? ¿Solo muestro enlaces a las primeras 10 páginas? Y al cambiar de página… ¿que hago? ¿debo volver a hacer la busqueda? Este artículo pretende dar respuesta a todas estas preguntas.
En realidad, paginar resultados es tan fácil como seguir los siguientes 3 pasos:
Paso 1
Hacer una llamada a la base de datos para obtener el número total de resultados de la busqueda y asignar el resultado a una variable que llamaremos $total. Con MySQL la llamada debería ser algo así:
< ?php
$get = mysql_query('select count(*) from mitabla where ...');
$total = mysql_result($get,0);
?>
Paso 2
Hacer otra llamada que devuelva los resultados de la busqueda, limitando los resultados devueltos mediante las variables $pp y $st. $pp define el número de resultados por páginas. $st define el número, del total de resultados, desde donde empezar a mostrar los resultados en la página actual.
Usando MySQL la llamada será algo así:
< ?php
// obtener el valor de $st
if(isset($_GET['st'])) {
$st = $_GET['st'];
} else {
$st = 0;
}
// la llamada a base de datos
$get = mysql_query('select * from mitabla where ... limit '.$st.','.$pp);
while($row=@mysql_fetch_row($get)) {
// imprimir resultados
echo $row[0].'<br />';
}
?>
$st es una variable que se obtiene de la dirección de la página actual, por lo que su valor se debe obtener de la variable $_GET[’st’]. En la primera página de resultados $_GET[’st’] no esta definida, por lo que como puedes observar en el código superior tendremos que comprobarlo, y si resulta que no esta definida, tendremos que asignarle el valor 0.
Paso 3
Aplicar la función paginacion() que se muestra a continuación. Esta función se encarga de imprimir una serie de enlaces a las páginas resultantes de la busqueda.
< ?php
// resultados por pagina
$pp = 10;
// la función
function paginacion($total,$pp,$st,$url) {
if($total>$pp) {
$resto=$total%$pp;
if($resto==0) {
$pages=$total/$pp;
} else {
$pages=(($total-$resto)/$pp)+1;
}
if($pages>10) {
$current_page=($st/$pp)+1;
if($st==0) {
$first_page=0;
$last_page=10;
} else if($current_page>=5 && $current_page< =($pages-5)) {
$first_page=$current_page-5;
$last_page=$current_page+5;
} else if($current_page<5) {
$first_page=0;
$last_page=$current_page+5+(5-$current_page);
} else {
$first_page=$current_page-5-(($current_page+5)-$pages);
$last_page=$pages;
}
} else {
$first_page=0;
$last_page=$pages;
}
for($i=$first_page;$i< $last_page;$i++) {
$pge=$i+1;
$nextst=$i*$pp;
if($st==$nextst) {
$page_nav .= '['.$pge.']';
} else {
$page_nav .= ''.$pge.'';
}
}
if($st==0) { $current_page = 1; } else { $current_page = ($st/$pp)+1; }
if($current_page< $pages) {
$page_last = '[>>>]';
$page_next = '[>]';
}
if($st>0) {
$page_first = '[< <<]';
$page_previous = '[< ]';
}
}
return "$page_first $page_previous $page_nav $page_next $page_last";
}
// mostrar resultado de la funcion
echo paginacion($total, $pp, $st, 'http://tudominio.com/mostrar.php?st=');
?>
A continuación una explicación de cada una de las variables que recibe la función paginacion():
- $total. Número total de resultados que ha devuelto la busqueda. La forma de obtener este valor se ha explicado en el paso 1).
- $pp. Número de resultados que queremos mostrar por en cada página.
- $st. Número del primer resultado de la página actual. $st vale 0 en la primera página, en la siguientes valdrá 10, 20, 30, …
- $url. La dirección completa de las páginas de resultados pero sin el valor de $st. Es decir, si la dirección de una página de resultados es http://tudominio.com/mostrar.php?st=30, el valor de $url debe ser http://tudominio.com/mostrar.php?st=