3

我有一个包含很多报价的数据库,我想创建一个"Quote of the Day"页面。基本思想是从数据库中获取所有报价,将其放在一个数组中,并在数组中的随机索引号处回显报价。

这是非常易于实施的基本思想,到目前为止我当然已经介绍过。问题是,每次刷新页面,都会弹出一个新的报价。这不是我想要的。

我希望页面仅在(或其他时间,但这不是重点)刷新报价0:00

有人可以指出我正确的方向吗?

4

8 回答 8

5

这听起来过于复杂。做这样的事情的正常方法是

  • 将报价存储在数据库中;给每一行一个日期
  • 在每个请求中,从数据库中获取当天的报价并显示它。

如果您不想在数据库中指定日期,您还可以在脚本中硬编码开始日期(例如,今天的日期),然后相应地获取报价 - 所以今天,您将获取第一个数据库中的行;明天,第二个,以此类推。

于 2012-08-12T16:11:50.033 回答
4

您的最终代码应该看起来像这样,其中数据库中的每个报价都有“day”字段作为它应该显示的日期 (0-365)。

<?php
$query = $pdo->prepare("SELECT * FROM `quotes` WHERE `day` = ?");
$query->execute(date("z", strtotime("today")));

$row = $query->fetch();
echo $row['quote'];
?>
于 2012-08-12T16:15:13.923 回答
3

使用日期作为 RNG 种子,这样它就会每天更新 :)

这是一些代码:

mt_srand(date('dmY')); //Sets mt_rand seed to date.
$displayno = mt_rand(0, $total_quotes); //Generates random number with that seed, and the amount of quotes.
display_quote($displayno); //Pre-defined function that gets quote from database, and displays it.

编辑:当我测试它时,这非常有效。(http://pi.berboe.co.uk/stacks.php 是一个工作示例,它每天选择一次 0 到 200 之间的随机数。)

这假设 $total_quotes 是较早设置的,并且是报价数据库中的条目数量。

于 2012-08-12T16:12:11.680 回答
3

这可能并不像第一眼看上去那么容易。

假设您有 365 个报价,并且这个数字不会改变 - 很简单,您可以每天使用 1 个。因此,您只需要一个算法,它可以为您提供一年中的天数,这将是您从数据库中拉出的行的 id。例如,2 月 1 日是数据库中的第 32 天 -> 获取该报价。

假设您有 2000 个报价,并且数量可能会改变 -> 您将如何处理?你的方法是什么?是否允许一年显示两次报价?如果超过 365,所有报价将如何显示?

更新:

//get number of quotes from DB
SELECT COUNT(*) AS cnt FROM quotes

$day_in_year=date('z')+1; //-> this will give you the number of days in a year, for today
于 2012-08-12T16:13:20.097 回答
2

我会这样做:

首先,我假设您可以在数据库中获取引号的数量,我将其称为number_of_quotes.

然后你可以使用类似PHP microtime()函数的东西来获取os timestamp并将它除以

(1000 /* for converting microseconds to milliseconds */ * 
1000 /* milliseconds to seconds */ * 
3600 /* seconds to hours */ * 
24 /* hours to days */)

要获取到现在为止经过的天数,我将其称为number_of_days_passed.

最后,您可以number_of_days_passed % (number_of_quotes + 1)从您的报价表中获取第 th 行。

于 2012-08-12T16:23:14.810 回答
2

另一种解决方案是mark已经显示的报价。这样,您应该只决定如何在一天中选择一个相同的报价。

Next报价可以在当天开始时随机选择并标记为todays报价。可以使用执行此任务CRON,您只需选择标记为todays(白天)的报价。

于 2012-08-12T16:57:27.413 回答
2

感谢所有的答案。不幸的是,我一直在寻找的答案没有给出。

这就是我消除问题的方法:

我创建了一个名为quote 的新表。

它有 1 行:更新当天最后一个报价的日期和报价本身。当日期与服务器日期不匹配时,我生成了一个新报价并使用新报价和新日期更新了表格。如果它确实匹配当前日期,它会获取报价并显示它。

相当简单的解决方案,但对我来说它是开箱即用的。

于 2012-08-12T20:51:09.003 回答
1

获取今天 00:00 的 unix 时间并将其作为 $variable 存储在您的代码中。

$id = (time() - $variable) % (24 * 60 * 60);
"SELECT * FROM `quotes` WHERE `id` = {$id}"
于 2012-08-12T16:18:57.697 回答