Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PHP обучение на примерах - Кухарчик А..pdf
Скачиваний:
136
Добавлен:
24.05.2014
Размер:
23.87 Mб
Скачать

Счетчикпосещенийсиспользованиембазыданных 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);

Соседние файлы в предмете Программирование