Перейти к содержимому

Фотография

соз Счетчик посещений. Часть вторая.

- - - - -

  • Авторизуйтесь для ответа в теме

#1
Joiner

Отправлено 17 ��� 2009 - 04:27

Joiner

    Новоприбывший

  • Пользователи
  • 18 сообщений
Прежде чем приступить к чтению этой части, я настоятельно рекомендую вам прочитать предыдущую часть, особенно, если вы новичок в программировании на PHP. В первой части я рассмотрел пример счетчика, который считает посещения только нашего (локального) сайта. Предположим, что вы создаете собственную систему статистики наподобие SpyLog. Другими словами, вы раздаете всем желающим счетчики, которые после установки на их сайтах, будут считать посещения, а потом пользователи смогут просмотреть статистику.
Прежде всего, нам нужно обеспечить идентификацию самих сайтов. Для этого будем использовать идентификационный номер сайта - id. Установить наш будущий счетчик на сайте клиента можно с помощью следующего тега:
<img src=counter.php?id=171>

В данном случае идентификатор сайта равен 171. Сразу оговоримся, что идентификатором по умолчанию будет номер 1 (наш сайт). Для подсчета посещений нашего сайта счетчик можно установить так:
<img src=counter.php>
А можно явно задать идентификатор, то есть id=1.

Общее число уникальных посетителей для каждого сайта будет храниться в таблице ids базы данных counter. Хочу обратить ваше внимание на то, что в отличие от примера из первой части, здесь мы будем использовать "свою собственную" базу данных. Структура таблицы ids выглядит так:
id int primary key, unq int
Где id - идентификатор сайта, а unq - количество уникальных посещений.
Отдельно статистика для каждого сайта будет записываться в таблицу idN, где N - это идентификатор сайта, например, id171. Cтруктура таблиц idN будет такова:
ip char(15), vdate char(8), browser char (127)

Думаю, теперь все стало ясно. Нам осталось только реализовать все это программно. Полный текст счетчика приведен в листинге 1.

Листинг 1


