Azotirovanie.ru

Инженерные системы и решения
1 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Статистика посещений на PHP

Статистика посещений на PHP

Статистика посещений на PHP

Пожалуй, одна из самых сложных, но в то же время обыденных, задач программиста является создание статистики посещений на PHP. В этой статье я покажу, как её можно сделать наиболее качественной.

Главная задача статистики посещений — это отличить одного пользователя от другого. Но как это сделать? К сожалению, это вообще невозможно. Если различать по IP, то ничего не выйдет. У огромного числа пользователей он динамический. Более того, у разных людей они повторяются. В итоге, 2 разных IP могут принадлежать одному человеку, а один и тот же IP может принадлежать разным людям.

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

На основании этого давайте с Вами разберём, какая таблица в базе нам потребуется. Вот те поля, которые я считаю необходимы для хорошей статистики посещений на PHP:

  • id — уникальный идентификатор.
  • userhashcookie пользователя. Данное поле по сути и является ключевым при различении пользователей.
  • ipIP-адрес пользователя.
  • uri — страница, на которую пришёл посетитель. Например, /page.html.
  • ref — адрес, с которого пришёл посетитель.
  • date — дата посещения.

Теперь разберём PHP-код добавления в эту таблицу новой записи:

<?php
$userhash = $_COOKIE[«userhash»]; // Узнаём, что за пользователь
if (!$userhash) <
/* Если это новый пользователь, то добавляем ему cookie, уникальные для него */
$userhash = uniqid();
setcookie(«userhash», $userhash, 0x6FFFFFFF);
>
$ip = ip2long($_SERVER[«REMOTE_ADDR»]); // Преобразуем IP в число
$uri = $_SERVER[«REQUEST_URI»]; // Узнаём uri
$ref = $_SERVER[«HTTP_REFERER»]; // Узнаём, откуда пришёл
$date = time(); // Берём текущее время
$mysqli = new mysqli(«localhost», «root», «», «mydb»); // Соединяемся с базой
$mysqli->query(«INSERT INTO `visits` (`userhash`, `ip`, `uri`, `ref`, `date`) VALUES (‘$userhash’, ‘$ip’, ‘$uri’, ‘$ref’, ‘$date’)»); // Добавляем запись
$mysqli->close(); // Закрываем соединение
?>

Безусловно, данный код надо размещать на всех страницах сайта. И так же он может быть и изменён в зависимости от Вашего движка. Также можно добавлять и другие данные, например, браузер пользователя, ОС и прочее.

И, конечно, данная статистика посещений на PHP не идеальна, но не думаю, что есть лучше. А уж идеала точно нет. В любом случае, если Вам нужно отслеживать пользователя на длительном периоде, то лучше как можно быстрее зарегистрировать его на сайте, а уже дальше отслеживать все его действия по полученному id. И вот это уже будет идеальная статистика.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Читайте так же:
Насос счетчик для дизтоплива

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

Комментарии ( 23 ):

А так и нужно чтобы при каждом переходе по ссылкам на сайте появлялась новая запись, или нет?

По мне так удобнее, просто обновлять ссылку и время, чтобы не загружать лишний раз базу данных, или дажу обновлять а ссылку добавлять через запятую а при выводе разбивать на массив и выводить в списке. А вам как такой вариант?

Всё равно нужно при каждом посещении обновлять таблицу, хоть новую запись добавить, хоть через запятую новый адрес записать.

Отлично,надо бы "похимичить" с этим кодом.

Михаил, а можете сделать статью про создание графиков статистики по дате или количеству без сторонних библиотек, в виде дополнения к статье? Я очень прошу, просьба размером с голубого кита.

Расскажу о создании графиков в PHP на основе данных, но это будет через 2-3 недели.

Большое спасибо, будем с нетерпением ждать этой статьи, всё мы точно будет рады. Огромное спасибо, а когда будет статья про спойлер на js? Я вас просил написать и до сих пор жду

Статистика

MySQL Native Driver поддерживает сбор статистики по взаимодействию клиента с сервером. Статистика собирается с двух основных точек:

Если вы используете модуль mysqli , эта статистика доступна с помощью двух функций, обращающихся к API:

Замечание:

Статистика агрегируется со всех модулей, использующих MySQL Native Driver. К примеру, если подключить и ext/mysql и ext/mysqli через MySQL Native Driver, как вызовы функций ext/mysql так и ext/mysqli будут внесены в общую статистику. Возможность разделить статистику в зависимости от использованного модуля отсутствует. Вы можете сконфигурировать драйвера PDO MySQL, ext/mysql и ext/mysqli для опционального использования MySQL Native Driver. При этом все три модуля будут изменять статистику.

