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 fideles
      Pessoal, tenho uma dúvida, talvez muito boba.
       
      Tenho um formulario com os input em array, e um alert javascript mostrando que foi registrado com suceso.
       
      O problema maior é que se for gravado 30 registro no banco de dados, ele mostra 30 alertas de registro gravado com suceso, por acaso é possivel limitar esse tanto de alerta para somente 1 independente da quantidade que ele grava no banco ?
    • By violin101
      Caros amigos, saudações...
       
      Desculpa em recorrer ao auxílio dos amigos.
       
      Como consigo realizar ORDENAÇÃO de Tabela usando Radio button ?

      por Exemplo:
      ordenar por: [ ]Código  ou  [ ]Descrição.
       
      Grato,
       
      Cesar
    • By Diego-SLP
      Bom dia,
       
      Estou fazendo uma tela de relatorios de registro de ponto e não estou conseguindo totalizar as horas conforme trago do banco de dados, se alguem puder me ajudar.
       
      SELECT p.cod_obra,f.nome,o.obra, TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(p.totalhora))),'%H:%i') AS hora, TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(p.totalhoraextra))),'%H:%i') AS horaextra, f.funcao FROM rh_pontoFuncionario p, rh_funcionario f, rh_obra o WHERE p.data BETWEEN '2020/10/01' AND '2020/11/20' AND p.cod_obra = '20056' AND p.cod_func = f.cod AND p.cod_obra = o.cod GROUP BY p.cod_obra, f.nome Essa query me traz COD_OBRA,NOME,OBRA,HORA,HORAEXTRA,FUNCAO e eu gostaria de TOTALIZAR o campo HORA e HORAEXTRA somando todas as linhas mas não consigo
    • By Erick Plant
      Olá! Precisando de uma ajudinha.
       
      FICAREI MUITO GRATO PELA AJUDA...SE PUDEREM ME DAR UMA LUZ!
       
      Estou arrumando um código que foi de outra pessoa, mas antes disso, preciso "apagar o incêndio" aqui e fazer funcionar uma implementação.
       
      Tenho um dropzone que carrega um arquivo sem necessidade de form. O problema começa por agora. Foi-me pedido para que eu implementasse um select trazendo do banco uma info e que enviasse via get 'junto com a url que envia as informaçoes do arquivo'.
      O carregador do select foi feito, eu estou pegando o value do select dinamicamente, pois não tem form.
      Porém, o problema é q nao sei como pegar esse value capturado para implentá-lo  na url via get.
       
       
      o js  e o dropzone na pag é esse:
      //AQUI EU PEGO O VALOR DO SELECT DE FORMA DINÂMICA id = ''; $(document).ready(function () { $("#seguimento").change(function () { id = $('#seguimento').val(); }); }); Dropzone.autoDiscover = false; Dropzone.options.tstDz = { //////////////////////////////////////////////////////// //AQUI O DROPZONE QUE PASSA OS PARAMETROS VIA GET /////////////////////////////////////////////////////// url: "<?= base_url('homeCgmrr/MonitoramentoPadraoDesempenho/addDoc?ambiente='.$ambiente.'&value='); ?>", paramName: "arquivo", maxFilesize: 2, acceptedFiles: ".xlsx,.ods,.xls,.csv", addRemoveLinks: true, // init: function () { // this.on("complete", function (file) { // setGallery(file); // }) // } init: function () { this.on('error', function(file, response) { $.notify("Você não pode fazer upload de arquivos com essa extensão, apenas arquivos .xlsx !", 'warning'); }); this.on('success', function(file, resp){ if(resp['status'] == false){ $.notify("Ocorreu erro no preenchimento da planilha. Por favor, verifique e tente novamente.", 'warning'); setGalleryError(file); }else{ setGallery(file); $.notify("Arquivo enviado com Sucesso!", 'success'); } }); } };  
      Como eu posso fazer pra carregar o id SE o base_url está em PHP?
      url: "<?= base_url('homeCgmrr/MonitoramentoPadraoDesempenho/addDoc?ambiente='.$ambiente.'&value='AQUI VAI O ID); ?>",  
      Obrigado pela ajuda!
       
×

Important Information

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