Jump to content
Fórum Script Brasil
  • 0

(Resolvido) Paginação em sistema de busca


cassianooliver

Question

to tentando colocar paginação em um sisteminha de busca...

se eu efetuar a busca sem usar nenhuma palavra, a busca retorna todos os e a paginação funciona corretamente...

o problema é quando eu busco por alguma coisa, 2 exemplos..

se eu procurar cassiano, a busca me retorna 4 registros, na paginação defini 10 registros por página, mas mesmo assim a paginação aparece como se eu tivesse feito a busca sem nenhuma palavra...

a paginação fica assim: 1 2 3 4 ....

como só achou 4 registros, então isso não era pra aparecer...

outro caso é se eu procurar por 2 palavras, por exemplo: cassiano designer

digamos que ele retorne 8 registros, não precisa de paginação, mas mesmo assim ela é exibida...

nesse caso com duas palavras a url fica assim:

admin.php?pg=localizar&busca=cassiano+designer
mas se eu ir para a página 2 aparece assim
admin.php?pg=localizar&busca=cassiano

a 2ª ou mais palavras não aparecem, e aí a busca vai procurar só pela 1ª...

espero ter sido o mais claro possível....

localizar.php

<?php
$busca = $_GET["busca"];

$NumReg = 10;
if(!isset($_GET["pag"])) {
    $pag = 0;
}
$inicio = $pag * $NumReg;

$sql = "SELECT * FROM shows WHERE evento LIKE '%$busca%' LIMIT $inicio, $NumReg";
$seleciona = mysql_query($sql);
$total = mysql_num_rows ($seleciona);

if ($total == 0) {
    echo "<h2>Nenhum show encontrado...</h2>";
}
else {
    echo "<h2>$total shows encontrados</h2>";
}

$sql2 = mysql_query("SELECT * FROM shows");
$tr = mysql_num_rows($sql2);
?>

<?php
echo "<table cellspacing='0' cellpadding='0'>";
while ($exibe = mysql_fetch_array ($seleciona)) {
     aqui exibo os dados...
}
echo "</table>";
echo "<br /><br />";
include "paginacao_busca.php";
?>
paginacao_busca.php
<?php
# Número total de páginas
$Npg = ceil($tr / $NumReg);
$Npg++;

# Verifica se esta na primeira página, se não estiver ele libera o link para anterior
if ( $pag > 0) {
    echo "<span class='AntProx'><a href=".$PHP_SELF."?pg=" . $_GET["pg"] . "&pag=".($pag-1) ."&busca=" . $_GET["busca"] . " class='ant'>Anterior</a></span>";
}
else {
    echo ""; # Caso contrário oculta o link "anterior"
}

# Faz aparecer os numeros das páginas entre os links ANTERIOR e PROXIMA
for($i = 1; $i < $Npg; $i++) {
    # Verifica a página que o navegante esta e retira o link do número para identificar visualmente
    if($pag == ($i - 1)) {
        echo "<span class='pga'>$i</span>";
    }
    else {
        # Acrescenta os links para cada página
        $i2 = $i - 1;
        echo "<a href=".$PHP_SELF."?pg=" . $_GET["pg"] . "&pag=" . $i2 . "&busca=" . $_GET["busca"] . " class='pg'>$i</a>";
    }
}

# Verifica se esta na ultima página, se não estiver ele libera o link para próxima
if (($pag + 2) < $Npg) {
    echo "<span class='AntProx'><a href=".$PHP_SELF."?pg=" . $_GET["pg"] . "&pag=".($pag + 1)."&busca=" . $_GET["busca"] . " class='prox'>Próxima</a></span>";
}
else {
    echo ""; # Caso contrário oculta o link "próxima"
}
?>

Link to comment
Share on other sites

18 answers to this question

Recommended Posts

  • 0

É como eu sempre digo, o bom é pegar um código, entender ele e ai fazer o próprio, como você está fazendo fica difícil aprender, já que você simplesmente tá tentando alterar uma coisa que não faz lá muita idéia de como funciona...

Veja:

