В данной статье рассмотрим самое элементарное: подсчёт количествава посещений всего, посещений сегодня, посетителей сегодня и вывод кнопки с этими данными на страницах сайта.
Начнём с разработки MySQL таблиц. Создадим файл bd.php и введём в нём данные подключения к БД MySQL:
Ў bd.php <?
$dbname='PHP_MySQL_DB';//Имя базы данных
$dbuser='snaker_php_mysql';//Имя пользователя
$dbpw='pass_php_mysql';//Пароль
$dbhost='localhost';//Хост
//И сразу напишем код для подключения к БД:
$db=mysql_connect("$dbhost", "$dbuser","$dbpw");
mysql_select_db("$dbname",$db) or die(mysql_error());
?> ^ bd.php
Теперь создамим файл install.php, в котором будет создаваться таблица 'main' (в ней будут хранится все данные).
В таблице main создадим 5 полей:allvisits - кол-во посетителей всего, определим её как численную(integer) с 15 знаками - int(15), visits - кол-во посещений сегодня, определим её как численную(integer) с 10 знаками -int(10), uniq - кол-во посетителей сегодня, определим её как численную(integer) с 10 знаками -int(10), iplist - список IP адресов посетителей сегодня, присвоим данному полю текстовой параметр - text, dat - сегдняшняя дата, будем записывать её в формате dd.mm.yyyy (т.к. поле date в MySQL такой формат даты не поддерживает, то возмём поле dat varchar(10)).
Ў install.php <?
require 'bd.php';
//Инклюдим файл с подключением к БД MySQL.
mysql_query ("DROP table if exists main");//Удаляем, если существует, таблицу main.
$sql1 = mysql_query ("CREATE TABLE main (
`allvisits` int(15) NOT NULL default '0',
`visits` int(10) NOT NULL default '0',
`uniq` int(10) NOT NULL default '0',
`iplist` text NOT NULL default '',
`dat` varchar(10) NOT NULL default ''
)
");//Создаём таблицу main
if ($sql1)echo "Таблица main создана";//Проверяем, создалась ли таблица.
else echo mysql_error();//Если не создалась, выводим ошибку.
mysql_query ("insert into main values (0 ,0, 0, '', '$date');");//Вставляем нулевые значения
unlink ("install.php");//Удаляем файл install.php, т.к. он нам больше не будет нужен.
?>
^ install.php
Теперь напишем скрипт, который будет обрабатыват данные, обновлять информацию в БД MySQL, выводить на экран графический счётчик в виде кнопочки. Назовём его index.php.
Ў index.php <?
require 'bd.php'; //Инключим файл с подключением к БД
//Функиця для получения IP адреса посетителя. Вникать в неё не надо, там просто перебираются разные способы получения IP адреса. В результате функция возвращает IP адрес посетителя.
function getIP() {
if(getenv("HTTP_CLIENT_IP")) {
$ip = getenv("HTTP_CLIENT_IP");
} elseif(getenv("HTTP_X_FORWARDED_FOR")) {
$ip = getenv("HTTP_X_FORWARDED_FOR");
} else {
$ip = getenv("REMOTE_ADDR");
}
return $ip;
}
//Функция для проверки IP адреса на уникальность. Ей передаются IP адрес посетителя ($uip) и список IP адресов, разделённых ';' ($ipl, этот список хранится в поле iplist в таблице main). Списко IP адресов $ipl разделяем на массив с IP адресами функцией explode, считая ';' разделителем и перебирая массив мы сравниваем каждый IP адрес из массива с IP адресом посетителя. Если есть совпадение, то функция возвращает значение true (1), а если нет - fales (0).
function checkIP($ipl, $uip){
$repeat = 0;
$iplist = explode(";",$ipl);//Списко IP адресов $ipl разделяем на массив с IP адресами функцией explode, считая ';' разделителем.
foreach($iplist AS $ip)
{
if ($uip == $ip)
$repeat = 1;
}//Перебираем массив IP адресов и если находим в нём IP адрес посетителя ($uip), то присваеваем значение переменной $repeat = 1.
return $repeat;
}
$uip = getip();//Получаем IP адрес посетителя
mysql_query ("update main set allvisits=allvisits+1 where 1");//Увеличиваем на единицу кол-во посещений всего
//Проверим, не наступил ли новый день, т.к. если он наступил, то нужно обнулить поля iplist (списрок IP адресов), uniq (посетителей сегодня), visits (посещений сегодня) и обновить поле date.
$date = date("d.m.Y");
$sql = mysql_query ("SELECT * from main where dat = '$date'");
if (mysql_num_rows($sql)==0)//Значит новый день
{
$ip = $uip.";";//Присоеденям к IP адресу разделитель ";"
mysql_query ("update main set dat='$date', uniq=1, visits=1, iplist='$ip' where 1");//ставим сегодняшнюю дату, обнуляем поля uniq, visits и iplist и сразу записываем 1 посещение, 1 посетителя и его IP адрес.
}
else//Если день не новый.
{
//Увеличим на единицу знач. посещений сегодня. Считаем поле iplist из таблицы main (SQL запрос был уже выполнен выше) и проверим посетителя на уникальность.
mysql_query ("update main set visits=visits+1");
$row = mysql_fetch_array($sql);//Получаем массив значений из таблицы main.
if (!checkip($row['iplist'], $uip))//Если уникальный, добавим IP адрес в поле iplist, отделив его ";", и увеличим значение поля uniq на единицу.
mysql_query ("update main set uniq=uniq+1, iplist = CONCAT(iplist, '$uip;')");
}
//Осталось только вывести кнопочку на экран.
//Получаем данные uniq, allvisits, visits из MySQL таблицы main:
$sql = mysql_query ("select uniq, allvisits, visits from main where 1");
$row = mysql_fetch_array($sql);
//Так как мы хотим, чтоб статистика выводилась в правой части кнопки, а текст, как мы знаем, пишется с лево на право, то нам нужно добавить пробелы в значения переменных allvisits, uniq, visits так, чтоб вместе с пробелами длина каждой переменной была на всю кнопку. (пробелы мы будет выводить перед цифрами и тогда цифры будут выровнены по левой границе кнопки.) При использовании параметра фонта 1(подробнее расскажу об этом ниже) в строке кнопки шириной 88px 15 символов. Напишем функцию, которая будет добавлять пробелы к переменным, пока их длина не станет равной 15 символам.
function donormal($string)
{
while (strlen($string)<16)$string = " ".$string;
return $string;
}
//Теперь добавляем пробелы в переменные allvisits, visits, uniq
$visits = donormal($row['visits']);
$uniq = donormal($row['uniq']);
$allvisits = donormal($row['allvisits']);
//Зададим цвета вывода значений в палитре RGB.
$r1 = 157;//R верхней строчки
$g1 = 88;//G верхней строчки
$b1 = 88;//B верхней строчки
$r2 = 157;//R средней строчки
$g2 = 88;//G средней строчки
$b2 = 88;//B средней строчки
$r3 = 157;//R нижней строчки
$g3 = 88;//G нижней строчки
$b3 = 88;//B нижней строчки
//В переменной $image укажем название файла - картинки кнопки. Файл должен быть формата JPEG
$img = "s.JPEG";//Скачать мою кнопку можно здесь.
//Теперь выведем кнопку.
header("Content-type: image/jpeg");//Говорим броузеру, что тип нашей странички - картинка.
$image = imagecreatefromjpeg("$img");//Создаём рисунок из файла $img. Также существуют функции imagecreatefromGIF и imagecreatefromPNG. Их нужно использовать соответственно для создания рисунков из файлов формата GIF и PNG.
//Теперь создадим цвета строк. $color1 - цвет первой строки, $color2 - цвет второй строки, $color3 - цвет третьей строки.
$color1=ImageColorAllocate($image,$r1, $g1, $b1);
$color2=ImageColorAllocate($image,$r2, $g2, $b2);
$color3=ImageColorAllocate($image,$r3, $g3, $b3);
//Теперь нанесём на кнопку значения, используя функцию imagestring (im, font, x, y, string, color), где im - рисунок (в нашем случае это $image), font - параметр фонта (оптимальный - 1), x - координата x вывода текста, y - координата y вывода текста, string - сам текст, color - цвет текста (в нашем случае это соотв. $color1, $color2, $color3).
ImageString($image,1,2,3, "$allvisits",$color1);
ImageString($image,1,2,14, "$visits",$color2);
ImageString($image,1,2,21, "$uniq",$color3);
//Выводим кнопку на экран.
imagejpeg($image);
?>
^ index.php
Теперь осталось только сделать вывод кнопки на страницах вышего сайта. Для этого вставьте следующий код в то место вашего сайта, где бы вы хотели её видеть: <img src="folder_with_this_script/index.php" width=88 height=31 border=0 alt="Статистика посещений от Snaker'a (php-exec.com)">
Вот и все, это статья заканчивается. Прошу не судить её строго, т.к. во-первых, это моя первая статья, и, во-вторых, - это статья является вступлением в серию статей по написанию счётчика для своего сайта с встроенным анализатором траффика.