ejckson 0 Denunciar post Postado Março 5, 2014 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
Wallace Maxters 10 Denunciar post Postado Março 5, 2014 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
Gabriel Heming 766 Denunciar post Postado Março 5, 2014 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
Wallace Maxters 10 Denunciar post Postado Março 5, 2014 Isso aê, Gabriel! mereceu um ponto! Compartilhar este post Link para o post Compartilhar em outros sites
ejckson 0 Denunciar post Postado Março 5, 2014 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
Williams Duarte 431 Denunciar post Postado Março 5, 2014 . 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
ejckson 0 Denunciar post Postado Março 5, 2014 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
Gabriel Heming 766 Denunciar post Postado Março 5, 2014 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
ejckson 0 Denunciar post Postado Março 6, 2014 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
Williams Duarte 431 Denunciar post Postado Março 6, 2014 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
Williams Duarte 431 Denunciar post Postado Março 7, 2014 Respondendo ao MD Esta classe é muito boa, e esta pronto para uso. https://github.com/rafapaulino/pagination Compartilhar este post Link para o post Compartilhar em outros sites
hinom 5 Denunciar post Postado Março 7, 2014 #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
ejckson 0 Denunciar post Postado Março 7, 2014 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