<? Class G_Paginacao { /* Baseado no c�digo do Calvin http://phpbrasil.com/scripts/script.php/id/581 Colocado em uma classe por Fabio Issamu Oshiro 13/8/2006 Alterado para controlar o n�mero de links exibidos por vez (por Hudson FAS em Maio/2007) */ var $registros_por_pagina = 35; var $pagina = 1; var $paginaKey = "pagina"; var $query; var $currentPage; var $link_de_navegacao; var $links_por_pagina = 15; // N�mero de itens de links exib�veis function G_Paginacao() { $this->currentPage = "?" . $_SERVER["QUERY_STRING"]; if (strpos($this->currentPage,"&")!==false) { $this->currentPage = "?" ; $vettemp = split('&',$_SERVER["QUERY_STRING"]); $qtd=0; foreach ($vettemp as $Item) { if (trim($Item)!="") if (strpos($Item,$this->paginaKey)===false) { if ($qtd>0) $this->currentPage .= "&" & $Item; else $this->currentPage .= $Item; $qtd++; } } } } function SetPaginacao($query,$regs_pag=0,$links_pag=0) { if ($regs_pag>0 ) $this->registros_por_pagina = $regs_pag; if ($links_pag>0) $this->links_por_pagina = $links_pag; // Descobrir qual o n�mero total de registros que a busca QUERY retorna $resultado = mysql_query(eregi_replace('(.*)from','select count(*) from', $query)); $total_de_registros = mysql_result($resultado, 0); // Calcular o n�mero de p�ginas que ser� preciso dividir o resultado if ($total_de_registros <= $this->registros_por_pagina) { $total_de_paginas = 1; } elseif (($total_de_registros % $this->registros_por_pagina) == 0) { $total_de_paginas = ($total_de_registros / $this->registros_por_pagina); } else { $total_de_paginas = ($total_de_registros / $this->registros_por_pagina) + 1; } $total_de_paginas = (int) $total_de_paginas; // Caso o n�mero seja quebrado, transformar em n�mero inteiro // Lendo "pagina atual" e "ultima p�gina" da URL e efetuando medidas sanit�rias nas mesmas $pagina_base = 1; $ultima_pagina = $this->pagina; if ( isset($_REQUEST[$this->paginaKey]) ) { $vetTemp = explode('_',$_REQUEST[$this->paginaKey]); if (count($vetTemp)>=1) { if ($vetTemp[0]>=1 && $vetTemp[0]<=$total_de_paginas) $this->pagina = $vetTemp[0]; } if (count($vetTemp)==3) { if ($vetTemp[1]>=1 && $vetTemp[1]<=$total_de_paginas) $pagina_base = $vetTemp[1]; if ($vetTemp[2]>=1 && $vetTemp[2]<=$total_de_paginas) $ultima_pagina = $vetTemp[2]; } } /* Vamos calcular a p�gina anterior e posterior que estamos Em seguida devemos calcular qual o ponto nos registros retornados na QUERY, acima, atualmente devemos RECOME�AR a ler. */ $pagina_anterior = $this->pagina - 1; $pagina_posterior = $this->pagina + 1; $registro_inicio = ($this->registros_por_pagina * $this->pagina) - $this->registros_por_pagina; if (($this->pagina > $total_de_paginas) || ($this->pagina < 0)) { echo 'n�mero da p�gina inv�lido'; exit; } $query = $query . " LIMIT $registro_inicio, $this->registros_por_pagina"; /* Aqui se faz a m�gica de limitar os resultados que vc deseja para a p�gina ser do registro X at� Y Caso tenha prestado aten��o no c�digo, perceber� que o segredo da pagina��o de resultados se limita ao uso do recurso LIMIT do MySQL para limitar a busca para os registros que vc quer mostrar na p�gina. Explica��o sobre como funciona esse pequena parte do SQL. A QUERY: SELECT * FROM tabela_qualquer WHERE idnome='$idnome' vai retornar o seguinte resultado resultado | idnome | nome | coluna1 | coluna2 0 1 manuel xxx yyy 1 2 joaquim xxx yyy 3 3 tereza xxx yyy 4 4 luiz xxx yyy 5 5 francisco xxx yyy A linha resultado 0 � a primeira linha dos resultados encontrados. A numera��o � a partir de ZERO e n�o 1 como se pensaria. Se vc quizesse apenas os registros de joaquim a luiza vc faria esta query SELECT * FROM tabela_usuarios LIMIT 1,3 O que significa LIMIT 1,3? Indica que vc quer 3 registros a partir da linha 1 da busca. */ $resultado = mysql_query($query); // Decidindo a nova p�gina base $pagina_media = $pagina_base + intval(round($this->links_por_pagina/2)) - 1; if ( $total_de_paginas > $this->links_por_pagina) { if ($this->pagina >= $ultima_pagina) { // avan�ando if ($this->pagina >= $pagina_media) { if ($this->pagina-$ultima_pagina==1) $pagina_base++; else $pagina_base = $this->pagina - intval(round($this->links_por_pagina/2)); } } else { // voltando if ($this->pagina <= $pagina_media) { if ($ultima_pagina-$this->pagina==1) $pagina_base--; else $pagina_base = $this->pagina - intval(round($this->links_por_pagina/2)); } } if ($pagina_base<1) $pagina_base=1; while ( $pagina_base>1 && ($pagina_base+$this->links_por_pagina-1)>$total_de_paginas ) $pagina_base--; } /* * Se��o para criar link de navega��o entre as p�ginas * Vai aparecer como aqueles link do tipo * * Anterior 1 2 [3] 4 5 Pr�ximo */ $link_base = "${pagina_base}_$this->pagina"; $this->link_de_navegacao = 'P�gina: '; if ($total_de_paginas>1) { /* link "anterior" */ if($pagina_anterior) { $this->link_de_navegacao .= "<a href=\"$this->currentPage&$this->paginaKey=${pagina_anterior}_${link_base}\"><strong><</strong></a> "; } else $this->link_de_navegacao .= "< "; for($i=$pagina_base; (($i-$pagina_base)<$this->links_por_pagina) && ($i <= $total_de_paginas); $i++) { if($i != $this->pagina) { /* link individual para as outras p�ginas */ $this->link_de_navegacao .= " <a href=\"$this->currentPage&$this->paginaKey=${i}_${link_base}\">$i</a> "; } else { $this->link_de_navegacao .= " <big><b>${i}</b></big> "; } } /* link "proximo" */ if($this->pagina != $total_de_paginas) { $this->link_de_navegacao .= " <a href=\"$this->currentPage&$this->paginaKey=${pagina_posterior}_${link_base}\"><strong>></strong></a> "; } else $this->link_de_navegacao .= " >"; } else $this->link_de_navegacao .= "<big><b>1</b></big>"; return $resultado; } } // Modo de Usar: /* $objPaginacao=new G_Paginacao; //caso voc� queira alterar o n�mero de p�ginas exibidas //$objPaginacao->registros_por_pagina=4; //caso voc� tenha que usar outro nome no QueryString Ex: nomedasuapagina.php?paginacao2=2 //$objPaginacao->paginaKey="paginacao2"; $objPaginacao->currentPage="nomedasuapagina.php"; $result = $objPaginacao->SetPaginacao("Select * From Tbl_alguma where alguma_coisa='algo' order by sua_ordem",30,10); // A linha anterior informa que cada p�gina ter� apenas 30 registros, e a janela de 'links' de p�gina mostra de 10 em 10 links $num=mysql_numrows($result); if ($num==0){ echo "<tr><td colspan='3'>vazio</td></tr>"; } $i=0; $objRua=new G_Rua(); While($i<$num) { //seu c�digo para imprimir os resultados } // Aqui imprime os bot�es de Anterior 1 2 3 4 pr�ximo // <?=$objPaginacao->link_de_navegacao?> */ ?>