3

我正在开发的网站提供了一项服务,只有会员才能完全访问内容。我正在尝试在主页上创建一个“样本”,每天获取新的 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];
?>
4

2 回答 2

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。

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

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

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

于 2012-08-01T16:18:49.983 回答
2

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

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

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

如果LIMIT你坚持一个 应该没有必要CarOfTheDay

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

于 2012-08-01T14:32:04.057 回答