我想要为访问某个页面的人执行每日SQL。但是我只想让这个特定用户每24小时发生一次。
(我使用cookies吗?我使用什么SQL查询?什么是PHP代码?)
这就是我的表格:
我想执行类似这样的mysql查询:
INSERT INTO `user_badges` VALUES ('1', 'ADM', '0');
如上所述,我希望这能为每天一次访问PHP页面的用户执行。感谢。
答案 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
的一大优势是它在数据库本身的控制下将预定更新放置到数据库中,因此它们不太可能因数据库外的情况而失败。
我已经不对此进行了测试,以确定语法是否正确,并将错误处理留作读者练习。