Ir para conteúdo

POWERED BY:

Arquivado

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

ejckson

Paginando via post com session

Recommended Posts

Olá meus amigos!

 

 

Estou tentando fazer uma paginação via $_POST ultilizando SESSION para passar as variáves adiante, pra quando o usuário avançar ou retornar as paginas a busca realizada continue fluindo.

 

Com $_GET eu consigo paginar normal, porém, acho que fica mais vulnerável, e com SESSION tudo ficaria mais legal.

 

Está aí o meu código abaixo, alguém pode ma ajudar, por gentileza?

 

<?php 
session_start(); 
include "../db_connect.php"; 

?>
<form action="search.php" method="post">
   <input type="text" name="name" />
   <select name="type">
   <option value="all">All</option>
   <?php
   // there is array for those
   foreach($sort_by_s AS $num => $type) {
     echo "<option value=\"".$num."\">".$type."</option>\n";
   }
   ?>
   </select>
   <select name="encoder">
   <option value="all">All</option>
   <?php
   // there is array for those
   foreach($encoders AS $e) {
     echo "<option value=\"".$e."\">".$e."</option>\n";
   }
   ?>
   </select>
   <input type="submit" name="search" value="Search"/>
</form>
<?php
if(isset($_POST['search'])) {
    //gets user input from form
    $name = $_POST['name'];
    $type = $_POST['type'];
    $encoder = $_POST['encoder'];
    
    //checks if name and type and encoder are selected
    if($name && $type && $encoder) {
        //name must be more than 2 chars
        if(strlen($name) < 2) {
            echo $name . " " . $type . " " . $encoder . "<br />shorts";
        }else {
            // if type isn't selected then make it empty
            if($type == "all") {
                $type = "";
            //otherwise search from db for selected type
            }else {
                $type = " AND `type`='".$type."'";
            }
            
            //if encoder isn't selected make it empty
            if($encoder == "all") {
                $encoder = "";
            //otherwise search from db for selected encoder
            }else {
                $encoder = " AND `encoder`='".$encoder."'";
            }
            
            // search query based on the checking on top
			$searchSql = "SELECT * FROM `mov_index` WHERE `display`='1' AND `title` LIKE '%".$name."%' ".$type.$encoder;
			#echo $sql;
			$_SESSION['searchSql'] = $searchSql;
			//echo $_SESSION['searchSql'];
            
            //pagination security
            $page =(!$_GET['page'] || $_GET['page'] < 0) ? "1" : $_GET['page'];
            $page = ceil($page);
            
            $limit = 25;
            $start = $limit;
            $end = $page*$limit-($limit);
            
            if(isset($_GET['page'])) {
                if(!is_int($start) && !is_int($end)) {
                    echo "ERRRORR";
                    die;
                }elseif($start < 0 || $end < 0) {
                    echo "ERRRORR";
                    die;
                }
            }
            //end of pagination security
            
            //selects first 25 results from search query
            $select_res = mysql_query($_SESSION['searchSql']." ORDER BY title DESC LIMIT ".$end.",".$start."") or die(mysql_error());
            while($row = mysql_fetch_assoc($select_res)) {
                //display results here
            }
            
            //pagination starts
            //amount check is search query
                $amount_check = $_SESSION['searchSql'];
                $amount_check_res = mysql_query($amount_check) or die(mysql_error());
                $amount_count = mysql_num_rows($amount_check_res);
                $pages = ceil($amount_count/$limit);
                $pag = $page - 1;
                
                $pagesystem = "";
                if($pages == 0) {
                    $pagesystem .= "No pages";
                }else {
                    if($pages == 1) {
                        $pagesystem .= "Page 1";
                    }else {
                        if($pag == 0) {
                            $pagesystem .= "« First ";
                        }else {
                            $pagesystem .= "<a href=\"search.php?page=1\">« First</a> ";
                        }
                        if($pages > 1) {
                            if($page > 1) {
                                $pagesystem .= " <a href=\"search.php?page=".($page - 1)."\">Prev.</a> ";
                            }else {
                                $pagesystem .= " Prev. ";
                            }
                            if(($page - 2) >= 1) {
                                if(($page -2) > 1) {
                                    $pagesystem .= "...";
                                }
                                $pagesystem .= " <a href=\"search.php?page=".($page - 2)."\">".($page - 2)."</a> <a href=\"search.php?page=".($page - 1)."\">".($page - 1)."</a> ";
                            }else {
                                if(($page - 1) >= 1) {
                                    $pagesystem .= " <a href=\"search.php?page=".($page - 1)."\">".($page - 1). "</a> ";
                                }
                            }
                        }
                        $pagesystem .= $page . " ";
                        
                        if($pages > 1) {
                            if(($page + 2) <= $pages) {
                                $pagesystem .= " <a href=\"search.php?page=".($page + 1)."\">".($page + 1)."</a> <a href=\"search.php?page=".($page + 2)."\">".($page + 2)."</a> ";
                                if(($page + 2) < $pages) {
                                    $pagesystem .= "...";
                                }
                            }else {
                                if(($page + 1) <= $pages) {
                                    $pagesystem .= " <a href=\"search.php?page=".($page + 1)."\">".($page + 1)."</a> ";
                                }
                            }
                            if($page < $pages) {
                                $pagesystem .= " <a href=\"search.php?page=".($page + 1)."\">Next</a> ";
                            }else {
                                $pagesystem .= " Next ";
                            }
                        }
                        
                        if($page == $pages) {
                            $pagesystem .= " Last »";
                        }else {
                            $pagesystem .= " <a href=\"search.php?page=".($pages)."\">Last »</a> ";
                        }
                    }
                }
            //display pagination
            echo $pagesystem;
        }
    }// end of if($name && $type && $encoder)
}//end of if(isset[post[search]])
?>

 

Sei que com $_GET é mais viável, mas prefiro com SESSION!

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio que o $_GET só é vunerável se você não tratar.

Sessões no PHP também podem ser roubadas (já vi um exemplo prático no curso que eu fiz).

 

Nada é seguro se você não tratar.

 

Se a questão fosse usar session só para não ver as "feias query strings no navegador", era melhor usar um AJAX



Eu tinha tentado uma vez fazer vários formulários com apenas um botão submit com o valor da página, que iria ser acessada, e isso dentro de um loop para poder gerá-los, para a paginação toda ser feita via $_POST, mas não foi uma boa idéia.

O navegador tratava com os excesso de formulários gerados!

Compartilhar este post


Link para o post
Compartilhar em outros sites

POST é tão vulnerável quanto GET, a segurança deve ser uma camada implementada por você na sua aplicação.

 

Todavia, se a requisição não tiver exclusivo intuito de alterar informações (seja em qualquer tipo de storage), deve ser realizada por GET.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado Wallace e Gabriel pela atenção!

 

Justamente é o quesito segurança que está em jogo, ambos possuem suas vulnerabilidades que precisam ser tratadas.

 

Só que além da vulnerabilidade o $_GET fica a query string horrorosa, muito grande, como falou Wallace. E com o com ajax os meus conhecimentos são limitados e pra deixar o resultado final como eu quero, vai levar tempo pq comecei a estudar ajax agora a pouco tempo.

 

Agradeço demais a dicas de vocês, valeu mesmo, estão de parabéns!

 

Voltando o código acima só pra finalizar o estudo, segue abaixo o trecho que eu acho estar faltando pra funcionar direitinho: Me corrijam se eu estiver errado! Porém, não sei onde encaixar-la! Me ajudem por gentileza!

 

