Jump to content
lucascientista

Pesquisa e paginação com o PHP não funcionam

Recommended Posts

Boa noite, galera é o seguinte eu estou montando um script que pesquisa no banco de dados e mostrar os resultados em uma página php, bem aí que está o problema eu pesquisei alguns sistemas de paginação e de pesquisa e acabei montando meu script, no meu script a pesquisa aparece na primeira página mas quando passo para a página adiante não me é mostrado resultado nenhum já verifiquei tudo e não consigo encontrar o erro, será que alguém pode me ajudar?

 

<?php
#Incluindo a conexão no banco de dados
require_once '../dao/conexao/Conexao.php';
$conexao = Conexao::getInstance();
/***********************************************/
#Aqui começa a parte a paginação e pesquisa
/**********************************************/
#Limitando o número máximo de resultados que serão mostrados na tela
$maximo = 1;
#Armazenando o valor da página atual
$pagina = isset($_GET["pagina"])? ($_GET["pagina"]): '1';
#Subtraindo 1, porque os registro começam do zero como em um array
$inicio = $pagina - 1;
#Multiplicamos a quantidade de registros da pagina pelo valor da pagina atual
$inicio = $maximo * $inicio;
#Agora chega a parte em que fazemos o SELECT para contar os resultados
$sql = "SELECT * FROM centroautomotivo";
$stmt = $conexao->prepare($sql);
$stmt->execute();
$contagem = $stmt->fetchAll(PDO::FETCH_ASSOC);
$total = 0;
if(count($contagem)){
    foreach ($contagem as $linhas) {
        #Armazenando o total de registros da tabela para fazer a paginação
        $total = count($contagem);
    }
}
/*******************************************************************
 * Aqui vai começar a parte da pesquisa, tornando o script em um só
 ********************************************************************/
#Recebe o termo da pesquisa se existir
$termo = (isset($_GET["termo"])) ? ($_GET["termo"]) : '';
#Executa uma pesquisa com o termo pesquisado como parametro - Este SELECT irá servir também para a paginação
if(empty($termo)){
    //Nada aqui
} else{
    $sql = "SELECT * FROM centroautomotivo WHERE nomefantasia LIKE :nomefantasia or email LIKE :email ORDER BY idCentro LIMIT $inicio,$maximo";
    $stm = $conexao->prepare($sql);
    $stm->bindValue(':nomefantasia', '%'.$termo.'%');
    $stm->bindValue(':email', '%'.$termo.'%');
    $stm->execute();
    $autocenters = $stm->fetchAll(PDO::FETCH_ASSOC);
}
<?php 
require_once '../includes/header.php';
require_once '../controller/paginacaoPesquisaCentro.php';
?>
<div class="container mb-5">
    <h1 class="text text-center">Centros Automotivos</h1>
    <p class="text text-center">Encontre o centro automotivo que mais se encaixa com você</p>
    <!--Formulário de pesquisa com paginação-->
    <form method="GET" action="">
    <div class="d-flex flex-column bd-highlight mb-3">
        <div class="p-2 bd-highlight"><img src="../img/Logotipo.png" class=" img-fluid rounded mx-auto d-block"></div>
        <div class="p-2 bd-highlight d-flex justify-content-center" style="margin-top: -10px;"><input type="text" name="termo" class="form-control" style=" width: 60%;" placeholder="Pesquise pelo Centro Automotivo!"/></div>
        <div class="p-2 bd-highlight d-flex justify-content-center"><button type="submit" class="btn btn-outline-primary"><i class="fas fa-search"></i>&nbsp;Pesquisar</button></div>
    </div>
    </form>
    <!--Fim do formuláio de pesquisa-->
    <!--Início dos resultados da pesquisa-->
    <?php if(!empty($autocenters)){?>
    <?php foreach ($autocenters as $autocenter) { ?>
        <center>
        <div class="card mb-3" style="max-width: 540px;">
        <div class="row no-gutters">
        <div class="col-md-4">
            <img src="../controller<?php empty($autocenter["foto"])? 'images/pic.png' : $autocenter["foto"] ?>" class="card-img img-fluid" width="150px" height="150px">
        </div>
        <div class="col-md-8">
        <div class="card-body">
        <p class="card-text text-justify"><?php $autocenter["nomefantasia"]?></p>
        <p class="card-text text-justify"><small class="text-muted"><?=$autocenter["email"]?></small></p>
        </div>
        </div>
        </div>
        </div>
        </center>
    <?php   }//Fechamento do foreach?>
    <div id="alignpaginacao">
       <?php
            //determina de quantos em quantos links serão adicionados e removidos
            $max_links = 6;
            //dados para os botões
            $previous = $pagina - 1; 
            $next = $pagina + 1; 
            //usa uma funcção "ceil" para arrendondar o numero pra cima, ex 1,01 será 2
            $pgs = ceil($total / $maximo); 
            //se a tabela não for vazia, adiciona os botões
            if($pgs > 1 ){   
                echo "<br/>"; 
                //botao anterior
                if($previous > 0){
                    echo "<div id='botaoanterior'><a href=".$_SERVER['PHP_SELF']."?termo={$termo}?pagina=$previous><input type='submit'  name='bt-enviar' id='bt-enviar' value='Anterior' class='button' /></a></div>";
                } else{
                    echo "<div id='botaoanteriorDis'><a href=".$_SERVER['PHP_SELF']."?pagina=$previous><input type='submit'  name='bt-enviar' id='bt-enviar' value='Anterior' class='button' disabled='disabled'/></a></div>";
                }   
                   
                echo "<div id='numpaginacao'>";
                    for($i=$pagina-$max_links; $i <= $pgs-1; $i++) {
                        if ($i <= 0){
                        //enquanto for negativo, não faz nada
                        }else{
                            //senão adiciona os links para outra pagina
                            if($i != $pagina){
                                if($i == $pgs){ //se for o final da pagina, coloca tres pontinhos
                                    echo "<a href=".$_SERVER['PHP_SELF']."?pagina=".($i).">$i</a> ..."; 
                                }else{
                                    echo "<a href=".$_SERVER['PHP_SELF']."?pagina=".($i).">$i</a>"; 
                                }
                            } else{
                                if($i == $pgs){ //se for o final da pagina, coloca tres pontinhos
                                    echo "<span class='current'> ".$i."</span> ..."; 
                                }else{
                                    echo "<span class='current'> ".$i."</span>";
                                }
                            } 
                        }
                    }
                       
                echo "</div>";
                   
                //botao proximo
                if($next <= $pgs){
                    echo " <div id='botaoprox'><a href=".$_SERVER['PHP_SELF']."?termo={$termo}?pagina=$next><input type='submit'  name='bt-enviar' id='bt-enviar' value='Proxima' class='button'/></a></div>";
                }else{
                    echo " <div id='botaoproxDis'><a href=".$_SERVER['PHP_SELF']."?pagina=$next><input type='submit'  name='bt-enviar' id='bt-enviar' value='Proxima' class='button' disabled='disabled'/></a></div>";
                }
                               
            }
                           
       ?>   
</div>
        <?php }//Fechamento do if?>
    <!--Fim dos resultados da pesquisa-->
    <!--Início da paginação-->

    <!--Fim da paginação-->
