【问题标题】:PHP - Keep randomized query results for 24 hoursPHP - 将随机查询结果保存 24 小时
【发布时间】:2016-10-06 14:19:59
【问题描述】:

我有一个显示随机结果的简单查询,但是我希望能够在每个访问者 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 使用它?

【问题讨论】:

标签: php mysql sql random time


【解决方案1】:

如果您必须计算大量行,这有点占用 CPU,但不要使用 cookie 或任何特殊数据来保持选择。

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

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

【讨论】:

    【解决方案2】:

    将您正在使用的日期种子传递到查询中。 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
    

    或者你想从那个日期得到的任何种子。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2014-04-16
        • 1970-01-01
        • 2021-12-05
        • 1970-01-01
        • 1970-01-01
        • 2015-06-02
        • 2016-05-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多