【问题标题】:Fetch new table data daily with mySQL每天使用 mySQL 获取新的表数据
【发布时间】:2012-08-01 14:26:37
【问题描述】:

我正在开发的网站提供了一项服务,只有会员才能完全访问内容。我正在尝试在主页上创建一个“样本”,每天获取新的 mysql 数据(通常只对会员可用),并为所有用户提供网站必须提供的“免费样本”。

数据库包含超过一千个条目,我想找到一种方法来每天从数据库中获取新的 mysql 数据。

假设我的数据库如下所示:

id    cars
1     honda
2     volvo
3     ford
4     audi

我希望“今日汽车”是 24 小时的“本田”,然后是 24 小时的“福特”,然后是 24 小时的“奥迪”,等等......

这是我目前所拥有的:

<?php 
    //Create mysql connect variable
    $conn = mysql_connect('server', 'username', 'password');
    //kill connection if error occurs
    if(!$conn){
        die('Error: Unable to connect. <br/>' . mysql_error());
    }
    //connect to mysql database
    mysql_select_db("masdswe9", $conn);

    $results = mysql_query("SELECT * FROM cars");

    $name_array = Array();

    while($row = mysql_fetch_array($results)){
        $name_array[] = $row['name'];
    }
    shuffle($name_array);

   /* I would like for this to fetch NEW SQL data every 24 hours, 
   since I am shuffling names above, slot 0 will be different once I 
   come up with a way to fetch new mysql data every 24 hours */
    echo $name_array[0];
?>

【问题讨论】:

  • 如果您是 MySQL 新手,请勿使用 mysql_query。尽管这在示例中很流行,但除非您格外小心,否则此功能非常危险。 mysqli 系列函数和 PDO 更安全。 Several examples 展示更好的做法。

标签: php mysql


【解决方案1】:

我将创建一个名为CarOfTheDay 的数据库表,您可以从中进行选择(它只会在Cars 表中包含汽车的ID)。要么这样,要么你可以有一个专栏carOfTheDay,或者改变汽车的顺序,但我认为这些更具侵入性。

创建一个每天运行一次的 cron,并将随机汽车写入CarOfTheDay。然后,你可以做上面做的事情,但你不必担心时间,你只会选择一辆车:

SELECT
   cars
FROM
   CarOfTheDay
   JOIN Cars USING (id)
LIMIT 1

如果您坚持使用CarOfTheDay,则不需要LIMIT

顺便说一句,使用PDOmysqli 而不是mysql_*。只选择你需要的列(不要在生产代码中使用SELECT *)..并且只选择你需要的行(你可以在查询中随机化)。

【讨论】:

  • 感谢您的回复,虽然我对 mySQL 很陌生,但您的解释让我无法理解:) 我将如何每 24 小时将汽车 ID 插入新表“计时”一次?这就是我遇到的麻烦......
  • Cron 作业。只需谷歌“cron”或“crontab”,您就会发现大量信息(仅限 Linux)。如果您使用的是 Windows 机器,则必须使用“Windows 任务计划程序”或某种 cron 仿真。一个 cron 作业可以运行一个程序(如果你喜欢的话,甚至是一个 PHP 程序),它可以做你需要的数据库更改。
  • 我明白了,感谢您的澄清......所以如果没有 cron 工作就没有办法做到这一点?我正在运行 Windows...我希望只有编程解决方案...我希望以某种方式使用时间戳或类似的东西...
  • @MHZ 需要了解以前的状态并且程序不会可靠地运行(即仅在每次访问页面时)。为什么你不想使用 cron 作业?它们非常适合许多任务——不是要避免的。
  • 真的没有什么真正的原因,我对Linux的经验并不多,但我会尝试一下,这似乎是一个有用的学习...谢谢
【解决方案2】:

@Explosion Pills 为您的未来提供了一个很好的解决方案。在你的未来,一些汽车公司会花大价钱让你的产品成为你的汽车。

现在,假设您只想浏览您的汽车清单,然后依次让每一辆汽车成为当天的汽车。假设您的 ID 值全部存在,没有间隙,从 1 开始。

然后:

SELECT id, car
  FROM cars
 WHERE id >= 1+MOD(TO_DAYS(CURDATE()),(SELECT MAX(ID) FROM cars)+1)
 ORDER BY ID
 LIMIT 1

每天都会从您桌子上的所有汽车中按 id 顺序为您提供一辆新车。

这里的诀窍是这个表达式:1+MOD(TO_DAYS(CURDATE()),(SELECT MAX(ID) FROM cars)+1)

基本上是这样的:

  1. 将今天的日期变成数字
  2. 从表中计算最大 ID 号
  3. 取今天的日期模数
  4. 查找具有该 ID 的行。

1+-1 存在一些问题,因为模运算的工作原理是 0 - n-1 而不是 1 - n。

请注意,我使用了&gt;=LIMIT 1 而不是简单的=,因此如果您碰巧在您的id 序列中出现间隙,您的查询不会在随机的一天崩溃。

编辑 这假设您的表名为“cars”,并且它具有 idcar 列。如果不是这样,您需要相应地更改查询。最好在编程之前尝试在 phpmyadmin 之类的 SQL 客户端中调试这些东西。我确实在我自己的一些虚拟数据上对此进行了测试。

http://sqlfiddle.com/#!2/eb1bb/1/0

【讨论】:

  • 感谢您的回复。您的 SELECT 语句超出了我对 mySQL 的了解,但它似乎返回 false,您确定语法正确吗?
  • 当你做SELECT id from cars order by id时你会得到什么?
  • 没有错误,它会根据 id 选择所有汽车 id 和订单...(我的数据库中确实有一个 id 字段)
  • 但是,我需要 SELECT 语句每 24 小时选择一个不同的行。
  • 这就是我的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-29
相关资源
最近更新 更多