Ejemplo de un paginador en PHP y MySQL

paginador.php es una clase paginador que permite mostrar los registros devueltos de una consulta a una base de datos de MySQL paginados (al estilo de Google). La clase incluye un ejemplo de uso.

Descargar paginador

< ?php
/***********************************************************************************************
paginador.php
Ver 1.0
Clase Paginador. Permite mostrar los registros devueltos de una consulta a una base de datos de
MySQL paginados.

(c) Febrero 2003 Carlos Fco. Andión López;(candion@gmail.com)

Este código se ha probado y funciona correctamente en los siguientes entornos:

Microsoft Windows 2000 Server: Php 4.2.3
                               Apache 2.0.43
                               MySql 3.23.53-max-nt

Debian GNU/Linux Woody 3.0 :   Php 4.1.2
                               Apache 1.3.26
                               MySQL 3.23.49

paginador.php is free software; you can redistribute it and/or modify it under the terms of
the GNU General Public License as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

paginador.php is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.

Ejemplo de uso

fichero testpaginador.php

<html>
  <body>
  < ?php
     include "paginador.php";
    //conexión a la base de datos
    $host="localhost";
    $user="root";
    $password="password";
    $dbname="database";
    $link = mysql_connect($host, $user,$password);
    $sql = "SELECT campo FROM tabla";
    mysql_select_db($dbname, $link);

    //Si la pagina a mostrar no existe se crea y toma por defecto el valor 1
    if (!isset($pagina)) $pagina = 1;

    $pagina_php="testpaginador.php";     //Se llama al constructor del objeto paginador
    $registros_devueltos=10;
    $max_paginas_devueltas=50;
    $paginador=new paginador(&$sql,$link,$registros_devueltos,$pagina,$max_paginas_devueltas,$pagina_php);

    $resultado = mysql_query($sql, $link);  //Se ejecuta la consulta a la base d edatos
    $paginador->links();                    //Crea los link del objeto paginador
    echo "

";

    // Se muestra el numero de registros
    echo "Registros " . $paginador->registro_minimo() . " a " . $paginador->registro_maximo();
    echo " de " . $paginador->total_registros();
    echo "
";

    //Se muestra el numero de pagina/as
    echo "Pagina " . $paginador->pagina_actual() . " de " . $paginador->contador_paginas();

    //Se crea la tabla con el resultado de la consulta
    echo "

";
    echo "
<table border = '1'> n";
    echo "
<tr>
<td>campo</td>
</tr>
n";
    while ($row = mysql_fetch_array($resultado))
      {
      echo "
<tr>";
      echo "
<td>".$row["campo"]."</td>
";
      echo "</tr>
n";
      }
      echo "</table>
n";
  ?>
  </body>

***********************************************************************************************/

    class paginador
    {

    var $pagina;           // Nº de pagina
    var $paginas;          // Nº total de paginas
    var $registros;        // Nº de registros a mostrar por pagina
    var $total;            // Nº total de registros de la BD
    var $max_paginas;      // Nº Máximo de páginas a mostrar al mismo tiempo
    var $aref;             // Enlace a pagina que se tiene que mostrar en los links

/* Constructor del objeto. Al llamarlo se le pasan como parámetros la consulta SQL a ejecutar,
   la conexión a la BD, el número de registros que se quiere recuperar, el número de página a
   la que sequiere ir, el máximo de páginas a mostrar al mismo tiempo (entre 1 y 30) y el
   enlace al archivo al que hay que pasarle el númer ode página (el enlace es el nombre del
   archivo). El constructor modifica la consulta SQL y le añade el número de registros a
   recuperar y el número de página a la que ir. */

    function paginador(&$sql,$conexion,$registros,$pagina,$max_paginas,$enlace)
      {
        $this->total = mysql_num_rows(mysql_query($sql,$conexion));
        $this->registros = $registros;
        $this->paginas = ceil($this->total / $registros);
        $this->pagina=$pagina;

        if (is_string($this->pagina)) $this->pagina =1 ;

        if (!is_int($this->pagina)) $this->pagina = ceil($this->pagina);

        if ($this->pagina <1) $this->pagina =1;
        if ($this->pagina > $this->paginas) $this->pagina = $this->paginas;
        $this->max_paginas=$max_paginas;
        $this->ahref = ($enlace ."?pagina=");
        // Solo se pueden mostrar entre 1 y 30 paginas al mismo tiempo. Si se necesita mostrar
        // mas de 30 páginas al mismo tiempo poner aqui el valor correspondiente.
        if($max_paginas<1)$this->max_paginas=1;
        if($max_paginas > 30)$this->max_paginas = 30;

        $sql=$sql ." LIMIT " .$this->registros* ($this->pagina-1) .", " .$this->registros;
        return(true);
      }

// Muestra el total de registros de la consulta a la base de datos

    function total_registros()
      {
        return($this->total);
      }

// Muestra el numero de registro mínimo del intervalo entre el que nos encontramos

    function registro_minimo()
      {
        return(((($this->pagina-1) * ($this->registros))+1));
      }

// Muestra el numero de registro máximo del intervalo entre el que nos encontramos

    function registro_maximo()
      {
        if (($this->pagina*$this->registros)< =($this->total))
		return($this->pagina*$this->registros);
			else return $this->total;
      }

// Muestra el total de páginas que hay

    function contador_paginas()
      {
        return($this->paginas);
      }

// Muestra el Nº de pagina en la que nos encontramos

    function pagina_actual()
      {
        return($this->pagina);
      }

/* Busca el valor mínimo y máxino del intervalo de páginas en el que nos encontramos y se
   encarga de mostrar los enlaces a las distintas paginas, permitiendo ir a la pagina anterior,
   siguiente, asi como desplazarnos al intervalo de páginas anterior o posterior. Solamente
   mostrará los enlaces si los registros devueltos de la consulta ocupan más de una página. */

    function links()
      {
      	$posicion=1;   // posición del intervalo correspondiente a la página pedida
        $j=0;

        // calculamos la posición del intervalo

        while($j < $this->pagina)
          {
            $j=$j + $this->max_paginas;
            if ($j < $this->pagina)	$posicion++;
          }

        // asignamos los valores máximo y mínimo del intervalo y la posición

        $minimo=($this->max_paginas*($posicion-1))+1;
        $maximo=$this->max_paginas*($posicion );

         // mostramos los enlaces a las distintas páginas

         if($this->paginas>1)
          {
          	// enlace al intervalo anterior

            if($minimo>1)
              {
                echo "<a href=" .$this->ahref .($minimo - $this->max_paginas);
                echo ">< <</a>" ."&nbsp&nbsp&nbsp";
                }

            // enlace a la página anterior

            if($this->pagina>1)
              {
                echo "</a><a href=" .$this->ahref .($this->pagina - 1);
                echo ">< </a>" ."&nbsp&nbsp&nbsp";
              }

            while($minimo < = $maximo and $minimo <= $this->paginas)
              {
              	// muestra el número de página actual

                if($minimo==$this->pagina)
                  echo "<b>" .$this->pagina ."</b>" ."&nbsp&nbsp";
                    else
                      {
                      // enlaces a las paginas anteriores y posteriores a la actual
                      // dentro del intervalo seleccionado

                      echo "</a><a href=" .$this->ahref .$minimo .">" .$minimo;
                      echo "</a>" ."&nbsp&nbsp";
                    }
               $minimo++;
              }

            echo "&nbsp&nbsp";

            // enlace a la página siguiente

            if($this->pagina < $this->paginas)
              {
                echo "<a href=" .$this->ahref .($this->pagina + 1);
                echo ">></a>" ."&nbsp&nbsp&nbsp";
              }
            //enlace al intervalo siguiente

            if($posicion < (ceil($this->paginas/$this->max_paginas)))
              {
                echo "<a href=" .$this->ahref .($maximo + 1)  .">>></a>";
              }
          }
        return(true);
      }
    }
?>

Anuncios
A %d blogueros les gusta esto: