如何从PHP中的MySQL数据库中提取“今日特色文章”?

时间:2011-07-29 14:50:43

标签: php mysql

如何使用PHPMySQL创建“今日精选文章”系统?

每天,当用户第一次访问该网站时,我需要从数据库中随机选择一篇文章,这将在一天内用于每个访问该网站的用户。 这将在没有管理员干预的情况下发生,因此脚本将由访问的用户触发。

据我了解,用户第一次在新的一天访问该页面时,该脚本会随机(或在其他基础上)选择一篇文章,然后在数据库中将其标记,同时解开文章从前一天开始。但是,如果两个用户同时访问同一页面怎么办?这可能意味着会同时标出两篇文章!

你如何应对时区?

3 个答案:

答案 0 :(得分:4)

我要做的是:

  • 在UTC午夜运行一个cron作业。 You can write offline cron jobs in PHP.
  • 随机选择文章ID。这可能需要几秒钟depending on how you do it,因此最好在脱机作业中执行此操作,而不是在任何用户的PHP请求期间执行此操作。
  • 从文章中生成HTML片段,例如:带有“阅读更多...”链接的文章介绍。当然要小心创建包含XSS vulnerabilities
  • 的HTML
  • 将HTML片段存储在memcached下的已知密钥下。

然后,当访问者访问该网站时,他们的页面视图只从memcached中提取HTML片段并直接在页面中输出。在午夜,HTML片段以原子方式更改,下一个PHP请求将获取新保存的文章。

由于cron作业是选择随机文章的唯一代码,因此它不会与任何其他代码同时运行,因此不需要锁定。

没有运行memcached?习惯它。 Web应用程序架构需要一些明智的,特定于应用程序的缓存,而memcached是最佳解决方案。

关于时区,简短的回答是将UTC用于所有事情。有关更多详细信息,请收听OurSQL Podcast episode 46: It's About Time

答案 1 :(得分:0)

您需要构建2个数据库。一个有明显的新闻文章,另一个持有该特定日期的文章ID。您可以在加载站点时在PHP中运行检查以检查当前日期以及是否存在文章。如果没有,则该用户是第一个到达该网站的用户,因此找到一篇随机文章,并在白天将这些文章插入到表格中。

我不会为你编写整个脚本,但我会给你几个元素。至于时区,您将使用服务器时间而不是最终用户的计算机时间。这是一种违反安全性的行为,因为它们可能在未来或过去设定了一个日期,而不是写入任何数据。

对于在“同一时间”访问该网站的用户,这是不太可能的。

要从MySQL数据库中按日期选择文章,您可以使用:

$check_sql = "SELECT * FROM todays_article
          WHERE date = '" . date("j-n-Y") . "'
          LIMIT 1";
$check_qry = mysql_query ($sql);
if (mysql_num_rows ($check_qry) == 1) {
    // Do nothing
}
else {
    $random_sql = "SELECT article_id FROM articles
               ORDER BY RAND() LIMIT 1";
    $random_qry = mysql_query ($random_sql);
    $random_row = mysql_fetch_assoc($random_qry);
    $insert_sql = "INSERT INTO todays_article
               ('article_id', 'date') VALUES
               ('" . $random_row["article_id"] . "', '" . date("j-n-Y") . "')";
    $insert_qry = mysql_query($insert_sql);
}

这是未经测试的,但它可以让您了解自己想要达到的目标。

答案 2 :(得分:0)

您可以通过使用日期来播放散布文章ID的哈希函数,而无需在任何地方保存任何内容。我不知道我推荐这么做,但无论如何都要考虑替代解决方案。 :)

$id = hexdec(substr(md5(date('Ymd')), 0, 8)) % $number_of_articles;

注意:

  • $ id不一定是article.id,而是第N条。
  • 您可以通过更改日期格式来更改文章更改的频率。如果您想每小时更改一次,请执行以下操作:date('H')