Uma dúvida muito freqüente entre os desenvolvedores web é: "qual a melhor forma de se criar um esquema de paginação de resultados de uma consulta SQL ?". Neste artigo passo o algoritmo que criei para tal tipo de tarefa.
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] Comentário enviado por plextor_df em 27/11/2003 - 17:34h
O script funcionou perfeitamente depois de alguns ajustes, porém é o seguinte, quando clico para visualizar a proxima página, ele não encontra o arquivo...
Warning: main(modulos/procurar/1.php): failed to open stream: No such file or directory in c:\\program files\\apache group\\apache\\htdocs\\index.php on line 226
Até ai tudo bem, a mensagem é clara... Ele não encontrou o arquivo 1.php no diretório, o que devo fazer ? Eu criei o arquivo 1.php e os demais sem código algum dentro... Porém como devo recuperar o resto do conteúdo para ser mostrado ?
[5] Comentário enviado por DDD em 18/02/2004 - 08:38h
fabineri, se sua query estiver correta, é bem possível q seu erro seja ao abrir a conexão com o MySQL. Observe como o Fábio cria uma nova conexão no bloco 1:
[6] Comentário enviado por Ranta em 22/04/2004 - 13:19h
Parabéns pelo teu algoritmo que funciona perfeitamente.
Mas eu tenho um problema que é quando temos imensos registos mesmo paginando temos uma lista enorme de páginas eu já vi em vários sites que quando isso acontece eles criaram um sistema com pontinhos "..." para ir aparecendo as páginas seguintes por exemplo:
1, 2, 3, 4, ... e ao carregar nos pontinhos aparece ... 5, 6, 7, 8, ... e por ai fora...
Será que alguem tem uma solução como alterar este algoritmo para fazer como o exemplo que eu dei.
Obrigado
[7] Comentário enviado por fhm_online em 07/05/2004 - 11:12h
Fábio, blz?
Fiz o algoritimio adaptando-o a minha base de dados porém não habilita a opção de próxima página... Ele visualiza as 6 mensagens de n cadastradas no banco porém a opção da página seguinte não fica disponível.
O que vc acha q pode ser??
[10] Comentário enviado por uaraujo em 01/08/2004 - 21:21h
Salve Fábio,
Achei teu script muito simples, eficiente e bem bolado (o que é uma arte). Tentei adapta-lo as minhas necesidades e até consegui faze-lo rodar sem erros. Todavia ele quando executado não sai da pagina um. Tanto faz clicar no painel ou em próxima, ele mostra sempre a primeira página.
Eator anexando para ver se voce consegue me dar uma ajudazinha. Obrigado.
<?
// bloco 1 - conecte-se ao banco de dados
include "inc/conecta_gesthor.inc";
// $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;
$std_arq_pagina = $_SERVER['PHP_SELF']; // Arquivo que contém a página atual.
// 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 (!isset($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";
$consulta = "SELECT * FROM etiq_arquivo_tbl ORDER BY etiq_numero ASC LIMIT $num_por_pagina OFFSET $primeiro_registro";
// bloco 5 - exiba os registros na tela
echo "<ul>"; while (list ($etiq_numero, $etiq_titulo, $etiq_subtitulo, $etiq_nota) = pg_fetch_array($res)) {
echo "<li> $etiq_numero - $etiq_titulo - $etiq_subtitulo - $etiq_nota";
}
echo "</ul>";
// bloco 6 - construa e exiba um painel de navegabilidade entre as páginas
$consulta = "SELECT COUNT(*) FROM etiq_arquivo_tbl";
//list($total_usuarios) = pg_fetch_array(pg_query($consulta,$con));
list($total_usuarios) = pg_fetch_array(pg_query($consulta));
$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=\"$std_arq_pagina?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=\"$std_arq_pagina?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=\"$std_arq_pagina?pagina=$x\">[$x]</a>";
}
}
// exibir painel na tela
echo "$prev_link | $painel | $next_link";
?>
[14] Comentário enviado por XSlack em 22/08/2004 - 19:10h
grande fabio vi o pessoal falando que ele funcionou bem nos servidores na net mais no seus pcs não funcionou (em algum forum não me lembro qual) o que deve ser? configuração do meu php? pois fiz igual ao que vc disse usei o mesmo exemplo não mudei nada.
[16] Comentário enviado por aureliomjr em 31/08/2004 - 09:51h
Muito bom o código.
Precisei alterá-lo para não mostrar um número grande de páginas na páginação. No meu caso, as páginas aparecem num conjunto de 10 em 10. Clicando no link +10, o usuário tem acesso às próximas 10 páginas, e em -10, às 10 anteriores.
Se alguém precisar, o código com as alterações está em seguida:
(As linhas modificadas estão com ******* no comentário)
<?
// 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 = "";
// ****** imprime a primeira página do conjunto de 10 páginas
$pag_inic=floor($pagina/10)*10;
if ($pag_inic==0)
$pag_inic=1;
$pag_final = (floor($pagina/10)*10)+10;
for ($x=$pag_inic; $x<=$total_paginas && $x<=$pag_final; $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 class=\"links\" href=\"$PHP_SELF?pagina=$x\">[$x]</a>";
}
}
// ******link para as 10 páginas anteriores
if ($pag_inic >= 10) {
if ($pag_inic==10)
$menos_10 = "<a class=\"links\" href=\"$PHP_SELF?pagina=1\">-10</a>";
else
$menos_10 = "<a href=\"$PHP_SELF?pagina=".($pag_inic-9)."\">-10</a>";
} else { // senão não há link para as -10
$menos_10 = "-10";
}
// ******link para próximas 10 páginas
if ($total_paginas > $pag_final) {
$mais_10 = "<a href=\"$PHP_SELF?pagina=$pag_final\">+10</a>";
} else { // senão não há link para as +10
$mais_10 = "+10";
}
// ******exibir painel na tela
echo "$menos_10 $prev_link $painel $next_link $mais_10";
[20] Comentário enviado por _oliveira_ em 02/01/2005 - 14:55h
Vocês que estão com problemas que só carrega a primeira página, façam o que "wariston" falou "" $pagina=GET['pagina']; "".
Se liguem que aqui
// 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;
}
ele testa se a váriavel $pagina tem algum conteúdo, mas como alguns servidores não "conseguem pegar" as variáveis automaticamente, garanta que a variavel está sendo "pegue" corretamente, fazendo assim:
// pega qualquer informação emitida pelo navegador em relação
// a varivel pagina.
$pagina=GET['pagina'];
// testa o conteudo da variavel
if (!$pagina) {
$pagina = 1;
}
primeiro ele verifica se alguma variavel pagina foi enviada pelo navegador, se não foi enviada, esta variável é setada com o conteúdo 1.
[21] Comentário enviado por virtual em 15/01/2005 - 05:31h
Para melhorar um pouco mais o script mude o seguinte:
//número da página a ser exibida
$pagina = (isset($_GET["pagina"])) ? $_GET["pagina"] : $pagina = 1;
/*
Isto é pra verificar se existe alguma variável de url
se existir a variável "$pagina" recebe o valor da variável de url $_GET["pagina"]
se não recebe 1
*/
Isso permite limitar as páginas entre 1 e o número total de páginas para que o usuário não vá até o barra de endereço e mude a variável página para -10 ou um número superior ao total de páginas. (O usuário é imprevisível)
[22] Comentário enviado por rogerao em 03/03/2005 - 23:03h
Amigo muito legal e facil seu script, só q. ew naum consegui fazer funcionar o seguinte: ele mostra a primeira pagina e mostra q. tem outras paginas pra ser exibida só q naum consigo ver as outras ele me mostra só a primeira...vc. sabe o q. ew posso ter feito de errado...obrigado
[27] Comentário enviado por Kalifa em 11/05/2006 - 07:46h
Oi gente:
É minha primeira mensagem e já estou pedindo ajuda. Tenho uma pesquisa que me retorna vários registros. Por enquanto eles são poucos pois está no inicio. Queria liberar a aplicação mas preciso de um script que me permita fazer a paginação de resultados para que na tela não apareça um lençol de resultados. Pesquisei na net e fui encontrando alguns exemplos que comigo têm dado buraco. Agora achei esta e tentei adaptá-la às minhas necessidades. Continuo a obter os resultados que preciso mas a paginação não é feita. Eu alterei o parâmetro de 6 para 3 uma vez que tenho 7 registos e portanto deveria aparecer 2 páginas com resultados. Mas não !!!
Sou um pouco verde em PHP e portanto haverá alguma coisa que está me escapando. O meu ficheiro que retorna os resultados é uma manta de retalhos pois vou adaptando scripts às minhas necessidades. Ele até funciona direitinho sem a paginação mas com ela implementada não.
Para melhor entenderem vou colar o script do meu ficheiro de resultados. Ok?
+++++++++++++++++++++++++++++++++++++
<?php
// Iniciar sessão constantes e demais parâmetros
session_start();
include ('pl_fsp_constantes_web.inc');
include ('pl_fsp_header_web.php');
$x_spot = 'FSPX';
include ('pl_fsp_opensql_web.php');
$pl_host = "192.160.1.54";
echo '<SPAN CLASS="area">:: Fornecedores de Sementes e Plantas</SPAN>';
echo '<BR><BR><font color="#8000000" size="4" face="Arial"><br><br><center><b>RESULTADO DA PESQUISA</b></center></font></SPAN>
<SPAN CLASS="detalhes">
<BR><BR> ';
// VERIFICAR VALIDADE DO Distrito ----------------------------
if (!isset($distrito))
{
echo "Deve especificar uma palavra-chave para iniciar a pesquisa! Quer fazer <A HREF='primeira.php' CLASS='brancounder'>outra</A> pesquisa?<p> <p> <p> <p> <p> ";
include ("pl_fsp_footer_web.inc");
exit;
}
/* ******************************
* ## BLOCO 1 - conecte-se ao banco de dados
******************************/
$link = mysql_connect ($pl_host, $pl_bduser, $pl_bdpass); // host, usuário, senha
if (!$link)
{
$answer = "Neste momento não é possível proceder a esta operação. Por favor tente mais tarde.<BR>Se o problema persistir contacte o Administrador.";
$erro = TRUE;
}
/* ******************************************************************************************
*
* ## BLOCO 2- defina o número de registros exibidos por página
*
* ***************************************************************************************** */
$num_por_pagina = 4;
/* **********************************************************************************************
* ## 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;
/* Base de dados */
mysql_select_db ('dgf_net'); // banco de dados
$consulta = "SELECT * FROM dgf_plantas WHERE distrito LIKE '%$distrito' ";
if ($viveirista <> "*") {
$consulta .= "AND viveirista LIKE '%$viveirista%' ORDER BY viveirista " ;
} elseif ($titulo <> "*" ){
$consulta .= " AND titulo LIKE '%$titulo%' ";
} else {
$consulta .= " ORDER BY viveirista ";
}
// 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</a>";
} 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
[28] Comentário enviado por cl3m4 em 30/08/2006 - 15:58h
Eu havia feito uma descrição detalhada de como funciona este pqno código que adicionei ao topo do script, mas a perdi pois eu nao tinha cadastro e nao havia visto o aviso q deveria ser cadastrado para responder....
Bom, ai vai uma pqna descrição do codigo, mas digo que sou novato no PHP (menos de 1 semana de estudo), por isso caso tenha alguma coisa que seja mais facil de fazer do que o q eu fiz, favor avisar.
/* Primeiro verifica se $página esta vazia. Caso ela esteja vazia confere se não existe a variavel $pagina que tenha vindo pela URL (metodo GET). Caso ela nao tenha vindo pela URL o valor dela sera 1 e se tiver vindo pela URL o valor dela passa a ser o valor informado na URL... */
[29] Comentário enviado por roiajo em 24/09/2006 - 00:42h
Consegui fazer a paginação certinha.
Agora, serpa que alguem pode me ajudar? A página da paginação, cada registro deve conter um link para determinada noticia.
Ou seja: aparecem 5 títulos de notícia por página, e cada título deve ter um link para a notíocia inteira.
Alguem poderia me ajudar? www.telinha.com
[30] Comentário enviado por telmoespanha em 30/11/2006 - 11:00h
Viva à universalidade, sou natural de Portugal e entrei aki no vosso blog, e utilizei este script de PHP para resolver a kestão da paginação ligado a uma base de dados, consegui efectuar este script, com a alteração no script PHP:
$pagina=GET['pagina'];
por
$pagina=$_GET['pagina'];
Funciona bem.
No entanto tenho o seguinte código na minha página index.php
<?
// aqui vai incluir o ficheiro main.php
//apanha o conteúdo de fid
$fid=$_GET["fid"];
//verifica se fid está disponível
if(!$fid){
$fid=1;
}
$fich=$include["$fid"];
// detecta o o nome do ficheiro
include "$fich";
?>
<?
// pega qualquer informação emitida pelo navegador em relação
// a varivel pagina.
$pag=$_GET['pag'];
// detecta o o nome do ficheiro
include "$pag";
?>
Pergunto como posso fazer funcionar o script de paginação, depois de chamar o $fid para que faça o include do valor da página no meu ficheiro index.php
[31] Comentário enviado por rgazeredo em 28/08/2007 - 01:39h
Fabio pode me ajudar? No meu pc rodando localmente ele funciona normal, agora fui jogar para o servidor onde hospedo a pagina e na hora de gerar a paginação ele cria mais 2 paginas em branco sem necessidade pq ja paginas anteriores ele ja mostrou todos os registros...
Pode da uma olhada no meu codigo e me ajudar?
Desde de ja agradeço pelo codigo e pela ajuda...
<head>
<link rel=STYLESHEET href="admin/estilo.css" type="text/css">
</head>
<table border="0" width="100%" align="center">
<table width="500" cellpadding="0" cellspacing="0" align="center" border="0">
<?
// bloco 1 - conecte-se ao banco de dados
include("include/config.php");
$pagina = $_GET['pagina'];
// bloco 2 - defina o número de registros exibidos por página
$num_por_pagina = 4;
// 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.
$sql = "SELECT * FROM cad_produtos WHERE categoria = '1' LIMIT $primeiro_registro, $num_por_pagina";
// executar query
$busca = mysql_query($sql,$conexao);
// bloco 6 - construa e exiba um painel de navegabilidade entre as páginas
$sql = "SELECT COUNT(*) FROM cad_produtos";
list($total_usuarios) = mysql_fetch_array(mysql_query($sql,$conexao));
$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</a>";
} 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 "<p align=\"center\">$prev_link | $painel | $next_link</p>";
?>
//número da página a ser exibida
$paginav = (isset($_GET["pagina"])) ? $_GET["pagina"] : $pagina = 1;
$num_por_pagina = 3;
// 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.
$sql = "SELECT * FROM tb_noticias ORDER BY data DESC LIMIT $primeiro_registro, $num_por_pagina";
$res = mysql_query($sql);
// Construa e exiba um painel de navegabilidade entre as páginas
$consulta = "SELECT COUNT(*) FROM tb_noticias";
list($total_usuarios) = mysql_fetch_array(mysql_query($consulta));
$total_paginas = $total_usuarios/$num_por_pagina;
$prev = $paginav - 1;
$next = $paginav + 1;
// se página maior que 1 (um), então temos link para a página anterior
if ($paginav > 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 > $paginav) {
$next_link = "<a href=\"$PHP_SELF?pagina=$next\">Próxima</a>";
} 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 = "";
// ****** imprime a primeira página do conjunto de 10 páginas
$pag_inic=floor($paginav/10)*10;
if ($pag_inic==0)
$pag_inic=1;
$pag_final = (floor($paginav/10)*10)+10;
for ($x=$pag_inic; $x<=$total_paginas && $x<=$pag_final; $x++) {
if ($x==$paginav) { // se estivermos na página corrente, não exibir o link para visualização desta página
$painel .= " [$x] ";
} else {
$painel .= " <a class=\"links\" href=\"$PHP_SELF?pagina=$x\">[$x]</a>";
}
}
// ******link para as 10 páginas anteriores
if ($pag_inic >= 10) {
if ($pag_inic==10)
$menos_10 = "<a class=\"links\" href=\"$PHP_SELF?pagina=1\">-10</a>";
else
$menos_10 = "<a href=\"$PHP_SELF?pagina=".($pag_inic-9)."\">-10</a>";
} else { // senão não há link para as -10
$menos_10 = "-10";
}
// ******link para próximas 10 páginas
if ($total_paginas > $pag_final) {
$mais_10 = "<a href=\"$PHP_SELF?pagina=$pag_final\">+10</a>";
} else { // senão não há link para as +10
$mais_10 = "+10";
}
// ******exibir painel na tela
echo "$menos_10 $prev_link $painel $next_link $mais_10";
[35] Comentário enviado por n3g4_1 em 18/05/2016 - 21:43h
Sei que o Post é antigo mas:
1 - Eu não entendo o seu $PHP_SELF.
2 - Estudando casos eu vi que PHP_SELF pega a parte da URL através do Supertag $_Server
3 - Não deu certo aqui!! Apesar do menu de lista estar aparecendo!! Eu não consigo navegar pelos dados!! Não sai da primeira página!!! Quando eu clico em uma página qualquer é exibido os dados da primeira página!!