PHP - 保持随机查询结果24小时

时间:2016-06-06 20:39:09

标签: php mysql sql random time

我有一个显示随机结果的简单查询,但是我希望能够在每个访问者的24小时内保持相同的结果,因此它不会在每次刷新页面时随机化。这是查询:

<?php
$rs1= mysql_query("
SELECT * FROM Table_1
ORDER BY RAND()
LIMIT 4
");
while ($row1= mysql_fetch_array($rs1)) { ?>

我收集我需要以某种方式使用日期。我确实弄清楚如何获得一个随机数字显示24小时:

<?php
date_default_timezone_set('America/Los_Angeles');
mt_srand(date('Ymd'));
$number = mt_rand(50, 5000);
mt_srand();  //reset for other calls

echo $number;
?>

但我不确定如何使用原始查询来完成这项工作。有任何想法吗?或者我应该创建一个cookie,而不是尝试只用PHP吗?我如何使用它来运行cookie?

3 个答案:

答案 0 :(得分:3)

如果您需要计算很多行,但是不使用cookie或任何特殊数据来保持选择,这会占用大量CPU资源。

select * from table order by md5(concat(id,curdate())) limit 4

将在同一天的每个查询中显示相同的顺序。如果想根据用户进行查询而不同,但当天仍然相同,你也可以将他的id添加到concat中。

select * from table order by md5(concat(id,userID,curdate())) limit 4

应该说,结果不再是随机的,可以由接受这项工作的人预测。您也可以添加种子,以减轻这种影响。

答案 1 :(得分:1)

将您使用的日期种子传递给查询。 MySQL的rand()函数也会使用一个种子来使你的随机结果相同。

http://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_rand

以下是使用mysqli扩展的示例,因为不推荐使用mysql。

<?php
date_default_timezone_set('America/Los_Angeles');
mt_srand(date('Ymd'));
$number = mt_rand(50, 5000);

$mysqli = new mysqli("localhost", "user", "password", "database");
$stmt = $mysqli->prepare("SELECT * FROM Table_1 ORDER BY RAND(?) LIMIT 4");
$stmt->bind_param('i', $number);
$stmt->execute();

您也可以在查询中完成所有操作

SELECT * FROM Table_1 ORDER BY RAND(CAST(CONCAT(YEAR(), MONTH(), DAY()) AS UNSIGNED)) LIMIT 4

或者你想从日期获得的种子。

答案 2 :(得分:0)

将结果保存/缓存到文件(使用serialize())并使用此文件的内容生成页面。然后根据需要每24小时刷新一次该文件。