【问题标题】:Random database query once a week using PHP and Mysql使用 PHP 和 Mysql 每周进行一次随机数据库查询
【发布时间】:2013-02-25 09:23:59
【问题描述】:

我有一个关于狗品种的网站,其中有一个“每日狗”部分。我希望“每日狗”每天显示一次新狗(来自 mysql 数据库)。使用php和mysql,我想操作其实很简单。

$connection = mysqli_connect("localhost", "username", "password");

$randomdog = mysqli_query($connection, "SELECT * FROM dogtable WHERE id >= RAND() * (SELECT MAX(id) FROM dogtable) LIMIT 1"));

echo $randomdog

当然,每次重新加载页面时,这都会给我一个随机的狗。我希望 $randomdog 每天只更改一次。

cron 作业会是答案吗?我以前从未实现过,但我在我的网站上安装了 cpanel,所以我认为它不会太麻烦。

如果我要使用 cron 作业,我假设我会保存

$connection = mysqli_connect("localhost", "username", "password");

$randomdog = mysqli_query($connection, "SELECT * FROM dogtable WHERE id >= RAND() * (SELECT MAX(id) FROM dogtable) LIMIT 1"));

作为 .php 文件,每天由 cron 作业运行一次,每天更新一次 $randomdog。但是,我怎么能将 $randomdog 传递到单独的页面以进行回显呢?

我以前在这里问过一个类似的问题,答案通常是“存储一个 unixtimestamp,一周后执行,当当前时间 == 时间 + 1 周时再次执行”。

这对 php 来说是不可能的吗?它只在用户请求时执行,确定吗?这意味着“时间 + 1 周”变量不可能存储在某处。

无论如何,请务必纠正我。

【问题讨论】:

  • 在 PHP 中播种一个随机数生成器在本周怎么样?

标签: php mysql web-applications


【解决方案1】:

是的,您可以使用 rand() 来获取随机项目。您希望它被播种,以便每次调用它时返回相同的初始 rand 值。你希望它每天播种相同的种子。您可以使用 dayofyear() 来获取一年中的日期 (1-366)。格式为:

select * from TABLE order by rand(dayofyear(CURRENT_DATE)) limit 1

【讨论】:

  • 你能解释一下“播种”吗?
  • 哇,刚刚试了一下:srand(floor(time() / (60*60*24*7)));回声兰德()%100;你知道这是如何工作的吗?这个号码存储在哪里? *编辑实际上,我只是在不同的浏览器中尝试过,得到了不同的号码。它需要对每个用户都一样。
  • 伪随机数生成器 (PRNG) 用于在计算机中生成我们所说的“随机数”。它们并不是真正随机的。它们是从种子值开始并在其上反复运行函数而产生的数字序列。一个简单(且愚蠢)的方法是从种子开始并运行“seed = seed*13%7”以获得下一个随机数。通过使用相同的种子,每次请求随机数时都会得到相同的序列。这就是为什么你应该在使用它之前播种随机数生成器。
  • 好东西。我已将其设置为回显 0 和 $number_of_database_rows 之间的随机数。它工作得很好,但是如果它一次又一次地在同一个函数上运行,你认为它会因为大量的数据库行而开始变得非常非常慢吗?真的很感兴趣,因为这对我的项目来说是完美的!
  • 当你有大表大小时,已知按 rand 排序会导致 MySQL 行为迟缓。但是,我使用具有数百万条记录的表,并且可以在一秒钟内按 rand 顺序提取随机记录 - 但是,这是在为 MySQL 量身定制的服务器上(tons-o-ram 和 tons-o-spindles) .我认为您在正常使用时不会看到明显的放缓。
【解决方案2】:

您可以创建另一个表,可能只包含单行,用于存储当前选择的狗 - 它可能只有一个唯一的 id 指向 dogtable。

隔夜 cron 作业将更新此表。它不必只是随机的,它可以使用更高级的技术,例如查看网站使用历史来实际选择更受欢迎的狗。

网站将使用这个dogoftheday 表格来显示当天的狗。

【讨论】:

  • 选择不太受欢迎的狗可能更好
【解决方案3】:

我可以看到很多方法,最简单(不是最简单)的方法如下:

使用 cron 作业(你可以很容易地从 cPanel 安装它),cron 作业会随机选择并存储,我建议使用以下方式来存储它

  1. 在你的表中添加一个新的字段,不为空,默认值为 0,只有当日选中的狗的值为 1(将通过 cronjob 脚本更新)
  2. 如果您对更高级的内容感兴趣,例如保留每日选择的狗的历史记录(例如:每周或每月不选择相同的两次),请创建一个新表来放置选择狗/天,如果按时间排序,今天的狗是最新插入的记录
  3. 如果您对保留跟踪或任何高级内容不感兴趣,并希望有自己的方式(优化有关性能和内存的一些内容),请将 cron 作业写入文件

希望对你有帮助

【讨论】:

    【解决方案4】:
    1. 创建一个表来存储随机id并初始化它

    即

    CREATE TABLE random_dog
    (
         INT id
    );
    
    INSERT INTO random_dog VALUES(RAND());
    
    1. 检查您是否有正在运行的事件 - 请参阅 this

    2. 创建活动

    即

    CREATE EVENT
    ON SCHEDULE EVERY DAY STARTS '00:00:00'
    ON COMPLETION PRESERVE
    DO UPDATE random_dog SET id = RAND();
    
    1. 对于查询,只需使用 random_dog 表

    即

    SELECT * FROM dogtable 
    JOIN random_dog ON (random_dog.id = dogtable.id)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-19
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多