Paginação de resultados em PHP/MySQL

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.

[ Hits: 87.335 ]

Por: Fábio Berbert de Paula em 03/02/2003 | Blog: https://fabio.automatizando.dev


Mãos a obra, hora de raciocinar !



Nosso script de paginação e navegação pelos registros possuirá a seguinte lógica seqüencial:
  1. conecte-se ao banco de dados
  2. defina o número de registros exibidos por página
  3. descubra o número da página que será exibida
  4. construa uma cláusula SQL "SELECT" que nos retorne somente os registros desejados
  5. exiba os registros na tela
  6. 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: 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

Página anterior    

Páginas do artigo
   1. Introdução
   2. Criação da tabela e da fonte de dados
   3. Mãos a obra, hora de raciocinar !
Outros artigos deste autor

O que são distribuições

O Surgimento do Linux

Criando um painel de rede em PHP

Criando sites para celular com WML

Como implementar uma assistente virtual no Linux

Leitura recomendada

Criando sites para celular com WML

Symfony Framework - Introdução

Formantando nomes com caracteres especiais em PHP

Debugando aplicações PHP com Xdebug e Eclipse PDT

PEAR - Utilizando classes prontas e documentadas no PHP

  
Comentários
[1] Comentário enviado por fabineri em 19/06/2003 - 17:01h

Dá o seguinte erro o que fazer para corrigir isso.

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /srv/www/default/html/exibir.php on line 37


F@biano

[2] Comentário enviado por fabio em 22/06/2003 - 02:36h

Isso significa que sua query não está correta. Faça um debug da seguinte forma, abaixo da definição de $consulta coloque a linha:

echo $consulta; exit;

Pegue a saída da página e cole no terminal do MySQL.