</div>
<?php 
require_once '../includes/footer.php';
?>

 

Bem aí está meu código, fico muito agradecido se puderem me ajudar.

Share this post


Link to post
Share on other sites

Olha não vou está analisando seu código, mas vou lhe dar as ferramentas necessárias para o entendimento.

 

Para executar-mos uma paginação de precisamos usar o LIMIT e o OFFSET em nossa query.

O "LIMITE" vai determinar quantos resultados vão aparecer.

O OFFSET vai determinar de qual índice vai mostrar os resultados.

 

Digamos então que temos a tabela centroautomotivo nela temos 10 registros.

No genérico nossa query:

SELECT * FROM centroautomotivo LIMIT 3 OFFSET 1

Isso quer dize que terei os três(3) resultados a partir do primeiro(1).

 

Então para que minha paginação funcione eu tenho que sempre aumentar o OFFSET em relação ao LIMIT.

Assim sendo a próxima consulta deverá ficar:

SELECT * FROM centroautomotivo LIMIT 3 OFFSET 4

Ou seja exibindo três resultados mas a partir do quarto índice porque os três primeiros já vimos com a query anterior.

E por assim adiante.

 

E como informar esse OFFSET corretamente?

Através de links, por exemplo:

<a href="arquivo.php?offset=1">Página 1</a>

<a href="arquivo.php?offset=4">Página 2</a>

Então temos a super global $_GET com o índice "offset" que poderemos usar para fazer a consulta.

Ou seja sempre o OFFSET da query será o que for informado pela url.

 