Доступ к клиентской статистике

Для получения клиентской статистике необходимо выполнить функцию mysqli_get_client_stats() . Функция вызывается без параметров.

Функция возвращает ассоциативный массив, использующий в качестве ключей названия метрик статистики и в качестве значения этих метрик, собственно, значения.

Читайте так же:
Счетчик tns что это

Также клиентская статистика доступна с помощью функции phpinfo() .

Доступ к статистике соединения

Для получения статистики соединения, выполните функцию mysqli_get_connection_stats() , передав в качестве параметра ресурс соединения.

Функция возвращает ассоциативный массив, использующий в качестве ключей названия метрик статистики и в качестве значения этих метрик, собственно, значения.

Буферизованные и небуферизованные результирующие наборы

Результирующие наборы могут быть буферизованными и небуферизованными. При использовании настроек по умолчанию, ext/mysql и ext/mysqli работают с буферизованными результирующими наборами при использовании нормальных (не подготовленных) запросов. Буферизованные результирующие наборы кешируются на стороне клиента. После выполнения запроса, все результаты передаются на клиента, где сохраняются в кеше. Преимущество буферизованных запросов в том, что сразу высвобождаются серверные ресурсы, связанные с хранением результирующего набора.

Небуферизованные результирующие наборы, с другой стороны, сохраняются на сервере гораздо дольше. Если вы хотите сократить потребление памяти на клиенте, но при этом нагрузить сервер, используйте небуферизованные результирующие наборы. Если узким местом в вашей системе является сервер баз данных, то вам стоит задуматься о скорейшем перемещении результатов на клиента. Обычно клиенты масштабируются гораздо легче, чем сервера БД. Нагрузка ложится не только на память, но и на прочие ресурсы, которые должна поддерживать база данных для обслуживания соединения, такие как открытые файловые дескрипторы и нити исполнения.

Подготовленные запросы по умолчанию используют небуферизованные результирующие наборы. В любом случае, вы можете использовать функцию mysqli_stmt_store_result() для буферизации результатов.

Статистика возвращаемая MySQL Native Driver

Следующая таблица демонстрирует список возвращаемой функциями mysqli_get_client_stats() и mysqli_get_connection_stats() статистики.

Каждая операция извлечения увеличивает это число.

Статистика не изменится, если результирующий набор был только буферизован, но не извлечён, как в этом примере:

Ошибка клиентского приложения

Клиент перестал извлекать записи, так как нашёл, что искал, но результирующий набор ещё не был извлечён до конца

Аварийное завершение клиентского приложения

Ошибка клиентского приложения

Клиент перестал извлекать записи, так как нашёл, что искал, но результирующий набор ещё не был извлечён до конца

Простой счетчик на сайт с помощью PHP

Счетчик посещений — важная составляющая любого сайта. Он позволяет отслеживать статистику посещений сайта, длительность сессии, регион посетителя и даже примерный его возраст.

Неотъемлимым минусом онлайн счетчика является обратная ссылка на сайт-создатель. Это особенно вредно для молодых сайтов. Поэтому рассмотрим PHP код, который позволит организовать счетчик посещений своими средствами.

Функционал такого счетчика очень простой — он будет хранить все данные в файле count.txt, в формате: сегодняшняя_дата:0,0%%%0,0 . Где первые две цифры до %%% — число просмотров и число посетителей за сегодня, а цифры после %%% — просмотры и посетители за все время. Когда посетитель заходит на сайт, то ему будет присвоена уникальная кука. За счет нее пользователь будет запомнен на 24 часа и сколько бы раз он не обновлял страницу, будет считаться сайтом, как одним посетителем. Будет расти лишь число просмотров, если он будет просматривать сайт.

Читайте так же:
Мфу бразер 1510 сбросить счетчик

PHP код онлайн счетчика с комментариями:

