0

ORDER BY RAND() - Trás sempre o mesmo resultado

criado por Osmar Malheiros em 02/02/2010 8:16pm
Caros,

Por favor, vejam se podem me ajudar.

Meu ambiente:

Wamp: Windows + Apache + Mysql + PHP

Estou montando um quiz com PHP + JavaScript ( Prototype + script.aculo.us) e estou passando por um mega perrengue! Li que o Mysql gera números aleatórios através do Order by rand().

Tenho certeza que estou usando a sintaxe correta:

Select * from tabela where campo_bool is false order by rand() limit 0,1;

Essa função em Javascript chama o PHP:

ret = new Ajax.Request(url, {
asynchronous: false,
method: "get",
parameters: {ID_PERG: $("ID_PERG").value, ID_PERG_SQ: $("ID_PERG_SQ").value },
onSuccess: function(request){

$("resultado").innerHTML=request.responseText;

},
onFailure: function(request){
alert("Erro do ajax"); } });

}


Essa aqui é a função do PHP que chama a base e prepara o dado:

<?php
require_once("include/conexao.inc.php");
require_once("include/Clbanco.php");

$cadastro = new banco($conn,$db);
$data=$cadastro->seleciona_random("perg");

//se encontrar registros
if(mysql_num_rows($data)){

$row=mysql_fetch_object($data);

$xml=$row->ID_GRUPO.','.$row->ID_PERG.','.$row->ID_PERG_SEQ;

$ID = $row->ID_PERG;
$SQ = $row->ID_PERG_SEQ;
}
else
{

echo "Nenhum dado";

}

echo $xml;

mysql_free_result($data);
$altera=$cadastro->altera("perg","SELECTED=true","ID_PERG=$ID and ID_PERG_SEQ=$SQ");

mysql_free_result($data);
mysql_close($conn);
exit();
?>

E por ultimo, segue a classe clBanco.php

<?php
class banco{
private $conn;
private $db;
private $query;
private $data;

function __construct($cnn,$base){
$this->conn=$cnn;
$this->db=$base;
}

function seleciona($tabela){

$strQuery = "SELECT * FROM PERG WHERE SELECTED IS FALSE ORDER BY BY RAND() LIMIT 0,1";


$this->query=$strQuery;
$result=mysql_query($this->query) or die ("Nao foi possivel selecionar na base");

return $result;
}

?>


Beleza minha gente, quando executo diretamente o PHP, as mensagens vem pra mim de forma randomica, se utilizo através do Ajax, ele desordena apenas uma vez e nunca mais. Já estou a dias com essa questão, tive que fazer um controle randomico pelo próprio Javascript, mas tenho certeza que deve haver algum detalhe que está ferrando o RAND(). Alguém consegue me ajudar?

Obrigado!

Lista de Respostas:

+1
02/02/2010 10:25pm
(~14 anos atrás)
Por envolver Ajax, pode ser que a página requisitada esteja sendo guardada em cache do navegador.

Experimente colocar o header no arquivo PHP:

<?php
header('Cache-Control: no-cache');
header('Expires: -1');
...

0
03/02/2010 12:31pm
(~14 anos atrás)
Osmar Malheiros respondeu:

Rubens! É exatamente isso!!!
Rapaz estava dias tentando resolver essa mágica e ontem de madrugada, após muita briga e pistas aqui e ali, descobri que o problema era com o cache do IE. Então no código php que retorna o xml eu coloquei os headers:

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
// Sempre modificado
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
// HTTP/1.1
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
// HTTP/1.0
header("Pragma: no-cache");
header("Content-type: application/xml;charset=iso-8859-1",true);

E com isso eu garanti que o maldito cache nunca mais seja atualizado, rsrsrs, nem que eu queira!! rs.

Muito obrigado pela dica, isso aí quase me enlouqueceu!

Nova Resposta:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)