sábado, 26 de abril de 2008

Sistema de Paginação com números

Mais PHP. Hoje vou mostrar como fazer um sistema de paginação. O código é muito simples. Seguindo a lógica então é melhor ainda. Para isso precisamos de um banco de dados.
Para fazer esse sistema, eu não peguei referência em nenhum outro sistema que existe pela web. Fiz seguindo a lógica:
1º Conectar ao banco de dados;
2º Selecionar no limite de 10;
3º Exibir resultado;
4º Calcular número páginas;
5º Exibir links de navegação;


<?php
// 1º Conectar banco de dados;
$conexao = mysql_connect("servidor", "usuario", "senha");
$banco_dados = mysql_select_db("banco", $conexao);

$indice = $_GET['indice']; // o valor dessa variável será recebido por query string

//2º Selecionar no limite de 10;
$query = "SELECT * FROM tabela LIMIT ".$indice.", 10";
$result = mysql_query($query, $conexao);

3º Exibir resultado;
echo("<table border='1'><tr><td>Nome</td><td>Email</td></tr>") // No caso nossa tabela tem apenas duas colunas

while ($linha = mysql_fetch_row($result)){ // Cada linha da tabela retorna um array com índices numéricos
echo("<tr><td>$linha[0]</td><td>$linha[1]</td></tr>"); // $linha[0] corresponde ao valor de nome e $linha[1] corresponde ao valor de email
}

echo("</table>");

// 4º Calcular número de páginas
$query2 = "SELECT * FROM webmail"; // Seleciona tudo
$result2 = mysql_query($query2, $conexao); // Realiza a query
$tudo = mysql_num_rows($result2); // Total de linhas na tabela

$calculo = $tudo/10; //*
$total_paginas = ceil($calculo);// Arredonda o resultado de uma fração para cima.

// 5º Exibir links de navegação
echo("<a href='$PHP_SELF?indice=0'>1</a>");// exibe o primeiro link com o índice 0 para a tabela.

for($i=2, $x=11; $i <= $total_paginas, $x <= $tudo; $i++, $x+=10){ //**
echo("<a href='$PHP_SELF?indice='$x'>$i</a>"); // exibe dinamicamente a partir do link 2 e um índice para cada link.
}
?>


*: Seguindo a lógica: nós queremos separar um tanto de registros em 10 partes NÃO iguais. Por exemplo: temos 453 registros na nossa tabela e queremos exibi-los de 10 em 10 páginas. Então 453/10 = 4.3. Daí nós usamos a função que irá arredondar o resultado para cima, ficando 5 páginas: 4 páginas com 10 registros e a quinta com 3 registros. Se fossem 27 registros, a divisão seria assim:
1ª Página:
1 2 3 4 56 7 8 9 10

2ª Página:
11 12 13 14 15 16 17 18 19 20

3ª Página:
21 22 23 24 25 26 27

Entenderam?

**: Aqui nós dizemos que será preciso exibir um link com um índice de 10 em 10 para cada link e cada link terá que ter um numero que será aumentado de um em um. Repare que na quinta etapa, o primeiro link não foi exibido dinamicamente, pois se o loop começasse com 0 o próximo índice seria 10 e não 11, repetindo assim o último elemento de cada página anterior.
depois de $i=2, $x=11 temos o seguinte: $i <= $total_paginas, $x <= $tudo. Isso quer dizer que o loop só irá terminar quando o numero de link for menor ou igual ao numero de páginas; e o índice for menor ou igual ao número total de linhas da nossa tabela.

É isso aí. Mas não acabou. Isso mesmo. Lembra que o valor da variável $indice que passa o índice para a query sql vem de um query string? E se não tiver nenhum query string? Não irá exibir nada! E nós não queremos isso né? Então é só trocar a linha $indice = $_GET['indice']; por:


$pagina = $_SERVER['PHP_SELF']; // Retorna o valor da página relativo à pasta root;
$query_string = $_SERVER['QUERY_STRING']; //retorna uma query string se houver, pela qual a página foi acessada;

$url = $pagina.$query_string; // Adiciona o nome valor da página com a query string;
if(!ereg("indice=", $url)){ // A função ereg verifica a ocorrência em uma string;
$indice = "0"; // Se não tiver query string seta o valor de índice para "0". Esse valor é uma string e não um inteiro;
}
else{
$indice = $_GET["indice"]; // Se tiver query string o valor de índice será recebido pela quer string
}

Agora sim terminamos. Para chegar nesse resultado, eu acabei fazendo uns loops infinitos travando o navegador várias vezes. Tome cuidado ao trabalhar com loops.
Use e abuse desse código não precisa citar a fonte, se você quiser cite, mas o importante nesse post é ensinar e não copiar e colar. Viu que seguindo a lógica é bem mais fácil fazer as coisas? Qualquer erro, sugestão, dúvida: comentem.
Até mais.

0 comentários: