
- •Оглавление
- •Что такое интернет
- •Готовимся к созданию Web-страниц
- •Железо, железо и еще раз железо...
- •Домашняя эргономика — безопасность прежде всего!
- •Программное обеспечение для Web-мастера
- •Выбор хостинга
- •Знакомьтесь — РНР
- •История создания РНР
- •Установка РНР
- •Настройка РНР для Apache
- •Виртуальные хосты в Apache
- •Тестирование РНР
- •Установка и настройка дополнительных модулей
- •Переносимость и совместимость
- •Синтаксис РНР
- •Возможности РНР
- •Работа с базами данных
- •HTTP-аутентификация средствами РНР
- •Работа с изображениями
- •Поддержка закачки файлов
- •Поддержка HTTP-cookie
- •Использование регулярных выражений
- •Обработка ошибок
- •Управление электронными письмами
- •Вывод на экран и переменные в РНР
- •Простейшие арифметические операции
- •Простейшие логические операции
- •Циклы
- •Массивы
- •Работа со строками
- •Сессии
- •Программирование на РНР
- •Сравнение чисел
- •Вложение файлов в документ
- •Простейший счетчик посещений
- •Обработка форм
- •Отправление почты
- •Отправление письма в HTML-формате
- •Дата по-русски
- •Счетчик посещений с использованием базы данных
- •Счетчик персональной посещаемости
- •Сохраняем информацию о посещениях
- •Ах, баннеры, баннеры...
- •Счетчик посещений с выводом информации на экран
- •Счетчик сессий
- •Создание динамического меню
- •«Грабим» странички
- •Голосование на сайте
- •Гостевая книга
- •Технология создания
- •Свой чат — это просто
- •Использование специального привата
- •Интернет-магазин
- •Технология создания
- •Сервисы интернет-магазина
- •Архив рассылок
- •Совет первый: а нужно ли вам это?
- •Совет второй: забудьте все советы
- •Пример системы безопасности
- •HTTP-аутентификация в РНР
- •Защита программы
- •РНР в вопросах и ответах
- •Приложения
- •Приложение 3. Некоторые функции РНР
- •Приложение 4. Cookie
- •Приложение 5. Методы передачи данных POST и GET
- •Приложение 6. Время Unix

Счетчикпосещенийсиспользованиембазыданных 99
Счетчик посещений с использованием базы данных
В данном примере мы будем не просто бездумно вести подсчет, а сформируем базу данных с возможностью просмотра статистики по каждой из существующих страниц.
Сначала разберемся более подробно с поставленной задачей. Есть несколько страниц сайта, каждая из которых имеет уникальный адрес — URL. Именно его мы и положим в основу нашей базы данных. Для этих целей отведем один файл с именем, например urlfile.txt.
Вторая составляющая статистики — количество посещений. Мы не будем пока касаться вопроса уникальности каждого посещения, а реализуем для начала их простой подсчет. Для статистики отведем еще один файл — counter.txt.
Этим обоим файлам — urlfile.txt и counter.txt — нужно установить соответствующие атрибуты, разрешающие запись в эти файлы, иначе скрипт выдаст ошибку.
Сам скрипт разместим в файле log.phtml, а вывод результатов — в файле index.phtml. Все четыре файла лучше сохранить в отдельную директорию (у нас она будет названа count), чтобы в дальнейшем не запутаться.
Когда все готово, можно начать программировать. Открываем свежесозданный файл log.phtml в текстовом редакторе и записываем в него следующие строки:
<?
if($QUERY_STRING ! = "")
{ $ u r l = $ PHP _ SELF . '?' . $QUERY_STRING; } e l s e { $ u r l = $PHP_SELF; }
Этим кодом мы считываем адрес, с которого вызывается скрипт и который задан в переменной окружения $PHP_SELF. НО нужно учитывать, что в адрес вполне могут быть включены параметры,

