<?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();
|