<?php
 
/*
 
 * Author    Gilberto Albino <http://www.gilbertoalbino.com>
 
 * License    None
 
 * Date        2009-03-1
 
 */
 
/*
 
 * Pedimos para o PHP mostrar os erros, caso esteja desativado
 
 */
 
error_reporting(E_ALL|E_STRICT);
 
ini_set('display_errors', 1);
 
/*
 
 * Constantes usadas pela classe de conexão, poderia estar num arquivo externo.
 
 */
 
 // o dsn é a string para conexão com o PDO que pode variar de banco para banco
 
 // Por isto, preste atenção que nesta string temos o driver, o host e o banco(dbname)
 
defined('DSN') or define('DSN', 'mysql:host=localhost;dbname=teste');
 
defined('USUARIO') or define('USUARIO', 'root');
 
defined('SENHA') or define('SENHA', '');
 
 
echo '<h1>Paginação PDO</h1>';
 
 
 
/*
 
 * Classe para paginação em PDO
 
 */
 
class Paginacao_PDO
 
{
 
    public $paginador = 'pag';    
 
    private $solicitador;
 
    public $sql;
 
    public $limite = 10;
 
    public $quantidade = 5;
 
    
 
    // Construtor carrega a string usada para como paginador
 
    public function __construct() 
 
    {
 
        $this->solicitador = ( isset ($_REQUEST["{$this->paginador}"]) ) 
 
                                   ? $_REQUEST["{$this->paginador}"] 
 
                                   : 0 ;        
 
    }
 
    // Conexão privada
 
    private function conexao()
 
    {
 
        $conexao = new Conexao();
 
        $con = $conexao->conexao;
 
        return $con;
 
    }
 
    // Retorna o número de resultados encontrados    
 
    public function resultado()
 
    {
 
        $this->resultado = $this->conexao()->query(str_replace('*', 'COUNT(*)', $this->sql));
 
        $this->numeroResultados = $this->resultado->fetchColumn();
 
        return $this->numeroResultados;
 
    }
 
    // Imprime um texto amigável mostrando o status das paginas em relação ao resultado atual
 
    public function imprimeBarraResultados()
 
    {        
 
        if($this->resultado() > 0) {
 
            echo '<p class="info_resultado_busca">';
 
            echo 'Exibindo página <b style="font-size:20px">' . $this->paginaAtual()  . '</b> de <b style="font-size:20px">' . $this->paginasTotais() . '</b> disponíveis para <b style="font-size:20px">'.$this->resultado().'</b> resultados encontrados.</p>';
 
        } else {
 
            echo '<p class="info_resultado_busca">Não foram encontrados resultados para sua busca.</p>';
 
        }    
 
    }    
 
    // Calcula o número total de páginas
 
    public function paginasTotais()
 
    {        
 
        $paginasTotais = ceil($this->resultado() / $this->limite);
 
        return $paginasTotais;
 
    }
 
    // Procura o número da página Atual
 
    public function paginaAtual()
 
    {
 
        if (isset($this->solicitador) && is_numeric($this->solicitador)) {         
 
            $this->paginaAtual = (int) $this->solicitador;
 
        } else {
 
            $this->paginaAtual = 1;
 
        }
 
 
        if ($this->paginaAtual > $this->paginasTotais()) {
 
            $this->paginaAtual = $this->paginasTotais();
 
        }
 
 
        if ($this->paginaAtual < 1) {
 
            $this->paginaAtual = 1;
 
        }
 
 
        return $this->paginaAtual;
 
        
 
    }
 
    // Calcula o offset da consulta
 
    private function offset()
 
    {
 
        $offset = ($this->paginaAtual() - 1) * $this->limite;    
 
        return $offset;
 
    }
 
    // Retorna o SQL para trabalhar posteriormente
 
    public function sql()
 
    {
 
        $sql = $this->sql .  " LIMIT {$this->limite} OFFSET {$this->offset()} ";
 
        return $sql;
 
    }
 
    // Imprime a barra de navegação da paginaçaõ
 
    public function imprimeBarraNavegacao() 
 
