Для простоты, скажем, я делаю основной счетчик просмотров страниц в php, который хранит счетчики для каждой страницы в таблице mysql. В таблице было 2 столбца: PAGE_ID и COUNT.
Я добавил следующий код на каждую страницу:
$query = "INSERT INTO table VALUES ('$page_id', '1')
ON duplicate KEY UPDATE COUNT=COUNT+1";
$result = mysqli_query($cxn, $query);
Чтобы убедиться, что каждый человек, просматривающий страницу, запускает счетчик только после того, как я добавил сеансы PHP. В основном, если вы просматриваете страницу, page_id сохраняется в сеансе, и php-код счетчика проверяет этот сеанс перед запуском счетчика. Работал нормально в моем тестировании.
Некоторые страницы получали слишком много просмотров, я подозревал дубликаты, поэтому я начал регистрировать IP-адреса и пользовательские агенты. Оказывается, примерно в 10% случаев IP запускает счетчик для одной и той же страницы 2-3 раза за несколько минут.
Первый вопрос
Что может быть причиной дубликатов? Похоже, что проблема возникает в основном с IE8 и Safari, но у меня также есть хотя бы один случай, когда это происходит с IE7 и IE6. Любая известная проблема с сессиями php? Должен ли я использовать куки вместо этого?
Часть 2:
Я изменил свою таблицу так, чтобы она теперь сохраняла последнюю метку времени Unix и последний IP, который вызвал счетчик.
Я хочу изменить свой запрос так, чтобы перед запуском "COUNT = COUNT + 1" он проверял следующее:
If the current IP is the same as the last stored IP for this page {
check that it's been at least 5 minutes before doing COUNT=COUNT+1
} else { COUNT=COUNT+1; }
Второй вопрос
Как мне написать это в запросе mysql, сохранив мой оператор «ON duplicate KEY»?
Я понимаю, что это утверждение не будет на 100% точным, но пока я не смогу выяснить, почему сессия не работает, это будет работать. Мой сайт имеет низкий трафик, и я редко получаю более 1 посетителя на одной странице в течение 5 минут.
Спасибо