Paginar resultados

Silver
17 de Mayo del 2006
Hola,

¿Como puedo paginar los resultados de una consulta (busqueda) a la MySQL?

Un saludo y gracias.

Alfredo
17 de Mayo del 2006

<?php
include('../lib/conectabd.php');
$campo = 'clave_conta';
$valor = '0';

$seleccion = "WHERE ".$campo.' = '.$valor;

$sql = "SELECT * FROM bienes ".$seleccion;
$conexion = mysql_query($sql);

$total_encontrados = mysql_affected_rows();
$registros_x_pagina = 20;
$total_paginas = round($total_encontrados/$registros_x_pagina);

echo 'Registros Encontrados: '.$total_encontrados.'<br>';
echo 'TOTAL PAGINAS '.$total_paginas.'<br><br>';

if(!$_GET['pagina_actual']){
$pagina_actual = 0;
}
else{
$pagina_actual = $_GET['pagina_actual'];
}

$sql = "SELECT * FROM bienes ".$seleccion." LIMIT ".$pagina_actual.",".$registros_x_pagina;
$conexion = mysql_query($sql);
$resultado = mysql_fetch_array($conexion);

$contador = 1;

do{

echo $contador.' .- '.$resultado[marbete].' - ';
echo $resultado[descripcion].'<br>';
$contador++;

}while($resultado = mysql_fetch_array($conexion));


?>
<table width="694" border="0" align="center">
<tr>
<td width="70">

<div align="center">
<?php
if($pagina_actual != 0){
$pagina_anterior = $pagina_actual - 1;
echo '<a href="paginar.php?pagina_actual='.$pagina_anterior.'">Anterior</a>';
}
?>
</div>

</td>
<td width="494"> <div align="center">
<?php
for($x=0;$x<$total_paginas;$x++){
echo '<a href="paginar.php?pagina_actual='.$x.'">'.$x.'</a> -';
}
?>
</div></td>
<td width="64">
<div align="center">
<?php
if($pagina_actual != $total_paginas){
$pagina_siguiente = $pagina_actual + 1;
echo '<a href="paginar.php?pagina_actual='.$pagina_siguiente.'">Siguiente</a>';
}
?>
</div></td>
</tr>
</table>

Silver
17 de Mayo del 2006
Lo he probado con el siguiente código y me muestra el "siguiente" "atras" y los numeros correctos de las paginas segun los resultados pero cuando pulso sobre uno de estos me habre la pagina vacia, digamos que no reparte los resultados por las paginas.

$allEntries = $num;
$limitStart = 0;
$limitBy = 2;

$lastPageEntries = ($allEntries % $limitBy);
$allPages = round(($allEntries - $lastPageEntries) / $limitBy)+1;
if($lastPageEntries>0 and $allPages==0) {$allPages=$allPages+1;}
$thisPage = round(($limitStart+$limitBy) / $limitBy);
print "<b><br>Pagina ".$thisPage." a ".$allPages."<br><br></b>";
if($allEntries > $limitBy)
{
print "<b>Paginas:</b>&nbsp;";
for($entryNr=1; $entryNr<=$allPages; $entryNr++)
{
$startPage = ($entryNr * $limitBy) - $limitBy;
if($thisPage!=$entryNr){ print "<b><a href="".$PHP_SELF."?limitStart=".$startPage."">".$entryNr."</a></b>&nbsp;"; }
else{print "<b>".$entryNr."</b>&nbsp;";}
}
}
$startNext = $thisPage * $limitBy;
if($startNext < ($allPages * $limitBy) and $allEntries > $limitBy)
{print "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<b><a href="".$PHP_SELF."?limitStart=".$startNext."">Siguiente</a></b>&nbsp;";}

Jose Luis
17 de Mayo del 2006
Muestra los valores de las variables $limiStart, $startNext y $allPages para ver cuál de las variables no mantiene el valor correcto.

Igual el problema es la inicialización de $limitStart = 0; porque siempre toma ese valor aunque tu le pases otro valor distinto.

Jose Luis
17 de Mayo del 2006
Hola,

Yo suelo utilizar una función que me he creado, con dos parámetros, la página que vas incrementando cada vez que la llamas y el número de registros por página, de esta forma al hacer la consulta puedes utilizas la claúsula LIMIT para mostrar sólo aquellos resultados contenidos en la página.

Espero que te sirva.
Hasta pronto.

Silver
17 de Mayo del 2006
No lo consigo. Podrias ponerme un pequeño ejemplo? Gracias.

Luis A.
17 de Mayo del 2006
Hola Silver soy Falkken en otros foros como el de webestilo o el de maestros del web yo hice la misma pregunta que tu, acabo de plantearles una solución en este mismo foro a programacion.net para que veamos todos el código y a partir de ahí cada caso específico lo preguntemos aquí en el foro. Pero a ver si nos son buenos y acaban el tuto del buscador con una buena paginación. Sino lo están dejando a medias. Y no parecen de esos mas bien parecen profecionales a ver que tal responden. Un saludo a todos