• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

FerFil

Paginação de Dados da Base de Dados

6 mensagens neste tópico

É o meu 1º tutorial  :D espero que gostem..

A paginação de dados é uma coisa básica, depois de aprendermos  ;), até lá a coisa torna-se confusa e nada fácil. Do pouco que aprendi partilho com vocês pra que possa ajudar quem ande enrascado, como eu andei  :).

Supomos que temos uma tabela chamada produtos que é composta por codigo, nome, descrição, preço e stock.

Mãos à obra.

include bd.php //----------ligação à base de dados

if (!isset($_GET['pag'])){ //--------Se a página actual não estiver definida
$pag = 1; //---------Passa a estar, e é apresentada como sendo a 1ª.
}else{ //-------Se já estiver definida.
$pag = $_GET['pag']; //-------Usa-se a página que é.
}

$linhas_por_pag = 5; //-------Estamos a dizer quantos registos serão apresentados por página.

/*Definimos um principio para a busca na Base de Dados.
Que será a página($pag) X a quantidade de registo por página($linhas_por_pag) menos a mesma quantidade($linhas_por_página)*/
$inicio = (($pag*$linhas_por_pag) - $linhas_por_pag);

//Fazemos a busca à base de dados limitando (LIMIT) a busca com $inicio e $linhas_por_pag préviamente definidos
$sql = mysql_query("SELECT * FROM produtos LIMIT $inicio, $linhas_por_pag");

//Cria-se uma tabela em html para apresentar os dados.
?>
<table width="100%" cellpadding="0" cellspacing="0" border="1" bordercolor="#666666" align="center" class="normal">
<tr align="center">
	<td><strong>Códigos</strong></td>
	<td><strong>Nome</strong></td>
	<td><strong>Descrição</strong></td>
	<td><strong>Preço</strong></td>
	<td><strong>Stock</strong></td>
<?

//Vamos buscar os dados à base de dados e adicionamos à tabela criada
while($row = mysql_fetch_array($sql)){
    echo "<tr align='center'>
		<td>".$row['prd_cod']."</td>
		<td>".$row['prd_nome']."</td>
		<td>".$row['prd_descricao']."</td>
		<td>".$row['prd_preco']."</td>
		<td>".$row['prd_stock']."</td>
	  </tr>";
} 

//fim da tabela em html
?>
</tr>
</table>
<?

// Vamos saber o total de registos que existem na base de dados
$total_res = mysql_result(mysql_query("SELECT COUNT(*) as Num FROM produtos"), 0);

// Vamos saber quantas páginas é que o total de registos dá e arredonda-se o total para cima(com ceil()), pra o resultado não seja 1.4 ou 2.32
$total_pag = ceil($total_res/$linhas_por_pag);

// Vamos criar um link para as páginas anteriores à actual
if ($pag > 1){
$anterior = ($pag-1);
echo "<a class='normal' href=\"".$_SERVER['PHP_SELF']."?pag=$anterior\">Anterior  </a>";
}

for($i=1; $i <= $total_pag; $i++){
if(($pag) == $i){
	echo "<font class='normal'><strong>$i</strong> </font>"; //-----O <strong> aplicado a $i dá ênfase à página que se visualiza.
}else{
	echo "<a class='normal' href=\"".$_SERVER['PHP_SELF']."?pag=$i\">$i </a>";
}
}

// Vamos criar um link para as páginas seguintes à actual
if($pag < $total_pag){
$proximo=($pag+1);
echo "<a class='normal' href=\"".$_SERVER['PHP_SELF']."?pag=$proximo\">  Próximo</a>";
}

E prontos já está.

Os links das páginas serão apresentados algo como:

Anterior 1 2 3 Seguinte

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

Excelente explicação. Simples.

Só tenho uma dúvida:

$total_res = mysql_result(mysql_query("SELECT COUNT(*) as Num FROM produtos"), 0);

Já viste o que acontece quando aplicas isto a uma base de dados com.. 8 milhões de entradas? :|

Abraços,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

Excelente explicação. Simples.

Só tenho uma dúvida:

$total_res = mysql_result(mysql_query("SELECT COUNT(*) as Num FROM produtos"), 0);

Já viste o que acontece quando aplicas isto a uma base de dados com.. 8 milhões de entradas? :|

Abraços,

Certamente, nem sequer utilizava este tutorial.

É uma boa observação, mas não acredito pra alguém q esteja a aprender PHP vá utilizar uma base de dados com 8 milhões de registos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu tenho um uma base de dados mysql em que uma tabela tem quase um milhão de linhas e que e submetida a 2000+ pesquisas fulltext por dia, nunca deu barraca e continua bem rapida. Claro que se não fosse o indice fulltext não sei como as coisas seriam.

Uma solução para os tais oito milhoes seria...

fazer o select com um limite tipo de 1000 resultados conta-los com o mysql_num_rows, se forem mil dizer: "encontrados 1000 ou mais resultados"

Se pensarmos bem não faz sentido colocar tipo 100 links para páginas numa pagina de resultados.

Não podias ter dito melhor: "parecia tão dificil"

Bom tutorial, facil de seguir.

Ja agora, caso seja util a alguem aqui está uma solução reutilizavel para paginação em php, uma classe de paginaçãoo:

http://forums.devnetwork.net/viewtopic.php?t=58124

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não testei o código. Usei partes do código do FerFil.  :P

<?php

include("bd.php");

if (empty($_GET['pag'])) {
$search_page = 1;
} else {
$search_page = $_GET['pag'];
}

$search_query_limit = 1000; // Limite máximo de resultados (para não encher o processador)
$search_query_max_per_page = 20; // Número de resultados a tirar da db

$inicio = $search_query_max_per_page*($search_page-1);

$sql = mysql_query("SELECT * FROM produtos LIMIT $inicio,$search_query_limit");

$query_results = mysql_num_rows($sql); // Número de resultados obtidos na query
$query_results_max = $query_results + (($search_page-1)*$search_query_max_per_page); // Número de resultados totais (com o limite de 1000)

// Recepção dos dados para um array
$i = 1;
$query_data = array();
while ($r = mysql_fetch_assoc($sql)) {
  $query_data[] = $r;
  if ($i == $search_query_max_per_page) {
  	break;
  }
  $i++;
}

mysql_close();

// Vamos fazer a paginação:

$num_pages = $query_results_max/$search_query_max_per_page;
for ($i=1;($i-1)<$num_pages;$i++) {
  	if ($i != $search_page) {
  	  	echo "$i";
  	}
  	else {
  	  	echo "<strong>$i</strong>";
  	}
}
?>

2000+ pesquisas fulltext por dia

O que é fulltext?

Abraços,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

fulltext é uma forma de indexação e pesquisa optimizada para pesquisas em texto.

Se tiveres uma base de dados com artigos de um jornal por exemplo, tens que usar uma tecnologia que te permita pesquisar em texto de forma rapida, pois o iso de coisas como

where texto like '%cebolas%'

tornam-se imprticaveis.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora