DougCoder 2 Denunciar post Postado Abril 19, 2016 Boa madruga a todos! Pessoal, pesquisando eu encontrei vários códigos de paginação de PHP... Aquele esquema de buscar 500 linhas de informação e dividir elas em 10 páginas de 50, por exemplo. Só que de TODOS os exemplos que encontrei, absolutamente todos... Eram com o método GET e eu não utilizo GET em nada no meu projeto, tudo passa pelo POST. Senti uma certa dificuldade e surgiram várias dúvidas, por isso, aqui estou mais uma vez ! Segue o código que estou tentando implementar: $num_por_pagina = 4; //if (!$pagina) { $pagina = 1; //} $primeiro_registro = ($pagina*$num_por_pagina) - $num_por_pagina; $consulta = "SELECT COUNT(*) FROM arquivos"; list($total_usuarios) = mysqli_fetch_array(mysqli_query($conn2,$consulta)); $total_paginas = $total_usuarios/$num_por_pagina; $prev = $pagina - 1; $next = $pagina + 1; // se página maior que 1 (um), então temos link para a página anterior if ($pagina > 1) { $prev_link = "<a href=\"$PHP_SELF?pagina=$prev\">Anterior</a>"; } else { // senão não há link para a página anterior $prev_link = "Anterior"; } // se número total de páginas for maior que a página corrente, então temos link para a próxima página if ($total_paginas > $pagina) { $next_link = "<a href=\"$PHP_SELF?pagina=$next\">Próxima"; } else { // senão não há link para a próxima página $next_link = "Próxima"; } $total_paginas = ceil($total_paginas); $painel = ""; for ($x=1; $x<=$total_paginas; $x++) { if ($x==$pagina) { $painel .= " [$x] "; } else { $painel .= " <a href=\"$PHP_SELF?pagina=$x\">[$x]</a>"; } } // exibir painel na tela echo "$prev_link | $painel | $next_link"; Segue o resultado na imagem: ou Link imagem: https://uploaddeimagens.com.br/images/000/605/498/original/erro_paginacao.jpg?1461040253 Observei que ele "joga" informações na URL e quando clico em [2] ou [3] por exemplo, é como se ele desse um "refresh" na página, ele zera os dados e não mostra, ele divide certinho pela quantidade e tals, mas só mostra os dados na primeira página e da o erro da imagem acima. É possível fazer isso sem que ele altere a URL? Como se fosse dentro de uma div por exemplo, alterando apenas os dados da div, ou de uma aba, enfim... Não encontrei nada desta forma, apenas via GET, somente assim é possível fazer? Caso seja apenas via GET, tem como eu implementar paginação sem alterar meus parâmetros POST? To meio acordado virado, to viajando muito nesse problema, tomara que seja um vacilo meu, daqueles fáceis de resolver, não aguento mais dor de cabeça com uns erros bobo de pura inexperiência. Compartilhar este post Link para o post Compartilhar em outros sites
DougCoder 2 Denunciar post Postado Abril 19, 2016 OBS: Neste ponto: $next_link = "<a href=\"$PHP_SELF?pagina=$next\">Próxima"; Não consegui implantar o $_SERVER['PHP_SELF'] Mais ou menos assim: $next_link = "<a href=\"$_SERVER['PHP_SELF']?pagina=$next\">Próxima"; Em algumas documentações e pesquisas que realizei, falaram de uma falha de segurança no php_self se utilizado direto como fiz no post acima. Compartilhar este post Link para o post Compartilhar em outros sites
Beraldo 864 Denunciar post Postado Abril 19, 2016 $PHP_SELF, assim como toda e qualquer outro índice de um array superglobal (como $_SERVER, $_POST, $_GET etc) só é acessível diretamente se register_globals estiver ativada no php.ini. Isso era uma tremenda falta de segurança (entenda por que), tanto é que essa configuração nem existe mais Portanto, use o array inteiro, fazendo concatenação: $next_link = "<a href=\"" . $_SERVER['PHP_SELF'] . "?pagina=" . $next . "\">Próxima"; Compartilhar este post Link para o post Compartilhar em outros sites
DougCoder 2 Denunciar post Postado Abril 19, 2016 $PHP_SELF, assim como toda e qualquer outro índice de um array superglobal (como $_SERVER, $_POST, $_GET etc) só é acessível diretamente se register_globals estiver ativada no php.ini. Isso era uma tremenda falta de segurança (entenda por que), tanto é que essa configuração nem existe mais Portanto, use o array inteiro, fazendo concatenação: $next_link = "<a href=\"" . $_SERVER['PHP_SELF'] . "?pagina=" . $next . "\">Próxima"; Salve Beraldo !!! O que seria de nós sem este grande samurai. Os Notice error de PHP_SELF foram sanados! Muito obrigado amigo. Porém eu não consigo visualizar os dados da página [2], [3], é como se ele fizesse um refresh na página, segue mais detalhes do código, ainda não descobri o que está acontecendo... Estou ralando aqui pra ver onde está minha cagada. Antes do meu select eu tenho essa parte do código: $num_por_pagina = 4; //if (!$pagina) { $pagina = 1; //} $primeiro_registro = ($pagina*$num_por_pagina) - $num_por_pagina; E isso me fez descobrir que to fazendo algo errado novamente kkk. Outra parte do código que não mencionei, se liga nesse select tigre que funciona lindamente: $codigo = "SELECT DISTINCT ARQ_ID,ARQ_NOME,conc_busca_autores(ARQ_ID) as AUT_NOME, conc_busca_temas(ARQ_ID) as TEM_NOME,EDI_NOME, conc_busca_disciplina(ARQ_ID) as DIS_NOME,conc_busca_palchave(ARQ_ID) as PAL_CHA_NOME, TIP_ARQ_NOME,ARQ_CAM_ARQ FROM `arquivos` a LEFT JOIN arquivos_has_disciplinas b ON a.ARQ_ID = b.Arquivos_ARQ_ID LEFT JOIN disciplinas dis ON b.Disciplinas_DIS_ID = dis.DIS_ID LEFT JOIN arquivos_has_temas c ON a.ARQ_ID = c.Arquivos_ARQ_ID LEFT JOIN temas tem ON c.Temas_TEM_ID = tem.TEM_ID LEFT JOIN autores_has_arquivos d ON a.ARQ_ID = d.Arquivos_ARQ_ID LEFT JOIN autores aut ON d.Autores_AUT_ID = aut.AUT_ID LEFT JOIN palavraschave_has_arquivos e ON a.ARQ_ID = e.Arquivos_ARQ_ID LEFT JOIN palavraschave pal ON e.PalavrasChave_PAL_CHA_ID = pal.PAL_CHA_ID LEFT JOIN editoras edi ON edi.EDI_ID = a.Editoras_idEditoras LEFT JOIN tipoarquivo tip ON tip.TIP_ARQ_ID = a.TipoArquivo_idTipoArquivo LIMIT $primeiro_registro, $num_por_pagina"; $codigo = $codigo." "; if($txtnomearquivo != '' or $id_editora != 0 or $id_ta != 0 or $id_disciplina != 0 or $id_tema != 0 or $id_autor != 0 or $id_palchave != 0){ $codigo = $codigo."where ( a.ARQ_NOME LIKE '%$txtnomearquivo%' or '$txtnomearquivo' LIKE '' ) and ( a.editoras_ideditoras = $id_editora or $id_editora = '' ) and ( a.TipoArquivo_idTipoArquivo = $id_ta or $id_ta = '' ) and ( b.Disciplinas_DIS_ID in ($disciplina) or '$disciplina' = 0 ) and ( c.Temas_TEM_ID in($tema) or '$tema' = 0 ) and ( d.Autores_AUT_ID in ($autor) or '$autor' = 0 ) and ( e.PalavrasChave_PAL_CHA_ID in ($chave) or '$chave' = 0 ) LIMIT $primeiro_registro, $num_por_pagina"; } $sqlbusca = $conn->query($codigo); Depois do select: $consulta = "SELECT COUNT(*) FROM arquivos"; list($total_usuarios) = mysqli_fetch_array(mysqli_query($conn2,$consulta)); $total_paginas = $total_usuarios/$num_por_pagina; $prev = $pagina - 1; $next = $pagina + 1; if ($pagina > 1) { $prev_link = "<a href=\"" .$_server['PHP_SELF']."?pagina=$prev\">Anterior</a>"; } else { // senão não há link para a página anterior $prev_link = "Anterior"; } if ($total_paginas > $pagina) { $next_link = "<a href=\"" . $_SERVER['PHP_SELF'] . "?pagina=" . $next . "\">Próxima"; } else { // senão não há link para a próxima página $next_link = "Próxima"; } $total_paginas = ceil($total_paginas); $painel = ""; for ($x=1; $x<=$total_paginas; $x++) { if ($x==$pagina) { // se estivermos na página corrente, não exibir o link para visualização desta página $painel .= " [$x] "; } else { $painel .= " <a href=\" ". $_SERVER['PHP_SELF']."?pagina=$x\">[$x]</a>"; } } // exibir painel na tela echo "$prev_link | $painel | $next_link"; while ($linha = $sqlbusca->fetch(PDO::FETCH_ASSOC)) { ?> Neste select, para paginação, eu adicionei no final da linha com LEFT JOIN e no final de tudo, o seguinte apenas: LIMIT $primeiro_registro, $num_por_pagina Isto está desta forma porque, se eu clicar em buscar, ele retorna todos os registros do banco! Limitados em 4 por página (pra testar), totalizando 3 páginas. Ok, perfeito. Se eu selecionar os filtros de busca, ele está retornando erro: Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 Este erro é porque estou usando ele duas vezes no sql e concatenando, acredito eu, que terei que alterar como o select irá tratar isso, talvez alguns IF resolva. 1 problema de cada vez, este eu acho mais simples de resolver, mas um que eu não faço idéia e gostaria da ajuda de vocês é como listar os dados na página [2], [3], etc. Ele mostra só da página 1. Compartilhar este post Link para o post Compartilhar em outros sites
ESerra 744 Denunciar post Postado Abril 19, 2016 Tchê, basta ler o que o Beraldo escreveu no post #3... de um está vindo a variável $pagina? De da querystring? Então: $pagina = $_GET['pagina']; Compartilhar este post Link para o post Compartilhar em outros sites
Matheus Tavares 167 Denunciar post Postado Abril 19, 2016 Amigo, você já pensou em utilizar Sessions? Edit: Sessions não ajudariam muito, já que você inutilizou os GETS. Nesse caso, outra sugestão: já que você está utilizando POST, crie um formulário e faça dos botões da paginação seus submits. PS: Você já deve saber, mas não custa lembrar.. tudo isso é uma bela gambiarra. Qual seria o motivo de não utilizar GET? Compartilhar este post Link para o post Compartilhar em outros sites
DougCoder 2 Denunciar post Postado Abril 19, 2016 Tchê, basta ler o que o Beraldo escreveu no post #3... de um está vindo a variável $pagina? De da querystring? Então: $pagina = $_GET['pagina']; Desculpe amigo, mas ficou meio sem sentido o que você escreveu. Não consegui entender o que quis dizer... O que o Beraldo disse foi sobre PHP_SELF, não vi nada no post #3 ele citando algo sobre $pagina ou $_GET['pagina'] @Matheus Tavares Não tenho motivos para não usar GET até o momento, é que fui fazendo, fazendo, fazendo... Tudo via POST e achei bem tranquilo que acabei optando por seguir assim, tudo que fosse preciso fazer, que seria feito via POST, agora na paginação não achei, mas caso precise ser GET, sem problemas... Eu acho que entendi mais ou menos o que você quis dizer, porém eu tive problemas já nesta página devido a usar forms dentro de forms, precisei separar e modificar muita coisa pra isso funcionar, não sei se seria boa idéia fazer isso novamente, creio que há forma melhor sem form. Compartilhar este post Link para o post Compartilhar em outros sites
ESerra 744 Denunciar post Postado Abril 19, 2016 Desculpe amigo, mas ficou meio sem sentido o que você escreveu. Não consegui entender o que quis dizer... O que o Beraldo disse foi sobre PHP_SELF, não vi nada no post #3 ele citando algo sobre $pagina ou $_GET['pagina'] Copiado no post #3 $PHP_SELF, assim como toda e qualquer outro índice de um array superglobal (como $_SERVER, $_POST, $_GET etc) só é acessível diretamente se register_globals estiver ativada no php.ini. Recomendo que você pesquise o que é o tal do register globals, o que é o tal array superglobal e etc... Compartilhar este post Link para o post Compartilhar em outros sites
DougCoder 2 Denunciar post Postado Abril 19, 2016 Copiado no post #3 $PHP_SELF, assim como toda e qualquer outro índice de um array superglobal (como $_SERVER, $_POST, $_GET etc) só é acessível diretamente se register_globals estiver ativada no php.ini. Recomendo que você pesquise o que é o tal do register globals, o que é o tal array superglobal e etc... Certo, é que da forma que você disse, eu entendi como se fosse que ele havia mostrado um exemplo. Entendi o que quis dizer! E corrigi +/- da seguinte maneira: Antes era: $num_por_pagina = 4; //if (!$pagina) { $pagina = 1; //} Mudei para: $pagina = (isset($_GET["pagina"])) ? $_GET["pagina"] : $pagina = 1; if($pagina<1) $pagina = 1; Só tem 1 problema ainda... Se eu clicar nas páginas [2], [3], etc. Ele não mostra na tabela o resultado delas, mas se eu clicar no botão buscar, dai ele mostra o resultado que deveria fazer direto clicando nas páginas. Compartilhar este post Link para o post Compartilhar em outros sites
DougCoder 2 Denunciar post Postado Abril 20, 2016 Bom, Até o momento a paginação está "funcionando" entre aspas, ela faz o que uma paginação tem que fazer, porém estou com problemas de atualização da página. Estive dando uma olhada no que parece ser uma solução: http://forum.imasters.com.br/topic/477879-resolvidofazer-essa-paginacao-nao-dar-refresh/ Mas ainda não tive sucesso tentando seguir o método do amigo que teve este mesmo problema. Talvez seja por bug no meu próprio código. Tenho uma gambiarra que fiz aqui para usar 1 form com determinada action após um evento click e também aproveitar este form para passagem de dados com $request na mesma página. Fiz o seguinte: <form name="form_busca" id="form-busca" method="POST" action="" > E ai eu tenho o seguinte JS: function add_action() { document.getElementById("form-busca").action = "visualiza_p.php"; document.getElementById("form-busca").submit(); } Isto foi feito desta forma para puxar o action nesta ação, pois eu precisava que fosse assim: <button type="submit" name="endereco" value="<?=$linha['ARQ_CAM_ARQ']; ?>" onclick="add_action();" > E dentro deste <form> eu tenho um botão Buscar: <button name="BUSCAR" id="bsc" class="btn btn-info" > Buscar </button><br> Que executa uma série de códigos, acionado por: <?php if (isset($_REQUEST['BUSCAR'])){ // é aqui que esta o $sqlbusca, a paginação e a tabela com os resultados da $sqlbusca. As vezes acho que esta gambiarra que seja o problema de atualização da página quando clico no [2], [3] ou próximo/anterior da paginação... Estou tentando uma gambiarra reversa para não atualizar a página com ajuda de div na tabela que preciso que atualize apenas, mas sem sucesso ainda, talvez até uma forma de clicar no botão busca após clicar em [2], [3] também resolveria meu problema, porque se eu clicar em algum índice de busca da paginação e depois clicar em buscar, ele joga os dados corretos na tabela! Eu preciso que ele faça isso sem eu clicar em buscar mas sim apenas clicando nos índices da paginação. Compartilhar este post Link para o post Compartilhar em outros sites
DougCoder 2 Denunciar post Postado Abril 22, 2016 Consegui resolver o problema de atualização da página com: $pagina = (isset($_GET["pagina"])) ? $_GET["pagina"] : $pagina = 0; <?php if ( isset($_REQUEST['BUSCAR']) || ($pagina > 0) ) { //e antes do $sql coloca as linhas abaixo: if($pagina<1) $pagina = 1; $primeiro_registro = ($pagina*$num_por_pagina) - $num_por_pagina; Agora está tudo 100% a paginação, tanto com filtro ou sem, obrigado (Y) Compartilhar este post Link para o post Compartilhar em outros sites