ORDER BY RAND() - Trás sempre o mesmo resultado
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!
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!
comentários (1)
suspender
Lista de Respostas:
02/02/2010 10:25pm
(~15 anos atrás)
(~15 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');
...
Experimente colocar o header no arquivo PHP:
<?php
header('Cache-Control: no-cache');
header('Expires: -1');
...
03/02/2010 12:31pm
(~14 anos atrás)
(~14 anos atrás)
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!