    {
 
        if($this->resultado() > 0) {        
 
            echo '<div id="navegacao_busca">';
 
            if ($this->paginaAtual() > 1) {
 
                echo " <a href='?" . $this->paginador . "=1"  . $this->reconstruiQueryString($this->paginador) . "'>Primeira</a> ";
 
                $anterior = $this->paginaAtual() - 1;
 
                echo " <a href='?" . $this->paginador . "=" . $anterior . $this->reconstruiQueryString($this->paginador) . "'>Anterior</a> ";
 
            }
 
            
 
            for ($x = ($this->paginaAtual() - $this->quantidade); $x < (($this->paginaAtual() + $this->quantidade) + 1); $x++) {
 
                if (($x > 0) && ($x <= $this->paginasTotais())) {
 
                    if ($x == $this->paginaAtual()) {
 
                        echo " [<b>$x</b>] ";
 
                    } else {
 
                        echo " <a href='?" . $this->paginador . "=" . $x . $this->reconstruiQueryString($this->paginador) . "'>$x</a> ";
 
                    }
 
                }
 
            }
 
            
 
            if ($this->paginaAtual() != $this->paginasTotais()) {
 
                $paginaProxima = $this->paginaAtual() + 1;
 
                echo " <a href='?" . $this->paginador . "=" . $paginaProxima . $this->reconstruiQueryString($this->paginador) . "'>Próxima</a> ";
 
                echo " <a href='?" . $this->paginador . "=" . $this->paginasTotais() . $this->reconstruiQueryString($this->paginador) . "'>Última</a> ";
 
            }
 
            
 
            echo '</div>';            
 
        }    
 
    }
 
    // Monta os valores da Query String novamente
 
    public function reconstruiQueryString($valoresQueryString) {
 
        if (!empty($_SERVER['QUERY_STRING'])) {
 
            $partes = explode("&", $_SERVER['QUERY_STRING']);
 
            $novasPartes = array();
 
            foreach ($partes as $val) {
 
                if (stristr($val, $valoresQueryString) == false)  {
 
                    array_push($novasPartes, $val);
 
                }
 
            }
 
            if (count($novasPartes) != 0) {
 
                $queryString = "&".implode("&", $novasPartes);
 
            } else {
 
                return false;
 
            }
 
            return $queryString; // nova string criada
 
        } else {
 
            return false;
 
        }
 
    }    
 
    
 
}
 
// Você pode criar outra forma de conexão se desejar
 
class Conexao
 
{
 
    private $_usuario;
 
    private $_senha;
 
    private $_dsn;
 
    
 
    public function __construct()
 
    {
 
        $this->defineUsuario(USUARIO);
 
        $this->defineSenha(SENHA);
 
        $this->defineDSN(DSN);    
 
        $this->abreConexao();
 
    }
 
    // Define o Usuário
 
    public function defineUsuario($usuario)
 
    {
 
        $this->_usuario = $usuario;
 
    }
 
    // Define a Senha        
 
    public function defineSenha($senha)
 
    {
 
        $this->_senha = $senha;
 
    }
 
    // Define o DSN        
 
    public function defineDSN($dns)
 
    {
 
        $this->_dsn = $dns;
 
    }
 
    // Abre a conexão sem retornar a mesma
 
    public function abreConexao()
 
    {
 
        $this->conexao = new PDO($this->_dsn, $this->_usuario, $this->_senha);
 
        $this->conexao->query("SET NAMES utf8");
 
    }
 
    // Fecha a conexao
 
    public function fechaConexao()
 
    {
 
        $this->_conexao = null;
 
    }
 
}
 
 
// Para trabalharmos externamente à classe Paginacao_PDO
 
$conexao = new Conexao();
 
$conexao = $conexao->conexao;
 
// Iniciamos a paginacao
 
$paginacao = new Paginacao_PDO();
 
$paginacao->sql = "select * from paises";
 
// Status dos Resultados
 
$paginacao->imprimeBarraResultados();
 
// A partir do método sql() de Paginacao_PDO
 
// Vamos listar os resultados
 
$res = $conexao->query($paginacao->sql());
 
while($r = $res->fetch(PDO::FETCH_OBJ)) {
 
    print $r->nome . "<br />";
 
}
 
// Barra de Navegação
 
$paginacao->imprimeBarraNavegacao();
 
 
 
 
 |