Обновление базы данных до 24 часов

Я пытаюсь сделать счетчик посещений, где я хочу собрать общее количество посещений за 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()

Я много искал этот сайт, но я не нашел ответа на этот вопрос, пожалуйста, помогите, как я могу это сделать?

Спасибо!


person user2854563    schedule 22.08.2014    source источник
comment
TIME_NOW - Я так понимаю, вы уже объявили его константой?   -  person Funk Forty Niner    schedule 22.08.2014
comment
Привет, Фред. Да, ты прав.   -  person user2854563    schedule 22.08.2014
comment
Поскольку вы вычитаете из TIME_NOW, чтобы получить $timer, как вы ожидаете, что это ($timer) когда-либо будет чем-либо, кроме меньшего, чем TIME_NOW?   -  person Patrick Q    schedule 22.08.2014
comment
Как выглядит это заявление?   -  person Funk Forty Niner    schedule 22.08.2014
comment
Также взгляните на thetricky.net/php/Compare%20dates%20with%20PHP. и highlystructured.com/comparing_dates_php.html могут помочь понять, как время отличия работают.   -  person Funk Forty Niner    schedule 22.08.2014
comment
@Fred-ii-: Фреймворк, который я использую, был создан кем-то, поэтому я не знаю, где именно это было объявлено, но я знаю, что TIME_NOW на самом деле равно time()   -  person user2854563    schedule 22.08.2014
comment
Хорошо, посмотри на ссылки, которые я тебе дал. Вам, скорее всего, потребуется использовать strtotime для преобразования времени.   -  person Funk Forty Niner    schedule 22.08.2014
comment
Спасибо, Фред, но не могли бы вы показать мне ответ, как использовать strtotime в моем случае?   -  person user2854563    schedule 22.08.2014
comment
TBH, мне очень тяжело с датой / временем, поэтому будет сложно дать вам определенный ответ. Просто посмотрите на ссылки, а затем повторите переменные, и если они появятся, как предполагалось, вы бы нашли нужную формулу. Я потратил 2 дня, пытаясь разобраться сам, и я не хочу тратить столько же времени на твое LOL!   -  person Funk Forty Niner    schedule 22.08.2014
comment
Давайте начнем с этого: Какова реальная проблема, с которой вы столкнулись? Вы всегда выполняете первое условие? Вы всегда бьете второй? Вы получаете сообщение об ошибке? Вы сделали var_dump(TIME_NOW); и var_dump($timer); для проверки значений?   -  person Patrick Q    schedule 22.08.2014
comment
Вам, вероятно, понадобится что-то вроде $now = TIME_NOW; $timer = TIME_NOW - 60*60*24; if ($timer < $now){...} и дать ему отправную точку.   -  person Funk Forty Niner    schedule 22.08.2014
comment
Почему бы не сделать это более надежным способом и не вставить такую ​​метрику в отдельную таблицу с отметками времени. Затем вы можете запросить его любым удобным для вас способом. Кроме того, я думаю, вам нужно будет сбросить значение до 1 вместо нуля, иначе вы не будете учитывать текущее попадание.   -  person Mike Brant    schedule 22.08.2014


Ответы (2)


Прежде всего, вам нужно где-то сохранить время запуска таймера. Затем вы можете сделать эту проверку в PHP работающей. Без него вы никогда не узнаете, сколько времени действительно прошло с момента последней проверки.

Альтернативное решение 1: создать поле со значением таймера в БД. Затем создайте триггер 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: Аналогично первому, но используйте задания CRON, запускаемые в определенный час (полночь, час ночи и т. д.).

person Zentoaku    schedule 22.08.2014

У меня есть очень простое решение для вас, если вы хотите иметь таблицу, посвященную счетчику попаданий, вместо того, чтобы хранить свой счетчик попаданий в таблице настроек...

+----------+---------+------+-----+---------+-------+
| 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 часов в качестве намека на то, что вы хотите ежедневно сбрасывать счетчик.

person Populus    schedule 22.08.2014