Ir para conteúdo

POWERED BY:

Arquivado

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

Taz~*

[Resolvido] Problema paginação

Recommended Posts

Olá pessoal,

Eu estou com um problema nesse script, quando faço pesquisa que o resultado é maior que o numero de resultados por pagina ele faz a contagem direitinho mostra numeros das paginas, mas quando vou passar pra segunda pagina é como se a pesquisa estivesse em branco, mostra todos os que esta no banco limitando as paginas daquela pesquisa. No link em vez de fica ?busca=hori&pag=1 fica ?busca=&pag=1 e assim nao da pra pra vez o resto dos resultados da pesquisa.

 

alguem pode me ajudar? Agradeço.

 

<?php
include 'conecta.php';
//$criterio = $_POST['buscar_musicas'];
$criterio = $_GET['buscar'];
$sql_p = "SELECT * FROM musicas WHERE mmad_nome LIKE '%$criterio%' Order By mmad_nome ASC";


//######### INICIO Paginação
        $numreg = 20; // Quantos registros por página vai ser mostrado
        if (!isset($pg)) {
                $pg = 0;
        }
        $inicial = $pg * $numreg;

//######### FIM dados Paginação

        // Faz o Select pegando o registro inicial até a quantidade de registros para página
        $sql = mysql_query("$sql_p LIMIT $inicial, $numreg");

        // Serve para contar quantos registros você tem na seua tabela para fazer a paginação
        $sql_conta = mysql_query("SELECT * FROM musicas WHERE mmad_nome LIKE '%$criterio%'");

        $quantreg = mysql_num_rows($sql_conta); // Quantidade de registros pra paginação

        /*while ($aux = mysql_fetch_array($sql)) {
                /* Ai o resto é com voces em montar como deve parecer o conteúdo */
        /*}*/

?>
<table align="center" style="width: 930px;">
	<tr>
		<td width="47"><strong>ID</strong></td>
        <td width="175"><div align="left"><strong>Artista</strong></div></td>
	  <td width="315"><div align="left"><strong>Nome</strong></div></td>
	  <td width="48"><div align="center"><strong>Play</strong></div></td>
      <td width="191"><div align="center"><strong>Player em  Nova Janela</strong></div></td>
	  <td width="126"><div align="center"><strong>Baixar</strong></div></td>
	</tr>
	<?php /* for($i=0;$i<$nr_linhas;$i++){ $campo = mysql_fetch_assoc($query);*/
            while ($aux = mysql_fetch_array($sql)) {
                $id = $aux[mmad_id];
                $nome = $aux[mmad_nome];
                $link = $aux[mmad_link];
				$artista = $aux[mmad_artista];

        ?>
	<tr>
		<td class="tabela2"><?php echo $id; ?> </td>
        <td class="tabela2"><?php echo $artista; ?></td>
		<td class="tabela2"><?php echo $nome; ?></td>
		<td class="tabela2"><div align="center">
	    <object type="application/x-shockwave-flash" width="17" height="17"
data="play/player_buton.swf?song_url=<?php echo $link; ?>&song_title=<?php echo $nome; ?>&repeat=true">
<param name="movie" 
value="play/player_buton.swf?song_url=<?php echo $link; ?>&song_title=<?php echo $nome; ?>&repeat=true" />
</object></div></td>
        <td class="tabela2"><div align="center"><a id="abrir" name="abrir" href="javascript:play('play.php?id=<?php echo $id; ?>');">Abrir</a></div></td>
		<td class="tabela2"><div align="center"><a id="down" name="down" href="javascript:down('down.php?id=<?php echo $id; ?>');">Baixar</a></div></td>
	</tr>
    <? } ?>
    <tr>
	  <td colspan="6"> </td>
    </tr>
	<tr>
	  <td colspan="6">
        <div align="center">
          <?php
            $quant_pg = ceil($quantreg/$numreg);
        $quant_pg++;

        // Verifica se esta na primeira página, se nao estiver ele libera o link para anterior
        if ( $pg > 0) {
                echo "<a href=".$PHP_SELF."?busca=$criterio&pg=".($pg-1) ." class=pg><b>« anterior</b></a>";
        } else {
                echo "<font color=#CCCCCC>« anterior</font>";
        }

        // Faz aparecer os numeros das página entre o ANTERIOR e PROXIMO
        for($i_pg=1;$i_pg<$quant_pg;$i_pg++) {
                // Verifica se a página que o navegante esta e retira o link do número para identificar visualmente
                if ($pg == ($i_pg-1)) {
                        echo " <span class=pgoff>[$i_pg]</span> ";
                } else {
                        $i_pg2 = $i_pg-1;
                        echo " <a href=".$PHP_SELF."?busca=$criterio&pg=$i_pg2 class=pg><b>$i_pg</b></a> ";
                }
        }

        // Verifica se esta na ultima página, se nao estiver ele libera o link para próxima
        if (($pg+2) < $quant_pg) {
                echo "<a href=".$PHP_SELF."?busca=$criterio&pg=".($pg+1)." class=pg><b>próximo »</b></a>";
        } else {
                echo "<font color=#CCCCCC>próximo »</font>";
        }

    ?>

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Antes de solucionar este problema, deixe-me oferecer uma nova abordagem sobre paginar com MySQL:

 

Você executa duas vezes praticamente o mesmo SQL para fazer uma contagem (já que com LIMIT o total fica limitado). O MySQL fornece uma alternativa mais fácil e mais performática.

 

Tente executar este dois SQL, primeiro um, depois o outro.

 

SELECT SQL_CALC_FOUND_ROWS * FROM musicas LIMIT 10;

 

Seguido de

SELECT FOUND_ROWS() AS total

 

Explicação breve:

 

Ao alterar o comando "SELECT" por "SELECT SQL_CALC_FOUND_ROWS", o MySQL guarda a informação do total sem o LIMIT, que torna-se disponível ao consultar a função FOUND_ROWS() logo após.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem, com poucos dados fornecido, tive que fazer algumas suposições.

 

Percebi que seu código tem comentado uma variável $_POST logo no inicio. Sua busca provavelmente é carregada a partir de um formulário e a paginação a partir de um link, correto?

 

Tente alterar a terceira linha

$criterio = $_GET['buscar'];

por

$criterio = $_REQUEST['buscar'];

 

Ou detalhe melhor os fluxos do programa.

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Testei os 2 nao funcionou

 

Script mais detalhado.

<?php
include 'conecta.php';
//$criterio = $_POST['buscar_musicas'];
$criterio = $_GET['buscar']; //pega o conteudo do form de outra pagina
$sql_p = "SELECT * FROM musicas WHERE mmad_nome LIKE '%$criterio%' Order By mmad_nome ASC";


//######### INICIO Paginação
        $numreg = 20; // Quantos registros por página vai ser mostrado
        if (!isset($pg)) {
                $pg = 0;
        }
        $inicial = $pg * $numreg; //soma numero total de resultados na pagina

//######### FIM dados Paginação

        // Faz o Select pegando o registro inicial até a quantidade de registros para página
        $sql = mysql_query("$sql_p LIMIT $inicial, $numreg");

        // Serve para contar quantos registros você tem na seua tabela para fazer a paginação
        $sql_conta = mysql_query("SELECT * FROM musicas WHERE mmad_nome LIKE '%$criterio%'");

        $quantreg = mysql_num_rows($sql_conta); // Quantidade de registros pra paginação

        /*while ($aux = mysql_fetch_array($sql)) {
                /* Ai o resto é com voces em montar como deve parecer o conteúdo */
        /*}*/

?>
<table align="center" style="width: 930px;">
	<tr>
		<td width="47"><strong>ID</strong></td>
        <td width="175"><div align="left"><strong>Artista</strong></div></td>
	  <td width="315"><div align="left"><strong>Nome</strong></div></td>
	  <td width="48"><div align="center"><strong>Play</strong></div></td>
      <td width="191"><div align="center"><strong>Player em  Nova Janela</strong></div></td>
	  <td width="126"><div align="center"><strong>Baixar</strong></div></td>
	</tr>
	<?php /* for($i=0;$i<$nr_linhas;$i++){ $campo = mysql_fetch_assoc($query);*/
            while ($aux = mysql_fetch_array($sql)) { //mostra o resultado da busca em tabela
                $id = $aux[mmad_id];
                $nome = $aux[mmad_nome];
                $link = $aux[mmad_link];
				$artista = $aux[mmad_artista];

        ?>
	<tr>
		<td class="tabela2"><?php echo $id; ?> </td>
        <td class="tabela2"><?php echo $artista; ?></td>
		<td class="tabela2"><?php echo $nome; ?></td>
		<td class="tabela2"><div align="center">
	    <object type="application/x-shockwave-flash" width="17" height="17"
data="play/player_buton.swf?song_url=<?php echo $link; ?>&song_title=<?php echo $nome; ?>&repeat=true">
<param name="movie" 
value="play/player_buton.swf?song_url=<?php echo $link; ?>&song_title=<?php echo $nome; ?>&repeat=true" />
</object></div></td>
        <td class="tabela2"><div align="center"><a id="abrir" name="abrir" href="javascript:play('play.php?id=<?php echo $id; ?>');">Abrir</a></div></td>
		<td class="tabela2"><div align="center"><a id="down" name="down" href="javascript:down('down.php?id=<?php echo $id; ?>');">Baixar</a></div></td>
	</tr>
    <? } ?>
    <tr>
	  <td colspan="6"> </td>
    </tr>
	<tr>
	  <td colspan="6">
        <div align="center">
          <?php
            $quant_pg = ceil($quantreg/$numreg);
        $quant_pg++;

        // Verifica se esta na primeira página, se nao estiver ele libera o link para anterior
        if ( $pg > 0) {
                echo "<a href=".$PHP_SELF."?pg=".($pg-1) ."&busca=$criterio class=pg><b>« anterior</b></a>";
        } else {
                echo "<font color=#CCCCCC>« anterior</font>";
        }

        // Faz aparecer os numeros das página entre o ANTERIOR e PROXIMO
        for($i_pg=1;$i_pg<$quant_pg;$i_pg++) {
                // Verifica se a página que o navegante esta e retira o link do número para identificar visualmente
                if ($pg == ($i_pg-1)) {
                        echo " <span class=pgoff>[$i_pg]</span> ";
                } else {
                        $i_pg2 = $i_pg-1;
                        echo " <a href=".$PHP_SELF."?pg=$i_pg2&busca=$criterio class=pg><b>$i_pg</b></a> ";
                }
        }

        // Verifica se esta na ultima página, se nao estiver ele libera o link para próxima
        if (($pg+2) < $quant_pg) {
                echo "<a href=".$PHP_SELF."?pg=".($pg+1)."&busca=$criterio class=pg><b>próximo »</b></a>";
        } else {
                echo "<font color=#CCCCCC>próximo »</font>";
        }

    ?>

Teria como gravar a busca no BD e depois colocar pra exibir resultado tipo GET ou POST, sera que daria mesmo problema?

Compartilhar este post


Link para o post
Compartilhar em outros sites

// Edite aqui:

$consulta = "SELECT * FROM `minha_tabela`"; // ATENÇÃO, NÃO USE 'LIMIT X,Y'!!

$rowspp = 10; // consultas por página

 

// Pare de editar aqui

 

$sql = mysql_query($consulta);

$nrows = mysql_num_rows($sql);

$totalpg = ceil($nrows/$rowspp);

$atualpg = isset($_REQUEST['pg'])? $_REQUEST['pg']: 1;

if($atualpg > $totalpg) $atualpg = $totalpg;

$nextpg = $atualpg + 1;

if($nextpg > $totalpg) $nextpg = false;

$prevpg = $atualpg - 1;

if($prevpg < 1) $prevpg = false;

$firstrow = ($atualpg - 1) * $rowspp;

 

$sql = mysql_query($consulta." LIMIT {$firstrow},{$rowspp}");

 

/*

 

bloco de exibição e manipulação dos resultados

 

*/

 

$links = array("primeira"=>1,"anterior"=>$prevpg,"próxima"=>$nextpg,"ultima"=>$totalpg);

foreach($links as $caption=>$page) if($page !== false) echo "<a href=\"{$_SERVER['PHP_SELF']}&pg={$page}\" title=\"{$caption}\">{$caption}</a>";

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aeeew Funcionou Evandro,

Mas esse seu codigo é diferente, como faço pra exibir os numeros das paginas?

tipo, Anterior 1 2 3 4 [5] 6 7 8 Proxima ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

manipule as seguintes variáveis:

 

$prevpg,

$atualpg e

$nextpg

 

basta fazer $prevpg -1, -2, -3 etc

basta fazer $nextpg +1, +2, +3 etc

 

tomando o cuidado de fazer a verificação se $prevpg não é menor que 1 e $nextpg não é maior que $totalpg

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui.

 

Só mais uma coisa.

nessa linha

$links = array("Primeira | "=>1,"« Anterior | "=>$prevpg,"Próxima » | "=>$nextpg,"Ultima "=>$totalpg2);

queria dividir em 4 linhas diferentes pra cada um mostrar um resultado pra mim poder adicionar os números das paginas entre ANTERIOR e PRÓXIMO pra que fique assim..

 

Primeira | Anterior 1 2 3 4 5 [6] 7 8 9 10 11 Próxima | Ultima

ja fiz a parte que mostra os numeros das paginas só preciso arrumar essa parte pq nao estou entendendo.

 

Agradeço.

 

 

<?php
$links = array("Primeira | "=>1,"« Anterior | "=>$prevpg,"Próxima » | "=>$nextpg,"Ultima "=>$totalpg2);
$inicio = $atualpg - $linksl;
$limite = $atualpg + $linksl;
foreach($links as $caption=>$page) if($page !== false) 
    echo "<a href=\"{$_SERVER['PHP_SELF']}?pg={$page}&busca={$busca}\" title=\"{$caption}\">{$caption}</a>";
    echo "<br>";
    // Faz aparecer os numeros das página
       for($atualpg=0;$atualpg<$totalpg2;$atualpg++) {
                // Verifica se a página que o navegante esta e retira o link do número para identificar visualmente
                if ($atualpg == ($atualpg2-1)) {
                        echo " <span class=pgoff>[$atualpg2]</span> ";
            
                } else {
                        $i_pg2 = $atualpg+1;
                        if ($i_pg2 >= $inicio && $i_pg2 <= $limite) //limita o numero de paginas mostrada na esquerda e na direita
  {
                        echo " <a href=".$PHP_SELF."?pg=$i_pg2&busca=$busca class=pg><b>$i_pg2</b></a> ";
                }
        }
       }
    echo "<br>";
    echo "Resultados: $nrows2 em $totalpg2 Paginas"

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui. mas me apareceu outro problema

quando eu pesquiso, aparece direitinho la ?buscar=Black+Eyed+Peas

mas na hora de passar as paginas ele corta os + ficando assim ?buscar=Black

e exibe só o resultado só para black.

 

:(

nunca fica bom

 

alguém sabe o que pode ser?

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

$_SERVER['PHP_SELF'] vai te dar apenas o caminho do arquivo.

 

você também tem que passar as variáveis que estão presentes em $_REQUEST[] na hora de montar o link

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aew Evandro consegui. Muito Obrigado pela ajuda.

 

Só uma curiosidade.. Porque você colocou as variaveis do link entre {}? foi isso que resolveu meu problema.

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

$nome = 'Evandro';

echo 'Meu nome é '.$nome; // é igual a
echo "Meu nome é {$nome}"; // que tecnicamente é igual a
echo "Meu nome é $nome";

// Porém, teríamos um problema neste caso:

$veículo = 'carro';

echo "Enquanto João tem um $veículo, Maria tem dois $veículos"; // O PHP procura a variável veículoS.

echo "Enquanto João tem um {$veículo}, Maria tem dois {$veículo}s"; //O PHP SABE que a variável se chama $veículo.

prefiro a forma com aspas duplas sem concatenação pontual por dois motivos:

- Posso me utilizar de caracteres especiais como quebras de linha e tabulação "Frase\ncom\n5\nquebras\nde\nlinha"

- economizo caracteres ao invés de 4 ('..') utilizo apenas dois ({}) para inserir variáveis, mas nem é bem essa vantagem, ao meu ver, fica mais fácil para diferenciar o conteúdo da string, talvez pq minha IDE forneça suporte a esse tipo de inserção

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.