<?php

/**
* Clase utilizada para paginar resultados de MySQL
* Desarrolada por: Iván Arias
* Spam: Visita www.php-hispano.net y #php_para_torpes del iRC-Hispano
*/
class paginador {

  var
$tabla;
  var
$where;
  var
$enlace;
  var
$epp;
  var
$actual;
  var
$link;

  
/**
   * Constructor de la clase
   * @param String $tabla Tabla de la base de datos que se va a paginar
   * @param String $where Clausula where del query para selccionar los datos
   * @param String $enlace Direccion URL de la pagina para generar los enlaces
   * @param int $epp Elementos por pagina que se mostrarán
   * @param Resource $link Variable de conexion MySQL
   */
  
function paginador ($tabla, $where, $enlace, $epp, $link) {
    
$this->tabla = $tabla;
    
$this->where = $where;
    
$this->enlace = $enlace . ((strpos($enlace, "?") === false)? "?" : "&");
    
$this->epp = $epp;
    
$this->link = $link;
    
$pag = empty($_GET['pag'])? 0 : $_GET['pag'];
    
$this->actual = ($pag > ($max = $this->max_paginas())) ? $max : (($pag < 1)? 1 : $pag);
  }

  
/**
   * Retorna un array con los elementos de la pagina actual
   * @return Array Elementos de la pagina actual
   */
  
function get_elementos() {
    
$inicio = ($this->actual - 1) * $this->epp;
    
$result = mysql_query("SELECT * FROM {$this->tabla} WHERE {$this->where} LIMIT $inicio, {$this->epp}", $this->link) or die (debug("paginador.class", "get_elementos", mysql_error()));
    
$array = array();
    while (
$row = mysql_fetch_array($result)) $array[] = $row;
    return
$array;
  }

  
/**
   * Retorna una cadena de texto con los enlaces formados
   * @param int $rango De ser especificado, solo muestra las paginas proximas a la actual cuya distancia sea menor o igual que el rango
   * @return String Cadena de texto con los enlaces formados
   */
  
function get_paginas($rango = 0) {
    
$rango = ($rango < 1) ? 0 : (($rango>5) ? 5 : $rango);
    if (
$rango) { $inicio = ($this->actual - $rango < 1) ? 1 : $this->actual - $rango; $fin = ($this->actual + $rango > ($max = $this->max_paginas())) ? $max : $this->actual + $rango; }
    else {
$inicio = 1; $fin = ($max = $this->max_paginas()); }
    
$return = ($this->actual != 1)? "<a href=\"{$this->enlace}pag=".($this->actual-1)."\">Anterior</a> " : "Anterior ";
    if (
$inicio > 1) $return .= "... ";
    for (
$i=$inicio; $i<=$fin; $i++) {
      
$return .= ($i != $this->actual)? "<a href=\"{$this->enlace}pag=$i\">$i</a> ": "$i ";
    }
    if (
$fin < $max) $return .= " ...";
    return (
$this->actual != $this->max_paginas() && !$this->vacio())? $return . " <a href=\"{$this->enlace}pag=".($this->actual+1)."\">Siguiente</a>" : $return." Siguiente";
  }

  
/**
   * Metodo que retorna el numero de elementos para la consulta
   * @return int Número de resultados en la tabla
   */
  
function num_elementos() {
    
$result = mysql_query("SELECT COUNT(*) FROM {$this->tabla} WHERE {$this->where}", $this->link) or die (debug("paginador.class", "num_elementos", mysql_error()));
    return
mysql_result($result, 0);
  }

  
/**
   * Numero total de paginas
   * @return int Numero total de paginas
   */
  
function max_paginas() {
    return (
$max = ceil($this->num_elementos() / $this->epp))? $max : 1;
  }

  
/**
   * Indica si hay elementos o no
   * @return boolean Retorna true si hay elementos para paginar, false en cualkier otro caso
   */
  
function vacio() {
    return
$this->num_elementos() == 0;
  }
}

?>
PHP-Hispano.net - Porque al final, todos acabamos aprendiendo.