1. <?
// Идентификатор не указан - наш сайт
2. if (!isSet($id)) $id=1;
// Таблица для статистики
3. $table="id$id";
// подключаемся к базе данных
4. mysql_connect("localhost");
5. mysql_select_db("counter");
// считаем, что хост - уникальный
6. $Unique = 1;
7. $R=@mysql_query("SELECT * FROM $table") or die("Invalid SQL query 1");
8. while($Rw=mysql_fetch_row($R))
9. { if($Rw[0]===$REMOTE_ADDR)
10. { $Unique = 0; break(1); }
11. }
// если хост уникальный...
12. if($Unique)
13. {
14. $R=mysql_query("SELECT * FROM ids WHERE id=$id") or die("Invalid
SQL query 2");
15. $Rw=mysql_fetch_row($R);
16. $counter=$Rw[1];
17. $vdate=date("d.m.y");
18. $counter=$counter+1;
// обновляем счетчик
19. @mysql_query("UPDATE ids SET unq=$counter WHERE id=$id");
// обновляем информацию о посетителе
20. @mysql_query("INSERT INTO $table VALUES('$REMOTE_ADDR','$vdate','$HTTP_USER_AGENT')");
21. }
22. else
23. {
24. $vdate=date("d.m.y");
25. mysql_query("UPDATE $table SET vdate='$vdate', browser='$HTTP_USER_AGENT'
WHERE ip='$REMOTE_ADDR'");
26. }
27. $img = ImageCreateFromPng("images/template.png");
28. $color = ImageColorAllocate($img, 220, 210, 60);
29. $x = (ImageSx($img)-6.5*strlen("$counter"))/2;
30. ImageString($img,3,$x,9,"Visits: $counter",$color);
31. Header("Content-type: image/png");
32. ImagePng($img);
33. ImageDestroy($img);
34. ?>

Теперь несколько замечаний. Во-первых, подключение к серверу, которое используется в строках 4,5 листинга 1, считается некорректным и возможно лишь при неправильном конфигурировании сервера баз данных. В общем случае вам нужно указать имя пользователя и пароль для доступа к серверу баз данных. Более подробно я об этом уже писал в первой части. Во-вторых, таблица idN уже должна существовать! Поэтому, прежде чем "обеспечить" пользователя кодом счетчика, его нужно зарегистрировать, то есть создать нужную таблицу. Для решения этого вопроса есть два метода: просто добавить в сценарий запрос создания нужно таблицы после подключения к серверу или же написать собственный сценарий регистрации пользователей. Первый метод, хотя и рабочий, но некорректный, потому, что при уже имеющейся таблице данный запрос будет порождать ошибку 1050: таблица существует. Поэтому, сейчас займемся написанием сценарий для регистрации.

Этот сценарий должен работать примерно так: находим номер N последнего зарегистрированного пользователя (он будет максимальным), потом присваиваем новому пользователю номер N+1 и создаем таблицу idN+1.
Для регистрации следующего пользователя можно использовать это сценарий:

Листинг 2


1. <?
// подключаемся к базе данных
2. mysql_connect("localhost");
3. mysql_select_db("counter");
4. $R=mysql_query("SELECT * FROM ids") or die("Invalid SQL query 1");
5. $Rw=mysql_fetch_row($R);
6. $max=$Rw[0];
// ищем максимум в таблице
7. while($Rw=mysql_fetch_row($R))
8. { if($Rw[0]>$max) $max=$Rw[0];
9. }
// новый номер
10. $N=$max+1;
// Таблица для статистики
11. $table="id$N";
12. mysql_query("insert into ids values ($N,0)");
// создаем таблицу
13. mysql_query("create table $table (ip char(15) primary key, vdate char(8),
browser char (127))");
14. echo "Поздравляем! Регистрация завершена успешно!";
15. echo "Установите следующий код на вашу страничку: ";
16. echo "<br>&ltimg src=\"reg.php?id=$N\"> ";
17. ?>


Вместо явного указания имени сценария (reg.php) вы можете использовать переменную окружения $SCRIPT_NAME. Однако, в ОС Windows она содержит немного не то значение, которое от нее ожидают. Как видите, сценарий для регистрации новых пользователей также предельно прост - всего 17 строк кода. В этом сценарии я не рекомендую вам использовать символ @ перед названиями функций для работы с MySQL (строки 12,13, лист. 2). В случае возникновения ошибки пользователь увидит соответствующее сообщение, а не будет несколько раз запускать сценарий, думая, что ему почему-то отказали в регистрации. Этот сценарий можно усложнить, но это выходит за рамки этой статьи - предоставлю вам пространство для творчества.

Практически все готово для нашей системы статистики. Осталось написать небольшой сценарий, который бы показваыл пользователю статистику обращений к его сайту. Этот сценарий представлен в листинге 3.

Листинг 3


1. <?
2. mysql_connect("localhost");
3. mysql_select_db("test");

4. if (!isSet($id)) $id=1;
5. $table="id$id";

6. $R=mysql_query("select unq from ids where id=$id");
7. $Rw=mysql_fetch_row($R);
8. $unq=$Rw[0];

9. $R=mysql_query("select * from $table");
10. echo "<html><body><h1>Здравствуйте, уважаемый пользователь!</h1>";
11. echo "Уникальных посетителей: $unq<br>";
// выводим таблицу со статистикой
12. echo "<table border>";
13. echo "<tr><td>Хост</td><td>Последнее 14. посещение</td><td>Броузер</td></tr>";
15. while($Rw=mysql_fetch_row($R))
16. {
17. echo "<tr>";
18. for($i=0; $i<mysql_num_fields($R); $i++)
19. echo "<td>$Rw[$i]</a></td>";
20. echo "</tr>";
21. }
echo "</table>";
echo "</body>";
?>

Данный сценарий не использует никакой аутентификации. Процедуру проверки правильности имени пользователя вы можете при необходимости добавить самостоятельно. При вызове сценария ему нужно передать всего один параметр - id - идентификатор сайта.

Функция mysql_num_fields() возвращает количество полей в результате SQL-запроса. Данный сценарий можно еще модифицировать, добавив функцию разрешения IP-адреса в доменное имя, однако это замедлит работу сценария.