quarta-feira, 3 de dezembro de 2008

Paginação de Resultados com Seleção Aleatória

Essa dica vai para quem quer fazer uma seleção aleatória e paginar os resultados, essa solução é muito usada para quem quer fazer uma vitrine de produtos...


O problema que o pessoal encontra e que ao usar a função rand(), ela gera resultados aleatórios diferentes a cada execução, portanto ao usar por exemplo;


$pagina = $_GET['$pagina'];

"select * from xxx order by rand(5) limit". $pagina * 10 .",".$pagina * 10 + 10;


A cada página a ordenação será diferente portando os resultados podem se repetir, ou não ser exibidos, deixando inviável a paginação...

Para entender a solução vamos olhar a sintaxe do comando rand():


RAND(), RAND(N)

Retorna um valor de ponto flutuante aleatório na faixa de 0 a 1.0. Se um argumento inteiro N é especificado, ele é usado como uma semente (produzindo uma sequência repetitiva):

Traduzindo: Se você passar algum argumento ele vai gerar uma seqüência sempre igual de números;

Exemplo:

mysql> SELECT i, RAND(3) FROM t;
+------+------------------+
| i    | RAND(3)          |
+------+------------------+
|    1 | 0.90576975597606 | 
|    2 | 0.37307905813035 | 
|    3 | 0.14808605345719 | 
+------+------------------+

Mas isso não nos ajuda muito pois se eu usar por exemplo:


$pagina = $_GET['$pagina'];

"select * from xxx order by rand(5) limit". $pagina * 10 .",".$pagina * 10 + 10;

Vou ter novamente uma seleção estática, pois retornara sempre os mesmos resultados...


Agora vai a nossa solução, gerar aleatoriamente o argumento que vai ser usado na função rand() e armazená-lo e uma variável de sessão...


//INICIANDO A SESSÃO

session_start();

//SETANDO A VARIAVEL argumento_rand COM UM NUMERO ALEATORIO

if(!isset($_SESSION['argumento_rand'])){

$_SESSION['argumento_rand'] = rand(1,100);

}

$pagina = $_GET['$pagina'];

"select * from xxx order by rand("._SESSION['argumento_rand'].") limit". $pagina * 10 .",".$pagina * 10 + 10;

//A CADA EXECUCAO A LISTAGEM SERÁ DIFERENTE,

//MAS ENQUANTO A SESSAO ESTIVER ATIVA ELA SERA A MESMA, PERMITINDO // ASSIM A PAGINACAO DE RESULTADOS

//DESENVOLVIDO POR EMANUEL SCARIOT

//emanuelscariot@gmail.com

?>