使用php每周显示随机SQL记录

使用php每周显示随机SQL记录,php,mysql,Php,Mysql,嗨,我有一个php的sql查询 SELECT * FROM catalogue order by RAND() LIMIT 5 我如何将其限制为在一整周内显示相同的记录,而不每周手动执行查询 它当前会在每次页面刷新时随机化不同的记录 我在论坛上搜索过类似的解决方案,但它们涉及到我不想做的cron作业。您可以将周数与记录一起存储在数据库的另一个表中,然后每次运行文件时,它都会确保日期(W)与数据库中的日期(如果是)不相同,然后它只会获取其中的数据,如果没有,则会使用另一个函数中的新数据进行更新以

嗨,我有一个php的sql查询

SELECT * FROM catalogue order by RAND() LIMIT 5
我如何将其限制为在一整周内显示相同的记录,而不每周手动执行查询

它当前会在每次页面刷新时随机化不同的记录


我在论坛上搜索过类似的解决方案,但它们涉及到我不想做的cron作业。

您可以将周数与记录一起存储在数据库的另一个表中,然后每次运行文件时,它都会确保日期(W)与数据库中的日期(如果是)不相同,然后它只会获取其中的数据,如果没有,则会使用另一个函数中的新数据进行更新

以下是一些可能的解决方案:

用周数播种你的兰特 在php中,执行以下操作:

$seed = intval(date('oW')); # o will return the "Week year", which is the year the current ISO week mostly corresponds to. W will return the ISO week number
并使用sql语句

SELECT * FROM catalogue order by RAND(?) LIMIT 5
并将该值绑定到
$seed
,结果如下

SELECT * FROM catalogue order by RAND(201751) LIMIT 5
这将为您的rand设置种子,这意味着具有相同种子(即您的周数和周年)的所有rand()调用将是相同的

在SQL中为您的rand添加一个完整的周数 将数据缓存在静态文件中一周 函数getDataOncePerWeek( $static_cache_file='your/cache/dir/your_cache_file.json'; $start_of_week=strotime(“本周00:00:00”); 如果(!file_存在($static_cache_file)| | filemtime($static_cache_file)<$start_of_week){ touch($static_cache_file);//只需更新上次更改的时间,因此我们只尝试重新缓存文件一次 $tmpFileName=tempnam(路径信息($static_cache_file,pathinfo_DIRNAME),'tmp_'); $data\u from_your\u sql=queryAndFetchYourSqlData();//为您的查询自行实现 file_put_contents($tmpFileName,json_encode($data_from_your_sql),LOCK_EX);//将新缓存保存到临时文件 重命名($tmpFileName,$static\u cache\u file); } 返回json_decode(file_get_contents($static_cache_file),true); } 此解决方案还可用于从sql数据生成html,并将其保存到缓存中。也就是说,如果您的html块在本周内不需要更改

将数据缓存到数据库中
设置一个缓存表,该表的定义与
目录
相同,但也有一个
时间戳
列,您可以查看该列而不是
filemtime()
,以确定是否需要生成缓存。

您可以仅使用SQL来执行此操作

获取当前周数(使用
week(current_TIMESTAMP())
)并将其用作随机函数的种子

ORDER BY RAND(WEEK(CURRENT_TIMESTAMP()))

文档:,

每周在另一个表中存储一次随机数据+在一周内从该表中读取数据有没有一种不必重新创建表的方法?我理解您的解决方案背后的逻辑,但不是我真正想要的,谢谢。@B001可能涉及cron作业或MySQL计划的事件-太好了你需要向警察解释一下OP@JediMasterOrion可以在没有计划作业(cron或其他类型)的情况下执行此操作,但从性能和复杂性的角度来看,计划作业要简单得多。顺便说一句,您不需要重新创建表。您只需在现有字段中添加一个字段,这将指示是否在本周选择了记录。计划作业只需更新此特定字段即可。
function getDataOncePerWeek(
    $static_cache_file = 'your/cache/dir/your_cache_file.json';
    $start_of_week = strtotime('this week 00:00:00');

    if (!file_exists($static_cache_file) ||  filemtime($static_cache_file) < $start_of_week) {
        touch($static_cache_file); // Just update the last changed time, so we only try to re-cache the file once
        $tmpFileName = tempnam(pathinfo($static_cache_file, PATHINFO_DIRNAME), 'tmp_');
        $data_from_your_sql = queryAndFetchYourSqlData(); //implement this yourself for your query
        file_put_contents($tmpFileName, json_encode($data_from_your_sql), LOCK_EX); // Save your new cache to a temporary file
        rename($tmpFileName, $static_cache_file);
    }
    return json_decode(file_get_contents($static_cache_file), true);
}
ORDER BY RAND(WEEK(CURRENT_TIMESTAMP()))