Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

rogarfil

Formulário busca no Mysql por filtro com paginação em PHP

Recommended Posts

Prezados Colegas,
Feliz 2016! Paz, Amor, Realizações...
Trata-se do seguinte, tenho uma página search.php onde realizo uma busca por seleção (Cargo, Escolaridade, Sexo, Cidade, Idade Mínima e Idade Máxima), estes valores já estão cadastrado no BD Mysql.
Quando realizo esta busca, com todas as opções que desejo e da maneira como desejo, tudo ocorre perfeitamente como programado, obtenho os resultados esperados. Mostrando inclusive a quantidade de páginas correspondentes a busca feita.
Na minha primeira query (echo $sql;) o resultado vem assim, pelas opções escolhidas (estou optando por tudo para melhor visualizarem):
SELECT * FROM tab_candidato WHERE `cargo_pretendido` = 'Analista e Desenvolvedor de Sistemas' AND `nivel` = 'Ensino Superior' AND `sexo` = 'Masculino' AND `cidade` = 'Palmas' AND `idade` >= '25' AND `idade` <= '55' ORDER BY nome ASC LIMIT 0,10
Na minha segunda query (echo $strCount;) o resultado vem assim:
SELECT * FROM tab_candidato WHERE `cargo_pretendido` = 'Analista e Desenvolvedor de Sistemas' AND `nivel` = 'Ensino Superior' AND `sexo` = 'Masculino' AND `cidade` = 'Palmas' AND `idade` >= '25' AND `idade` <= '55' ORDER BY nome ASC
O total contado está correto (echo $total;) e mostra, o valor: 19 -> total de páginas 3.
O problema é quando dou o clique para as próximas páginas, elas me retornam vazia, ou seja, debugando posso perceber que a <div> correspondente não recebe os valores.
<?php
ini_set('display_errors', true);
error_reporting(E_ALL);