$Npg = ceil($tr / $NumReg);
$Npg++;
Isso dai diz a quantidade de página, ou seja arredodando pra cima o $tr (quantidade de registros) dividindo pelo $Num_Reg (quantidade de registros por página), ai se você tivesse consultado o $tr veria que ele está assim:
$sql2 = mysql_query("SELECT * FROM shows");
$tr = mysql_num_rows($sql2);
Ou seja, a paginação está sendo exibida porque a query simplesmente sempre está pegando todos os registros... essa contagem deveria se basear na query que faz a consulta no banco de dados conforme você especificou, ou seja:
$sql2 = "SELECT * FROM shows WHERE evento LIKE '%$busca%'";
$seleciona2 = mysql_query($sql2);
$total = mysql_num_rows ($seleciona2);

Quanto ao seu outro problema, tente o urlencode e urldecode...

Link to comment
Share on other sites

  • 0

se eu fizer como você falou, pegar a contagem no SELECT com LIMIT, a paginação não funciona...

em todas as páginas onde uso essa paginação, a contagem é sempre feita assim mesmo...

$sql2 = mysql_query("SELECT * FROM shows");
$tr = mysql_num_rows($sql2);

pegando todos os registros...

caso contrário, a paginação não funciona...

Link to comment
Share on other sites

  • 0

Esquece a parte do LIMIT (já corrigi a referência no post anterior), mas é sempre bom usar a lógica (e nem precisa ser a de programação), se dentre os resultados que comporão o retorno do BD só te interessam os que estiverem determinados no WHERE, como você vai usar uma query que pega tudo como referência para a parte da paginação?

Logo se no BD tem 1000 cadastros, mas a tua pesquisa só deve retornar 100 com o que foi especificado, e devam ser exibidos 10 resultados por página, no primeiro caso vão existir 100 páginas, no segundo 10, ou seja, vai ter página que não vai ter conteúdo algum... por isso você vai ter que contar o número total de registro indicando um WHERE igual ao usado para na query que utiliza o LIMIT...

Link to comment
Share on other sites

  • 0

brigadão pela atenção e pela paciência ESerra...

li várias vezes e acho que consegui entender...

fiz alterações, se entendi bem deveria ficar assim:

<?php
$busca = $_GET["busca"];

$NumReg = 2;
if(!isset($_GET["pag"])) {
    $pag = 0;
}
$inicio = $pag * $NumReg;

$sql = "SELECT * FROM shows WHERE evento LIKE '%$busca%'";
$seleciona = mysql_query($sql);
$total = mysql_num_rows ($seleciona);

if ($total == 0) {
    echo "<h2>Nenhum show encontrado...</h2>";
}
else {
    echo "<h2>$total shows encontrados</h2>";
}

$sql2 = mysql_query("SELECT * FROM shows LIMIT $inicio, $NumReg");
$tr = mysql_num_rows($sql2);
?>

<?php
echo "<table cellspacing='0' cellpadding='0'>";
while ($exibe = mysql_fetch_array ($seleciona)) {
    ...
}
echo "</table>";
echo "<br /><br />";
include "paginacao_busca.php";
?>

está certo?

Bom, só que não está limitando, sempre retorna todos os registros encontrados pela busca...

EX: retorna 8, como está configurado para mostrar 2 por página, então deveria mostrar 4 páginas...

mas isso não acontece, todos são mostrados na 1ª...

Link to comment
Share on other sites

  • 0

Volto a repetir, entenda a lógica, não copie apenas...

Você tem duas querys:

$sql = "SELECT * FROM shows WHERE evento LIKE '%$busca%'";

$seleciona = mysql_query($sql);

E

$sql2 = mysql_query("SELECT * FROM shows LIMIT $inicio, $NumReg");

$sql deveria ser a que serve apenas para saber a quantidade total de registros que existem com o termo pesquisado, e $sql2 deveria ser a que vai exibir os registros em cada página... só que logo abaixo no seu script está:

while ($exibe = mysql_fetch_array ($seleciona)) {

...

}

Ou seja, você está mandando pro mysql_fetch_array a query errada!

Link to comment
Share on other sites

  • 0

hum..

agora entendi a lógica do negócio...

