Учимся считать

Поиск на php

Считать нужно уметь, это даже в сказках детей учат. Сегодня мы попробуем научиться считать посетителей страниц своего сайта. Причем не просто бездумно вести подсчет, а сформировать базу данных с возможностью просмотра статистики по каждой из существующих страниц.

Считаем посещения

Как всегда, для работы нам понадобится сервер (например - Apache) с установленным гипертекстовым препроцессором РНР, текстовый редактор и немного времени. Для начала давайте разберемся более подробно с поставленной задачей. Есть несколько страниц сайта. Все они, конечно, имеют уникальный адрес - URL. Вот его-то мы и положим в основу нашей базы данных. Для этих целей отведем один файл с именем, например, urlfile.txt. Вторая составляющая статистики - это количество посещений. Мы не будем пока касаться вопроса уникальности каждого захода, а реализуем для начала простой подсчет посещений. Для статистики отведем еще один файл - counter.txt (жалко, что ли…? :-). Сам скрипт разместим в файле log.phtml, а вывод результатов - в файле index.phtml. Все четыре файла полезно вынести в отдельную директорию, что бы в дальнейшем не запутаться. Она у нас будет названа - count. Не забывайте, что на файлы, в которые будет осуществляться запись (у нас их два - с расширением .txt), нужно установить соответствующие атрибуты, разрешающие в них запись, иначе скрипт выдаст ошибку.

Когда все готово, можно начать программировать. В первую очередь сделаем файл log.phtml, как самый главный. Открываем свежесозданный файл в текстовом редакторе (можно и в блокноте), и прописываем туда следующие строки:

Этим кодом мы считываем адрес, с которого вызывается скрипт. Этот адрес прописан а переменной окружения $PHP_SELF, но нужно учитывать, что в адрес вполне могут быть включены параметры, которые идут после вопросительного знака, и считать их можно уже из переменной окружения $QUERY_STRING. Итак, если эта переменная у нас пуста, адрес считывается из $PHP_SELF, если нет, адрес комбинируется из двух переменных окружения.

Здесь мы формируем пути, по которым скрипт будет искать файла для записи данных статистики. $DOCUMENT_ROOT - тоже переменная окружения, и в ней хранится абсолютный путь (адрес) к Вашему сайту. Благодаря наличию данной переменной обеспечивается стопроцентная работоспособность скрипта, из какой бы директории он не был запущен. В конце этого кода считываем в массив с именем $li содержимое файла с базой данных адресов. Пока эта база пуста, и массив соответственно пуст.

Этот код отвечает за определение местоположения запрошенного адреса в массиве адресов. Так как пока этот массив пуст, то запрошенный адрес не обнаруживается, и его необходимо туда записать. За это отвечает следующий код:

Файл адресов и файл количества посещений дополняются новыми данными, учитывается и перевод строки, так как он является разделителем при считывании файла в массив в дальнейшем. Если же запрошенный адрес уже есть в базе данных, этот код не выполняется, так как переменная $w равна номеру позиции запрошенного адреса в массиве адресов. Таким образом, достигается равновесие - если адрес есть, то хорошо, если нет - его туда добавляют, а переменная $w все равно указывает на номер позиции в массиве адресов. В любом случае идем дальше:

Этот кусочек кода отвечает за загрузку базы данных количества посещений страниц в массив $co и за увеличение на единицу нужной позиции в этом массиве. В переменную $count кладется значение текущего счетчика посещений данной страницы, его можно позже вывести на экран.

Отдельно стоит рассмотреть вторую строчку, так как она нам уже встречалась. Дело в том, что когда РНР считывает данные из файла в массив, разделителем считается перевод строки. Но это не значит, что он не попадает в массив. Кроме перевода строки, в массив могут попасть пробелы с начала и с конца строки, и от них, равно как и от перевода строки нужно избавиться. Именно это и делает указанная строчка кода. А дальше - увеличиваем показание счетчика, дополняем его переводом строки для корректной записи, и…

… записываем весь массив $co в файл. Прежде, чем записать, массив склеивается в одну переменную, и уже она легко записывается. Осталось завершить код тегом окончания кода РНР:

Вот и все, что требовалось записать в самый большой и сложный :-) файл log.phtml. Хочу Вас обрадовать, дальше будет проще. Как я и обещал, мы сделаем вывод результатов на экран, что бы была возможность наглядно оценить посещаемость тех или иных Ваших страниц. За это, как Вы помните, у нас отвечает файл index.phtml. Начнем теперь заполнять кодом его:

Вот так, кстати, будет вызываться наш скрипт статистики. Подобная вставка вызовет либо пополнение базы данных адресов, либо увеличение соответствующей позиции счетчика на единицу. Мы могли бы и не учитывать в рейтинге страницу результатов, но никто нам этого не запрещает. А сами результаты не плохо бы разместить в таблице:

