MYSQL + PHP每天都在执行sql

时间:2015-12-22 00:59:31

标签: php mysql

我想要为访问某个页面的人执行每日SQL。但是我只想让这个特定用户每24小时发生一次。

(我使用cookies吗?我使用什么SQL查询?什么是PHP代码?)

这就是我的表格:

enter image description here

我想执行类似这样的mysql查询:

INSERT INTO `user_badges` VALUES ('1', 'ADM', '0');

如上所述,我希望这能为每天一次访问PHP页面的用户执行。感谢。

2 个答案:

答案 0 :(得分:1)

创建一个这样的表:

CREATE TABLE badge_update_time (
    user_id INT(11) PRIMARY KEY,
    last_updated DATETIME
);

然后,插入user_badges表的脚本将首先执行如下查询:

SELECT COUNT(*) AS count
FROM badge_update_time
WHERE user_id = 1 AND last_updated > DATE_SUB(NOW(), INTERVAL 1 DAY)

如果表中的用户没有行,或者行超过1天,则会返回count == 0。所以你的代码会这样做:

if ($row['count'] == 0) {
    mysqli_execute($conn, "INSERT INTO badge_update_time VALUES (1, NOW()) ON DUPLICATE KEY UPDATE last_updated = NOW()";
    mysqli_execute($conn, "INSERT INTO `user_badges` VALUES ('1', 'ADM', '0')");
}

答案 1 :(得分:1)

一种可能性是使用MySQL的事件调度程序做一些事情。

在应用程序的users表中添加一列,如

been_there  BOOLEAN NOT NULL DEFAULT FALSE

当用户访问相关网页时

$stmt = $dbh->prepare("UPDATE users
                         SET been_there = TRUE
                         WHERE user_id = :user_id");
$stmt->execute(array(":user_id" => $user_id));
$event = "CREATE EVENT reset_" . $user_id . " IF NOT EXISTS
            ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 24 HOUR
            DO
              UPDATE users SET been_there = FALSE WHERE user_id = " . $user_id;
$dbh->exec($event);

(请注意,我通常不赞成使用动态SQL,但在这种情况下,我不确定是否有其他方法,我假设$user_id已经被正确清理过。)< / p>

它优于cron的一大优势是它在数据库本身的控制下将预定更新放置到数据库中,因此它们不太可能因数据库外的情况而失败。

我已经对此进行了测试,以确定语法是否正确,并将错误处理留作读者练习。