apenas trocando essa parte, ainda não funcionava...

pra funcionar realmente, a contagem dos registros tinha que ser feita na sql da busca e não na sql com LIMIT

agora a paginação está certa...

só não arrumei ainda o probleminha na url...

pra quando o usuário voltar e avançar a página, permanecer as 2 ou mais palavras usadas na busca...

vou testar o urlencode que sugeriu...

Agora percebi uma falha na busca, exemplo:

independente da palavra pesquisada, sempre são retornados a quantidade de registros definida na $NumReg e não a quantidade encontrada no BD...

se eu buscar "show" ele retorna todos os resultados encontrados e mais alguns, sempre mostrando no mínino a quantidade definida na $NumReg...

não entendi porque ta acontecendo isso...

o código ficou assim:

<?php
$busca = $_GET["busca"];

$NumReg = 10;
if(!isset($_GET["pag"])) {
    $pag = 0;
}
$inicio = $pag * $NumReg;

$sql = "SELECT * FROM shows WHERE evento LIKE '%$busca%'";
$seleciona = mysql_query($sql);
$total = mysql_num_rows ($seleciona);

if ($total == 0) {
    echo "<h2>Nenhum show encontrado...</h2>";
}
else {
    echo "<h2>$total shows encontrados</h2>";
}

$sql2 = mysql_query("SELECT * FROM shows LIMIT $inicio, $NumReg");
$tr = mysql_num_rows($seleciona);
?>

Edited by cassianooliver
Link to comment
Share on other sites

  • 0

Tá difícil... mas vamos lá...

"independente da palavra pesquisada, sempre são retornados a quantidade de registros definida na $NumReg e não a quantidade encontrada no BD...

se eu buscar "show" ele retorna todos os resultados encontrados e mais alguns, sempre mostrando no mínino a quantidade definida na $NumReg..."

Não sei se entendi o que você disse, mas cada página sempre vai retornar no máximo o definido no $NumReg, já que ele diz quantos resultados devem existir por página, assim uma consulta que retorne 35 resultados, com um $NumReg igual a 10 terá 4 páginas, sendo que a 1,2,3 terão 10 resultados e a 4 terá 5 resultados...

Coloque o código completo....

Link to comment
Share on other sites

  • 0
"independente da palavra pesquisada, sempre são retornados a quantidade de registros definida na $NumReg e não a quantidade encontrada no BD...

se eu buscar "show" ele retorna todos os resultados encontrados e mais alguns, sempre mostrando no mínino a quantidade definida na $NumReg..."

Não sei se entendi o que você disse, mas cada página sempre vai retornar no máximo o definido no $NumReg, já que ele diz quantos resultados devem existir por página, assim uma consulta que retorne 35 resultados, com um $NumReg igual a 10 terá 4 páginas, sendo que a 1,2,3 terão 10 resultados e a 4 terá 5 resultados...

é exatamente isso...

serã que não tem como fazer pra que só exiba a quantidade dos resultados encontrados e se necessário paginar?

EX: 8 registros encontrados, então só mostra 8...

EX: 20 registros encontrados, então mostra os 10 e a paginação deve ter 2 páginas...

Link to comment
Share on other sites

  • 0

tipo,

$NumReg = 10..

na busca sempre são retornados 10 resultados, 3 encontrados pelo termo pesquisado e o restante só para completar os 10, se a busca retornar 20 por ex, a paginação funciona normalmente...

o que to querendo é que se achar só 3, mostre somente 3...tendeu?

localizar.php(somente a parte da conf. da paginação)

<?php
$busca = $_GET["busca"];

$NumReg = 10;
if(!isset($_GET["pag"])) {
    $pag = 0;
}
$inicio = $pag * $NumReg;

$sql = "SELECT * FROM shows WHERE evento LIKE '%$busca%'";
$seleciona = mysql_query($sql);
$total = mysql_num_rows ($seleciona);

if ($total == 0) {
    echo "<h2>Nenhum show encontrado...</h2>";
}
else {
    echo "<h2>$total shows encontrados</h2>";
}

$sql2 = mysql_query("SELECT * FROM shows LIMIT $inicio, $NumReg");
$tr = mysql_num_rows($seleciona);
?>
paginacao
<?php
# Número total de páginas
$Npg = ceil($tr / $NumReg);
$Npg++;

# Verifica se esta na primeira página, se não estiver ele libera o link para anterior
if ( $pag > 0) {
    echo "<span class='AntProx'><a href=".$PHP_SELF."?pg=" . $_GET["pg"] . "&busca=" . $_GET["busca"] . "&pag=" .($pag-1) . " class='ant'>Anterior</a></span>";
}
else {
    echo ""; # Caso contrário oculta o link "anterior"
}

# Faz aparecer os numeros das páginas entre os links ANTERIOR e PROXIMA
for($i = 1; $i < $Npg; $i++) {
    # Verifica a página que o navegante esta e retira o link do número para identificar visualmente
    if($pag == ($i - 1)) {
        echo "<span class='pga'>$i</span>";
    }
    else {
        # Acrescenta os links para cada página
        $i2 = $i - 1;
        echo "<a href=".$PHP_SELF."?pg=" . $_GET["pg"] . "&busca=" . $_GET["busca"] . "&pag=" . $i2 . " class='pg'>$i</a>";
    }
}

# Verifica se esta na ultima página, se não estiver ele libera o link para próxima
if (($pag + 2) < $Npg) {
    echo "<span class='AntProx'><a href=".$PHP_SELF."?pg=" . $_GET["pg"] . "&busca=" . $_GET["busca"] . "&pag=" . ($pag + 1) . " class='prox'>Próxima</a></span>";
}
else {
    echo ""; # Caso contrário oculta o link "próxima"
}
?>

Link to comment
Share on other sites

  • 0

Tipo, o que você passou não é o que eu pedi, vou ser mais explícito, o que está interessando nesse momento é o laço que imprime os resultados na tela, antigamente estava assim:

while ($exibe = mysql_fetch_array ($seleciona)) {
    ...
}

Mas é necessário saber como está agora, pois o erro está nele.

O meu palpite é que de novo você está apontando pra query errada, pois o que você disse:

"na busca sempre são retornados 10 resultados, 3 encontrados pelo termo pesquisado e o restante só para completar os 10, se a busca retornar 20 por ex, a paginação funciona normalmente...

o que to querendo é que se achar só 3, mostre somente 3...tendeu?"

não tem a mínima lógica, se a query só tem 3 resultado não tem como ela criar mais 7 pra completar os 10...

Link to comment
Share on other sites

  • 0

while ($exibe = mysql_fetch_array ($seleciona)) {
    $show   = utf8_encode($exibe["evento"]);
    $dia     = $exibe["dia"];
    $mes    = $exibe["mes"];
    $ano     = $exibe["ano"];
    $cidade = utf8_encode($exibe["cidade"]);
    $estado = $exibe["estado"];
    $cartaz    = $exibe["cartaz"];
    $obs     = utf8_encode($exibe["obs"]);
    
    if(!$cartaz == "") {
        $cartaz = "<a href='$dir$cartaz' class='lightbox' title='$show - Cartaz versão maior'><img src='$redimensiona_cartaz$dir$cartaz' /></a>";
    }
    
    if(!$obs == "") {
        $obs = "<strong>Observações:</strong> <br />$obs<br />";
    }
    
    switch ($mes) {
        case "01":
        $mes = "Janeiro";
        break;
        
        case "02":
        $mes = "Fevereiro";
        break;
        
        case "03":
        $mes = "Março";
        break;
        
        case "04":
        $mes = "Abril";
        break;
        
        case "05":
        $mes = "Maio";
        break;
        
        case "06":
        $mes = "Junho";
        break;
        
        case "07":
        $mes = "Julho";
        break;
        
        case "08":
        $mes = "Agosto";
        break;
        
        case "09":
        $mes = "Setembro";
        break;
        
        case "10":
        $mes = "Outubro";
        break;
        
        case "11":
        $mes = "Novembro";
        break;
        
        case "12":
        $mes = "Dezembro";
        break;
    }
    
    // Montando a visualização da página
    echo "<div class='show'>";
        echo "<h2 class='show'>$show</h2>";
        echo "<p class='InfoShow'>";
        echo "<strong>Data:</strong> $dia de $mes de $ano</span><br />";
        echo "<strong>Local:</strong> $cidade - $estado<br />";
        echo $obs;
        echo "</p>";
        echo $cartaz;
        
    echo "</div>";
}