O ideal para que uma paginação funcione sem dores de cabeça é fazer uma consulta prévia para somente informar índices com o total de resultados, filtrar e tratar esses get's de entrada para evitar danos ao DB.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Kefatif
      Prezados boa tarde.
       
      Preciso bloquear a edição de um date input de forma que só seja possível selecionar a data através do calendário.
       
      Alguém pode me ajudar?
       
      Utilizo php, html e js.
       
      <input type="date" value="<?php echo $data ?>" name="datacoleta" class="form-control" required style="width:100%;">  
      Agradeço desde já.
    • By Kefatif
      Prezados boa tarde.
       
      Preciso bloquear a edição de um date input de forma que só seja possível selecionar a data através do calendário.
       
      Alguém pode me ajudar?
       
      Utilizo php, html e js.
       
      <input type="date" value="<?php echo $data ?>" name="datacoleta" class="form-control" required style="width:100%;">  
      Agradeço desde já.
    • By Thiago Duarte
      Eu tenho uma página que abri um alert ao clicar no link , só que nao cadastra e nem funciona o login.
       
       <div class="btn-box">          <a class="btn btn-color venobox vbox-item" data-toggle="modal" href="javascript:void(0)" onclick="openRegisterModal();">Start now Free </a>             <img src="images/seta.png"> </div>  
      <div class="modal-body">                               <div class="box">                                  <div class="content">                                     <!-- Login Form -->                                     <div class="loginBox">                                        <form id="login-modal" role="form"  method="post" action="#">                                           <input type="hidden" name="param" value="logar" />                                           <!-- Success/Alert Notification -->                                           <p class="lm-success"><i class="icon icon_check_alt2"></i> <strong>Congratulation! Login modal validation is working. Implement your code.</strong></p>                                           <p class="lm-failed"><i class="icon icon_close_alt2"></i><strong> Something went wrong! Insert correct value.</strong></p>                                           <!-- Input Fields -->                                           <input id="lm-email" class="form-control input-lg" type="text" placeholder="Email" name="email" required="">                                           <input id="lm-password" class="form-control input-lg" type="password" placeholder="Password" name="senha" required="">                                           <!-- Login Button -->                                           <input type="submit" class="btn btn-color" value="Login">                                           <!-- <button class="btn btn-color">Login</button> -->                                        </form>                                     </div>                                     <!-- /End Login Form -->                                  </div>                               </div>                               <!-- /End Login Form Box -->                               <div class="box">                                  <!-- Signup Form -->                                  <div class="content registerBox" style="display:none;">                                     <form id="signup-modal" role="form" method="post" action="?go=cadastrar">                                        <!-- Success/Alert Notification -->                                        <p class="sm-success"><i class="icon icon_check_alt2"></i> <strong>Congratulation! Signup modal validation is working. Implement your code.</strong></p>                                        <p class="sm-failed"><i class="icon icon_close_alt2"></i><strong> Something went wrong! Insert correct value.</strong></p>                                        <!-- Input Fields -->                                        <input id="sm-email" class="form-control input-lg" type="text" placeholder="Email" name="email" required="">                                        <input id="sm-password" class="form-control input-lg" type="password" placeholder="password" name="password">                                        <input id="sm-confirm" class="form-control input-lg" type="password" placeholder="Repeat password" name="senha-confirm">                                        <!-- Signup Button -->                                        <!--  <button class="btn btn-color">Create an account</button> -->                                        <input type="submit" class="btn btn-color" value="Create an account">                                     </form>                                  </div>                                  <!-- /End Signup Form -->                               </div>                               <!-- /End Signup Form Box -->                            </div>  
      e em baixo do </html> coloquei
        <?php           $param = (empty($_POST['param'])) ? 'error' : $_POST['param'];           if($param == 'logar'){       //if($_POST['param'] == 'logar'){             $email = $_POST['email'];             $password = $_POST['password'];             $query1 = mysql_num_rows(mysql_query("SELECT * FROM usuario WHERE email = '$email' AND password = '$password'")) or die(mysql_error());             if($query1 == 1){           // print "<script>alert('logou');</script>";              print "<script>window.location.replace('dashboard/index.php');</script>";           }else{              echo "<script>alert('User and password do not match.'); history.back();</script>";           }        }        if(@$_GET['go'] == 'cadastrar'){           // $dominio_gratis = $_POST['dominio_gratis'];          $email = $_POST['email'];          $password = $_POST['password'];          $date_register = date("m-d-Y");                // if(empty($dominio_gratis)){           //     echo "<script>alert('Preencha todos os campos para se cadastrar.'); history.back();</script>";           // }else          if(empty($email)){           echo "<script>alert('Fill in all the fields to register.'); history.back();</script>";            }elseif(empty($password)){           echo "<script>alert('Fill in all the fields to register.'); history.back();</script>";        }else{           $query1 = mysql_num_rows(mysql_query("SELECT * FROM usuario WHERE email = '$email'"));           if($query1 == 1){            echo "<script>alert('User already exists.'); history.back();</script>";          }else{            mysql_query("insert into usuario (email, password, date_register, plan) values ('$email','$password','$date_register', '0')");            header("Location: dashboard/dashboard.php");         }      }   }   ?>  
      Alguem pode ajudar?
    • By ricardocelso
      Pessoal boa tarde,  tenho um pc com windows 10, oque preciso instalar para programar em php desde ja muito obrigado.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.