Sábado, 20 de Abril de 2024




 Consulta Paginada em PHP/MySQL

Aqui temos uma breve descrição de uma solução em PHP para uma consulta paginada com Banco de Dados MySQL.

Para um melhor entendimento, será melhor uma leitura inicial da Publicação de Padronização de Página PHP.

A melhor maneira de se fazer uma consulta paginada é concentrá-la numa única página fonte, que será recarregada por si própria a cada mudança de página.

Note que a página em questão tem apenas UM parâmetro de entrada: O número da página. Para a paginação em si este único parâmetro é suficiente. Poderão ser utilizados outros parâmetros para programar a consulta a ser feita, mas para a paginação não é necessário.

Não está sendo apresentado aqui o código completo de uma página e sim partes principais do código, para entendimento.


1) Exemplo da área de definição da página:

// =========================< CONSTANTES >============================

// Quantidade de itens por página:
define("cQtdItemPag", 10);


// ==========================< VARIÁVEIS >============================

// Número (Inteiro) da página atual:
$numPag = 1;

// Clausula Where da sua consulta SQL:
$sWhere = "";



2) Recepção de parâmetros e carga inicial das variáveis:

Caso o número da página recebida seja vazio ou não numérico, assumimos como sendo 1 (primeira página). Desta forma, quando a página for chamada pela primeira vez, sem parâmetros, apresentará a primeira página da consulta:

    $pag = $_REQUEST["Pag"];
    // Se página não indicada, assume a 1 (um):
    if($pag == "") $pag = "1";
    if(is_numeric($pag)){
      $numPag = intval($pag);
    } else {
      $numPag = 1;
    }


A cláusula Where da consulta poderá ser fixa ou gerada a partir de outros parâmetros recebidos. Ela é gerada como variável de página para simplificar, pois serão necessárias duas consultas com a mesma seleção:

    $sWhere = " WHERE . . . "


3) Apresentação dos registros:

Para a apresentação dos registros será necessário fazer uma consulta a partir do primeiro registro da página atual. Este registro pode ser calculado a partir do número da página atual e da Quantidade de ítens por página.

Para isso utilizaremos o comando LIMIT e OFFSET do MySQL, como no exemplo de função para a geração de registros abaixo:

function GeraRegistros(){
    global $numPag, $sWhere;

    // Monta o SQL para a Consulta:
    $s = "SELECT * FROM tbTabela $sWhere ORDER BY ... LIMIT " . cQtdItemPag;
    if($numPag > 1){
      $s .= " OFFSET " . strval(($numPag - 1) * cQtdItemPag);
    }
    $rs = $apl->querySQL($s);
    while($lin = $rs->fetch_assoc()){

      // Monta e apresenta o registro com o visual desejado...
    }
    $rs->close();
}



4) Links de Paginação:

Uma simples consulta na base nos indica quanto registros existem na consulta.

Com a quantidade de registros da consulta e a quantidade de ítens por página calculamos quantas páginas existirão na consulta.

Sabendo a quantidade de registros podemos montar os Links das páginas da consulta. Estes Links remeterão à própria página, passando o número da página desejada. A página atual não é montada como Link. Os links Anterior e Próxima aparecem como links, conforme a necessidade:

function GeraPaginacao(){
    global $numPag, $sWhere;

    // Inicializa Vars:
    $qtdReg = 0;
    $qtdPag = 1;

    // Monta SQL para consulta de quantidade::
    s = "SELECT Count(*) AS QtdReg FROM tbTabela $sWhere";
    $rs = $apl->querySQL($s);
    if($lin = $rs->fetch_assoc()){
      $qtdReg = $lin["QtdReg"];
      $qtdPag = ceil($qtdReg / cQtdItemPag);

      if($numPag > 1){
        ?>
        <a href="JavaScript:selPag('<?=($numPag-1)?>')">Anterior</a>
        &nbsp;
        <?
      } else {
        ?>
        Anterior&nbsp;
        <?
      }

      for($i=1; $i<$qtdPag; $i++){
        if($i != $numPag){
          ?>
          <a href="JavaScript:selPag('<?=$i?>')"><?=$i?></a>
          &nbsp;
          <?
        } else {
          ?>
          <?=$i?>&nbsp;
          <?
        }
      }

      if($qtdPag > 1 && $numPag < $qtdPag){
        ?>
        <a href="JavaScript:selPag('<?=($numPag+1)?>')">Próxima</a>
        &nbsp;
        <?
      } else {
        ?>
        Próxima&nbsp;
        <?
      }
    }
    $rs->close();
}



5) Código JavaScript:

A função JavaScript chamada nos Links, simplesmente irá carregar o número da página dada como parâmetro no campo hidden "Pag", que deverá estar definido dentro do form principal da página e submetê-la a ela mesma:

<Script Language=JavaScript>

function selPag(Pagina){

  var f = document.form;

  f.Pag.value = Pagina;
  f.action = "Nome da Pagina atual";
  f.submit();
}
</Script>



¤ Links Relacionados:
- Padronização de Página em PHP