Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
/ AGORA COM VISIBILIDADE /
/ NÃO DEPENDE DA CLASSE DE GERENCIAMENTO DO DB /
/ ADIDIONADA A VARIAVEL $EXTRA /
/ ATUALIZADA 12/08/2008 /
Ae, fiz uma classe para paginação de resultados, bem simples de usar e não exibe nenhum estilo pre-definido, assim fica facil adaptar a qualquer site.
comentem! COMENTEM!
A classe:
<?
class paginacao {
/**
* Classe de gerenciamento do banco de dados
*
* @var object
*/
protected $db;
/**
* Resultados por página
*
* @var int
*/
public $rpp = 10;
/**
* Comando SQL para pesquisar os resultados
*
* @var string
*/
public $sql = false;
/**
* Variável com os dados finais
*
* @var array
*/
public $fim = array();
/**
* Variável com total de páginas extras além da atual
*
* @var int
*/
public $extra = 3;
public function __construct() {
global $db; // pega a variável $db do escopo global
$this->db = $db; // guarda a variável $db na variável $this->db
}
public function montaPaginacao() {
if (!$this->sql) return false; // interrompe a execução se não tiver nenhuma query
$this->sql = preg_replace("'LIMIT.*'","",$this->sql); // retira o LIMIT da query case tenha
$pagina = (isset($_GET['p'])) ? intval($_GET['p']) : 1; // pega a página da URL ou define como a primeria página
$total = $this->db->sql_query($this->sql); // envia query
$total = $this->db->sql_numrows($total); // pega o total de resultados
$this->fim['mostrando'] = array($pagina*$this->rpp-$this->rpp+1,(($total < $pagina*$this->rpp) ? $total : $pagina*$this->rpp));
$this->fim['totalresultados'] = $total; // Total de resultados no banco de dados
$total = ceil($total/$this->rpp); // pega o total de páginas
$this->fim['paginaatual'] = $pagina; // Página atual
$this->fim['totalpaginas'] = $total; // Total de páginas
$limite = $pagina*$this->rpp-$this->rpp.",".$this->rpp; // define o limite de pesquisa
$this->sql .= " LIMIT $limite"; // coloca o LIMIT na query
$q = $this->db->sql_query($this->sql); // envia query
if ($this->db->sql_numrows($q) > 0) { // verifica se existe algum resultado
$this->fim['status'] = 'ok'; // coloca o status da pesquisa como ok
while ($linha = $this->db->sql_fetchrow($q)) $this->fim['resultados'][] = $linha; // coloca os valores da pesquia na variável fim
$min = $pagina-$this->extra; // coloca as 3 páginas anteriores
while ($min <= 0) $min++; // tira valores negativos e 0 das páginas anteriores
$max = $pagina+$this->extra; // coloca as 3 próximas páginas
while ($max > $total) $max--; // tira os valores que passam do total de páginas
if ($pagina > 1) { // se nao for a primeira página
$this->fim['paginas'][] = array('n' => 1, 't' => '<<'); // coloca o indicador da primeira página
$this->fim['paginas'][] = array('n' => $pagina-1, 't' => '<'); // coloca o indicador da página anterior
for ($x=$min;$x<$pagina;$x++) $this->fim['paginas'][] = array('n' => $x, 't' => $x); // coloca as 3 páginas anteriores
}
$this->fim['paginas'][] = array('n' => $pagina, 't' => 'atual'); // coloca a página final
if ($pagina < $total) { // se nao for a ultima
for ($x=$pagina+1;$x<=$max;$x++) $this->fim['paginas'][] = array('n' => $x, 't' => $x); // coloca o indicador da ultima página
$this->fim['paginas'][] = array('n' => $pagina+1, 't' => '>'); // coloca o indicador da próxima página
$this->fim['paginas'][] = array('n' => $total, 't' => '>>'); // coloca as 3 próximas páginas
}
} else {
$this->fim['status'] = 'sr'; // retorna sr se não tiver resultados
}
return $this->fim; // retorna os valores da consulta
}
}Vlw beraldo
jah tinha visto essa parada d visibilidade mas nunca tive paciencia pra ler com atenção,
mas agora vo ta um jeito...
viva,
tentei utilizar o teu código, mas deu erro
Fatal error: Call to undefined method stdClass::montaPaginacao() ........
É pq você não instaciou a classe.
antes da linha
$pg->sql = "SELECT * FROM tabela WHERE campo = '0' ORDER BY data DESC"; // query sql a ser executada
coloca
$pg = new paginacao();
ficando assim
$pg = new paginacao();
$pg->sql = "SELECT * FROM tabela WHERE campo = '0' ORDER BY data DESC"; // query sql a ser executada
...
Abraços
Boa Noite a Todos,
Gente sou iniciante com PHP, atualmente utilizo uma classe desenvolvida por um membro da comunidade"Fabyo". Gostaria de saber como posso aplicar o seu sistema de paginação junto a classe de conexão feita por ele!
<table width="100%" class="altera_usuario">
<tr>
<td class="t">ID</td>
<td class="t">Nome</td>
<td class="t">E-mail</td>
<td class="t">Celular</td>
<td class="t">Usuário</td>
<td class="t">Entidade</td>
<td class="t">Status</td>
<td class="t">Ação</td>
</tr>
<?php
$classe =& Singleton::factory( "Conexao" );
$re = $classe->Executar("SELECT * FROM usuarios");
while ($exibe = $re->fetch_array(MYSQLI_ASSOC)) {
echo "
<tr>
<td class='c'>" . $exibe["id_usuario"] . "</td>
<td class='c'>" . $exibe["nome"] . " " . $exibe["sobrenome"] . "</td>
<td class='c'>" . $exibe["email"] . "</td>
<td class='c'>" . $exibe["celular"] . "</td>
<td class='c'>" . $exibe["usuario"] . "</td>
<td class='c'>" . $exibe["entidade"] . "</td>
<td class='c'>" . $exibe["status"] . "</td>
<td class='c'><a href='?secury=usuarios&op=A&us=" . $exibe["id_usuario"] . "' title='Alterar Usuário'>Alterar</a></td>
</tr>
";
}
$classe->Fechar();
?>
</table>
Queria incluir a paginação nesse script, se alguém puder me ajudar eu agradeço!
Abraços!
Já que você está usando __construct() (construtor para PHP 5), use visibilidade (public, private e protected) nos métodos e propriedades de classe, em vez de var.
http://www.php.net/manual/pt_BR/language.oop5.visibility.php
http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif