Счетчик уникальных IP

Захотелось мне в некоторых своих проектах реализовать сбор статистических данных по заходу различных пользователей с уникальными IP адресами на сайт. Да и подобные вопросы появились на форумах, которые я посещаю.

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

Для реализации данной задачи были приняты следующие принципы:

  • Автоматическое подключение к базе данных MySQL
  • Автоматическое создание нужной таблицы (имя таблицы настраиваемое)
  • Сам скрипт выполнен ввиде класса
  • Класс должен быть самодостаточным, т.е. содержать в себе методы по подключению к БД, а так же методы по работе с данными.

Для удобства скрипт включал в себя все необходимые настройки.

Вот что в итоге получилось:

<?php
/**
*  config:
*/
$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = '12345';
$dbport = '3306';
$dbname = 'test';
$dbtable = 'ip_today_visiters';
$timePeriod = 24; //За сколько последних часов.
//

Class DBIPClass
/**
* Класс для ведения таблицы уникальных IP на вашем сайте
* с сохранением всех данных в базе MySQL.
*
* Кот ДаWINчи 2012
*/
{

/**
* Переменные с данными о подключении.
*/
private $host = '127.0.0.1';       // адрес подключения
private $user = 'root';            // имя пользователя
private $password = '12345';       // пароль
private $port = '3306';            // порт
private $db = '';                  // имя базы данных
private $charset = 'utf8';         // кодировка БД
private $table = '';

/**
* идентификатор подсоединения к базе.
*/
private $idmysql;

/**
* Деструктор класса
*/
public function __destruct()
{
mysql_close($this->idmysql);
}

/**
* * Конструктор класса
*
* @param string $chost адрес/имя сервера
* @param string $cuser логин к серверу БД
* @param string $cpass пароль
* @param string $cdb имя базы
* @param string $cport порт сервера
* @param string $ccharset кодировка (поумолчанию utf8)
* @return boolean
*/
public function __construct($ctable, $cdb = '', $chost = '', $cuser = '', $cpass = '', $cport = '', $ccharset = '')
{
// Если введены данные для подключения, то сохраняем их в переменных класса.
// иначе используем данные "по-умолчанию".
$this->table = $ctable;
if ($chost <> '')
$this->host = $chost;
if ($cuser <> '')
$this->user = $cuser;
if ($cpass <> '')
$this->password = $cpass;
if ($cport <> '')
$this->port = $cport;
if ($cdb <> '')
$this->db = $cdb;
if ($ccharset <> '')
$this->charset = $ccharset;
// Попытка подключения
$this->idmysql = mysql_connect($this->host . ':' . $this->port, $this->user, $this->password) or false;
if ($this->idmysql != false)
{
// Выбор базы
mysql_select_db($this->db, $this->idmysql);
// кодировка
mysql_query("SET NAMES '" . $this->charset . "'", $this->idmysql);
// Проверка наличия таблицы
$tab_count = mysql_query("SHOW TABLES LIKE '" . $this->table . "'", $this->idmysql) or 0;
if ($tab_count <> 1)
{
// Если нет такой таблицы - создаем.
mysql_query("CREATE TABLE `" . $this->table . "` "
. "(`ip` varchar(15) NOT NULL DEFAULT '0.0.0.0',"
. "`lastvisits` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP"
. " ON UPDATE CURRENT_TIMESTAMP,"
. " PRIMARY KEY (`ip`)"
. " )", $this->idmysql);
}
// Подготавливаем IP
// Try IPv4 First, as its the most used method right now
if (!filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV4))
{
// Oops... try v6
if (!filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP, FILTER_FLAG_IPV6))
{
$ip = "0.0.0.0"; // Sorry...
} else
{
$ip = $_SERVER['REMOTE_ADDR'];
}
} else
{
$ip =$_SERVER['REMOTE_ADDR'];
}
// Сразу же обновляем данные о заходе данного IP.
mysql_query("REPLACE INTO " . $this->table
. " (`ip`) VALUES ('" . $ip . "')", $this->idmysql);
return true;
} else
{
return false;
}
}

/**
* Подсчет посетителей за определенный период
*
* @param integer $p - период в часах за который подсчитывать посетителей
* @return integer
*/
public function showCount($p)
{
$i = mysql_query("SELECT COUNT(*) AS `kol` FROM `"
. $this->table . "` WHERE "
. "UNIX_TIMESTAMP(`lastvisits`) > UNIX_TIMESTAMP()-60*60*"
. $p
, $this->idmysql);
$j = mysql_fetch_assoc($i);
return $j['kol'];
}

/**
* Подсчет уникальных посетителей за всё время.
*
* @return integer
*/
public function showAllCount()
{
$i = mysql_query("SELECT COUNT(*) AS `kol` FROM `"
. $this->table, $this->idmysql);
$j = mysql_fetch_assoc($i);
return $j['kol'];
}

/**
* Выборка списка IP за последний период
*
* @param integer $p
* @param string $separator
* @param string $kovychki
* @param integer $limit
* @return string
*/
public function showIP($p = 24, $separator = ',', $kovychki = "'", $limit = 0)
{
$stroka = '';
if ($limit > 0)
{
$l = " LIMIT 0," . $limit;
} else
{
$l = "";
}
if ($p == 0)
{
$w = "";
} else
{
$w = " WHERE UNIX_TIMESTAMP(`lastvisits`) > UNIX_TIMESTAMP()-60*60*" . $p;
}
$i = mysql_query("SELECT `ip` FROM `"
. $this->table . "`" . $w . " ORDER BY `lastvisits` DESC" . $l
, $this->idmysql);
while ($j = mysql_fetch_assoc($i))
{
if ($stroka <> '')
{
$stroka .= $separator;
}
$stroka .= $kovychki . $j['ip'] . $kovychki;
}
return $stroka;
}

/**
* Возвращает время последнего посещения заданным IP.
*
* @param string $ip
* @param string $format ("u" или "") u - unixtime.
* @return type
*/
public function showTime($ip, $format = '')
{
$i = mysql_query("SELECT `lastvisits` FROM `"
. $this->table . "` WHERE `ip` = '"
. $ip . "' LIMIT 1", $this->idmysql);
if (mysql_num_rows($i) == 1)
{
$j = mysql_fetch_assoc($i);
if ($format == 'u')
{
return strtotime($j['lastvisits']);
} else
{
return $j['lastvisits'];
}
} else
{
return false;
}
}

}

/**
* *************************************************
*  main
*
*  Ниже расположен пример использования скрипта (класса).
*/
$ipdb = new DBIPClass($dbtable, $dbname, $dbhost, $dbuser, $dbpass, $dbport, 'utf8');
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
body {
FONT-SIZE: 12px;
MARGIN: 0px;
color: #000000;
font-family: Tahoma;
}
</style>
</head>
<body>
Посетителей за сегодня:
<?php echo $ipdb->showCount(24); ?>
<hr/>
IP адреса последних:
<br/>
<?php
echo $ipdb->showIP(24, "<br/>", '', 10);

// end
?>
</body>
</html>

Подключить данный скрипт можно при помощи html-тега <iframe>

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

Оставить комментарий


Примечание - Вы можете использовать эти HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

=