Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

charlesschaefer

Criando menu de paginação com várias funcionalidades

Recommended Posts

Visitando alguns fóruns pela internet eu vi que várias pessoas têm dificuldades com paginação. Eu resolvi, então, criar um tutorial para que algumas pessoas tivessem menos problemas com isso.

Para isso vamos simular um sistema de catálogo de produtos. Nosso sistema busca o nome do produto e exibe logo abaixo do nome a descrição deste.

 

Atenção: Eu fiz a classe e o tuto para mostrar mais ou menos como fazer a sua, mas se você preferir utilizá-la como está, lembre-se de copiar todas as funções para dentro da classe.

 

Vamos começar pela tabela do nosso produto:

create table produtos(id tinyint not null auto_increment,nome varchar(30) not null,descricao tinytext not null,primary key(id)) type=MyISAM auto_increment=1;
Nosso arquivo de conexão:

 

## conecta.php ##

<?php$bd = "meu_banco";$server = "localhost";$user = "eu";$senha = "senha";$conn = mysql_connect($server,$user,$senha) or die("erro ao conectar!");mysql_select_db($bd);?>
**Para mantermos um texto mais limpo, vou colocar as url de referência no final do tutorial, e darei a elas apelidos que serão utilizados no desenvolver do texto, no lugar das url's inteiras.

 

Bom, agora podemos começar o que realmente interessa: a paginação.

 

Uma paginação tem, geralmente, os mesmos atributos: números de registros por página, número de páginas, url da página que chamou a paginação, e mais alguns que nem sempre há nas paginações. Para nossa paginação, iremos utilizar o paradigma da orientação a objetos (ver em POO, e PHPOO). Se você não sabe o que siginifica orientação a objetos, leia o POO, depois o PHPOO, mas se estiver muito apressado e não quer aprender orientação a objetos, você pode continuar a ler que conseguirá entender a lógica do negócio. ;).

 

Nossa paginação deverá trabalhar com banco de dados, ou com qualquer outra fonte de dados, por isso, a conexão com o BD e as queries não estarão nesta classe.

Nossa paginação irá retornar um menu comun, ou um menu com limitação de resultados, e a opção de ter um identificador de localização nos registros, como no google (reg.: 1 a 10 de 50).

Para darmos mais dinamismo a nossa paginação, podemos ter a opção de escolher qual o separador entre os links de navegação, e qual os "botões" de avançar e de retroceder.

Então vamos lá!

 

Para que você consiga fazer sua paginação, você precisa saber quantos registros irá usar. Tendo em mãos o total de registros, você precisa definir qual será o limite de registros a ser selecionado no banco de dados, baseado na quantidade de registros que quer por página.

Vamos então mostrar como será o "esqueleto" de nossa classe:

 

