Listado completo de tutoriales

Temario del Tutorial32 - Paginación de registros.


En situaciones en las cuales una consulta retorna muy muchos datos, en vez de enviarlos todos al navegador, se puede enviar un conjunto limitado de registros. Luego, mediante hipervínculos, ver el resto de datos. Por ejemplo, cuando hacemos búsquedas con el servidor google, generalmente no nos retorna todas las direcciones donde se encuentran los resultados buscados, nos retorna páginas con 10 enlaces por página (pensemos el tiempo de transferencia si nos retornara 1.000.000 de enlaces).

Bueno, ahora resolvamos con el lenguaje PHP este problema de paginación, mostraremos dos alumnos por página:

pagina1.php

<?php
if (isset($_REQUEST['pos']))
  $inicio = $_REQUEST['pos'];
else
  $inicio = 0;
?>
<html>

<head>
  <title>Problema</title>
</head>

<body>

  <?php
  $conexion = mysqli_connect("localhost", "root", "", "base1") or
    die("Problemas con la conexión");

  $registros = mysqli_query($conexion, "select alu.codigo as  
                                               codigo,
                                               nombre,
                                               mail,
                                               codigocurso, 
                                               nombrecurso 
		                                      from alumnos as alu
                                          inner join cursos as cur on cur.codigo=alu.codigocurso
                                          limit $inicio,2") or
    die("Problemas en el select:" . mysqli_error($conexion));
  $impresos = 0;
  while ($reg = mysqli_fetch_array($registros)) {
    $impresos++;
    echo "Codigo:" . $reg['codigo'] . "<br>";
    echo "Nombre:" . $reg['nombre'] . "<br>";
    echo "Mail:" . $reg['mail'] . "<br>";
    echo "Curso:" . $reg['nombrecurso'] . "<br>";
    echo "<hr>";
  }
  if ($inicio == 0)
    echo "anteriores ";
  else {
    $anterior = $inicio - 2;
    echo "<a href=\"pagina1.php?pos=$anterior\">Anteriores </a>";
  }
  if ($impresos == 2) {
    $proximo = $inicio + 2;
    echo "<a href=\"pagina1.php?pos=$proximo\">Siguientes</a>";
  } else
    echo "siguientes";
  mysqli_close($conexion);
  ?>

</body>

</html>

La función isset retorna verdadero si existe la variable que le pasamos como parámetro, en este caso le estamos pasando la componente pos del vector asociativo $_REQUEST. Cuando llamamos por primera vez a esta página, lo hacemos : pagina1.php sin parámetros, por lo que el if se verifica como falso. Es decir la variable $inicio se carga con el valor 0.

Otro concepto importante es la cláusula limit que es propia del gestor MySQL. Mediante esta cláusula limitamos la cantidad de registros que retorna el select. El primer valor del limit indica a partir de cual registro y el segundo la cantidad de registros. Es decir si un select sin limit retorna 100 registro, luego utilizando por ejemplo la sintaxis limit 50,25 nos retornará, de esa lista de 100 registros, a partir del registro de la posición 50, 25 registros.

En nuestro problema indicamos que retorne desde valor que tenga la variable $inicio y como cantidad 2 (páginas con 2 registros):

$registros=mysqli_query($conexion,"select alu.codigo as  
                                      codigo,
  				      nombre,
				      mail,
				      codigocurso, 
                                      nombrecurso 
		                    from alumnos as alu
                                    inner join cursos as cur on cur.codigo=alu.codigocurso
                                    limit $inicio,2") or
  die("Problemas en el select:".mysqli_error($conexion));

Seguidamente mostramos todos los registros retornados y además los contamos:

  $impresos = 0;
  while ($reg = mysqli_fetch_array($registros)) {
    $impresos++;
    echo "Codigo:" . $reg['codigo'] . "<br>";
    echo "Nombre:" . $reg['nombre'] . "<br>";
    echo "Mail:" . $reg['mail'] . "<br>";
    echo "Curso:" . $reg['nombrecurso'] . "<br>";
    echo "<hr>";
  }

Ahora vemos dónde dispondremos los hipervínculos, hacia adelante o atrás:

  if ($inicio == 0)
    echo "anteriores ";
  else {
    $anterior = $inicio - 2;
    echo "<a href=\"pagina1.php?pos=$anterior\">Anteriores </a>";
  }

Si la variable $inicio vale 0 significa que no hay registros antes de éste, por lo que sólo mostramos un texto "anteriores". En caso que la variable $inicio sea distinta de 0, se ejecuta el else, donde disponemos un hipervínculo con la misma página e inicializando el parámetro pos con el valor de $inicio menos 2.

Si el contador $impresos tiene el valor 2 significa que posiblemente hay más registros por mostrar y debemos disponer un hipervínculo con la misma página pero inicializando el parámetro pos con el valor de $inicio más 2:

  if ($impresos == 2) {
    $proximo = $inicio + 2;
    echo "<a href=\"pagina1.php?pos=$proximo\">Siguientes</a>";
  } else
    echo "siguientes";


Problema resuelto.

Copiar el contenido de este cuadro de texto al VS Code y almacenarlo en la carpeta c:\xampp\htdocs con un nombre con extensión php.
luego abrir el navegador (Chrome, FireFox, IExplorer etc.) y en la barra de direcciones tipear:
http://localhost/pagina1.php (o el nombre del archivo que le dió)

pagina1.php

Ejecutar ejemplo

Problema propuesto.

Confeccionar un programa que muestre los registros de la tabla "cursos" con páginas de 3 registros.

Solución
pagina1.php

Ejecutar ejemplo

Retornar