include 'conexao.php';
?>
      <!-- GERAL -->
      <div class="pg_candidatos">
        <!-- FILTRO DE BUSCA -->
        <fieldset>
        <legend>Selecione as Opções da Pesquisa</legend>
          <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
            <ul>
              <!-- CARGO -->
              <li>
                <select name="comboCargo">
                  <option value="0" selected="selected">Cargo</option>
                  <?php
                    $qrCargo = mysqli_query($dados, "SELECT DISTINCT cargo_pretendido FROM tab_candidato ORDER BY cargo_pretendido ASC") or die(mysqli_error());
                    while ($linhaCargo = mysqli_fetch_array($qrCargo)) {
                  ?>
                  <option value="<?php echo $linhaCargo['cargo_pretendido']; ?>">
                    <?php echo $linhaCargo['cargo_pretendido']; ?>
                  </option>
                  <?php } ?>
                </select>
              </li>
              <!-- ESCOLARIDADE -->
              <li>
                <select name="comboNivel">
                  <option value="0" selected="selected">Escolaridade</option>
                  <?php
                    $qrNivel = mysqli_query($dados, "SELECT DISTINCT nivel FROM tab_candidato ORDER BY nivel ASC") or die(mysqli_error());
                    while ($linhaNivel = mysqli_fetch_array($qrNivel)) {
                  ?>
                  <option value="<?php echo $linhaNivel['nivel']; ?>">
                    <?php echo $linhaNivel['nivel']; ?>
                  </option>
                  <?php } ?>
                </select>
              </li>
              <!-- SEXO -->
              <li>
                <select name="comboSexo">
                  <option value="0" selected="selected">Sexo</option>
                  <?php
                    $qrSexo = mysqli_query($dados, "SELECT DISTINCT sexo FROM tab_candidato ORDER BY sexo ASC") or die(mysqli_error());
                    while ($linhaSexo = mysqli_fetch_array($qrSexo)) {
                  ?>
                  <option value="<?php echo $linhaSexo['sexo']; ?>">
                    <?php echo $linhaSexo['sexo']; ?>
                  </option>
                  <?php } ?>
                </select>
              </li>
              <!-- CIDADE -->
              <li>
                <select name="comboCidade">
                  <option value="0" selected="selected">Cidade</option>
                  <?php
                    $qrCidade = mysqli_query($dados, "SELECT DISTINCT cidade FROM tab_candidato ORDER BY cidade ASC") or die(mysqli_error());
                    while ($linhaCidade = mysqli_fetch_array($qrCidade)) {
                  ?>
                  <option value="<?php echo $linhaCidade['cidade']; ?>">
                    <?php echo $linhaCidade['cidade']; ?>
                  </option>
                  <?php } ?>
                </select>
              </li>
              <!-- IDADE MÍNIMA -->
              <li>
                <select name="comboIdadeMin">
                  <option value="0" selected="selected">Idade Mínima</option>
                  <?php
                    $qrIdadeMin = mysqli_query($dados, "SELECT DISTINCT idade FROM tab_candidato ORDER BY idade ASC") or die(mysqli_error());
                    while ($linhaIdadeMin = mysqli_fetch_array($qrIdadeMin)) {
                  ?>
                  <option value="<?php echo $linhaIdadeMin['idade']; ?>">
                    <?php echo $linhaIdadeMin['idade']; ?>
                  </option>
                  <?php } ?>
                </select>
              </li>
              <!-- IDADE MÁXIMA -->
              <li>
                <select name="comboIdadeMax">
                  <option value="0" selected="selected">Idade Máxima</option>
                  <?php
                    $qrIdadeMax = mysqli_query($dados, "SELECT DISTINCT idade FROM tab_candidato ORDER BY idade ASC") or die(mysqli_error());
                    while ($linhaIdadeMax = mysqli_fetch_array($qrIdadeMax)) {
                  ?>
                  <option value="<?php echo $linhaIdadeMax['idade']; ?>">
                    <?php echo $linhaIdadeMax['idade']; ?>
                  </option>
                  <?php } ?>
                </select>
              </li>
              <div class="limpar"></div>
            </ul>
            <div class="limpar"></div>
            <div class="bt_pesquisar"><input type="submit" value="Buscar" /></div>
            <div class="limpar"></div>
          </form>
        </fieldset>
        <!-- /FILTRO DE BUSCA -->
    <!-- RETORNO DA BUSCA -->
    <fieldset>
    <legend>Resultado da Pesquisa</legend>
      <?php

        $maximo = 10;
        $pagina = (isset($_GET['pagina'])) ? (int)$_GET['pagina'] : 1;
        $inicio = ($maximo * $pagina) - $maximo;

        if ($_SERVER['REQUEST_METHOD'] == "POST") {

          $where    = array();
          $cargo    = $_REQUEST['comboCargo'];
          $nivel    = $_REQUEST['comboNivel'];
          $sexo     = $_REQUEST['comboSexo'];
          $cidade   = $_REQUEST['comboCidade'];
          $idademin = $_REQUEST['comboIdadeMin'];
          $idademax = $_REQUEST['comboIdadeMax'];

          if ( $cargo )    { $where[] = " `cargo_pretendido` = '{$cargo}'    "; }
          if ( $nivel )    { $where[] = " `nivel`            = '{$nivel}'    "; }
          if ( $sexo )     { $where[] = " `sexo`             = '{$sexo}'     "; }
          if ( $cidade )   { $where[] = " `cidade`           = '{$cidade}'   "; }
          if ( $idademin ) { $where[] = " `idade`           >= '{$idademin}' "; }
          if ( $idademax ) { $where[] = " `idade`           <= '{$idademax}' "; }

          $sql = "SELECT * FROM tab_candidato";
            if( sizeof( $where ) )
              $sql .= ' WHERE '.implode( ' AND ', $where ).' ORDER BY nome ASC LIMIT '.$inicio.','.$maximo;
 
          echo $sql;
          echo '<br />';
 
          $query  = mysqli_query($dados, $sql) or die( mysqli_error() );
 
          $contar = mysqli_num_rows($query);

          if ($contar == 0) {
            echo "<p>Não foram encontrados registros!</p>";

          } else {
            while ($rs = mysqli_fetch_array($query)) {

      ?>
      <div class="bx_resultado">
        <div class="campo_result1"><?php echo $rs['nome']; ?></div>
        <div class="campo_result2"><?php echo $rs['email']; ?></div>
        <div class="campo_result3"><?php echo $rs['celular']; ?></div>
        <div class="campo_result4"><a href="visualizar.php?id=<?php echo $rs['id']; ?>"><img title="Clique visualizar" alt="Clique visualizar" src="images/ico_pesq.png"></a></div>
        <div class="limpar"></div>
      </div>
      <div class="limpar"></div>
      <?php
            }//while
          }//else
          $strCount = "SELECT * FROM tab_candidato";
            if( sizeof( $where ) )
              $strCount .= ' WHERE '.implode( ' AND ', $where ).' ORDER BY nome ASC';

          echo $strCount;
          echo '<br />';

          $qrCount = mysqli_query($dados, $strCount) or die( mysqli_error() );
          $total   = mysqli_num_rows($qrCount);

          echo $total;
          echo '<br />';

          $pgs = ceil($total / $maximo);

          $menos = $pagina - 1;
          $mais = $pagina + 1;        
   
          if ($pgs > 1){
            echo "<br />";
            // Mostragem de pagina
            if ($menos > 0) {
              echo "<a href=".$_SERVER['PHP_SELF']."?pagina=$menos>Anterior</a>  ";
            }
   
            // Listando as paginas
            for ($i = 1; $i <= $pgs; $i++) {
              if ($i != $pagina) {
                echo "<a href=".$_SERVER['PHP_SELF']."?pagina=".$i.">$i</a> | ";
              } else {
                echo " <strong>".$i."</strong> | ";
   
              }
            }
            if ($mais <= $pgs) {
              echo "<a href=".$_SERVER['PHP_SELF']."?pagina=$mais>Próxima</a> ";
            }
          }
        }//if
      ?>
    </fieldset>
    <!-- /RETORNO DA BUSCA -->
  </div>
  <!-- /GERAL -->

