我正试图制作一个点击计数器,我希望24小时收集总点击数。无论最终用户的时区如何,这24小时都应该是固定值。在24小时内,数据库应该以+1命中计数进行更新,一旦达到24小时时间刻度,应重置计时器。
以下是我正在尝试的内容:
$timer = TIME_NOW - 60*60*24;
if ($timer < TIME_NOW)
$db->query("UPDATE settings SET value=value+1 WHERE name='hits_today'");
}
else
{
$db->query("UPDATE settings SET value=0 WHERE name='hits_today'");
}
此处TIME_NOW
是一个定义为time()
我已经搜索了很多这个网站,但是我没有找到这个问题的任何答案,请帮忙,我该怎么办呢?
谢谢!
答案 0 :(得分:0)
首先,您需要存储计时器的开始时间。然后你可以在PHP工作中进行这项检查。如果没有它,你将永远不会知道自上次检查以来已经过了多少时间。
替代解决方案1:在DB中创建具有计时器值的字段。然后在设置表上创建ON UPDATE触发器,该触发器将检查时间,即i.E。如果是新的一天,请更新此时间,然后重置计数器。
DELIMITER $$
CREATE TRIGGER update_counter
AFTER UPDATE ON settings
FOR EACH ROW
BEGIN
SET TIMER = (SELECT value FROM settings WHERE name='hits_timer' LIMIT 1);
IF (TIMER < NOW() - INTERVAL 1 DAY) THEN
UPDATE settings SET value=NOW() WHERE name='hits_timer';
UPDATE settings SET value=0 WHERE name='hits_today';
END IF;
END;
$$
DELIMITER ;
替代解决方案2:与第一个解决方案类似,但在某个特定小时(午夜,凌晨1点等)触发使用CRON作业。
答案 1 :(得分:0)
我有一个非常简单的解决方案,如果你愿意有一个专门用于hitcount的表而不是将你的hitcount存储在设置表中......
+----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| date | date | NO | PRI | NULL | |
| hitcount | int(11) | YES | | NULL | |
+----------+---------+------+-----+---------+-------+
要更新您的hitcount,请执行
INSERT INTO `hitcount` VALUES (CURDATE(), 1) ON DUPLICATE KEY UPDATE hitcount = hitcount + 1;
这样,您不仅不需要重置计数器,而且每天都有统计数据!!!
注意:关于最终用户的时区,您无法从服务器端可靠地获取此信息(您可以尝试使用IP确定某人的位置,但它不可靠)。因此,您需要以某种方式从用户那里获取(例如,使用用户浏览器中的javascript,或者让用户输入此内容并将其保存在某处)
如果你真的想要将用户的时区用于日期,那么它可能会变得更加复杂,我不建议这样做。只需使用服务器的日期。
更新: 根据您实际想要实现的目标(您的问题没有给出我们,您只询问实施情况),有很多方法可以解决它。我的回答是使用24小时解释您的问题,作为您希望每天重置计数器的提示。