não tem a mínima lógica, se a query só tem 3 resultado não tem como ela criar mais 7 pra completar os 10...

mas é isso que está acontecendo...

mesmo trocando $seleciona por $sql2 no while, tá acontecendo o mesmo...

Edited by cassianooliver
Link to comment
Share on other sites

  • 0

Como eu pensei, você está usando a query errada (comentários no próprio código):

<?php
$busca = $_GET["busca"];

$NumReg = 10;
if(!isset($_GET["pag"])) {
    $pag = 0;
}
$inicio = $pag * $NumReg;

$sql = "SELECT * FROM shows WHERE evento LIKE '%$busca%'";
/*
######################
VOCÊ ESTÁ USANDO ESSA
######################
*/
$seleciona = mysql_query($sql);
$total = mysql_num_rows ($seleciona);

if ($total == 0) {
    echo "<h2>Nenhum show encontrado...</h2>";
}
else {
    echo "<h2>$total shows encontrados</h2>";
}
/*
######################
QUANDO DEVERIA ESTAR USANDO ESSA, QUE É A QUE CONTÊM O LIMITE
######################
*/
$sql2 = mysql_query("SELECT * FROM shows LIMIT $inicio, $NumReg");
$tr = mysql_num_rows($seleciona);
?>
/*
######################
VOCÊ DEVE USAR NO mysql_fetch_array a query com o LIMIT ou seja, a $sql2
######################
*/
while ($exibe = mysql_fetch_array ($seleciona)) {
    $show   = utf8_encode($exibe["evento"]);
    $dia     = $exibe["dia"];
    $mes    = $exibe["mes"];
    $ano     = $exibe["ano"];
    $cidade = utf8_encode($exibe["cidade"]);
    $estado = $exibe["estado"];
    $cartaz    = $exibe["cartaz"];
    $obs     = utf8_encode($exibe["obs"]);
[...]

E tem mais um erro:

$Npg = ceil($tr / $NumReg);

ai você está descobrindo o número total de páginas, só que $tr conta os registros quem vem da $sql2, ou seja, sempre vai ter no máximo 10, em vez de $tr deveria estar usando a variável $total, que conta todos os registros sem a cláusula LIMIT...

Link to comment
Share on other sites

  • 0

fiz o que disse, mas continua a mesma coisa...

acha 4 registros, mas continua mostrando 10...

<?php
$busca = $_GET["busca"];

$NumReg = 10;
if(!isset($_GET["pag"])) {
    $pag = 0;
}
$inicio = $pag * $NumReg;

$sql = "SELECT * FROM shows WHERE evento LIKE '%$busca%'";
$seleciona = mysql_query($sql);
$total = mysql_num_rows ($seleciona);

if ($total == 0) {
    echo "<h2>Nenhum show encontrado...</h2>";
}
else {
    echo "<h2>$total shows encontrados</h2>";
}

$sql2 = mysql_query("SELECT * FROM shows LIMIT $inicio, $NumReg");
?>

<?php
echo "<table cellspacing='0' cellpadding='0'>";
while ($exibe = mysql_fetch_array ($sql2)) {
    $sid    = $exibe["id"];
    $evento = $exibe["evento"];
    
    if ($cont % 2 == 0) {
        $cor = "#E9E9E9";
    }
    else {
        $cor = "#FFFFFF";
    }
                
    // Tabela que exibe os dados
    echo "
    <tr bgcolor='$cor' id='$sid'>
        <td class='ColShow'><a class='admin' href='admin.php?pg=editar_show&sid=$sid'>$evento</a></td>
        <td class='ColIcone'><a href='admin.php?pg=ver_show&sid=$sid'><img src='icones/ver.png' title='Ver' /></td>    
        <td class='ColIcone'><a href='admin.php?pg=editar_show&sid=$sid'><img src='icones/editar.png' title='Editar' id='EditarShow' /></td>
        <td class='ColIcone'><img src='icones/excluir.png' title='Excluir' class='ExcluirShow' id='$sid' /></td>
    </tr>
    ";
    $cont = $cont + 1;
}
echo "</table>";
echo "<br /><br />";
include "paginacao_busca.php";
?>
paginacao
<?php
# Número total de páginas
$Npg = ceil($total / $NumReg);
$Npg++;

# Verifica se esta na primeira página, se não estiver ele libera o link para anterior
if ( $pag > 0) {
    echo "<span class='AntProx'><a href=".$PHP_SELF."?pg=" . $_GET["pg"] . "&busca=" . $_GET["busca"] . "&pag=" .($pag-1) . " class='ant'>Anterior</a></span>";
}
else {
    echo ""; # Caso contrário oculta o link "anterior"
}

# Faz aparecer os numeros das páginas entre os links ANTERIOR e PROXIMA
for($i = 1; $i < $Npg; $i++) {
    # Verifica a página que o navegante esta e retira o link do número para identificar visualmente
    if($pag == ($i - 1)) {
        echo "<span class='pga'>$i</span>";
    }
    else {
        # Acrescenta os links para cada página
        $i2 = $i - 1;
        echo "<a href=".$PHP_SELF."?pg=" . $_GET["pg"] . "&busca=" . $_GET["busca"] . "&pag=" . $i2 . " class='pg'>$i</a>";
    }
}

# Verifica se esta na ultima página, se não estiver ele libera o link para próxima
if (($pag + 2) < $Npg) {
    echo "<span class='AntProx'><a href=".$PHP_SELF."?pg=" . $_GET["pg"] . "&busca=" . $_GET["busca"] . "&pag=" . ($pag + 1) . " class='prox'>Próxima</a></span>";
}
else {
    echo ""; # Caso contrário oculta o link "próxima"
}
?>

Link to comment
Share on other sites

  • 0

Relamente 1001% estranho, bom, vamos analisar isso pelo lado da lógica:

-> Achou 4 registros;

-> Tá mostrando 10 registros;

1 - O mysql_num_rows tá te informado que achou 4 registros ou você tá consultando isso pelo phpmyadmin?

2 - Os registros estão se repetindo ou tá vindo outros coisas que não tem nada a ver com a pesquisa?

EDIT:

Mais um erro:

$sql2 = mysql_query("SELECT * FROM shows LIMIT $inicio, $NumReg");

Tá faltando o WHERE na query!

Link to comment
Share on other sites

  • 0
1 - O mysql_num_rows tá te informado que achou 4 registros ou você tá consultando isso pelo phpmyadmin?
o total de registros encontrados vêm daqui

$sql = "SELECT * FROM shows WHERE evento LIKE '%$busca%'";
$seleciona = mysql_query($sql);
$total = mysql_num_rows ($seleciona);

if ($total == 0) {
    echo "<h2>Nenhum show encontrado...</h2>";
}
else {
    echo "<h2>$total shows encontrados</h2>";
}
Mais um erro: $sql2 = mysql_query("SELECT * FROM shows LIMIT $inicio, $NumReg"); Tá faltando o WHERE na query!
coloco como na busca?
$sql2 = mysql_query("SELECT * FROM shows WHERE evento LIKE '%busca%' LIMIT $inicio, $NumReg");

acho que não né?

porque nem da certo...

Link to comment
Share on other sites

  • 0

Claro que as duas querys tem que serem iguais na questão do WHERE, só que uma vai ter o LIMIT a outra não, realmente você não entendeu a idéia da paginação... vou tentar de novo:

Você vai ter que ter duas querys:

query 1 -> Vai ter o total de registros baseados na sua busca;

query 2 -> Vai ser a query que vai ser usada para exibir os dados, ela tem que ter os mesmos critérios da query1, só que contém a cláusula LIMIT que dirá onde começa e quanto resultados deve pegar...

EDIT:

Testei aqui em localhost e funcionou...

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152k
    • Total Posts
      651.6k
×
×
  • Create New...