class paginacao{	var $regs; // número de registros por páginas	var $exNum;//número de páginas a ser exibida no menu ex.: mostra "1 2 3 4 5" apesar de termos 10 páginas 	var $url;//url da página que chamou nossa classe	var $totReg;//número de registros contidos no banco de dados	var $totPag;//número total de páginas	var $pg;//página em que estamos 	var $separador;//separador entre os links do menu ex. separador = "|" menu = 1|2|3|4|5	var $tag_pagin;//tag na qual nossa paginação estará inserida	var $url_separator;//separador de url, para o caso de precisarmos passar outros argumentos pelo get, que não seja apenas a página	/**	 * método construtor da nossa classe	 */	function paginacao($regs,$url,$totReg,$pg,$exNum="",$separador=' | ',$tag_pagin="")	{			}		/**	 * método que nos retornará uma string com o valor a ser passado na cláusula limit do sql	 * @return string limit pronto pra sql	 */	function limit()	{			}		/**	 * métod que cria nossa paginação	 * @return string menu formatado	 */	function paginar($primeiro="<<",$ultimo=">>",$prev="<",$next=">")	{			}		/**	 * método que cria uma paginação limitada	 * @access private	 * @return string menu quase pronto	 */	function paginar_limitado($exNum,$totalPg)	{			}		/**	 * método que nos retornará aquele lembrete de localização nos registros como no google ex. reg.: 1 a 5 de 10	 * @return lembrete de registros	 */	function paginar_inteligente($template="")	{			}}
Bom, agora vamos colocar alguns métodos para trabalhar, mas antes vamos entender com irá funcionar nossa classe:

Você instancia a classe paginação, que tem um método construtor (paginacao()) que irá definir os valores dos atributos da classe. Então você, caso precise, chamará o método limit() para que possa obter o limit que precisa na sua query. Feito isso, você mostra o conteúdo de sua página, e então chama o método paginar() que irá retornar o menu com a paginação pronta. Como nossa classe é uma classe democrática, você tem o direito de escolher se quer uma paginação comun, ou uma paginação limitada, apenas definindo um valor inteiro ou nada para a variável $exNum. Dai, se você quiser aquele avisinho como há no google, você chama o método paginar_inteligente().

Vamos aos métodos:

 

Paginação vai definir valores de atributos da classe. Note que aqueles parâmetros que queremos ter como opcionais, nós colocamos com um valor já "setado":

 

function paginacao($regs,$url,$totReg,$pg,$exNum="",$separador=' | ',$tag_pagin="")	{		$this->regs = $regs;		$this->exNum = $exNum;		$this->url = $url;		$this->totReg = $totReg;		$totPag = ($totReg <= $regs) ? 1 : ceil($totReg/$regs);//se você está acostumado com o operador ternário, você sabe o que isso siginifica, senão, leia TERNÁRIO		$this->totPag = $totPag;		$this->pg = ($pg != "") ? $pg : 1;		$this->separador = $separador != "" ? $separador : " | ";		$this->tag_pagin = $tag_pagin;		$this->url_separator = (strpos($url,"?") !== false) ? "&" : "?";	}
Note que no url_separator nós conferimos se há o "?" na url (o que indica que você quer passar outro parâmetro junto com a página pela url) e damos um separador de strings adaptado a situação encontrada.

 

 

Agora vamos para o método limit(). Ele faz uma continha para descobrir qual o registro inicial e que o total de registros buscados para você usar na sua query:

 

function limit()	{		$inicio = ($this->pg * $this->regs) - $this->regs;//o primeiro registro a ser puxado do BD		$final = $this->regs;//o total de registros a ser puxado do BD		$limit = $inicio.",".$final;//limit formatado para ser utilizado na sua query		return $limit;	}
Façamos um teste para ver se nosso limite está certo: se estivermos na página um, devemos começar pelo registro 0,digamos que queremos 5 registros por página, então -> 1*5 - 5 = 0. Agora se estivermos na página 2? 2*5 - 5 = 5. Perfeito, nosso cálculo está funcionando como queremos.

 

Vamos agora fazer o método paginar(), que receberá o formato dos botões de avançar e retroceder para que possamos utilizar um formato diferente de vez em quando (nossa classe é democrática, lembra-se?). Preste bastante atenção nesse método, pois a paginação é um emaranhado de condicionais com uma enorme facilidade de nos deixar perdidos.

 

function paginar($primeiro="<<",$ultimo=">>",$prev="<",$next=">")	{		//vamos pegar os valores dos atributos da classe e usar como variáveis locais ao método		$pg = $this->pg;		 $totPag = $this->totPag;		 $url = $this->url;		 $tag_pagin = $this->tag_pagin;		 $url_separator = $this->url_separator;		 //caso nada seja passado como parâmtro para a função, iremos dar um valor default		 $primeiro = $primeiro == "" ? "<<" : $primeiro;		 $ultimo = $ultimo == "" ? ">>" : $ultimo;		 $prev = $prev == "" ? "<" : $prev;		 $next = $next == "" ? ">" : $next;		 		 //primeira condição. Se tivermos o número de páginas igual á página atual, estaremos na última página, ou temos apenas 		 //uma página, mas nesse caso não exibiremos a paginação (com css, display: none)		 //já que estamos na última página, não precisaremos de links nos botoes proximo e última		 if($totPag == $pg)		 {		 	//a página utilizada nos links dos botoes de voltar		   	$pg = $this->pg - 1;		   	$proximo = $next." ";		   	$ultima = $ultimo;		   	//precisaremos de botoes anterior e primeira, a não ser que tenhamos apenas uma página, mas nesse caso esconderemos 		   	//nossa paginação		   	$anterior = "<a href=\"".$url.$url_separator."pg=$pg\"> ".$prev."</a> ";		   	$primeira = "<a href=\"".$url.$url_separator."pg=1\">".$primeiro."</a>";		 }elseif($pg == 1)		 {		 //nosso segundo condicional. se estivermos na página 1, não precisamos de botões de voltar, certo?			 			 	//a página utilizada nos links dos botões de avançar			  $pg = $this->pg + 1;			$proximo = "<a href=\"".$url.$url_separator."pg=$pg\">".$next." </a>";			  $anterior = " ".$prev." ";		   	$primeira = $primeiro;		   	$ultima = "<a href=\"".$url.$url_separator."pg=$totPag\">".$ultimo."</a>";		 }else		 {		 //significa que não estamos nem na última nem na primeira, e os botões podem ter os links normais		 	//número de página usado no botão de avançar		 	$pg_p = $pg + 1;		 	//número de página usado no botão de voltar		   	$pg_a = $pg - 1;		   	//botões 			$proximo = "<a href=\"".$url.$url_separator."pg=$pg_p\">".$next." </a>";			$anterior = "<a href=\"".$url.$url_separator."pg=$pg_a\"> ".$prev."</a> ";			$primeira = "<a href=\"".$url.$url_separator."pg=1\">".$primeiro."<a/>";			$ultima = "<a href=\"".$url.$url_separator."pg=$totPag\">".$ultimo."</a>";		 }		 //montamos nossa primeira seção de botões, os de voltar		 $pagina = "<p>".$primeira.$anterior;		 //se tivermos o $exNum definido, é porque teremos uma paginação limitada...		 if($this->exNum != "")		 {		 	$exNum = $this->exNum;		 	$pagina .= $this->paginar_limitado($exNum,$totPag);		 }else		 {		 //...senão, podemos paginar normalmente		 	//esse laço vai nos dar os números do menu da paginação		 	for($i=1;$i<=$totPag;$i++)		 	{		 		//se nosso link for o mesmo da página em que estamos, devemos mostrá-lo em negrito, e sem links...			 	if($i == $this->pg)			 	{			 		//nossa variável página será concatenada com os valores de i dentro do loop, aqui e dentro do else log abaixo				 	$pagina .= "<b>".$i."</b> | ";			 	} else			 	{			 	//...senão, mostramos ele normalmente, com os links. Note a utilização do url_separator aqui também.				 	$pagina .= "<a href=\"".$url.$url_separator."pg=".$i."\">".$i."</a> | ";			 	}		 	}//close for		 }		 		 	//mais uma concatenação, agora para terminarmos nosso menu, com os botões de ir e vir, e com os números internos		 	$pagina .= $proximo.$ultima."</p>";		 	//aqui nós definiremos se o menu deve aparecer ou não (caso tenha apenas uma página)		 	if($totPag == 1)		 	{		 		$result = "<span style=\"visibility: hidden\">".$pagina."</span>";		 	}elseif ($tag_pagin != "")		 	{		 	//se tivermos uma tag definida, devemos colocar nosso menu dentro dela, correto?			 		$result = str_replace("><",">".$pagina."<",$tag_pagin);			}else			{				$result = $pagina;			}			//retornamos o nosso menu completo, pronto para ser mostrado na nossa página		 	return $result;	}
Como eu disse, preste bastante atenção nos condicionais, é neles que você se baseia para gerar uma paginação sem erros.

 

Agora vamos para a grande geradora de dúvidas: a paginação com limite de exibição no menu. Se você se perdeu um pouco nos condicionais do método paginar(), agora você deve ter o dobro de atenção, senão não entenderá como o resultado final foi obtido.

 

function paginar_limitado($exNum,$totalPg)	{		//vamos pegar os valores dos atributos da classe e usar como variáveis locais ao método		$url = $this->url;		$url_separator = $this->url_separator;		$separador = $this->separador;		$pg = $this->pg;		//aqui teremos duas variáveis importantíssimas:		//div nos mostra a o próximo inteiro mais próximo da metade do valor de exNum. esse valor será utilizado em cálculos futuros		$div = (is_int($exNum/2)) ? $exNum/2 : floor($exNum/2);		//centro é o centro da paginação. se tivermos 5 como exNum, teremos 3 com sendo o centro. Isso é para uma apresentação estética mais agradável		$centro = (is_int($exNum/2)) ? $exNum/2 : ceil($exNum/2);		//1° condicional: nossa página é igual ao total de páginas(estamos na última página)...		if($pg == $totalPg)		{			//...testamos se nosso total de paginas é maior que o numero de links a ser exibido no menu...			//...se sim, nosso menu ultrapassa os limites de exibição de links, e deve começar por um número maior que 1.			if($totalPg >= $exNum)			{				//variável que indica o final do menu				$termina = $totalPg;				//variável que indica o começo do menu. Precisamos subtrair do final, o exNum. E adicionar 1, senão teremos um link a mais no nosso menu				$comeco = $termina - $exNum +1;				//começaremos nosso loop com o valor do primeiro link do menu				$i = $comeco;				//para exibirmos os links do menu, temos que ter um loop, e nesse loop precisamos testar se nosso número tem link ou não. Fazemos isso com um operador ternário, que é mais enxuto:				while($i >= $comeco and $i<=$termina)				{					//Note o uso da variável $separador, como separador de números do menu					$menu .= ($i == $pg) ? "<b>".$i."</b>$separador" : "<a href=\"".$url.$url_separator."pg=".$i."\">".$i."</a>$separador";					$i++;				}			}else			{			//...senão, nosso menu não ultrapassa os limites de exibição de links.				//nosso menu começa...do começo...rsrs				$comeco = 1;				//e termina na nossa última página				$termina = $totalPg;				//daqui para baixo, os loops serão os mesmos, então considere os comentários do loop de cimam ^				$i = $comeco;				while($i>=$comeco and $i<=$termina)				{				$menu .= ($i == $pg) ? "<b>".$i."</b>$separador" : "<a href=\"".$url.$url_separator."pg=".$i."\">".$i."</a>$separador";				$i++;				}			}		}elseif ($pg == 1)		{		//2° condicional: estamos na primeira página			//nosso menu começa...do começo...rsrs			$comeco = 1;			//para sabermos onde termina, precisamos saber se nosso menu ultrapassa os limites de links, se sim, nosso menu termina exNum números depois do começo menos 1. Assim fazemos nosso menu ter apenas exNum links, e não exNum + 1. 			$termina = $totalPg >= $exNum ? ($comeco + $exNum) -1 : $totalPg;			$i = $comeco;						while($i <= $termina and $i >= $comeco)			{				$menu .= ($i == $pg) ? "<b>".$i."</b>$separador" : "<a href=\"".$url.$url_separator."pg=".$i."\">".$i."</a>$separador";				$i++;			}					}elseif ($pg < $totalPg - $exNum)		{		//3° condicional: estamos num página cujo número é menor que o total de páginas menos o exNum. ou seja, não está entre os "exNum"s links do nosso menu			if($pg > $exNum)			{			//estamos num página que é maior que os "exNum" primeiros números do nosso menu				//nosso menu começa "div" números antes da nossa página atual. ou seja, nossa página ficará no centro do menu				$comeco = $pg - $div;				//o nosso sistema de fazer o menu terminar com exNum links				$termina = $comeco + $exNum - 1;				$i = $comeco;				while ($i <= $termina and $i >= $comeco) 				{					$menu .= ($i == $pg) ? "<b>".$i."</b>$separador" : "<a href=\"".$url.$url_separator."pg=".$i."\">".$i."</a>$separador";					$i++;				}			}elseif ($pg < $exNum)			{			//estamos entre os "exNum"s primeiros números do menu, devemos saber se estamos no centro, ou se estamos antes dele				if($pg > $centro)				{				//se estamos além do centro, nosso menu começa "div" números antes de nossa página atual, ou seja, nossa página ficará no centro do menu					$comeco = $pg - $div;					$termina = $comeco + $exNum - 1;					$i = $comeco;					while($i <= $termina and $i >= $comeco)					{						$menu .= ($i == $pg) ? "<b>".$i."</b>$separador" : "<a href=\"".$url.$url_separator."pg=".$i."\">".$i."</a>$separador";						$i++;					}				}else				{				//se estamos antes ou no centro, nossa página ficará na posição normal, sem deslocamento para centrarmos ao menu					$comeco = 1;					$termina = $comeco + $exNum - 1;					$i = $comeco;					while($i <= $termina and $i >= $comeco)					{						$menu .= ($i == $pg) ? "<b>".$i."</b>$separador" : "<a href=\"".$url.$url_separator."pg=".$i."\">".$i."</a>$separador";						$i++;					}				}			}elseif ($pg == $exNum)			{			//estamos no limite de exibição de links								//jogaremos, então, nossa página no centro do menu, com esse cálculo, onde tiramos div do exNum, o que nos dará o centro atual do menu:				$comeco = $exNum - $div;						$termina = $comeco + $exNum -1;				$i = $comeco;				while ($i >= $comeco and $i <= $termina) 				{					$menu .= ($i == $pg) ? "<b>".$i."</b>$separador" : "<a href=\"".$url.$url_separator."pg=".$i."\">".$i."</a>$separador";								$i++;				}			}		}elseif ($pg > $totalPg - $exNum)		{		//4° condicional: testamos se nossa página está entre as exNum últimas do menu			if($totalPg > $exNum)			{			//temos um total de paginas que ultrapassa o limite de links/página								if($pg <= $totalPg - ($exNum - $centro))				{				//nossa página está antes ou é o centro atual do menu, então jogamos ela para o centro, quando já não o é					$comeco = $pg - $div;					$termina = $comeco + $exNum - 1;					$i = $comeco;					while ($i >= $comeco and $i <= $termina) 					{						$menu .= ($i == $pg) ? "<b>".$i."</b>$separador" : "<a href=\"".$url.$url_separator."pg=".$i."\">".$i."</a>$separador";						$i++;					}				}else 				{				//nossa página está além do centro, então teremos que manter seu lugar normal, sem deslocá-la para o centro, senão teremos mais links do que realmente precisamos					$comeco = $totalPg - $exNum + 1;					$termina = $comeco + $exNum - 1;					$i = $comeco;					while ($i >= $comeco and $i <= $termina) 					{						$menu .= ($i == $pg) ? "<b>".$i."</b>$separador" : "<a href=\"".$url.$url_separator."pg=".$i."\">".$i."</a>$separador";						$i++;					}				}			}elseif ($totalPg <= $exNum)			{			//nosso total de páginas não é maior que noss menu				$comeco = 1;				$termina = $totalPg;				$i = $comeco;				while ($i <= $termina and $i >= $comeco) 				{					$menu .= ($i == $pg) ? "<b>".$i."</b>$separador" : "<a href=\"".$url.$url_separator."pg=".$i."\">".$i."</a>$separador";					$i++;				}			}		}elseif ($pg == $totalPg - $exNum)		{		//5° condicional: se nossa página for igual ao total de páginas menos o limite de exibição por menu, ela ainda não foi atingida por nenhum condicional acima, então teremos um só pra ela... :D			$termina = $totalPg - ($exNum - $div);			$comeco = $termina - $exNum + 1;			$i = $comeco;				while ($i <= $termina and $i >= $comeco) 			{				$menu .= ($i == $pg) ? "<b>".$i."</b>$separador" : "<a href=\"".$url.$url_separator."pg=".$i."\">".$i."</a>$separador";				$i++;			}		}		//die($menu);//essa é uma boa pratica: testar o seu resultado retornado antes de utilizar a classe no seu site;)				//aqui nós iremos retirar o ultimo separador da nossa string, pois não precisamos dele entre os números e os botões.		$menu = rtrim($menu,$separador)." ";		return $menu;	}
Meio grande né? Pois bem, você deve ler com atenção os comentários para entender o que cada um está fazendo. Basicamente, nós estamos testando várias condições que farão com que nosso menu fique errado, e corrigimos esses problemas. Procure escrever as condições que testamos em língua falada (caso não tenha entendido o que está escrito) ou tente diminuir os condicionais, o máximo possível, caso tenha entendido. Não se preocupe, esse tutorial vai estar disponível por muito tempo, então pode brincar a vontade com nossos condicionais, até que você aprenda o que acontece dentro deles.

 

Agora vamos para o método paginar_inteligente(), que nos retorna aquele lembrete como temos no google. Lembra-se da democracia de nossa classe? Aqui ela também é democrática, e nos deixa escolher uma forma diferente de exibirmos o lebrete. Usaremos como padrão a frase "itens # a # de #":

Editado: Correção do bug que fazia escrever algo como "registros 1 a 10 de 0 encontrados". Obrigado: dammy.

Editado2: Correção do bug que calcula errado os registros exibidos. Obrigado: dammy.

function paginar_inteligente($template="")	{		//valor que será apresentado como o valor inicial		$de = $this->pg * $this->exNum - $this->exNum + 1;		//valor final que se está exibindo		$a = $this->pg * $this->exNum;		//total de registros exibidos		$total = $this->totReg;				//correção de um bug bem feio				($total - $a) < $this->exNum ? $a = $total : "";		//testamos se não tem nada no parametro da função, para então retornarmos o nosso default, ou o template passado.		if(!empty($template))		{			//temos aqui uma aglomeração de funções do php para manipulação de strings, procure entender cada uma delas no manual.			//veja SUBSTR_REPLACE e STRPOS			$tpl = substr_replace(substr_replace(substr_replace($template,$total,strpos($template,"#3"),2),$a,strpos($template,"#2"),2),$de,strpos($template,"#1"),2);			$menu = $tpl;		}else 		{			$menu = "Itens ".$de." a ".$a." de ".$total;		}		return $menu;	}
Você agora só precisa de um exemplo, num é? Então vamos tentar um, no qual exibiremos os nossos produtos, dos quais falei no começo do tutorial (lembra?)

Bom, esse é o exibir.php:

 

 

<?php$sql = "select count(*) as total from produtos";$query = mysql_query($sql);$result = mysql_result($query,0,"total");$pagin = new paginacao(5,$_SERVER['PHP_SELF'],$result,$_GET['pg'],5);$limit = $pagin->limit();$sql = "select nome, descricao from produtos order by nome limit ".$limit;$query = mysql_query($sql);while($array = mysql_fetch_array($query)){	echo "Produto: ".$array[0]."<br />Descrição: ".$array[1]."<br /><br /><br />";}$paginar = $pagin->paginar("primeiro","último","anterior","próximo");echo $paginar;$lembrete = $pagin->paginar_inteligente("Exibindo registro #1 a #2 de #3 encontrados");echo "<br />".$lembrete;?>
Se tivermos mais de 25 registros no banco conseguiremos ver algo como:

 

"primeiro anterior 1 2 3 4 5 próximo último

 

Exibindo registro 16 a 20 de 30 encontrados"

 

Bom, era isso então, espero que esse tutorial ajude você a construir sua própria classe de paginação. Qualquer dúvida você pode postar no forum do imasters ou me mandar um e-mail. ;)

 

REFERÊNCIAS

 

PHPOO - http://br2.php.net/manual/pt_BR/language.oop.php

 

POO - http://www.dca.fee.unicamp.br/cursos/POOCPP/node3.html

 

TERNÁRIO - http://br2.php.net/manual/pt_BR/language.expressions.php

 

CEIL - http://br2.php.net/manual/pt_BR/function.ceil.php

 

SUBSTR_REPLACE - http://br2.php.net/manual/pt_BR/function.substr_replace.php

 

STRPOS - http://br2.php.net/manual/pt_BR/function.strpos.php

 

FLOOR - http://br2.php.net/manual/pt_BR/function.floor.php

 

RTRIM - http://br2.php.net/manual/pt_BR/function.rtrim.php

 

STR_REPLACE - http://br2.php.net/manual/pt_BR/function.str_replace.php

 

FORUM_IMASTERS - http://forum.imasters.com.br/index.php?showforum=3

 

Você gostou? Dê uma palavra de força. Isso as vezes vale mais do que dinheiro.

Você me encontra em charlesschaefer(no)gmail(ponto)com, ou em theschaefer.blogger.com ou em forum.imasters.com.

 

Você encontra um exemplo sem banco de dados no endereço: http://schaefer.myfreewebs.net/classes/testeSP.php

 

Não me culpe pelos erros de português, por favor, eram 3:20 da matina quando terminei esse tuto, então não poderia mesmo fazê-lo sem nem um errinho. :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deu algum problema, pois ele não paginou.

 

Parse error: parse error, unexpected T_STRING in C:\Xamp\xampp\htdocs\noatacado\busca\1\teste1.php on line 398

 

A linha é essa:

 

$sql = "select id_cidade, dsc_cidade from cidades order by id_cidade limit ".$limit;

Só busca os registro se eu apago o limit

 

$sql = "select id_cidade, dsc_cidade from cidades order by id_cidade;

Só que daí ele não pagina.

 

Se eu coloco

 

$sql = "select id_cidade, dsc_cidade from cidades order by id_cidade limit 50";

Ele traz os dados todos numa mesma página

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tudo bem, faça um favor para mim:me diga quais os valores você está passando para o método paginacao(), é com eles que o método limit() gera o valor do limit do sql.Antes da linha que deu erro, coloque assim:die($limit);só para vermos o valor de $limit.E na hora do teste, que você colocou limit 50, tente algo como "limit 0,5 " para ver se aparecerão 10 páginas (no menu)...aguardo,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Desculpe. Não tinha entendido teu tutorial.

Achei que alterando os dados da busca no bd já tava funcional.

 

Dei uma lida em todo ele, mas meu pouco conhecimento de php não foi suficiente pra entender o que eu preciso fazer para fazê-lo funcionar.

 

Será que dá pra dar umas dicas?

 

Na verdade o que eu tô procurando é uma paginação que aceite busca. Eu tenho uma que funciona legal, mas qdo coloco uma variável vinda de um form de busca, ao passar pra segunda página ela vem em branco. Vi que no teu tb não bem essa variável, tipo:

 

$sql = "select id_cidade, dsc_cidade from cidades where estados='$variável' order by id_cidade limit ".$limit;

Compartilhar este post


Link para o post
Compartilhar em outros sites

seguinte,

para minha paginação funcionar ela tem que saber quanto registros serão exibidos, e para isso você tem que contar no bd antes de chamar a classe.

algo como:

$sql = "select count(*) from cidades where estados='$variável'";

Daí, você pega o resultado e passa pra classe, com a quantidade de registros que você quer por página, e todos os outros parâmetros.

 

Daí sim, você roda o limit(), e então monta sua query baseado nele.

 

Não estou podendo postar um exemplo agora, mas depois eu mando um pra você, caso não consiga fazer ai....

 

flw

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então eu não tava errado, não. Foi isso que eu fiz. Fiz o teste em duas tabelas. Uma (cidades) tem mais de 9000 registros e na outra (estados) tem 27. Em nenhuma delas deu certo.

 

Se eu coloco o die($limit); que você falou, não retorna nenhum valor.

 

Se eu faço:

 

E na hora do teste, que você colocou limit 50, tente algo como "limit 0,5 " para ver se aparecerão 10 páginas (no menu)...

 

retornam 5 registros mas claro sem paginação

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, eu testei a classe aqui, copiada do jeito que está no forum, e ela funcionou normalmente.Posta ai o código que você está usando na hora da paginação, desde o sql que você usa pra contar os registros, até a parte em que você seleciona os dados do bd com o "$limit" que a classe retorna.flw

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, eu testei a classe aqui, copiada do jeito que está no forum, e ela funcionou normalmente.Posta ai o código que você está usando na hora da paginação, desde o sql que você usa pra contar os registros, até a parte em que você seleciona os dados do bd com o "$limit" que a classe retorna.flw

Segue o código:
387 $sql = "select count(*) as total from cidades";388 $query = mysql_query($sql);389 $result = mysql_result($query,0,"total");390 $pagin = new paginacao($result,$_SERVER['PHP_SELF'],5,$_GET['pg'],5);391 $limit = $pagin->limit();392 $sql = "select id_cidade, dsc_cidade from cidades order by id_cidade limit ".$limit;393 $query = mysql_query($sql);394 while($array = mysql_fetch_array($query))395 {396 	echo "Estado: ".$array[0]."<br />Cidade: ".$array[1]."<br /><br /><br />";397 }398 $paginar = $pagin->paginar("primeiro","último","anterior","próximo");399 echo $paginar;400 401 $lembrete = $pagin->paginar_inteligente("Exibindo registro #1 a #2 de #3 encontrados");402 echo "<br />".$lembrete;
O erro é esse:Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/noatacad/public_html/aula/teste/teste.php on line 392

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos lá:

 

Você está passando a quantidade de registros que tem no banco de dados, como se fosse a quantidade de registros que você quer por página;

Por conta disso você está passando "5" como o total de registros no banco de dados;

 

No entanto, eu dei uma lida no exemplo que eu postei, e descobri que o errado dessa história toda sou eu. No meu exemplo está assim também!

 

Desculpa cara. Vou corrigir agora.

 

 

Tente assim que agora deve dar:

390 $pagin = new paginacao(5,$_SERVER['PHP_SELF'],$result,$_GET['pg'],5);

A documentação da função está abaixo para você ver pq estava errado

/**  * @param integer $regs registros por página  * @param String $url Url que deve estar nos links gerados  * @param integer $totReg Totalde registros no banco de dados  * @param integer $pg Página em que estamos agora  * @param integer $exNum  Número de páginas a ser exibida no menu ex.: mostra "1 2 3 4 5" apesar de termos 10 páginas   */function paginacao( $regs, $url, $totReg, $pg, $exNum ){...}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mudei a linha 390 mas a msg continua a mesma:Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/noatacad/public_html/aula/teste/teste.php on line 392Alterei a linha:$limit = $pagin->limit();para $limit = 5;pra ver o que acontecia. Ele retornou cinco registros (de um total de mais de 9000), mas não paginou.EditeiOpa.... dei um echo do $limit e não retornou nada... de qq forma, mesmo que eu coloque um valor qq (como coloquei o 5 que disse acima), ele não tá paginando.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos testar a inicialização do objeto:

 

 

Na linha 391 (ou uma após ter chamado a classe), digite assim:

 

print_r($pagin);exit;

Se o objeto foi instanciado normalmente, deverá ser apresentado algo assim:

paginacao Object(	[regs] => 5	[exNum] => 5	[totReg] => 9000	[totPag] => 1800	[pg] => 1	[numPG] => 	[url] => sua_url	[separador] =>  | 	[tag_pagin] => )

Por favor, veja se está assim mesmo a saída na sua casa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, você tem certeza de que copiou a classe e os métodos certinhos??

 

A estrutura deve ser assim:

class paginacao{	function paginacao(){}	function limit(){}	function paginar(){}	function paginar_limitado(){}	function paginar_inteligente(){}}

Pelo que está acontecendo, parece que você não copiou a função paginacao() dentro da classe paginacao.

 

Por favor, veja se é isso mesmo, e se você precisar que te mande a classe pronta para usar, me passe seu mail que eu mando.

Compartilhar este post


Link para o post
Compartilhar em outros sites

NOSSA... que falha... você tinha razão... tava errada a classe...

 

Mil desculpas.

 

Ficou 10!!! http://forum.imasters.com.br/public/style_emoticons/default/clap.gif http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

 

Deixa eu abusar da tua boa vontade.. http://forum.imasters.com.br/public/style_emoticons/default/blush.gif

 

Os links primeiro anterior e próximo último estão ficando grudados. Onde eu coloco o espaço pra separá-los? Já tentei em vários lugares mas nenhum deu certo.

 

próximo último

 

Outra dúvida, hehehe...

 

Como eu faço pra passar uma variável pras páginas seguintes.

 

Fiz uma busca e pego o valor por POST

 

ex.:

 

$busca = $_POST['busca'];$sql = "select count(*) as total from cidades where estado = '$busca'";$sql = "select id_cidade, dsc_cidade from cidades order by id_cidade where estado = '$busca' limit " .$limit;
Qdo eu for passar pra segunda página, vou ter que enviar esta variável, né. Como eu faço isso?

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

quanto ao label da paginação, você pode alterar ela por css, já que você pode passar uma tag na classe que será onde a paginação vai ser inserida, ou você pode mudar os labels:

 

colocando a paginação em uma tag:

$pagin = new paginacao( 5, $_SERVER['PHP_SELF'],$result,5, " | ","<span id="paginacao"></span>");
E no css:

#paginacao{/* separa mais as palavras*/word-spacing: 5px;}#paginacao a:link,#paginacao a:visited{/* tira o sublinhado do link*/text-decoration: none;}
Utlizando outra forma:

$pagin = new paginacao (  5, $_SERVER[ 'PHP_SELF' ], $result, 5 );........$paginar = $pagin->$paginar ( "Primeiro  ", "Último  ", "Anterior  ", "Próximo  " );
Ao passar os argumento para a função paginar() você pode colocar qualquer label, como "Primeiro Anterior", "<< <" "|< <<", etc, só passando-os como argumento na função, na seguinte ordem:

 

paginar( $primeiro, $ultimo, $anterior, $proximo )

 

Bom, quanto a passar um argumento para a próxima página, não seria melhor você passar isso por GET??

Com POST você provavelmente terá de modificar a classe, ou, para mantê-la assim, criar uma função que modifique o resultado gerado por paginar().

 

Acho que a primeira opção é simples, você tem que mudar o method do form para get e usar get na sua busca (php)

 

A segunda maneira é mais complicada. Você deve colocar na página de resultados um form, sem action, e com um campo hidden, com o mesmo nome que você usa na página de busca, e com o valor que o usuário passou pelo campo texto.

Com isso, você deve ter uma função javascript que vai fazer com que ao clicar no link, o navegador envie via post o valor do hidden para o endereço suaPagina.php?pg=3, por exemplo.

function redir(){	var pagin = document.getElementById("paginacao");	var x = pagin.getElementsByTagName('a').length;	for ( var i = 0; i < x; i++ ){		pagin.getElementsByTagName('a').onclick = "function () { submitComPagina(this); }";	}}function submitComPagina(anchor){	var form = document.forms[0];	var url = anchor.href;	form.action = url;	form.submit();}
isso é só um exemplo, mas isso pode ser mto melhorado.

 

Qlqer coisa posta ai.

 

até logo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, quanto a passar um argumento para a próxima página, não seria melhor você passar isso por GET??

 

Na verdade eu pensei em passar por REQUEST que pegaria tanto GET qto POST.

 

Mas o que eu tenho que fazer é enviar a variável pelos links (próxima, anterior... ).

 

Eu tenho uma paginação que está assim:

 

$arquivo?busca=$busca&id=$lnk_impressos

 

Então, no link aparece: www.minha_pagina.com.br/index.php?busca=palavra_buscada&id=2

 

Neste teu script eu imagino que seja aqui:

 

$pagin = new paginacao(5,$_SERVER['PHP_SELF'],$result,$_GET['pg'],5);
algo do tipo:

 

$pagin = new paginacao(5,$_SERVER['PHP_SELF'],?busca=$busca&$result,$_GET['pg'],5);

 

 

Mas já testei assim e não funcionou.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A classe SPagin (nome original dessa classe) aceita uma url com argumentos como parâmetros no construtor (paginacao()). Então você pode formatar primeiro sua url e então passá-la para o método. Assim:

 

$url = $_SERVER['PHP_SELF'] . "?busca=" . $busca;

 

$pagin = new paginacao ( 5, $url, $result, $_GET['pg'], 5 );

 

 

Assim seus links ficariam:

 

 

<a href="http://www.suapagina.com/pagina.php?busca=palavra buscada&pg=2">2</a>

 

Note que você não precisa colocar o & na url, pois a classe identifica que a url contém argumentos e insere pg com um argumento a mais, já separado por &.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa.... consegui resolver.... Declarei:global $busca;na função paginação e deu certo...Só mais uma coisa. Qdo ele tá na última página tá exibindo assim:Exibindo registro 3 a 5 de 4 encontrados Na verdade deveria ser 3 a 4 de 4 encontrados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.