Matéria retirada de http://www.vivaolinux.com.br
1.Introdução
Uma das dúvidas mais freqüentes entre os programadores web que conheço é "como faço uma paginação de registros que capturo do meu banco de dados?". Muito bem, já que é uma pergunta freqüente, nada mais justo que escrever um artigo sobre a mesma.
Neste artigo utilizarei o exemplo prático que nos exibirá a lista dos 20 usuários de maior pontuação do site. Nosso script será escrito na linguagem PHP e terá como base de dados uma tabela do MySQL.
O script terá as seguintes características:
-configuração do número de registros exibidos por página
-painel de navegação entre as páginas
-dados capturados a partir de uma tabela do MySQL.
2.Criação da tabela e da fonte de dados
Neste exemplo vamos partir do princípio que você possui uma conta com acesso ao banco de dados meusite, previamente criado pelo pessoal que dá suporte ao MySQL em sua empresa. Nossos dados fictícios serão os seguintes:
servidor MySQL: mysql.vivaolinux.com.br
base de dados: meusite
nome de usuário: fabio
senha: oi_feio
Criação da tabela usuários
Para tornar a explicação da lógica mais simples, nossa tabela de usuários possuirá somente dois campos, o nome do usuário e sua quantidade de pontos. Sendo assim, execute a seguinte cláusula SQL em seu cliente MySQL:
CREATE TABLE usuarios ( nome varchar(50) NOT NULL PRIMARY KEY, pontos INT DEFAULT 0 );
|
Insira alguns registros na tabela para podermos executar os testes. Eis alguns inserts que podem servir para nosso exemplo (estes foram os 20 usuários de melhor pontuação do site Viva o Linux na época em que o artigo foi escrito):
INSERT INTO usuarios (nome,pontos) VALUES ("Douglas Vigliazzi", 9160); INSERT INTO usuarios (nome,pontos) VALUES ("Lauro Gatz", 9040); INSERT INTO usuarios (nome,pontos) VALUES ("Eduardo Assis", 5270); INSERT INTO usuarios (nome,pontos) VALUES ("William da Rocha Lima", 5200); INSERT INTO usuarios (nome,pontos) VALUES ("MARCOLINO Alexandre de Jesus", 5190); INSERT INTO usuarios (nome,pontos) VALUES ("Fábio Berbert de Paula", 4970); INSERT INTO usuarios (nome,pontos) VALUES ("Rodrigo Pace de Barros", 4290); INSERT INTO usuarios (nome,pontos) VALUES ("Mauricio de Brito Maciel", 4110); INSERT INTO usuarios (nome,pontos) VALUES ("Wanderson Berbert", 4100); INSERT INTO usuarios (nome,pontos) VALUES ("Felipe Gubert", 3750); INSERT INTO usuarios (nome,pontos) VALUES ("Renato Michnik de Carvalho", 2760); INSERT INTO usuarios (nome,pontos) VALUES ("Lucas Martinez", 2520); INSERT INTO usuarios (nome,pontos) VALUES ("Ricardo Landim", 2250); INSERT INTO usuarios (nome,pontos) VALUES ("Fábio Campos Coelho", 1670); INSERT INTO usuarios (nome,pontos) VALUES ("Apocalipse", 1620); INSERT INTO usuarios (nome,pontos) VALUES ("Blackcatdbflush", 1310); INSERT INTO usuarios (nome,pontos) VALUES ("Caio Filipini", 1230); INSERT INTO usuarios (nome,pontos) VALUES ("Jorge Luiz Olimpia", 1140); INSERT INTO usuarios (nome,pontos) VALUES ("Anderson", 970); INSERT INTO usuarios (nome,pontos) VALUES ("Fernando Pereira", 900);
|
3.Mãos a obra, hora de racionar
Nosso script de paginação e navegação pelos registros possuirá a seguinte lógica seqüencial:
-conecte-se ao banco de dados
-defina o número de registros exibidos por página
-descubra o número da página que será exibida
-construa uma cláusula SQL "SELECT" que nos retorne somente os registros desejados
-exiba os registros na tela
-construa e exiba um painel de navegabilidade entre as páginas
Ufa !!! Veremos que o script não será tão complexo como aparenta. Vamos ao código ?!
<? // bloco 1 - conecte-se ao banco de dados $con = mysql_pconnect('mysql.vivaolinux.com.br','fabio','oi_feio'); // host, usuário, senha mysql_select_db('meusite'); // banco de dados
// bloco 2 - defina o número de registros exibidos por página $num_por_pagina = 6;
// bloco 3 - descubra o número da página que será exibida // se o numero da página não for informado, definir como 1 if (!$pagina) { $pagina = 1; }
// bloco 4 - construa uma cláusula SQL "SELECT" que nos retorne somente os registros desejados // definir o número do primeiro registro da página. Faça a continha na calculadora que você entenderá minha fórmula. $primeiro_registro = ($pagina*$num_por_pagina) - $num_por_pagina;
// consulta apenas os registros da página em questão utilizando como auxílio a definição LIMIT. Ordene os registros pela quantidade de pontos, começando do maior para o menor DESC. $consulta = "SELECT nome, pontos FROM usuarios ORDER BY pontos DESC LIMIT $primeiro_registro, $num_por_pagina"; // executar query $res = mysql_query($consulta,$con);
// bloco 5 - exiba os registros na tela echo "<ul>"; while (list($nome, $pontos) = mysql_fetch_array($res)) { echo "<li> $nome - $pontos"; } echo "</ul>";
// bloco 6 - construa e exiba um painel de navegabilidade entre as páginas $consulta = "SELECT COUNT(*) FROM usuarios"; list($total_usuarios) = mysql_fetch_array(mysql_query($consulta,$con));
$total_paginas = $total_usuarios/$num_por_pagina;
$prev = $pagina - 1; $next = $pagina + 1; // se página maior que 1 (um), então temos link para a página anterior if ($pagina > 1) { $prev_link = "<a href=\"$PHP_SELF?pagina=$prev\">Anterior</a>"; } else { // senão não há link para a página anterior $prev_link = "Anterior"; }
// se número total de páginas for maior que a página corrente, então temos link para a próxima página if ($total_paginas > $pagina) { $next_link = "<a href=\"$PHP_SELF?pagina=$next\">Próxima"; } else { // senão não há link para a próxima página $next_link = "Próxima"; }
// vamos arredondar para o alto o número de páginas que serão necessárias para exibir todos os registros. Por exemplo, se temos 20 registros e mostramos 6 por página, nossa variável $total_paginas será igual a 20/6, que resultará em 3.33. Para exibir os 2 registros restantes dos 18 mostrados nas primeiras 3 páginas (0.33), será necessária a quarta página. Logo, sempre devemos arredondar uma fração de número real para um inteiro de cima e isto é feito com a função ceil(). $total_paginas = ceil($total_paginas); $painel = ""; for ($x=1; $x<=$total_paginas; $x++) { if ($x==$pagina) { // se estivermos na página corrente, não exibir o link para visualização desta página $painel .= " [$x] "; } else { $painel .= " <a href=\"$PHP_SELF?pagina=$x\">[$x]</a>"; } }
// exibir painel na tela echo "$prev_link | $painel | $next_link"; ?>
|
Se você deseja fazer o download do código do script acima, acesse o seguinte endereço:
http://www.vivaolinux.com.br/publico/paginacao.txt
Enfim, acho que agora podemos evitar aquelas páginas de exibição de dados com intermináveis barras de rolagem que mais parecem presente de Grego né ?!?
Atenciosamente,
Fábio Berbert de Paula