100 |
|
Программирование на РНР |
которые идут после вопросительного знака и которые можно прочитать уже из переменной окружения $QUERY_STRING. Итак, если переменная $QUERY_STRING у нас пуста, адрес считывается только из $PHP_SELF, если нет, адрес комбинируется из двух переменных окружения.
Дальше:
$add = $DOCUMENTROOT."/count/urlfile.txt"; $adds = $DOCUMENTROOT."/count/counter.txt"; $li = file($add);
$a = count($li);
Здесь мы формируем пути, по которым скрипт будет искать файлы для записи данных статистики.
$DOCUMENT_ROOT — еще одна переменная окружения, в ней хранится абсолютный путь к вашему сайту, благодаря наличию данной переменной обеспечивается стопроцентная работоспособность скрипта, из какой бы директории он ни был запущен. В конце этого кода считываем в массив с именем $li содержимое файла с базой данных адресов. Пока эта база пуста, и массив, соответственно, пуст.
Следующие действия:
$i = 0; $w = -1; while {$i <= $a):
$tmp = trim(str_replace ("\n","", $li[$i])); if ($tmp == $url) { $w = $i; $i = $a++; } $i++;
endwhile;
Этот код отвечает за определение местоположения запрошенного адреса в массиве адресов. Массив пока пуст, поэтому запрошенный адрес не обнаруживается, и его необходимо туда записать. За это отвечает код:

Счетчик посещений с использованием базы данных |
101 |
|||
if |
($w |
== -1) |
|
|
{ |
|
|
|
|
$fp |
= |
fopen{$add, |
"a+"); |
|
if |
($fp) { $fw = fwrite($fp, $url."\n"); fclose($fp); |
|||
} |
|
|
|
|
$fp |
= |
fopen($adds, |
"a+"); |
|
if ($fp) { $fw = fwrite{$fp, "0"."\n"); fclose ($fp); }
$w = $a++;
}
Файл адресов и файл количества посещений дополняются новыми данными, учитывается и перевод строки, так как он является разделителем при считывании файла в массив в дальнейшем. Если же запрошенный адрес уже есть в базе данных, этот код не выполняется, так как переменная $w равна номеру позиции запрошенного адреса в массиве адресов.
Таким образом, достигается равновесие: если адрес есть, то ничего не делаем, если нет — добавляем его туда, а переменная $w все равно указывает на номер позиции в массиве адресов.
Дальше:
$со = f i l e ( $ adds);
$co[$w] |
= |
t r i m ( s t r _ r e p l a c e ( " \ n " , " " , $ c o [ $ w ] ) ) ; |
$co[$w]++; |
$count = $co[$w]; |
|
$co[$w] |
= |
$ c o [ $ w ] . " \ n " ; |
Данный код отвечает за загрузку базы данных количества посещений страниц в массив $со и за увеличение на единицу нужной позиции в этом массиве. Переменной $count передается значение текущего счетчика посещений данной страницы, его можно позже вывести на экран.
Посмотрите на вторую строку, нам уже встречалась эта функция, Дело в том, что когда РНР считывает данные из файла в массив,

102 |
Программирование на РНР |
разделителем считается перевод строки. Но это не значит, что он не попадает в массив. Кроме перевода строки, в массив могут попасть пробелы с начала и с конца строки, и от них, как и от перевода строки, нужно избавиться. Именно это и делает указанная строка кода.
Дальше:
$р = implode ("", $со); $fp = fopen($adds, "w");
if ($fp) { $fw = fwrite($fp, $p) ; fclose ($fp); }
Этим кодом увеличиваем показание счетчика, дополняем его переводом строки для корректной записи и записываем весь массив $со в файл. Прежде чем это сделать, массив объединяется в одну переменную, и уже она легко записывается. Осталось завершить код тегом окончания кода РНР:
?>
Вот и все, что требовалось внести в самый большой и сложный файл log.phtml.
Дальше сделаем вывод результатов на экран, чтобы была возможность наглядно оценить посещаемость ваших страниц. За это, как вы помните, отвечает файл index.phtml Начнем теперь заполнять кодом его:
<? include ($DOCUMENT_ROOT."/count/log.phtml"); ?>
Так будет вызываться наш скрипт статистики. Подобная вставка вызовет либо пополнение базы данных адресов, либо увеличение соответствующей позиции счетчика на единицу. Результаты можно разместить в таблице:
<table align="center" border="l"> <?
$add = $DOCUMENT_ROOT."/count/urlfile.txt"; $adds = $DOCUMENT_ROOT."/count/counter.txt"; $li = file($add);