<?php
//Установка счетчика — ставится в начале страницы
//Для настроек — указать путь, где будет создаваться файл счетчика
$files = $_SERVER[‘DOCUMENT_ROOT’].»/templates/wordpress_58465/count.txt»;
if ( !file_exists($files) ) //создаем и записываем данные по умолчанию, если файла нет
else <
$rez = file_get_contents($files);
$rez = explode(«%%%», $rez);
//В массиве $rez[0]: 19.05.2014: 0, 0 — т.е. дата, кол просм, кол посет.
//В массиве $rez[1]: 0, 0 — кол просм, кол посет. за все время
$rezall = explode(«,», $rez[1]);
//echo $rezall[0]; //Просмотры за все врем
//echo $rezall[1]; //Посетители за все время
$rezdata = preg_replace(‘/:.*/’, », $rez[0]); //В $rezdata только дата типа 19.05.2014
$rezpr = preg_replace(‘/.*:/’, », $rez[0]); //В $rezpr только данные типа 0,0
$rezpr = explode(«,», $rezpr); //В $rezpr[0] — просмотры, $rezpr[1] — посетители
if (strtotime(date(‘d.m.Y’)) == strtotime($rezdata)) <
$rezpr[0] = $rezpr[0] + 1; //просмотры +1
if (!isset($_COOKIE[‘visitors’])) <
setcookie(«visitors», «yes», time()+3600*24); //уникальный посетитель на 24 часа
$rezpr[1] = $rezpr[1] + 1; > //посетитель +1
file_put_contents($files, date(‘d.m.Y’).»:».$rezpr[0].»,».$rezpr[1].»%%%».$rezall[0].»,».$rezall[1].»»); //записываем результат в файл
>
else < //Дата устаревшая Обнуляем счетчик за сегодня, а старые данные добавляем к за все время
$rezall[0] = $rezpr[0] + $rezall[0]; //сохраняем все просмотры
$rezall[1] = $rezpr[1] + $rezall[1]; //сохраняем всех посетителей
if (!isset($_COOKIE[‘visitors’])) <
setcookie(«visitors», «yes», time()+3600*24); //уникальный посетитель на 24 часа
$ynikuser = 1; > //посетитель +1
else $ynikuser = 0;
file_put_contents($files, date(‘d.m.Y’).»:1,».$ynikuser.»%%%».$rezall[0].»,».$rezall[1].»»); //записываем результат в файл
>
>

//Вывод данных счетчика
$rezview = file_get_contents($files);
$rezview = explode(«%%%», $rezview);
$rezview = preg_replace(‘/.*:/’, », $rezview[0]);
$rezview = explode(«,», $rezview);
echo «Просмотров: «.$rezview[0];
echo » Посетителей: «.$rezview[1];
?>

Из настроек вам нужно только указать путь к файлу в $files count.txt.

Чтобы скрипт работал, его можно вставить в шапку или футер сайта. Никто не запрещает использовать метод include.