Já tentei várias formas de paginação e não obtive nenhuma solução. E não consigo deparar com o que estou errando. A tabela é única com todos os campos que preciso.
Agradeço desde já a atenção dispensada,
Rogarfil

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui:

ORDER BY nome ASC LIMIT 0,10

No lugar desse zero você precisa informar qual é o número inicial... Desse jeito você está sempre pegando os 10 primeiros registros, teria que ser algo mais ou menos assim:

    $pagina        = 1;  // Página padrão: primeira página
    $inicio        = 0;  // Início do LIMIT da consulta
    $qde_registros = 20; // Registros por página

    // Página
    if(!empty($_GET['pagina'])) {
        $pagina = $_GET['pagina'];
        if(is_numeric($pagina)) {
            $inicio = ($pagina - 1) * $qde_registros;
        }
    }

    $sql = "

        SELECT * 
          FROM tab_candidato 
         WHERE `cargo_pretendido` = 'Analista e Desenvolvedor de Sistemas' 
           AND `nivel` = 'Ensino Superior' 
           AND `sexo` = 'Masculino' 
           AND `cidade` = 'Palmas' 
           AND `idade` >= '25' 
           AND `idade` <= '55' 
      ORDER BY nome ASC 
         LIMIT ".$inicio.", ".$qde_registros;

    [continua...]

Entendeu a ideia? Outra coisa, não sei se essa forma de identificar quantos registros existem na tabela com as condições informadas é a melhor forma de se fazer, eu inclusive recentemente estava pesquisando sobre como fazer isso e basicamente existem duas formas, uma é fazendo um SELECT COUNT(*) ou é utilizando o SQL_CALC_FOUND_ROWS. Mas o intuito não é falar sobre isso aqui, mas já que toquei no assunto, seguem alguns links para você dar uma olhada:

 

http://www.marcosborges.com/blog/2010/08/13/select-sql_calc_found_rows-no-mysql/

http://stackoverflow.com/questions/186588/which-is-fastest-select-sql-calc-found-rows-from-table-or-select-count

https://www.percona.com/blog/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/

 

A discussão vai longe, tem gente que fala que é melhor, tem gente que não...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Prezado Paulo de Tarso F. M.,

 

