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>

						
					
© IQSystems 2023