Информация, которая выводится (//Вывод данных счетчика) реализована в простом выводе данных. Если вам нужно ее красиво оформить, то используйте верстку и CSS.

Установка счетчика на сайт с CSP

Код счетчика, генерируемый Яндекс.Метрикой, предназначен для размещения внутри HTML-кода страниц (inline). На сайтах, которые используют технологию Content Security Policy, такой код будет исполняться только в том случае, если предприняты специальные действия. А именно, необходимо передавать браузеру в HTTP-заголовке разрешение на обработку данных: директивы src-script с атрибутом nonce (это требует подписывания содержимого элемента script ) и img-src для обработки содержимого элемента noscript .

Кроме этого, Яндекс.Метрика допускает другой способ подключения script и HTML-кода, включенного в элемент noscript .

Читайте так же:
Годен ли счетчик для эксплуатации

&#34;>>»>кода счетчика : вы можете разместить в HTML-коде страниц только содержимое элемента noscript , а содержимое элемента script вынести во внешний скрипт (например, в JS-файл).

При выборе любого способа необходимо добавить в HTTP-заголовок разрешение на обращение к Яндекс.Метрике.

  • https://mc.yandex.ru
  • https://mc.yandex.az
  • https://mc.yandex.by
  • https://mc.yandex.co.il
  • https://mc.yandex.com
  • https://mc.yandex.com.am
  • https://mc.yandex.com.ge
  • https://mc.yandex.com.tr
  • https://mc.yandex.ee
  • https://mc.yandex.fr
  • https://mc.yandex.kg
  • https://mc.yandex.kz
  • https://mc.yandex.lt
  • https://mc.yandex.lv
  • https://mc.yandex.md
  • https://mc.yandex.tj
  • https://mc.yandex.tm
  • https://mc.yandex.ua
  • https://mc.yandex.uz
  • https://mc.webvisor.com
  • https://mc.webvisor.org
  • https://yastatic.net

Размещение кода счетчика в HTML-коде страниц сайта

script-src с атрибутом nonce. Этот атрибут должен содержать строковое значение в виде случайной последовательности символов (латинские буквы и цифры). Это значение должно быть сформировано на сервере случайным образом отдельно при каждом запросе.

Эту же последовательность символов должен содержать атрибут nonce в элементе script кода счетчика на страницах сайта.

img-src — для разрешения обработки содержимого элемента noscript .

connect-src&nbsp;— для подключения к Яндекс.Метрике.

Пример HTTP-заголовка при использовании данного способа:

Подключение кода счетчика с помощью внешнего скрипта

Если вы используете этот способ, HTTP-заголовок Content-Security-Policy или Content-Security-Policy-Report-Only может иметь общий набор директив, включая правила для загрузки данных от Яндекс.Метрики:

script-src для разрешения обработки скриптов.

img-src — для разрешения обработки содержимого элемента noscript .

connect-src&nbsp;— для подключения к Яндекс.Метрике.

Пример HTTP-заголовка при использовании данного способа:

Ниже представлен пример подключения JavaScript-кода во внешнем JS-файле. При этом в HTML-код страниц сайта необходимо добавить только элемент script с атрибутом src . Этот атрибут должен содержать путь к файлу (например, metrika.js ).

Добавьте этот код в файл metrika.js .

Где XXXXXX — номер счетчика Яндекс.Метрики.

Чтобы счетчик собирал данные о посетителях, у которых отключен JavaScript, добавьте в HTML-код страниц сайта содержимое элемента noscript :

В данном случае проверка кода счетчика на сайте не будет работать. На странице со списком счетчиков у счетчика будет статус: — «не установлен на главной странице, но данные поступают» .

Если вам не удалось самостоятельно проверить работу счетчика, воспользуйтесь рекомендациями ниже.

Это может происходить по нескольким причинам:

Это значит, что информация отправляется Яндекс.Метрике. При этом данные могут не отображаться в отчетах по следующим причинам:

Кодирование запросов с несколькими счетчиками в mysql / php

Я кодирую следующее: я все еще очень новичок в php, поэтому мое кодирование немного вздор, есть ли лучший способ сделать следующее, в идеале поместить в один запрос или что-то в этом роде, поскольку это единственный способ, которым я знаю, как это сделать : -S. Спасибо 🙂

Вход в музей Мадам Тюссо официально рекомендуется что вы не используете функции mysql_ *. Вместо этого следует использовать MySQLi или PDO. — FrozenFire

3 ответы

Если (и только если) одно из этих утверждений верно:

  • большинству строк в hqfjt_chronoforms_data_addupdatelead нужна какая-то информационная рассылка
  • нет индексов в полях списка рассылки получения *
Читайте так же:
Скрытые люки под счетчик

вы можете сэкономить много мышц БД, выполнив

так как это будет проходить по таблице только один раз.

В остальной части работы вы, конечно, используете

Привет, этот запрос в mysql возвращает газойль derv kero 2 4 3, но когда я использую его с php на странице, я просто получаю — gasoil: derv: kero: — Иэн Симпсон

вам нужно запустить цикл while или другой способ получения результатов. Вы делаете это в своем исходном посте. while ($ row = mysql_fetch_assoc ($ qry)) <. >— Кай Цин

Это потому, что я дебил. Исправлен PHP, теперь должно работать. — Ойген Рик

@KaiQing ненадолго, возвращаем ровно 1 строку. — Ойген Рик

да, нет необходимости в while, но БЫЛА необходимость получить строку или любую другую выборку. исходный ответ просто попытался получить доступ к самой переменной запроса. Цикл while мог оказаться неэффективным, но сработал бы. — Кай Цин

Я бы сделал союз лично.

и поскольку другие ответили, я полагаю, вы можете сказать, как просмотреть результаты.

Если вы не уверены в объединениях, вы можете запускать подобные запросы, если все типы данных ожидаемого результата одинаковы. В этом случае все они имеют значение, так что все должно работать хорошо.

Вы можете использовать UNION и установить тип в каждом запросе, а затем зациклить все три записи одновременно. UNION сопоставляет результаты вместе, но должен иметь одинаковую точную структуру вывода.

Кроме того, мой код намного короче для такой же обработки! 🙂

Привет, я только что попробовал это, но получил строку из трех: но это все, похоже, он не извлекает какие-либо данные. — Иэн Симпсон

Я серьезно не знаю, почему он не работает, так как я копирую вставленные ваши SQL-запросы . Если вы запустите большой запрос в PHPMyAdmin (или в вашем любимом инструменте), он вернет ожидаемые данные? — Матье Дюмулен

Да, это работает в php, мой админ, я проверю, не ошибся ли я где-нибудь. — Иэн Симпсон

Я посмотрел и не увидел ничего плохого, я буквально просто обернул его тегами php, и все, он повторяет двоеточия, и все, ошибок тоже нет, но если я запускаю этот запрос в phpmyadmin, я получаю: — Иэн Симпсон

counttype countdata gasoil 2 derv 4 kero 3 — Иэн Симпсон

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками php mysql count echo or задайте свой вопрос.

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector