我有一个显示随机结果的简单查询,但是我希望能够在每个访问者的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?
答案 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小时刷新一次该文件。