嗨我在php中有一个SQL查询
SELECT * FROM catalogue order by RAND() LIMIT 5
如何在不每周手动执行查询的情况下将其限制为显示相同记录一整周?
它目前随每个页面刷新随机化一个不同的记录。
我在论坛上搜索了类似的解决方案,但它们涉及我不想做的cron工作。
答案 0 :(得分:1)
以下是一些可能的解决方案:
在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()调用都是相同的。
SELECT * FROM catalogue ORDER BY RAND(WEEK(NOW())) LIMIT 5
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);
}
此解决方案也可用于从您的sql数据生成html,并将其保存到缓存中。也就是说,如果您的html块在本周内不需要更改。
设置一个与catalogue
具有相同定义的缓存表,但也有一个timestamp
列,您可以查看而不是filemtime()
,以确定是否需要生成高速缓存中。
答案 1 :(得分:0)
您可以将周数与数据一起存储在数据库的另一个表中,然后每次运行该文件时,都会确保Date(W)与数据库中的whats不同,如果是,然后它只是获取那里的数据,如果不是,那么它将使用来自其他函数的新数据进行更新
答案 2 :(得分:0)
您只能使用SQL执行此操作。
获取当前周数(使用WEEK(CURRENT_TIMESTAMP())
)并将其用作随机函数的种子
ORDER BY RAND(WEEK(CURRENT_TIMESTAMP()))