Ну, эта часть нам уже до боли знакома. Блок кода практически ничем не отличается от такого же блока в файле log.phtml. Мы узнали адреса файлов базы данных и ввели информацию в массивы. Осталось ее только вывести, предварительно отформатировав тегами HTML:

Теперь наши результаты будут выведены в таблице в виде адрес - количество посещений. Вот и вся работа! В заключение хочу еще раз напомнить, что вызов скрипта статистики осуществляется следующей командой:

Достаточно вставить этот код в любое место любого файла (но только с расширением для РНР!), и он будет проиндексирован в базе данных, и в дальнейшем каждое его посещение будет учитываться. Если Вас интересует пример - посмотрите как работает подобный скрипт на сайте http://virtual.bresttelecom.by. Удачных Вам подсчетов!

Что такое cookie

Ну, допустим, считать своих посетителей мы научились. А как сделать счетчик персонального учета посещаемости? Так, что бы вывести посетителю информацию о том, сколько раз он заходил на Вашу страничку. Эта задача несколько иного рода, но решается она на самом деле еще проще. Но сначала нам придется познакомиться с одной очень полезной и важной штукой. Я имею в виду технологию cookie. Переводится на русский это английское слово примерно так - печенье, кусочек. В данном случае имеется в виду кусочек информации, записанной сервером на компьютер посетителя. В дальнейшем эту информацию можно извлечь, причем сделать это может только тот сервер, что записал ее туда. Информация ограничена размером 4 килобайта. Есть ограничения по времени существования cookie, по их количеству и т.д. Бояться этой технологии не нужно, и многие сайты очень активно используют ее для сбора информации о своих клиентах, их предпочтениях, настройках и т.д. Для примера представьте себе форум, в котором нужно обязательно указывать имя, адрес или другую информацию. Обычно все это приходится каждый раз вводить заново, а с помощью cookie все данные можно запомнить на компьютере клиента и при следующем посещении форума их извлечь и воспроизвести в форме. Еще проще - один раз запомнить имя посетителя, и каждый раз приветствовать его по имени.

Самый простой способ установить cookie с помощью РНР - это использовать специальный оператор:

Теперь, пока не будет закрыто окно браузера пользователем, переменную $name со значением, равным числу 12345 можно считать с помощью другого оператора:

Часто делают сразу проверку, установлена или нет соответствующая переменная, и на основе полученных результатов принимают решение, что делать дальше:

Надо помнить, что установленный таким образом cookie живет только до тех пор, пока не закрыто окно браузера, его породившее. Как только пользователь закрывает окно, установленная переменная уже не доступна. Это - так называемый сессионный cookie. Впрочем, совсем не сложно продлить срок жизни cookie до нужного времени. Делается это с помощью третьего параметра оператора setcookie, который указывает дату истечения срока действия cookie либо срок его действия, если число меньше, чем дата установки:

Перед тем, как задать третий параметр, его нужно сформировать специальной функцией. Дело в том, что в РНР этот параметр указывает на количество секунд, прошедшее после 1 января 1970 года. Немного странно, но уж как есть. Функция mktime() именно для этого и предназначена. Ей нужно указать час, минуту, секунду, месяц, день и год в такой же последовательности. На выходе получим нужное значение в секундах, прошедших с 1.01.1970. В примере cookie будет жизнеспособен (а значит, и поддастся считыванию) до 1 января 2002 года.

Переустановить или удалить cookie очень просто - достаточно указать либо новое значение, либо не указать его вовсе. И под конец одно существенное ограничение. В силу каких-то пока не очень понятных мне свойств работа с cookie должна вестись до какого-либо вывода на экран (в браузер пользователя) любого текста, в том числе и тегов HTML. То есть вот так уже не сработает:

Запомните это ограничение и старайтесь подстраиваться под него, так как тут ничего поделать нельзя. Это не РНР виноват, так уж устроены эти самые cookies. Вот теперь пришла пора от теории перейти к практике.

Персональный счетчик

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

Смысл кода очень прост. Если cookie с именем name установлен, его значение считывается и увеличивается на единицу. Если нет - записывается в cookie ноль. В дальнейшем он будет считан и учтен. В любом месте страницы теперь можно вывести результаты:

Как видите, еще проще: весь код буквально уместился в одну строчку. Теперь вы легко сможете организовать с помощью технологии cookie много полезных приемов. Только не забывайте, что некоторые Ваши посетители могут запрещать браузеру принимать cookie, нужно позаботиться и о них. На крайний случай - просто предупреждать о необходимости разрешить их прием.



Опубликовал admin
10 Сен, Среда 2003г.



Программирование для чайников.