Infelizmente segui a suas orientações e meus resultados continuam o mesmo, ou seja, realiza a busca por filtro perfeitamente e me apresenta os resultados desejados, mostrando até mesmo a quantidade de páginas pela filtragem.

Acontece que minha consulta na query é por array e é este array que não passa para a página seguinte, os dados não chegam na segunda página.

 

Abraços,

 

Rogarfil

Compartilhar este post


Link para o post
Compartilhar em outros sites
<?php


$maximo = 3;

$pagina = (isset($_GET['pagina'])) ? (int)$_GET['pagina'] : 1;

$inicio = ($maximo * $pagina) - $maximo;


if( $_SERVER['REQUEST_METHOD']=='POST' )

{

$where = Array();


$n_processo = $_REQUEST['n_processo'];

$relator = $_REQUEST['relator'];

$especie = htmlentities($_REQUEST['especie'],ENT_QUOTES);

$seccao = htmlentities($_REQUEST['seccao'],ENT_QUOTES);

$data_inicio = $_REQUEST['data_inicio'];

$data_fim = $_REQUEST['data_fim'];



if( $n_processo ) { $where[] = " `processo` = '{$n_processo}'"; }

if( $relator ) { $where[] = " `relator` = '{$relator}'"; }

if( $especie ) { $where[] = "`especie` = '{$especie}'"; }

if( $seccao ) { $where[] = " `seccao` = '{$seccao}'"; }

if ( $data_inicio ) { $where[] = " `data`>= '{$data_inicio}' "; }

if ( $data_fim ) { $where[] = " `data` <= '{$data_fim}' "; }




$sql = "SELECT * FROM jurisprudencia";

if( sizeof( $where ) )

$sql .= ' WHERE '.implode( ' AND ',$where ).'LIMIT '.$inicio.','.$maximo;


$query = mysql_query($sql) or die( mysql_error() );


$contar = mysql_num_rows($query);


if ($contar == 0) {

echo "<h2>Não foram Encontrados Registros!</h2>";


}else {

if ($contar == 1) {

echo "<h2>1 Registro Encontrado</h2>";

}

if ($contar > 1) {

echo "<h2>$contar Registros Encontrados</h2>";

}


?>


<table class="data">

<tr class="data">

<th class="data" width="85" align="center"><label>Processo</label></th>

<th class="data" width="130" align="center"><label>Relator</label></th>

<th class="data" width="100" align="center"><label>Espécie</label></th>

<th class="data" width="80" align="center"><label>Secção</label></th>

<th class="data" width="80" align="center"><label>Data de Entrada</label></th>

</tr>

<?php while ($rs = mysql_fetch_array($query)) {

extract($rs);

?>


<tr class="data">

<td align="center" class="data"> <a href="arquivos/jurisprudencia/<?php echo $rs['acordao'] ?>"><?php echo $rs['processo']; ?></a> </td>

<td align="center" class="data"> <?php echo $rs['relator']; ?> </td>

<td align="center" class="data"> <?php echo $rs['especie']; ?> </td>

<td align="center" class="data"> <?php echo $rs['seccao']; ?> </td>

<td align="center" class="data"> <?php echo $rs['data']; ?> </td>

</tr>


<?php }}


$strCount = "SELECT * FROM jurisprudencia";

if( sizeof( $where ) )

$strCount .= ' WHERE '.implode( ' AND ', $where );


$qrCount = mysql_query($strCount) or die( mysql_error() );

$total = mysql_num_rows($qrCount);



$pgs = ceil($total / $maximo);


$menos = $pagina - 1;

$mais = $pagina + 1;


// Mostragem de pagina

if ($menos > 0) {

echo "<a href=".$_SERVER['PHP_SELF']."?pagina=$menos>Anterior</a>  ";


}

// Listando as paginas

for ($i = 1; $i <= $pgs; $i++) {

if ($i != $pagina) {

echo "<a href=".$_SERVER['PHP_SELF']."?pagina=".$i.">$i</a> | ";

} else {

echo " <strong>".$i."</strong> | ";

}

}

if ($mais <= $pgs) {

echo "<a href=".$_SERVER['PHP_SELF']."?pagina=$mais>Próxima</a> ";

}


} ?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.