1

24小时后如何更改mysql数据库中的值?用户是否需要访问网站才能运行查询?例如,我有一个名为“user-rank”的列,它的值为“10”,我希望它在 24 小时后为“20”......

4

5 回答 5

5

Crontab aka CRON 是最灵活的解决方案,但您需要在 shell 或特定控制面板中拥有使用它的权限,因为出于安全原因,许多托管服务提供商不喜欢与其共享权限。

首先创建带有更新代码的 PHP 脚本,如下所示:

<?php

//connect to database
//.... 

//prepare MySQL query
$sql = "UPDATE myTable SET `user-rank` = `user-rank` + 10";

//execute query and handle errors
//...

//optinal reporting on e-mail
//...

//end
?>

接下来,您需要通过在 shell 中调用“crontab -e”来向 crontab 添加条目,像这样粘贴代码并保存更改:

0    0     *     *     *     /usr/bin/php -f /path/to/my_update_script.php > /dev/null

此条目将定义每天午夜(服务器时间)对脚本的调用,并忽略脚本的任何输出。

注意:您需要为不同的操作系统或用户定义的配置文件指定 php 二进制文件的确切路径。使用“ which php ”shell 命令检查它。

- - - - - - - - 更新 - - - - - - - -

没有 crontab 的解决方案。

创建一个新的数据库表php_cron并使用以下 MySQL 代码插入初始记录(第一个且仅需要一个):

CREATE TABLE `php_cron` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `last_ts` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
);

INSERT INTO `php_cron` (`id`, `last_ts`) VALUES (1,'2012-08-10 00:00:00');

然后创建新的 PHP 脚本,它将包含此类任务所需的所有逻辑,并将其包含在您的主 index.php 文件或其他可以在用户每次访问您的站点时加载的位置,例如在某些配置或类似脚本中。我想你每天至少会有一个访客。

这个新脚本需要做两个任务,首先查询那些 php_cron 表并计算时间差,如果差大于 24 小时(86400 秒)然后执行更新用户等级的代码并将新的时间戳保存到数据库中。

该脚本可能如下所示:

<?php


    //connect to database
    //.... 

    //get time difference in seconds from last execution
    $sql1 = "SELECT TIME_TO_SEC(TIMEDIFF(NOW(), last_ts)) AS tdif FROM php_cron WHERE id=1";
    $res1 = mysql_query($sql1) or die("[1] MySQL ERROR: ".mysql_error());
    $dif = mysql_fetch_assoc($res1['tdif']);


    if ($dif >= 86400) { //24h

        //following code will run once every 24h

        //update user's page rank
        $sql2 = "UPDATE myTable SET `user-rank` = `user-rank` + 10"; 
        mysql_query($sql2) or die("[2] MySQL ERROR: ".mysql_error());

        //update last execution time
        $sql3 = "UPDATE php_cron SET last_ts = NOW() WHERE id=1";
        mysql_query($sql3) or die("[3] MySQL ERROR: ".mysql_error());

    }

?>

这个脚本不像 CRON 那样时间准确,但肯定会每天运行一次。这可以通过更多的 php/mysql 逻辑来纠正,但我认为它会完成这项工作。

于 2012-08-09T22:41:26.313 回答
4

一个常见的解决方案是设置一个cron 作业来定期运行脚本来更新任何需要更新的内容。

于 2012-08-09T20:13:02.517 回答
1

您可以设置一些东西来运行查询检查数据库的最后一次运行时间,然后您可以运行查询(当有人访问该站点时所有这些)。或者你可以设置一个 cron 作业。

于 2012-08-09T20:13:30.097 回答
0

根据您的 MySQL 版本,您可以使用事件。

于 2012-08-09T20:11:48.087 回答
0

首先编辑您的 crontab 文件(在终端中)

crontab -e

将此行添加到文件中:

0    0     *     *     *         php /var/www/myquery.php

第一个 0 表示分钟 0,第二个零表示 0h。其他星星表示该作业将每天执行。

在 myquery.php 文件中,您放置了一些将连接到您的数据库并执行您想要的查询的 php。

这是在 linux 系统上执行此操作的一种方法。

于 2012-08-09T20:24:14.150 回答