[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 ?

[4] Comentário enviado por dedraks em 19/01/2004 - 14:25h

fabineri, pra ver o erro da query faça assim:

mysql_query("SUA QUERY AQUI") or die(mysql_error());

[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:

$con = mysql_pconnect('mysql.vivaolinux.com.br','fabio','oi_feio');

Posteriormente, ele usa a variável $con no momento de contar o total de registros no bloco 6:

$consulta = "SELECT COUNT(*) FROM usuarios";
list($total_usuarios) = mysql_fetch_array(mysql_query($consulta,$con));

É provável q tu estejas usando outra variável para criar a conexão. Dae, é só trocar a variável $con por $tua_var_de_conexão :)

Abração

[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??

Um abraço!

[8] Comentário enviado por fhm_online em 07/05/2004 - 11:53h

Fábio, consegui fazer funcionar corretamente...

Obrigado!!

[9] Comentário enviado por doug_lima_rs em 21/06/2004 - 15:27h

Kara, show de bola o seu algoritimo, consegui implementar em minha base, tambem é um exemplo muito bem detalhado.....

[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";

// executar query
//$res = pg_query($consulta,$con);
$res = pg_query($consulta);

// 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";
?>

[11] Comentário enviado por XSlack em 13/08/2004 - 20:45h

não sai da primeira pagina hehe dava pra postar uma solução?

[12] Comentário enviado por XSlack em 19/08/2004 - 15:19h

tem ou não tem solução?

[13] Comentário enviado por fabio em 20/08/2004 - 09:22h

Como está o seu script? O algoritmo funciona 100%, você deve ter feito alguma caquinha por aí.

[]'s

[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.

[15] Comentário enviado por fabio em 23/08/2004 - 00:34h

X, não creio que seja configuração do PHP. Tenta enviar seu código pra mim que assim que puder dou uma analisada.

[]'s

[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";

?>

[17] Comentário enviado por johnson em 14/10/2004 - 03:13h

Estou tendo o mesmo problema de paginação: não sai da primeira página!

No começo achava que era um problema com as versões do php, apache e mysql, instalei todos atualizados e nada.

Hospedei o script no miarroba.com e tudo funcionou.

Deve ser um problema de configuração.

Alguém poderia me ajudar?

[18] Comentário enviado por wariston em 11/11/2004 - 04:33h

o problema com a navegação das páginas pode ser resolvido colocando um:

$pagina=GET['pagina'];

no inicio do script, pois alguns servidores não estão configurados corretamente para esse tipo de comportamento, isso resolve o problema...


100% Slackware


[19] Comentário enviado por removido em 11/11/2004 - 07:26h

massa o artigo fabio...

um pequeno erro...

$next_link = "<a href=\"$PHP_SELF?pagina=$next\">Próxima";

a tag nao esta fechada.. </a>

valeu ae..
falows!

[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
*/

if($pagina<1) $pagina = 1;

$sql = "SELECT COUNT(*) FROM tb_aluno";
$rs2 = $db->query($sql);
$valor = $db->fetchRow($rs2);
$total_reg = $valor[0];

if($pagina>($total_reg/$num_por_pagina)) $pagina = $total_reg/$num_por_pagina;

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

[23] Comentário enviado por kandrus em 14/05/2005 - 18:46h

Parabéns pelo artigo muito bom tive que fazer algumas modificações para adapta-lo as minhas necessidades.

Mas ficou muito bom simples porem eficiente

[24] Comentário enviado por melck em 11/06/2005 - 01:41h

Aeh Fabio, quero deixar meu agradecimento pelo seu script de paginação, funcionou bacaninha, aprendi mais uma com quem realmente conhece o que faz.

Parabéns pela excelente explicação.

Grd []



[25] Comentário enviado por leogsouza em 24/11/2005 - 00:08h

Mto bom esse artigo vai me ajudar mto no site daki da empresa

[26] Comentário enviado por dudu1533 em 27/02/2006 - 18:26h

Perfeito
Tá funcionando beleza

até mais

[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";

// Tabela estruturante
echo '<TABLE WIDTH=100% CELLPADDING=0 CELLSPACING=0 BORDER=0><TR><TD STYLE="width: 10px;"></TD><TD VALIGN=TOP>';
echo '<BR><BR>';

// ++++++++++++++++++++++++++

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 ";
}


/* Cabeçalho: */

echo '<BR><BR><center>';
echo '<TABLE WIDTH=98% cellspacing="1" bgcolor="#C0E0C0" cellpadding="2">
<TR STYLE="font-size: 10px; color: white; ">
<TD background="imagem/tbl_verde.png" ALIGN=center>  Nome do<br> Fornecedor </TD>
<TD background="imagem/tbl_verde.png" ALIGN=center> Espécie </TD>
<TD background="imagem/tbl_verde.png" ALIGN=CENTER> Distrito </TD>
<TD background="imagem/tbl_verde.png" ALIGN=CENTER> Região <br>Proveniência</TD>
<TD background="imagem/tbl_verde.png" ALIGN=CENTER> Outra <br> Região </TD>
<TD background="imagem/tbl_verde.png" ALIGN=CENTER> Actividade </TD>
<TD background="imagem/tbl_verde.png" ALIGN=CENTER> Produto </TD>
<TD background="imagem/tbl_verde.png" ALIGN=CENTER> Suporte <br>Raíz </TD>
<TD background="imagem/tbl_verde.png" ALIGN=CENTER> Sustrato </TD>
<TD background="imagem/tbl_verde.png" ALIGN=CENTER> Idade </TD>
<TD background="imagem/tbl_verde.png" ALIGN=CENTER>Quantid.<br>(Kg)</TD>
<TD background="imagem/tbl_verde.png" ALIGN=CENTER> Quantid. <br>(Unid.)</TD>
<TD background="imagem/tbl_verde.png" ALIGN=CENTER> Contacto </TD>
</TR>
';


/* *********************************************
*
* ## BLOCO 5 - exiba os registros na tela
*
* ********************************************/
$resultado = mysql_query ($consulta) ; /*[SOS]*/

if (!$resultado)
{ // Não há resultados
echo 'Não há resultados para os critérios indicados.<BR>Quer fazer <A HREF="primeira.php" CLASS="brancounder">outra</A> pesquisa?';
}
while ($linha = mysql_fetch_array($resultado))
{
echo '<TR STYLE="font-size: 10px">';
echo '<TD bgcolor="#E6FFF2">'.$linha["viveirista"].'</TD>';
echo '<TD bgcolor="#E6FFF2" ALIGN="CENTER">'.$linha["titulo"].'</TD>';
echo '<TD bgcolor="#E6FFF2" ALIGN="CENTER">'.$linha["distrito"].'</TD>';
echo '<TD bgcolor="#E6FFF2" ALIGN="CENTER">'.$linha["regprov"].'</TD>';
echo '<TD bgcolor="#E6FFF2" ALIGN="CENTER">'.$linha["outraregiao"].'</TD>';
echo '<TD bgcolor="#E6FFF2" ALIGN="CENTER">'.$linha["actividade"].'</TD>';
echo '<TD bgcolor="#E6FFF2" ALIGN="CENTER">'.$linha["produto"].'</TD>';
echo '<TD bgcolor="#E6FFF2" ALIGN="CENTER">'.$linha["suporteraiz"].'</TD>';
echo '<TD bgcolor="#E6FFF2" ALIGN="CENTER">'.$linha["substratoraiz"].'</TD>';
echo '<TD bgcolor="#E6FFF2" ALIGN="CENTER">'.$linha["idade"].'</TD>';
echo '<TD bgcolor="#E6FFF2" ALIGN="RIGHT">'.$linha["quantkg"].'</TD>';
echo '<TD bgcolor="#E6FFF2" ALIGN="RIGHT">'.$linha["quantunid"].'</TD>';
echo '<TD bgcolor="#E6FFF2" ALIGN="RIGHT">'.$linha["contacto"].'</TD>';
echo '</TR>';
}
echo '</TABLE></center>';
echo '<br><br>';
/* *******************************************************************************
*
* ## BLOCO 6 - construa e exiba um painel de navegabilidade entre as páginas
*
* ***************************************************************************** */
$total_registos = mysql_num_rows($resultado);
$total_paginas = $total_registos / $num_por_pagina;

/* Botões anterior e próximo: **/
$prev = $pagina - 1;
$next = $pagina + 1;
if ($pagina > 1) {
$prev_link = "   <a href=\"$PHP_SELF?pagina=$prev\"><- Anterior</a> ";
}
else {
$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 "  $prev_link | $painel | $next_link";

// --+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
echo '<font color="#800000" size="1" face="Verdana"><br><br>  Pretende fazer <A HREF="primeira.php" CLASS="brancounder">outra</A> pesquisa?</font>';
echo "<br>  ";
mysql_close ($link);
// ----------------------------------------------------------------------- /*
include ("pl_fsp_footer_web.inc");
?>

[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... */

if (empty($pagina)) {
if(!isset($_GET['pagina'])){
$pagina = 1;
}else{
$pagina = $_GET['pagina'];
}
}

[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

http://www.marthas.pt/est1920/

clicar em noticias
e encontra aqui o meu problema


Fica aqui a dúvida? Ficaria grato pela solução deste script.

[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);

while($lista=mysql_fetch_array($busca)) {

if($contador){
if($contador%2==0){
print "</tr><tr>";
}
}
$contador++;
?>
<tr>
<td rowspan="2" bgcolor="#CCCCCC" style="border-color:#FFFFFF; border-style:solid; border-bottom-width:1px; border-left-width:2px; border-right-width:2px; border-top-width:2px;" width="120" height="90" align="center" valign="middle"><a href="#" onclick="javascript:window.open('ft_produtos/<? echo $lista['foto'];?>','foto','toolbar=no,location=no,status=no,menubar=no,scrollbars=no,resizable=yes,width=,height=, left=0, top=0')"><img align="middle" src="ft_produtos/<? echo $lista['foto'];?>" border="0" width="120" height="100" /></a></td>
<td width="2"></td><td class="texto" bgcolor="#CCCCCC" style="border-color:#FFFFFF; border-style:solid; border-bottom-width:1px; border-left-width:2px; border-right-width:2px; border-top-width:2px;" align="left" valign="middle"><? echo $lista['produto']; ?></td>
</tr>
<tr>
<td width="2"></td><td class="texto" bgcolor="#EBEBEB" style="border-color:#FFFFFF; border-style:solid; border-bottom-width:1px; border-left-width:2px; border-right-width:2px; border-top-width:2px;" height="70" align="left" valign="top"><? echo nl2br($lista['descricao']); ?></td>
</tr><tr><td height="5"></td></tr>

<?
}
?>
</table>
<?


// 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>";
?>

[32] Comentário enviado por removido em 04/12/2007 - 22:08h

ERRO: Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource


Isso aparece nas linhas onde tem $res = mysql_query($sql); e na linha while ($noticias=mysql_fetch_array($res))

Ou seja tudo que resgata da $res, o que pode ser???
segue codigo:


<?php require('verifica.php');
require_once("conexao.php");

//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);

$pagina=("Relatorio de Notícias");
require("arquivos/adm_header.php");
?>
<table border="0" cellspacing="2" cellpadding="2">
<tr>
<td><b>Titulo</b></td><td><b>Data</b></td><td><b>Ações</b></td>
</tr>
<?php
$cont = 0;
while ($noticias=mysql_fetch_array($res))
{
$novadata=($noticias['data']); //1900-10-10
$arrdata=explode("-",$novadata);
$novadata=$arrdata[2]."/".$arrdata[1]."/".$arrdata[0];

$cor = ($cont%2 == 0) ? "#E9E9E9" : "#FFFFFF";
$cont++;

echo"<tr style=\"background-color:$cor\">
<td width=\"340\">{$noticias['titulo']}</td>
<td>{$novadata}</td>
<td width=\"60\" align=\"center\"><a title=\"Alterar Notícia\" href=\"alt_noticia.php?cod_noticia={$noticias['cod_noticia']}\"><img src=\"imagens/pencil.gif\" border=\"0\" width=\"16\" height=\"16\"></a> <a title=\"Excluir Notícia\" href=\"conf_exclusao_noticia.php?cod_noticia={$noticias['cod_noticia']} \"><img src=\"imagens/cross.gif\" border=\"0\" width=\"16\" height=\"16\"></a></td>
</tr>";
}
?>
<tr>
<td colspan="4" align="center"><br/><b><?php echo mysql_num_rows($res); ?> registros encontrados!</b></td>
</tr>
</table>

<?php

// 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";



require("arquivos/adm_footer.php");?>


[33] Comentário enviado por comfaa em 28/10/2008 - 12:59h

muito legal !!!

[34] Comentário enviado por markintux em 06/10/2009 - 09:03h

rodou o arquivo... mas não funciona a navegação...

[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!!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts