0

I'm trying to make a hit counter where I want to collect total hits for 24 hours. This 24 hours should be a fixed value regardless to the end user's time zone. Within 24 hours the database should be updated with +1 hit counts and once the 24 hour time scale achieved the timer should be reset.

Here is what I'm trying:

$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'");
}

Here TIME_NOW is a constant defined as time()

I've searched alot this site but I didn't find any answer to this question, please help, how can I go about this?

Thanks!

4

2 回答 2

0

首先,您需要将计时器的开始时间存储在某处。然后您可以在 PHP 中进行此检查。没有它,你现在永远不会知道自上次检查以来已经过去了多少时间。

替代解决方案 1:在 DB 中创建一个具有计时器值的字段。然后在设置表上创建 ON UPDATE 触发器,该触发器将检查时间,即如果是新的一天,则更新此时间然后重置计数器。

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 作业。

于 2014-08-22T18:08:00.040 回答
0

我有一个非常简单的解决方案给你,如果你愿意有一个专门用于命中计数的表,而不是将你的命中计数存储在设置表中......

+----------+---------+------+-----+---------+-------+
| Field    | Type    | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| date     | date    | NO   | PRI | NULL    |       |
| hitcount | int(11) | YES  |     | NULL    |       |
+----------+---------+------+-----+---------+-------+

要更新您的命中数,只需执行

INSERT INTO `hitcount` VALUES (CURDATE(), 1) ON DUPLICATE KEY UPDATE hitcount = hitcount + 1;

这样,您不仅不需要重置计数器,而且您还拥有每日统计数据!!!

注意:关于最终用户的时区,您无法从服务器端可靠地获取此信息(您可以尝试使用 IP 确定某人的位置,但这并不可靠)。所以你需要以某种方式从用户那里获得它(例如,使用用户浏览器中的javascript,或者让用户输入这个然后你把它保存在某个地方)

如果您真的想使用用户的时区作为日期,它可能会变得更加复杂,我真的不建议这样做。只需使用服务器的日期。

更新:根据您实际尝试实现的目标(您的问题没有告诉我们,您只询问了实施),有很多方法可以处理它。我的回答是使用 24 小时作为您想要每天重置计数器的提示来解释您的问题。

于 2014-08-22T18:18:16.097 回答