if (isset($_GET['page']) && isset($_SESSION['searchSql']))
{
    $sql = $_SESSION['searchSql']; 
}
else
{
   $sql = $minha_query_normal
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

.

Só que além da vulnerabilidade o $_GET fica a query string horrorosa, muito grande, como falou Wallace

 

já ouviu falar em friendly url ou em nosso português urls amigáveis.

 

site.com/category/page/1

site.com/category/1

 

Edit: Sem falar que para SEO é bem mellhor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ola! Wiliians! Agradecido pela atenção!

 

Sim já sim, meu .htacces está configurado pra isso!

 

Só que a questão está no transporte das variáveis entre as páginas do paginador!

 

Como estou querendo fugir do $_GET, tentando fazer isso via $_POST, ao avançar as páginas a busca se perde já na segunda página, e com SESSION talvez eu consigo transportar as variáveis de página em página!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Passar a paginação de GET para o POST, no seu caso, é errado (vide Methods Definitions).

 

Entretanto, qual é o seu problema, pois não consegui captar no último trecho de código.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Gabriel, como vai tudo bem

 

O que eu quero é passar o resultado de uma query por sessão na paginação.

 

Exemplo: O usuário filtra os dados através de um form via $_POST com três campos, em seguida resulta .a busca e pagina com 10 resultados por pagina. Com $_post diretamente a busca se perde na segunda página, então eu estou tentando armazenar as variaives via SESSION pra resgata las na segunda pagina?

 

É só por questão de estética mesmo da url, pq com GET a url fica grande dmais e com ajax meus conhecimentos são limitados.

 

Segue meu codigo abaixo:

 

<?php 
session_start(); 
include "../db_connect.php"; 

?>
<form action="search.php" method="post">
   <input type="text" name="name" />
   <select name="type">
   <option value="all">All</option>
   <?php
   // there is array for those
   foreach($sort_by_s AS $num => $type) {
     echo "<option value=\"".$num."\">".$type."</option>\n";
   }
   ?>
   </select>
   <select name="encoder">
   <option value="all">All</option>
   <?php
   // there is array for those
   foreach($encoders AS $e) {
     echo "<option value=\"".$e."\">".$e."</option>\n";
   }
   ?>
   </select>
   <input type="submit" name="search" value="Search"/>
</form>
<?php
if(isset($_POST['search'])) {
    //gets user input from form
    $name = $_POST['name'];
    $type = $_POST['type'];
    $encoder = $_POST['encoder'];
    
    //checks if name and type and encoder are selected
    if($name && $type && $encoder) {
        //name must be more than 2 chars
        if(strlen($name) < 2) {
            echo $name . " " . $type . " " . $encoder . "<br />shorts";
        }else {
            // if type isn't selected then make it empty
            if($type == "all") {
                $type = "";
            //otherwise search from db for selected type
            }else {
                $type = " AND `type`='".$type."'";
            }
            
            //if encoder isn't selected make it empty
            if($encoder == "all") {
                $encoder = "";
            //otherwise search from db for selected encoder
            }else {
                $encoder = " AND `encoder`='".$encoder."'";
            }
            
            // search query based on the checking on top
			$searchSql = "SELECT * FROM `mov_index` WHERE `display`='1' AND `title` LIKE '%".$name."%' ".$type.$encoder;
			#echo $sql;
			$_SESSION['searchSql'] = $searchSql;
			//echo $_SESSION['searchSql'];
            
            //pagination security
            $page =(!$_GET['page'] || $_GET['page'] < 0) ? "1" : $_GET['page'];
            $page = ceil($page);
            
            $limit = 25;
            $start = $limit;
            $end = $page*$limit-($limit);
            
            if(isset($_GET['page'])) {
                if(!is_int($start) && !is_int($end)) {
                    echo "ERRRORR";
                    die;
                }elseif($start < 0 || $end < 0) {
                    echo "ERRRORR";
                    die;
                }
            }
            //end of pagination security
            
            //selects first 25 results from search query
            $select_res = mysql_query($_SESSION['searchSql']." ORDER BY title DESC LIMIT ".$end.",".$start."") or die(mysql_error());
            while($row = mysql_fetch_assoc($select_res)) {
                //display results here
            }
            
            //pagination starts
            //amount check is search query
                $amount_check = $_SESSION['searchSql'];
                $amount_check_res = mysql_query($amount_check) or die(mysql_error());
                $amount_count = mysql_num_rows($amount_check_res);
                $pages = ceil($amount_count/$limit);
                $pag = $page - 1;
                
                $pagesystem = "";
                if($pages == 0) {
                    $pagesystem .= "No pages";
                }else {
                    if($pages == 1) {
                        $pagesystem .= "Page 1";
                    }else {
                        if($pag == 0) {
                            $pagesystem .= "« First ";
                        }else {
                            $pagesystem .= "<a href=\"search.php?page=1\">« First</a> ";
                        }
                        if($pages > 1) {
                            if($page > 1) {
                                $pagesystem .= " <a href=\"search.php?page=".($page - 1)."\">Prev.</a> ";
                            }else {
                                $pagesystem .= " Prev. ";
                            }
                            if(($page - 2) >= 1) {
                                if(($page -2) > 1) {
                                    $pagesystem .= "...";
                                }
                                $pagesystem .= " <a href=\"search.php?page=".($page - 2)."\">".($page - 2)."</a> <a href=\"search.php?page=".($page - 1)."\">".($page - 1)."</a> ";
                            }else {
                                if(($page - 1) >= 1) {
                                    $pagesystem .= " <a href=\"search.php?page=".($page - 1)."\">".($page - 1). "</a> ";
                                }
                            }
                        }
                        $pagesystem .= $page . " ";
                        
                        if($pages > 1) {
                            if(($page + 2) <= $pages) {
                                $pagesystem .= " <a href=\"search.php?page=".($page + 1)."\">".($page + 1)."</a> <a href=\"search.php?page=".($page + 2)."\">".($page + 2)."</a> ";
                                if(($page + 2) < $pages) {
                                    $pagesystem .= "...";
                                }
                            }else {
                                if(($page + 1) <= $pages) {
                                    $pagesystem .= " <a href=\"search.php?page=".($page + 1)."\">".($page + 1)."</a> ";
                                }
                            }
                            if($page < $pages) {
                                $pagesystem .= " <a href=\"search.php?page=".($page + 1)."\">Next</a> ";
                            }else {
                                $pagesystem .= " Next ";
                            }
                        }
                        
                        if($page == $pages) {
                            $pagesystem .= " Last »";
                        }else {
                            $pagesystem .= " <a href=\"search.php?page=".($pages)."\">Last »</a> ";
                        }
                    }
                }
            //display pagination
            echo $pagesystem;
        }
    }// end of if($name && $type && $encoder)
}//end of if(isset[post[search]])
?>

 

Porem com o codigo acima não estou conseguindo, talves falte o trecho abaixo para concluir, está ai a minha duvida!

 

if (isset($_GET['page']) && isset($_SESSION['searchSql']))
{
    $sql = $_SESSION['searchSql']; 
}
else
{
   $sql = $minha_query_normal
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para falar a verdade eu me preocuparia mais em deixar este código enxuto do que a própria url, usuário não liga para isso e seu código for aberto a boots você terá problemas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

#ao autor..

 

já fiz disso no passado, quando estava começando na web...

 

cara, desencana e faça do modo mais simples..

 

Ainda tenho hoje uns poucos sistemas legados onde apliquei session para paginação.. por um lado tem umas vantagens e por outro acaba dando mais trabalho.. menos mal que são sistemas privados, pois se fossem de acesso ao publico em geral teria outro problema que é referente ao SEO.

 

Sobre a segurança em passar dados por GET.. desencana disso tambem.. obviamente, desde que não seja dados sensíveis como login, senha e coisas do tipo.

 

Como já comentaram várias vezes, enviar por POST é desnecessário e prejudicará em muito a navegação e o SEO.

 

 

Enfim, se quer mesmo prosseguir, pense melhor na modelagem do array de sessão, mantendo-o bem organizado para evitar conflitos entre páginas distintas.

 

E mais, quer ver um exemplo bem prático de dificuldade que poderá encontrar pra frente?

 

Imagine que vc quer debugar ou fazer qualquer outra coisa com duas janelas de uma mesma página.

Ambas influenciarão a sessão uma da outra. Terá que aplicar alguma gambiarra para fazer um bypass ou ficar resetando o tempo todo.. Isso porque estamos falando de 2 páginas somente..

 

É comum o usuário abrir mais de uma janela de uma mesma página... eu mesmo faço isso direto..

 

Bom.. isso aqui é apenas uma das diversas situações..

Não é a toa que a maioria está indicando ser contra o que está tentando fazer.

 

Avalie o que conveniente para o seu caso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Respondendo ao MD

 

Esta classe é muito boa, e esta pronto para uso.

 

https://github.com/rafapaulino/pagination

 

Vlw, vou dar uma trabalhada nesta Classe, depois volto pra marcar como Resolvido!

 

 

Hinom, o mais conveniente é fazer o que todos estão dizendo, eu não tinha pensado nessas questões, boa opinião, vlw mesmo!

 

Obrigado a todos pela colaboraçã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.