LISTADO DE REGISTROS A UNA TABLA CON PAGINADO AVANZADO
Primero hacemos un SELECT COUNT(*) para tener el número de registros.
El bloque de if corrige la página pedida si excede por abajo o arriba el N° de páginas i en
$idini finalmente calcula el id inicial de la página pedida con:
(pagina anterior X registros por página).
Antes de cargar la tabla debemos poner el menú con el paginado.
Primero los < <<. Para eso tengo Indicesporsite nos da cuantos indices por vez vamos a tener,
salto que lleva la cuenta de cuanto avanzo o retrocedo con << o >> y pagini la página inicial de las visibles.
$salto=$pagini-$indicesporsite excepto que la resta de negativo, entonces $salto=1
Antes de poner los N° de pag. debemos determinar $superior que lleva cuenta de hasta donde
indexamos en la página visible, en principio es $superior=$pagini+$indicesporsite pero si esta
cuenta excede $totalpag le damos este valor.
Ahora van los N° de página determinados por $indicesporsite, esto se hace en el bloque
for, primero se ve con el if si $i es la página actual y se le da la clase
pagactual (roja) y no se le pone link, en los otros casos el link es la propia página con un parámetro p = N°
de página.
Ahora solo quedan los > >>. Aqui usamos los parámetros calculados anteriormente. Y se controla si
> va a caer en una página completa o en la página final (o sea si al sumar un $indicesporsite)
cae en la final o no ahí cambia el link, ver en el código las opciones.
Luego abre nuevamente la base por debajo de la cabecera de tabla. En el
SELECT ... LIMIT $idini,$regporpag va a cargar desde el id inicial calculado en el head hasta el
número de registros por página. Le damos los estilos a cada columna y
luego si se devuelven registros con (mysqli_num_rows) un while (fetch_array)
que devuelve true si al avanzar un registro no llega al end of file, carga cada linea de la tabla con los valores
correspondientes a ese registro.
No olvidar el free_results y close finales y cerrar la etiqueta
<head>
<style>
td{
border-bottom:#333 solid 1px;
margin: 0px;
padding: 5px;
padding-bottom:3px;
padding-top:3px;
}
.pagactual{
color:#C00;
}
.pag{
color:#03C;
}
</style>
<?
$regporpag=30; //registros por paginado
$indicesporsite =15; //indices visibles de una antes del > >>
if(conectar()){
//calculo el número total de registros
$sqltxt = "SELECT COUNT(*) AS total FROM clientes";
$sqldevolucion = mysqli_query($conn,$sqltxt);
$r = mysqli_fetch_array($sqldevolucion, MYSQLI_ASSOC);
$total= $r["total"];
$totalpag = ceil($total/$regporpag); //definí en $regporpag 30 registros por página
mysqli_free_result($sqldevolucion); //devuelvo recurso a memoria
}
$pagactual=0; //si no empecé a paginar página inicial es 0
if (isset($_GET["p"])){
$pagactual= (int)$_GET["p"]; // si estoy paginando recupero el N° de página actual
}
if (isset($_GET["pi"])){
$pagini=(int)$_GET["pi"]; // si pase de menú de página recupero la inicial del menú
}else{
$pagini=1; // si no la inicial del menú es 1
}
if ($pagactual<1){
$pagactual=1; // si pagina actual quedó negativa queda en 1
}else if ($pagactual>$totalpag){ // si pagina actual quedó pasada de la final queda la final
$pagactual=$totalpag;
}
$idini= ($pagactual-1)*$regporpag; //esta cuenta me da el id inicial de la página pedida
?>
</head>
<body>
<div>
<div style="margin-bottom:10px; margin-top:10px; background-color:#CFF">
TOTAL REGISTROS: <? echo $total;?> TOTAL PAG: <? echo $totalpag;?>
PÁG. ACTUAL: <? echo $pagactual;?> REGISTRO INI. PÁG. ACTUAL :<? echo $idini+1;?>
</div>
<!-- paginador -->
<div style="margin-bottom:10px; margin-top:10px; background-color:#CFF">
<?
//inicio colocacion de < <<
if ($pagactual<>1){
if ($pagini-$indicesporsite<1){
$salto=1;
}else{
$salto=$pagini-$indicesporsite;
}
echo( "<a href='?pi=1&p=1' class='pag'><<</a> " );
echo( "<a href='?pi=". $salto . "&p=" . $salto. "' class='pag'><</a> " );
}
// fin colocacion de < <<
// inicio menú N° páginas
if($pagini+$indicesporsite<$totalpag){
$superior=$pagini+$indicesporsite;
}else{
$superior=$totalpag;
}
for ($i=$pagini ; $i<=$superior ; $i++){
if($i==$pagactual){
echo("<span class='pagactual'>" . $i . "</span> ");
}else {
echo( "<a href='?pi=" . $pagini . "&p=" . $i . "' class='pag'>" . $i . "</a> " );
}
}
// fin menú N° páginas
// inicio colocacion de > >>
if(($pagini+2*$indicesporsite)<$totalpag){
echo( "<a href='?pi=". ($pagini+$indicesporsite) . "&p=" . ($pagini+$indicesporsite) . "' class='pag'>></a> " );
echo( "<a href='?pi=". ($totalpag-$indicesporsite) . "&p=" . ($totalpag-$indicesporsite) . "' class='pag'>>></a> " );
}else if (($pagini+$indicesporsite)<$totalpag) {
echo( "<a href='?pi=". ($totalpag-$indicesporsite) . "&p=" . ($totalpag-$indicesporsite) . "' class='pag'>></a> " );
echo( "<a href='?pi=". ($pagini+$indicesporsite) . "&p=" . ($pagini+$indicesporsite) . "' class='pag'>>></a> " );
}
// fin colocacion de > >>
?>
</div>
<table>
<tr>
<td width="40" style=" text-align:center">ID</td>
<td width="200" style=" text-align:center">NOMBRE</td>
<td width="200" style=" text-align:center">DIRECCION</td>
<td width="200" style=" text-align:center">MAIL</td>
<td width="160" style=" text-align:center">NACIMIENTO</td>
</tr>
<?
$sqltxt = "SELECT * FROM clientes LIMIT " . $idini . "," . $regporpag;
$sqldevolucion = mysqli_query($conn,$sqltxt);
if (!mysqli_num_rows($sqldevolucion)) {
echo("Error, no se devuelven registros".$sqltxt );
} else {
$i=1;
while ($registro = mysqli_fetch_array($sqldevolucion, MYSQLI_ASSOC)){
echo("<tr>");
echo("<td>" . $registro["id"] . "</td>" );
echo("<td>".$registro["nombre"] . "</td>" );
echo("<td>".$registro["direccion"] . "</td>" );
echo("<td>".$registro["mail"] . "</td>" );
echo("<td style=' text-align:center;'>".$registro["fecha_nac"] . "</td>" );
echo("</tr>");
}
mysqli_free_result($sqldevolucion); //devuelvo recurso a memoria
mysqli_close($conn); // cierro conexion
}
?>
</table>
<!--FIN paginacion-->
</div>
</body>