繁体   English   中英

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

[英]PHP - Keep randomized query results for 24 hours

我有一个显示随机结果的简单查询,但是我希望每个访问者都能在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或任何特殊数据来保留选择,则这会占用大量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

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

将您正在使用的日期种子传递到查询中。 MySQL的rand()函数还带有一个种子,该种子将使您的随机结果相同。

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

由于不建议使用mysql,因此以下示例使用mysqli扩展名。

<?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

或者您想从日期中获取任何种子。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM