Reg.ru: домены и хостинг

Крупнейший регистратор и хостинг-провайдер в России.

Более 2 миллионов доменных имен на обслуживании.

Продвижение, почта для домена, решения для бизнеса.

Более 700 тыс. клиентов по всему миру уже сделали свой выбор.

Перейти на сайт->

Бесплатный Курс "Практика HTML5 и CSS3"

Освойте бесплатно пошаговый видеокурс

по основам адаптивной верстки

на HTML5 и CSS3 с полного нуля.

Начать->

Фреймворк Bootstrap: быстрая адаптивная вёрстка

Пошаговый видеокурс по основам адаптивной верстки в фреймворке Bootstrap.

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

Верстайте на заказ и получайте деньги.

Получить в подарок->

Бесплатный курс "Сайт на WordPress"

Хотите освоить CMS WordPress?

Получите уроки по дизайну и верстке сайта на WordPress.

Научитесь работать с темами и нарезать макет.

Бесплатный видеокурс по рисованию дизайна сайта, его верстке и установке на CMS WordPress!

Получить в подарок->

*Наведите курсор мыши для приостановки прокрутки.


Счетчик посещений сайта своими руками на PHP и MySQL

Размер: 53,8 Мб.

Длительность: 34 мин. 25 сек.

Скачать видеоурок + исходники

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

Понятно, что сейчас существует множество готовых решений - начиная от liveinternet и mail.ru, и заканчивая Яндекс.Метрикой.

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

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

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

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

Под видео вы найдете сокращенную текстовую версию для этого видеоурока.


Хостинг


Краткий обзор урока (все подробности смотрите в видео):

Что нам понадобится?

1. 4 практически идентичных файла, играющих роли разных страниц сайта (index.php, contacts.php, about.php и uslugi.php)
2. Файл .htaccess для задания кодировки сервера в значение UTF-8
3. Папка css с файлом стилей. Там прописано немного простейших стилей для наших страниц
4. Папка inc с подключаемыми файлами. Их три:
- файл подключения к базе данных
- Файл, который будет подключаться в нужном месте страницы для вывода счетчика на экран
- Основной скрипт, в котором прописана логика работы счетчика
5. Папка admin с файлом index.php. В этом файле мы сможем просмотреть статистику посещений сайта


Как что работает?

1. Создаем проект в Денвере (либо на реальном сервере)

Я создал в Денвере хост с именем statistic, а в папке www находятся все файлы сайта.



2. Создаем базу данных

Давайте перейдем к созданию базы, где у нас будет лежать вся информация. Назовем ее stats и создадим в ней две таблицы.



Если вы не хотите вручную создавать таблицы, то можете воспользоваться дампом базы (приложен в дополнительных материалах) и выполнить SQL-запрос на вкладке SQL после создания базы.



Итак, создаем первую таблицу. Назовем ее ips - в ней будут храниться идентификаторы IP-адресов и сами IP-адреса посетителей сайта.

В таблице будут 2 поля:

- id_id (int (12), первичный ключ, автоинкремент)- идентификатор IP-адреса;
- ip_address (varchar (50)) - сам IP-адрес посетителя.





Далее создаем вторую таблицу. Назовем ее visits - в ней будет храниться информация о посещениях сайта.

В таблице будут 4 поля:

visit_id (int (12), первичный ключ, автоинкремент) - идентификатор визита;
date (date) - дата визита;
hosts int(12) - количество хостов (уникальных посещений);
views int(12) - количество хитов (просмотров страниц).





В итоге база будет выглядеть вот так:



3. Базовые положения

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

1. Определять уникального посетителя мы будем по IP-адресу. 1 IP-адрес равен 1 уникальному посетителю (хосту).

2. Заходы в течение 1 дня с одним и тем же IP-адресом не увеличивают количество уникальных посетителей в этот день.

3. Любой заход на сайт в течение суток увеличивает счетчик посещений (хитов) на 1 (вне зависимости от того, совершается ли он с уникального за сегодня IP-адреса или нет).

Хостинг

4. Начало суток мы будем определять следующим образом: когда человек заходит на сайт, мы будем делать проверку, существуют ли в таблице visits какие-либо записи за сегодняшнюю дату. Если нет, значит текущий посетитель является первым посетителем в данных сутках.

5. Раз в сутки идет очистка таблицы с IP-адресами для того, чтобы мы могли заносить в нее IP-адреса уже текущего дня и собирать статистику именно по сегодняшним посещениям сайта (делается это как раз по факту обнаружения того, что к нам пожаловал первый в текущих сутках посетитель).

4. Пишем файлы страниц сайта (index.php, contacts.php, about.php и uslugi.php)

Поскольку все 4 файла страниц сайта практически идентичны, мы рассмотрим только страницу index.php. Остальные три страницы (contacts.php, about.php и uslugi.php) отличаются только тэгами title и h2, в которых написаны другие названия страниц.

Итак, файл index.php:


<?php include 'inc/count.php';?>

<!DOCTYPE HTML>
<html>
<head>
	<meta charset = "utf-8" />
	<title>Главная</title>
    <link rel="stylesheet" type="text/css" href="css/style.css" />
</head>

<body>

<ul id="nav">
    <li><a href="index.php">Главная</a></li>
    <li><a href="uslugi.php">Услуги</a></li>
    <li><a href="contacts.php">Контакты</a></li>
    <li><a href="about.php">О нас</a></li>
</ul>

<h2>Главная страница</h2>

<?php include 'inc/show_stats.php';?>

</body>
</html>

В самом начале мы подключаем файл сount.php, который содержит всю логику работы счетчика.

Далее - подключение файла стилей и простая разметка. В блок div с идентификатором nav заключено меню, и в файле стилей как раз для него прописаны некоторые простые стили.

В нижей части, перед закрывающим тэгом body мы подключаем файл show_stats.php, в котором содержится сам код счетчика, т.е. в этом файле уже формируется непосредственно то, что мы будем выводить на экран.

Т.е. на каждой странице сайта у нас будет выводиться счетчик, и будет указано, сколько было за сегодня уникальных посетителей и просмотров. Этот файл мы разберем позже.

5. Пишем файл стилей (style.css)


#nav{
    padding-left: 0px;
}

#nav li{
    display: inline;
	margin: 5px;
	padding: 5px;
    font-family: Verdana;
	font-size: 15px;
    background-color: #F1EEF7;
    border: 1px solid silver;
}

#nav li a{
    text-decoration: none;
}

#nav li:hover{
    background-color: #8D93EF;
}

Стили, как вы видите, очень простые. Мы задаем отступы, размер и гарнитуру шрифта, убираем подчеркивание для ссылок в меню и меняем цвет фона при наведении курсора мыши на элемент списка.

Кроме того, мы используем свойство display со значением inline для того, чтобы наше меню приняло горизонтальный, а не вертикальный вид.

6. Пишем файл .htaccess

На всякий случай создаем в корне сайта файл .htaccess с одной единственной директивой для задания кодировки UTF-8:


AddDefaultCharset UTF-8

Данный шаг может оказаться излишним, если кодировка сервера уже была установлена в это значение.

7. Подключаемся к базе данных (db.php)


<?php
// Хост (обычно localhost)
$db_host = "localhost";
// Имя базы данных
$db_name = "stats";
// Логин для подключения к базе данных
$db_user = "root";
// Пароль для подключения к базе данных
$db_pass = "";

$db = mysqli_connect ($db_host, $db_user, "", $db_name) or die ("Невозможно подключиться к БД");

В файле db.php указаны параметры подключения к базе данных - хост, имя базы, логин и пароль.

В этом же файле выполняется непосредственно соединение, а идентификатор соединения заносится в переменную $db. В случае ошибки выводится сообщение о невозможности подключиться к базе.

7. Пишем основной файл с логикой (count.php)

Ниже представлен его код, который мы вкратце разберем:


<?php include 'db.php';

// Указываем кодировку, в которой будет получена информация из базы
@mysqli_query ($db, 'set character_set_results = "utf8"');

// Получаем IP-адрес посетителя и сохраняем текущую дату
$visitor_ip = $_SERVER['REMOTE_ADDR'];
$date = date("Y-m-d");

// Узнаем, были ли посещения за сегодня
$res = mysqli_query($db, "SELECT `visit_id` FROM `visits` WHERE `date`='$date'") or die ("Проблема при подключении к БД");

// Если сегодня еще не было посещений
if (mysqli_num_rows($res) == 0)
{
    // Очищаем таблицу ips
    mysqli_query($db, "DELETE FROM `ips`");

    // Заносим в базу IP-адрес текущего посетителя
    mysqli_query($db, "INSERT INTO `ips` SET `ip_address`='$visitor_ip'");

    // Заносим в базу дату посещения и устанавливаем кол-во просмотров и уник. посещений в значение 1
    $res_count = mysqli_query($db, "INSERT INTO `visits` SET `date`='$date', `hosts`=1,`views`=1");
}

// Если посещения сегодня уже были
else
{
    // Проверяем, есть ли уже в базе IP-адрес, с которого происходит обращение
    $current_ip = mysqli_query($db, "SELECT `ip_id` FROM `ips` WHERE `ip_address`='$visitor_ip'");

    // Если такой IP-адрес уже сегодня был (т.е. это не уникальный посетитель)
    if (mysqli_num_rows($current_ip) == 1)
    {
        // Добавляем для текущей даты +1 просмотр (хит)
        mysqli_query($db, "UPDATE `visits` SET `views`=`views`+1 WHERE `date`='$date'");
    }

    // Если сегодня такого IP-адреса еще не было (т.е. это уникальный посетитель)
    else
    {
        // Заносим в базу IP-адрес этого посетителя
        mysqli_query($db, "INSERT INTO `ips` SET `ip_address`='$visitor_ip'");

        // Добавляем в базу +1 уникального посетителя (хост) и +1 просмотр (хит)
        mysqli_query($db, "UPDATE `visits` SET `hosts`=`hosts`+1,`views`=`views`+1 WHERE `date`='$date'");
    }
}

Итак, сначала мы подключаем файл bd.php, обеспечивающий связь с базой данных, после чего начинаем писать основной код.

Перво-наперво мы получаем из глобального массива $_SERVER IP-адрес посетителя и сохраняем текущую дату.

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

Далее у нас возможно только 2 варианта: или посещений сегодня еще не было, или посещения сегодня уже были.

В первом случае (если посещений еще не было) и текущий посетитель является первым в этих сутках, мы производим очистку таблицы с IP-адресами.

Это нужно нам для того, чтобы начать сбор статистики уже именно за сегодняшний день.

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

Второй вариант - когда посещения сегодня уже были.

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

Если выясняется, что такой IP-адрес уже сегодня был, то мы к текущему значению просмотров добавляем +1 и больше ничего.

Если же такого IP-адреса сегодня еще не было (т.е. посетитель уникальный), то сохраняем в базу его IP и обновляем значения как количества уникальных посетителей, так и просмотров (т.е. увеличиваем на единицу значения обоих полей).

На этом файл count.php можно считать разобранным.

8. Пишем файл, выводящий счетчик на страницы (show_stats.php)

Файл show_stats.php мы используем на каждой из страниц для того,  чтобы вывести статистическую информацию. Вот его код:


<?php

// Указываем кодировку, в которой будет получена информация из базы
@mysqli_query ($db, 'set character_set_results = "utf8"');

// Извлекаем статистику по текущей дате (переменная date попадает сюда из файла count.php, который, в свою очередь, подключается в каждом из 4 обычных файлов)
$res = mysqli_query($db, "SELECT `views`, `hosts` FROM `visits` WHERE `date`='$date'");
$row = mysqli_fetch_assoc($res);

echo '<p>Уникальных посетителей: ' . $row['hosts'] . '<br />';
echo 'Просмотров: ' . $row['views'] . '</p>';

Как видите, этот файл намного проще.

Здесь мы просто получаем из базы статистику по текущей дате,  после чего используем ключи результирующего массива $row для вывода на экран количества уникальных посетителей (поле host) и просмотров (поле views).

9. Создаем файл "админки" (index.php в папке admin)

В этом файле мы представим статистику посещений в табличном виде.

Кроме того, мы реализуем возможность получать статистику за определенный период времени. Ниже представлен код файла index.php:


<?php include '../inc/db.php'; ?>

<h2>Статистика</h2>

<p><a href="?interval=1">За сегодня</a></p>
<p><a href="?interval=7">За последнюю неделю</a></p>

<table style="border: 1px solid silver;">

<tr>
    <td style="border: 1px solid silver;">Дата</td>
    <td style="border: 1px solid silver;">Уникальных посетителей</td>
    <td style="border: 1px solid silver;">Просмотров</td>
</tr>

<?php
// Если в массиве GET есть элемент interval (т.е. был клик по одной из ссылок выше)
if ($_GET['interval'])
{
	$interval = $_GET['interval'];

    // Если в качестве параметра передано не число
    if (!is_numeric ($interval))
    {
        echo '<p><b>Недопустимый параметр!</b></p>';
    }

    // Указываем кодировку, в которой будет получена информация из базы
    @mysqli_query ($db, 'set character_set_results = "utf8"');

    // Получаем из базы данные, отсортировав их по дате в обратном порядке в количестве interval штук
	$res = mysqli_query($db, "SELECT * FROM `visits` ORDER BY `date` DESC LIMIT $interval");

    // Формируем вывод строк таблицы в цикле
	while ($row = mysqli_fetch_assoc($res))
    {
		echo '<tr>
			     <td style="border: 1px solid silver;">' . $row['date'] . '</td>
			     <td style="border: 1px solid silver;">' . $row['hosts'] . '</td>
			     <td style="border: 1px solid silver;">' . $row['views'] . '</td>
			 </tr>';
	}
}
?>

</table>

Сначала соединяемся с базой. Затем формируем две ссылки с параметрами, которые позволят нам при клике по ним получать данные за определенный интервал времени (в примере: за 1 день и за 1 неделю).

Мы также проверяем глобальный массив $_GET на наличие передаваемого нами параметра (interval) и, в случае, если значение этого параметра не является числом, мы выводим соответствующее предупреждение.

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

После этого мы запускам цикл while и в нем формируем строки таблицы, выводя в их ячейки элементы результирующего массива $row (date, hosts и views), в результате чего получаем список всех посещений за указанный период времени.

Ну что ж, на этом разбор скрипта можно считать оконченным. При желании вы можете его модифицировать, заставив его, например, собирать больше статистических данных.

Если краткий текстовый обзор вам не до конца понятен, то изучите полную версию урока в видеоформате на этой странице выше.

Успехов вам, и до связи!

Дмитрий Науменко.

P.S. Хотите легко работать с PHP? Обратите внимание на премиум-уроки по различным аспектам сайтостроения, включая программирование на PHP, а также на бесплатный курс по созданию своей CMS-системы на PHP с нуля. Все это поможет вам быстрее и проще освоить этот мощный язык веб-разработки:

Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!


Смотрите также:

PHP: Получение информации об объекте или классе, методах, свойствах и наследовании

PHP: Получение информации об объекте или классе, методах, свойствах и наследовании

CodeIgniter: жив или мертв?

CodeIgniter: жив или мертв?

Функции обратного вызова, анонимные функции и механизм замыканий

Функции обратного вызова, анонимные функции и механизм замыканий

Применение функции к каждому элементу массива

Применение функции к каждому элементу массива

Слияние массивов. Преобразование массива в строку

Слияние массивов. Преобразование массива в строку

Деструктор и копирование объектов с помощью метода __clone()

Деструктор и копирование объектов с помощью метода __clone()

Эволюция веб-разработчика или Почему фреймворк - это хорошо?

Эволюция веб-разработчика или Почему фреймворк - это хорошо?

Магические методы в PHP или методы-перехватчики (сеттеры, геттеры и др.)

Магические методы в PHP или методы-перехватчики (сеттеры, геттеры и др.)

PHP: Удаление элементов массива

PHP: Удаление элементов массива

Ключевое слово final (завершенные классы и методы в PHP)

Ключевое слово final (завершенные классы и методы в PHP)

50 классных сервисов, программ и сайтов для веб-разработчиков

50 классных сервисов, программ и сайтов для веб-разработчиков

Наверх