Taz~* 0 Denunciar post Postado Abril 5, 2010 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
Jaime_Pinheiro 0 Denunciar post Postado Abril 5, 2010 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
Jaime_Pinheiro 0 Denunciar post Postado Abril 5, 2010 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
Taz~* 0 Denunciar post Postado Abril 5, 2010 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
Evandro Oliveira 331 Denunciar post Postado Abril 5, 2010 // 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
Taz~* 0 Denunciar post Postado Abril 5, 2010 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
Evandro Oliveira 331 Denunciar post Postado Abril 5, 2010 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
Taz~* 0 Denunciar post Postado Abril 5, 2010 Entendi, vou tentar aqui e posto resultado. Muito obrigado pela ajuda pessoal :D Compartilhar este post Link para o post Compartilhar em outros sites
Taz~* 0 Denunciar post Postado Abril 6, 2010 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
Evandro Oliveira 331 Denunciar post Postado Abril 6, 2010 apague a linha e faça a seu gosto. ali eu fiz com um loop para economizar linhas. Compartilhar este post Link para o post Compartilhar em outros sites
Taz~* 0 Denunciar post Postado Abril 6, 2010 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
Evandro Oliveira 331 Denunciar post Postado Abril 6, 2010 $_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
Taz~* 0 Denunciar post Postado Abril 7, 2010 Continua cortando a pesquisa :( Compartilhar este post Link para o post Compartilhar em outros sites
Taz~* 0 Denunciar post Postado Abril 8, 2010 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
Evandro Oliveira 331 Denunciar post Postado Abril 8, 2010 $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
Taz~* 0 Denunciar post Postado Abril 8, 2010 Entendi. Muito bom. Obrigado mais uma vez ;D Compartilhar este post Link para o post Compartilhar em outros sites