Primeiro vamos fazer um arquivo de configuração em que vai estar armazenado os dado primordiais do script:
config.php
Esse será o arquivo que tem as configurações básicas de conexão ao banco de dados.<?
$host = "localhost";
$user = "root";
$pass = "";
$db = "banco_de_dado";
$reg_p_pag = "10";
$link_p_pag = "5";
$connection = @mysql_connect($host, $user, $pass) or die("Unable to connect to database!");
@mysql_select_db($db, $connection) or die("Unable to select database!");
?>
Uma parte muito importante é a que tem a variavel $reg_p_pag = "10"; ela define que teremos 10 registros por página e a $link_p_pag = "5"; define que teremos 5 links por página.
Bom, vamos criar uma tabela no banco de dados com o nome teste e com os campos id e texto.
Pra ser mais prático criei um arquivo de instação pra os priguiçosos...
instalar.php
Esse arquivo vai criar a tabela e os campos automaticamente. O campo ID é auto increment, ou seja, vai fazer uma numeração crescence.<?
include("config.php");
$query = "CREATE TABLE teste";
$query .= "(id int(10) unsigned NOT NULL auto_increment,";
$query .= "texto text NOT NULL, PRIMARY KEY (id))";
mysql_query($query);
?>
Agora que já criamos a tabela vamos inserir vários cadastro na nossa tabela pra poder ter uma paginação com várias páginas (já que é um exemplo, tem que mostrar como funciona).
Eu criei uma paginazinha que insere um cadastro na tabela e depois atualiza para enviar outro cadastro e por aí vai.
insert.php
Abre esse arquivo no servidor e deixa ele aberto por +-1 minuto que insere um bom nº de cadastros.<script>
window.onload = function teste()
{
location.href = location.href;
}
</script>
<?
include("config.php");
$query = "INSERT INTO teste (texto) VALUES ('Texto sobre algo')";
mysql_query($query);
?>
Agora chegamos onde eu queria! A página que vai realmente trabalhar! Vou tentar fazê-la o mais detalhado possível.
Primeiro vamos ver como seria a lógica.
Primeiro nós temos que saber quantos cadastros temos no banco de dados, conheço duas formas de fazer isso.
Uma forma é fazer uma consulta que resulte em todos os registros da tabela usando a função mysql_num_rows(). Imagina só se temos 10.000 registros e o usuário quer visualizar a página 10! Fica meu incabível vc selecionar os 10.000 registros e depois fitrar pra mostrar somente de 101 a 110 (caso sejam 10 registros por página).
Nesse exemplo acima a busca pelos resultados seria assim:
$query = mysql_query("SELECT * FROM teste;");
$registros = mysql_num_rows($query);
Mas uma busca dessa leva todos os resultados pra a memória do servidor, mesmo que não seja um nº grande pode fazer uma diferença na sua performance.
O jeito mais cabível é assim:
$query = mysql_query("SELECT count(*) FROM teste;");
$registros = mysql_result($query,0);
Ok! Já temos o nº de registros.
Lembra-se do arquivo de configuração? Pois é! Nele temos a especificação de $reg_p_pag = "10"; ele será muito usado, por exemplo agora, que temos que saber o nº total de página que teremos.
$num_total_paginas = ($registros%$reg_p_pag==0)?$registros/$reg_p_pag:floor($registros/$reg_p_pag)+1;
Esse código acima é o seguinte, ele pega o Nº de registros e divide pelo Nº de regitros por página se o resultado for iqual a 0 o Nº de páginas será o Nº de registros dividido pelo Nº de registros por página, se o resultado da divisão for diferende de 0 o Nº de páginas será floor($registros/$reg_p_pag)+1.
A função floor() retorna o nº inteiro da divisão arredondado pra baixo e no final colocamos + 1 que soma 1 ao resultado.
Ótimo!!! Conseguimos um Nº inteiro como resultado de páginas.
Agora como selecionar os registros certos da página requerida pelo usuário? Simples, usando LIMIT na sua seleção.
SELECT * FROM teste ORDER BY id LIMIT 11, 10
Entendeu como funciona o LIMIT? No exemplo acima ele vai selecionar todos os campos da tabela TESTE ordenados pelo ID começando pelo registro 11 e vai selecionar os 10 próximos.
Agora vamos saber qual vai ser o início do LIMIT.
$inicio = ($reg_por_pag*$pag)-$reg_por_pag;
Essa variavel $pag será passada pelo URL no método GET, caso ela não exista o valor dela será 1.
if (!$pag)
$pag = "1";
Pronto, já temos o Inicio e o Tanto que temos que selecionar. Na query pra selecionar os registros vamos fazer assim:
$query = "SELECT * FROM teste ORDER BY id LIMIT $inicio, $reg_por_pag";
$result = @mysql_query($query);
while ($row = mysql_fetch_assoc($result))
{
$id = $row['id'];
$texto = $row['texto'];
echo $id;
echo " - ";
echo $texto;
echo "<br>";
}
Agora vamos aos links...
$anterior = $pag-1;
if ($anterior<1)
echo "Anterior - ";
else
echo "<a href=\"{$_SERVER['PHP_SELF']}?pag=$anterior\">Anterior</a> - ";
Essa é a parte em que vai imprimir o link pra página anterior, veja que existe um IF, a tradução de IF é SE, então o código seria:
SE ($anterior maior que 1)
escreva "Anterior -"
CASO CONTRARIO
ecreva ...
A váriavel anterior vai ser a página atual - 1.
for($i=1; $i<$pag; $i++)
if($i>=$pag-$links_p_pag)
echo "<a href=\"{$_SERVER['PHP_SELF']}?pag=$i\">$i</a> - ";
Aqui vamos escrever os links anteriores a página atual, caso existam.
echo "<b>$pag</b>";
for($i=$pag+1; $i<=$num_total_paginas; $i++)
if($i<=$pag+$links_por_pag)
echo " - <a href=\"{$_SERVER['PHP_SELF']}?pag=$i\">$i</a>";
E aqui vamos escrever a página atual e os links posteriores caso existam.
$proxima = $pag+1;
if ($proxima>$num_total_paginas)
echo " - Próxima";
else
echo " - <a href=\"{$_SERVER['PHP_SELF']}?pag=$proxima\">Próxima</a>";
E por último vamos escrever um link pra a próxima página, caso exista.
O código dessa página seria assim:
paginacao.php
<html>
<head>
<title>Paginação</title>
<style type="text/css">
body { font-family: Verdana; font-size: 12px; }
a { font-family: Verdana; font-size: 12px; color: #000000; text-decoration: none; }
a:hover { color: #FE5400; text-decoration: none; }
</style>
</head>
<body>
<?
include("config.php");
$link_p_pag = 5;
$reg_p_pag = 9;
$pag = $_GET['pag'];
$busca = mysql_query("SELECT count(*) FROM teste;");
$registros = mysql_result($busca,0);
echo "Número de registros: ";
echo $registros;
echo "<br>";
$num_total_paginas = ($registros%$reg_p_pag==0)?$registros/$reg_p_pag:floor($registros/$reg_p_pag)+1;
echo "Número de páginas: ";
echo $num_total_paginas;
echo "<br>";
echo "Links por página: ";
echo $link_p_pag;
echo "<br>";
echo "Registros por páginas: ";
echo $reg_p_pag;
echo "<br>";
echo "<hr>";
if ($pag>$num_total_paginas)
echo "Error<br><br>";
else
if (!$pag)
$pag = 1;
$inicio = ($reg_p_pag*$pag)-$reg_p_pag;
echo "Inicia em: $inicio<br><br>";
$query = "SELECT * FROM teste ORDER BY id LIMIT $inicio, $reg_p_pag";
$result = @mysql_query($query);
while ($row = mysql_fetch_assoc($result))
{
$id = $row['id'];
$texto = $row['texto'];
echo $id;
echo " - ";
echo $texto;
echo "<br>";
}
echo "<hr><br>";
$anterior = $pag-1;
if ($anterior<1)
echo "Anterior - ";
else
echo "<a href=\"{$_SERVER['PHP_SELF']}?pag=$anterior\">Anterior</a> - ";
for($i=1; $i<$pag; $i++)
if($i>=$pag-$link_p_pag)
echo "<a href=\"{$_SERVER['PHP_SELF']}?pag=$i\">$i</a> - ";
echo "<b>$pag</b>";
for($i=$pag+1; $i<=$num_total_paginas; $i++)
if($i<=$pag+$link_p_pag)
echo " - <a href=\"{$_SERVER['PHP_SELF']}?pag=$i\">$i</a>";
$proxima = $pag+1;
if ($proxima>$num_total_paginas)
echo " - Próxima";
else
echo " - <a href=\"{$_SERVER['PHP_SELF']}?pag=$proxima\">Próxima</a>";
?>
</body>
</html>
Me desculpem mais comecei a cansar, afinal to a uma hora tentando fazer esse tutorial e começou a dar dores no pulso.
Vou colocar ele em anexo funcionando, caso queiram ajuda podem postar...
Correções serão bem vindas caso necessárias.
-------
Cristiano G.