Ir para conteúdo

POWERED BY:

Arquivado

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

DougCoder

PHP_SELF erro - Paginação em PHP

Recommended Posts

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:

 

erro_paginacao.jpg?1461040253

 

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

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

$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

 

$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

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

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

 

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

 

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

 

 

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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.