Ваш первый Сайт С использованием РНР-скриптов
СЧЕТЧИК ПОСЕТИТЕЛЕЙ САЙТА
Итак, приступим, наконец, к практическому использованию языка РНР для создания сценариев. Создадим счетчик посещений для страниц нашего сайта, который будет выводить в браузер общее число посещений какой-либо страницы сайта, число посещений за текущие сутки и число посетителей с разными IP-адресами (уникальных посетителей). Разберите все варианты кода счетчика, так как это поможет вам лучше усвоить язык РНР. Сначала разберитесь во всех строчках кода (разбор кода сразу после листинга), а потом попробуйте самостоятельно набрать код в РНР-редакторе.
Сначала в корневой папке hdocs создайте подпапку под названием Chetchik, где будут храниться текстовые файлы с данными для счетчика. Теперь создайте в РНР-редакторе новый файл и сохраните его в корневой папке Hdocs под названием chetchik.php.
Листинг 4.6 (файл Chetchik. php) <?Php
$data=date("d. m");
$stranica=substr(basename($_SERVER[" PHPSELF"]), 0, А);11эма строчка здесь не нужна! Она должна быть на той странице, где будет установлен счетчик!
$ip=$_SERVER["REMOTE_ADDR"];
$flle="chetchik/chetchik,,.$stranica. M.txtM;
$ffle2="chetchik/todayf$stranica.".txtM;
$file3="chetchik/data".$stranica.".txt";
$file4="chetchik/ip".$stranica. M.txt";
If (!file_exists($flle))
{
$chetcik=fopen($file, "w+"); fwrite($chetcik, "Iм); fclose($chetcik); $read=l;
$chetcik=fopen($flle2, "w+"); fwrite($chetcik, "1"); fclose($chetcik); $read2=l;
$chetcik=fopen($file3, "w+"); fwrite($chetcik, $data); fclose($chetcik);
$chetcik=fopen($flle4, "w+M); fwrite($chetcik, $ip. Mn, f); fclose($chetcik);
$ipkolich=l; }
Else
{
$chetcik=fopen($file, "г"); $read=fread($chetcik, 100); fclose(Schetcik); $read++;
$chetcik=fopen($file, "w+"); flock($chetcik, LOCK_EX); f>vrite($chetcik, $read); flock($chetcik, LOCK_UN); fclose(Schetcik); $data2=fopen($file3, "r"); $read3=fread($data2,100); fclose($data2);
If($read3!=$data)
{
$data2=fopen($file3, "w+"); flock($data2, LOCK_EX); fwrite($data2, $data); flock($data2, LOCK_UN); fclose($data2); $today=fopen($file2, "w+"); flock($today, LOCK_EX); fwrite($today, "1"); flock($today, LOCKJJN);. $read2=l;
Fclose(Stoday);
}
Else
{
$today=fopen($file2, "r"); $read2=fread($today. 100); fclose(Stoday); $read2++;
$today=fopen($file2, f, w+"); flock($today, LOCK EX); fwrite($today, $read2); flock($today, LOCK_UN);
Fclose(Stoday);
$ip2=f! le($file4); $ipkolich=count($ip2);
If(in_array($ip."n",$ip2)==false)
{
$ipopen=fopen($file4, "a"); flock($ipopen, LOCK_EX); fwrite($ipopen, $ip."n"); flock($ipopen, LOCK_UN); $ipkolich++;
Fclose(Sipopen);
}
}
Echo "<table border=2 id=lolo4 bordercolor=orange bgcolor=limextr> <td colspan=2 align=center>IlocemaeMocTb</td></tr> <tr><td align=center>Bcero</tdxtd Align=center>CeГOДня</tdx/tr> <tr><td align=center>$read</tdxtd align=ceilter>$read2</tdx/tr>
<tr><td СоЬрап=2>Униклр: $ipkolich</tdx/trx/table>";
?>
Разберем каждую строчку этого кода: $data=date("d.m") - в переменную $data записываем текущую дату и месяц; $ip=$_SERVER["REMOTE_ADDR"] - в переменную $ip записываем ip пользователя, просматривающего данную страницу;
$/ile="chetchik/chetchik".$stranica.".txt" - в переменную $file записываем строку, содержащую путь к текстовому файлу, где, у нас будет записано общее число посещений. Все текстовые файлы, где будут храниться данные счетчика, мы, как я уже отметил, будем помещать в созданную вами папку Chetchik. Сам текстовый файл для хранения данных об общем числе посещений будет называться chetchik$stranica.txt. В переменной Sstranica будет находиться название той страницы, куда будет помещен счетчик. Это делается, чтобы различать данные счетчиков с разных страниц. Например, если web- страница, куда будет помещен счетчик, имеет название index.php, то название текстового файла, где будет фиксироваться общее число посещений данной страницы, будет называться chetchikindex.txt. А для страницы с названием Video.php, текстовый файл будет уже иметь название chetchikvideo.txt. То есть по названию текстовых файлов мы сможем определить, данные с каких страниц там содержатся. Наш счетчик получился универсальным. Достаточно в начале кода каждой страницы, где вы хотите разместить счетчик, указать переменную $stranica, а точнее записать:
Sstranica =substr(basename($_SER VERf'PHP SELF"]), 0, -4);
Здесь элемент глобальной переменной $_SERVER["PHP_SELF"] содержит полный путь на сервере к текущей странице, где размещена данная строчка. Далее при помощи функции basename от полного пути остается только название данной страницы с расширением, например index.php. И, наконец, функция substr удаляет из названия четыре последних символа (точку и расширение php). Все данные функции для работы со строками были рассмотрены выше;
$file2="chetchik/today"Jstranica. ".txt" - аналогично в переменную $flle2 записываем строку, содержащую путь к текстовому файлу, где будут храниться данные о том, сколько было посетителей на сегодняшний день;
$file3 = "chetchik/data".$stranica.".txt" - в переменную $file3 записываем строку, содержащую путь к текстовому файлу, где будет храниться текущий день и месяц. Зачем это надо, я объясню позже;
$file4="chetchik/ip".$stranica. ".txt" - наконец, в переменную Sfile4 записываем строку, содержащую пугь к текстовому файлу, где будут храниться IP-адреса посетителей страницы.
Итак, каждый счетчик на каждой странице будет иметь по 4 текстовых файла с данными. Эти данные будут потом считываться и выводиться в окно браузера.
Далее идет условный оператор if который проверяет условие, записанное в круглых скобках, и если оно истинно, то выполняются команды в фигурных скобках. Функция Jile_exists, которую мы рассматривали выше, проверяет существование файла, который указан в качестве аргумента этой функции. А в качестве аргумента у нас переменная Sfile, куда записан путь к текстовому файлу, где хранится число, сообщающее об общей посещаемости страницы. Получается, что выражение fileexists(Sfile) проверяет, существует ли файл в папке chetchik под названием chetchikSstranica.txt. Первоначально такого файла не сущестзует. Если вашу страницу еще никто не посещал, то счетчик пуст и никаких текстовых файлов с данными о посещениях нет. Перед функцией file_ex!sts($file) стоит оператор «!», который означает отрицание. В итоге получаем следующее условие:
If (!file_exists($file)) - если файла, который указан в переменной Sfile, еще не существует (данную страницу еще никто не посещал), то выполнится последовательность действий между фигурными скобками под номером 1 (от открывающейся сксбки под номером 1 до закрывающейся скобки под номером 1). Скобки я пронумеровал для удобства: 1{
$chetcik=fopen($fi!e, "w+") - мы создаем и открываем при помощи функции Fopen новый пустой фалл, который будет рассполагаться и иметь название, как указано в переменной Sfile. Весь этот процесс создания нового файла с именем, указанным в переменной $file, мы присвоим переменной Schetcik. То есть в переменной Schetcik будет содержаться идентификатор нового созданного нами файла и открытого для записи. Почти во всех функциях для работы с файлами, в качестве аргумента используется именно идентификатор файла, а не название самого файла;
Fwrite($chetcik, "1") - в этот пустой текстовый файл, идентификатор которого содержится в переменной Schetcik, при помощи функции fwrite записывается число 1. Если первый посетитель уже зашел на страницу, то число посещений уже не нулевое и в нашем новом текстовом файле, где указывается общее число посещений, будет записано число 1. Итак, если страница, где расположен счетчик, будет называться index.php и ее посетил первый посетитель, то после выполнения двух предыдущих строчек кода в папке chetchik Будет образован новый текстовый файл под названием chetchikindex.txt. В этот файл будет записано число 1;
Fclose(Schetcik) - закрываем созданный нами файл, точнее, его идентификатор при помощи функции fclose. После этой команды переменная Schetcik будет пуста;
$read=l - вводим переменную $read и присваиваем ей значение 1. При первом посещении значение этой переменной, обозначающее количество посещений, будет выведено в браузер.
Далее аналогично мы создаем и открываем опять при помощи функции Fopen новый пустой файл, который будет располагаться и иметь название, как указано в переменной Sfile2. Весь этот процесс создания нового файла с именем, указанным в переменной $frfe2, мы снова можем присвоить переменной Schetcik. Можно, конечно, выбрать другую переменную, но я не стал этого делать. Одной и той же переменной можно присвоить другое новое значение, при этом старое значение аннулируется. То есть переменная Schetcik будет уже идентификатором для нового созданного нами файла Todayindex.txt, и этот файл будет открыт для записи. В этом файле, как было указано выше, будет содержаться количество посещений текущего дня:
$chetcik=fopen($file2, "w+") - создаем и открываем новый текстовый файл для учета количества посещений текущих суток; Fwrite($chetcik, "I") - записываем в этот файл значение 1; Fclose(Schetcik) - закрываем файл (его идентификатор);
Sread2=l - вводим переменную Sread2 и присваиваем ей значение 1. При первом посещении, значение этой переменной, обозначающее количество посещений за текущие сутки, будет выведено в браузер;
$chetcik=fopen($file3, "w+") - аналогично создаем и открываем новый текстовый файл для учета текущей даты посещения;
Fwrite($chetcik, $data) - записываем в этот файл текущую дату, которая указана в переменной $data
Fclose($chetcik) - закрываем файл (его идентификатор);
$chetcik=fopen($file4, "w+") - аналогично создаем и открываем новый текстовый файл для учета (Р-адресов посетителей;
Fvrite($chetcik, $ip."n") - записываем (используя функцию fwrite) в этот файл IP-адрес первого посетителя, который хранится в переменной $ip. Символ «1/7» обозначает, если вы помните, перевод строки. После выполнения этой команды в созданном нами текстовом файле ipindex.txt (счетчик, по предположению, мы разместили на странице index. php) будет записан IP-адрес первого посетителя и осуществлен перевод строки. Строку мы переводим для того, чтобы следующий IP-адрес следующего посетителя начинался с новой строки. Это необходимо для удобного подсчета общего количества адресов, т. е. оно будет равно числу строк в этом текстовом файле. Это число и будет выводиться в браузер;
Fclose($chetcik) - закрываем файл (его идентификатор);
$ipkolich=l - вводим переменную Sipkolich и присваиваем ей значение 1. При первом посещении, значение этой переменной, обозначающее количество посетителей с различными IP-адресами, будет выведено в браузер; 1} - мы закрыли фигурную скобку.
Итак, весь этот приведенный выше код в фигурных скобках под номером 1 будет выполнен только при первом посещении страницы, т. е. всего один - единственный раз! Больше он выполняться не будет, поскольку при повторном посещении страницы условие в круглых скобках после условного оператора if ({file _exists($f)le)) будет ложным, так как файл, указанный в переменной Sfile, уже будет существовать. Он был создан при первом посещении страницы. А если условие ложно, то будет выполнен только код, который расположен ниже в фигурных скобках под номером 2, после оператора Else (иначе):
Else - если условие ложно и текстовый файл chetchikindex.txt уже существует (посетитель уже не первый), то выполнится код ниже за фигурной скобкой;
2{
$chetcik=fopen($fi!e, "г") - при помощи функции fopen открываем текстовый файл, название которого (точнее, путь к нему) находится в переменной $fde, А именно, если счетчик расположен на странице index.php, chetchik / chetchikindex.txt. Этот файл уже существует, так как был создан программно при первом посещении страницы. Файл открываем только для чтения, поскольку второй аргумент функции fopen имеет значение «г». Переменная Schetcik будет являться идентификатором этого файла;
$read=fread($chetcik, 100) - при помощи функции fread мы считываем данные из открытого выше файла, идентификатор которого Schetcik. Второй аргумент функции указывает количество считываемых байтов. Для считывания одного числа, обозначающего общее число посещений страницы, достаточно и 100 байтов. В нашем случае после первого посещения страницы в этом текстовом файле будет находиться число 1. После выполнения данной команды число это будет считано и присвоено переменной Sread, т. е. $read=l;
Fclose(Schetcik) - закрываем файл;
$read++ - увеличиваем считанное из файла значение на единицу. При посещении второго посетителя $read=2. Теперь это новое значение нужно сохранить;
Schetcik=fopen($fi/e, "w+") - вновь открываем файл chetchik / chetchikindex.txt, Но уже для записи, так как второй аргумент функции fopen имеет значение «w+». При этом старая информация в файле стирается;
Flock($chetcik, LOCK EX) - блокируем файл перед записью. Для чего это нужно, сказано выше, в разд. 4.3;
Fwrite($chetcik, Sread) - с помощью функции fwrite записываем в файл, идентификатор которого Schetcik, значение, находящееся в переменной Sread. Например, при втором посещении страницы в этот файл будет записана цифра 2;
Flock($chet,cik, LOCK UN) - после записи отключаем блокировку файла; Fclose(Schetcik) - закрываем файл, в котором уже будет новое значение.
Итак, при каждом посещении страницы значение переменной Sread будет увеличиваться на 1 и перезаписываться в текстовый файл, указанный в переменной Sfile.
В текстовом файле, указанном в переменной Sfile2 мы, как сказано выше, будем сохранять число посещений за текущие сутки. Это число должно так же увеличиваться на единицу при каждом посещении страницы. Однако при наступлении новых суток когда изменится дата, число при очередном посещении страницы должно снова стать равным 1.
Чтобы контролировать дату посещения, мы и создали текстовый файл, который указан в переменной Sfi/еЗ. Если код этого счетчика будет расположен на странице index.php, то текстовый файл, где записана дата посещения страницы, будет расположен в каталоге chetchik и будет называться datain- dex.txt:
Sdata2=fopen(Sfile3, "г") - открываем текстовый файл с датой; Sread3=fread($data2, 100) - считываем эту дату и записываем ее в переменную Sread3;
Fclose($data2) - закрываем файл с датой.
Далее идет проверка условия. Мы сравниваем дату, которая была записана в текстовом файле dataindex.txt с текущей датой. А текущая дата у нас находится в переменной Sdata. Смысл сравнения понятен. Пока посетители посещают вашу страницу в течение одних суток, дата в текстовом файле и текущая дата совпадают. Как только наступят новые сутки, текущая дата станет другой. Число посещений за сутки снова должно «сброситься». А вместо старой даты в текстовый файл dataindex.txt нужно будет записать новую дату:
If($read3!=$data) - если дата, записанная в файле dataindex.txt, и текущая дата не совпадают (наступили новые сутки), то выполнится блок команд в фигурных скобках под номером 3;
Н
Sdata2=fopen($file3, 'VV') - открываем текстовый файл с датой, стирая содержимое, так как второй аргумент функции fopen у нас «и>+». Прошедшая дата нам уже не нужна. Идентификатором файла будет являться переменная
Sdata2
Flock($data2, LOCK EX) - блокируем этот файл перед записыванием;
Fwrite($data2, Sdata) - записываем в файл новую текущую дату;
Flock($data2, LOCK UN) - разблокируем файл;
Fclose($data2) - закрываем файл с записанной новой датой;
Stoday=fopen($file2, "w-") - открываем текстовый файл, где записано число посещений за текущие сутки, стирая содержимое, ибо число посещений за прошедшие сутки нам уже не нужно;
Flock($today, LOCK EX) - блокируем файл перед записыванием; Fwrite(Stoday, "1") - записываем в файл единицу; Flock($today, LOCK UN) - разблокируем файл;
$read2=l - переменной Sread2 присваиваем значение 1. При первом посещении значение этой переменной, обозначающее количество посещений за текущие сутки, будет выведено в браузер;
Fclose(Stoday) - закрываем файл;
3} - закрываем скобку.
Если условие if($read3!=Sdata) ложно, т. е. дата в текстовом файле Dataindex.txt и текущая дата совпадают, значит, сутки не поменялись. Мы просто увеличим число посещений за текущие сутки на 1:
Else - если текущая дата прежняя, то выполнится блок программ между фигурными скобками под номером 4, а тот блок программ, который был выше (между фигурными скобками под номером 3), будет проигнорирован;
Stoday=fopen($file2, "г") - открываем текстовый файл для чтения, где хранится число посещений страницы за текущие сутки. Путь к этому файлу указан в переменной $file2. В переменной $today будет содержаться идентификатор этого файла;
$read2=fread($today, 100) - считываем содержимое открытого нами файла и записываем его в переменную $read2
Fclose(Stoday) - закрываем файл;
$read2++ - увеличиваем переменную $read2 на единицу;
$today=fopen($file2, "w+") - снова открываем текстовый файл, где хранится число посещений страницы за текущие сутки, но уже для записи. При этом старая информация в файле уничтожается;
Flock($today, LOCK EX) - блокируем файл перед записью;
Fwrite($today, $read2) - записываем в фарш уже новое число, которое у нас
В переменной $read2;
Flock($today, LOCK UN) - разблокируем файл;
Fclose(Stoday) - закрываем файл;
4} - закрываем скобкой блок программ.
Теперь займемся текстовым файлом, где у нас хранятся IP-адреса. Путь к этому файлу указан в переменной $fde4. Если страница, где будет расположен этот код, называется index.php, то сам текстовый файл будет называться Ipindex.txt. Каждый IP-адрес будет располагаться на новой строке, т. е. после записи очередного адреса должен следовать символ перевода строки «п»:
$ip2=file($file4) - при помощи функции fde превращаем содержимое файла Ipindex.txt в массив строк. Каждый элемент массива является строкой, а каждая строка содержит какой-нибудь один IP-адрес. Массив записываем в переменную $ip2
$ipkolich=count($ip2) - функция count определяет число элементов в массиве $ip2. В нашем случае это будет число строк в файле, т. е. число IP-адресов. Именно это число, которое сохраним в переменной Sipkolich, мы выведем потом в окно браузера.
Посетитель с одного IP-адреса может посетить вашу страницу неоднократно. Нам нужно сделать так, чтобы IP-адрес записывался в текстовый файл только при первом посещении определенного посетителя. При дальнейшем посещении страницы данным посетителем его IP-адрес записываться не должен, так как он у нас уже есть. Таким образом, в окно браузера будет выведено число уникальных, неповторяющихся посетителей вашей web- страницы. Если конкретный посетитель попал на вашу страницу впервые, то его адреса не будет в текстовом файле ipindex.txt и его надо записать:
If(in_array($ip."n",$ip2)==false) - здесь проверяется условие. Функция In_array осуществляет поиск элемента (первый аргумент функции) в массиве $ip2 (второй аргумент функции). Первый аргумент функции inarray у нас $ip."n". В переменной $ip содержится элемент суперглобального массива S SERVER (см. начало кода), определяющий IP-адрес посетителя страницы. Далее при помощи символа конкатенации (точки) ставим символ перевода строки «п». Таким образом, функция in_arrav будет искать в массиве строк файла ipindex.txt строку с записью IP-адреса посетителя и перевода строки. Если данный IP-адрес будет найден, то функция возвратит True, в противном случае возвратит False. В общем, данное условие звучит так: если данного IP-адреса нет в массиве строк $ip2 (функция n_array возвращает False), то выполнится блок команд в фигурных скобках под номером 5;
$ipopen=fbpen($file4, "а") - открываем текстовый файл с IP-адресами для записи, причем содержимое его не стираем, а будем записывать данные после последнего символа (вторым аргументом функции fopen является «а»), А последним символом у нас является символ перевода строки после прошлой записи, когда страницу посетил первый посетитель. Короче, запись нового IP-адреса начнется с новой строки;
Flock($ipopen, LOCK EX) - блокируем текстовый файл перед записью;
Jwrite($ipopen, $ip."n") - записываем в этот файл очередной IP-адрес и снова ставим курсор на новую строку, используя символ «п»; Flock($ipopen, LOCK UN) - разблокируем файл;
$ipkolich+ + - увеличиваем число ip посетителей на единицу. Поскольку в текстовый файл ipindex.txt мы записали новую строку, то число элементов в массиве строк увеличится на единицу;
Fclose(Sipopen) - закрываем файл;
5} - закрываем фигурную скобку. Весь этот блок команд, приведенный выше между фигурными скобками под номером 5, будет выполняться тогда и только тогда, когда на страницу зашел новый посетитель, ранее не посещавший вашу страницу. Если же посетитель заходит не впервые (условие If(in_array($ip."n",$ip2)==false) ложно), весь этот блок команд будет проигнорирован;
2} - наконец, закрываем большой блок команд в фигурных скобках под номером 2 (он начинался после оператора else) нашего первого условия If(!file_exists($file)), которое проверяло, посещал ли вообще кто-нибудь вашу страницу.
Код счетчика практически написан и разобран. Осталось теперь вывести данные о посещении страницы в окно браузера. Создадим маленькую табличку при помощи HTML-тега <table>. Толщину линий таблицы сделаем в 2рх (Border=2), цвет линий bordercolor установим равным orange, цвет фона bgcolor установим равным lime. Вообще, как создается таблица, описано выше в гл. 3. Вывод таблицы в браузер осуществляется при помощи известного вам оператора echo. Вся таблица от тега <table> до тега </table> обязательно заключается в кавычки, ибо любые HTML-теги со всем их содержимым в PHP-коде перед оператором echo должны быть в кавычках:
Echo "<table border=2 bordercolor=orange bgcolor=lime> <tr> - тег <tr> создает первую верхнюю строчку таблицы. Это будет шапка нашей таблицы со словом «Посещаемость»;
<Td Colspan=2 Align=Center>NoceuAeMocmb</Td></Tr> - эта верхняя строка будет занимать сразу 2 столбца (2 ячейки), так как в теге, создающей ячейку в строке <Td>, мы указали Colspan=2. Текст в ячейке устанавливаем по центру, так как есть параметр Align=Center. Далее закрываем ячейку и строку при помощи операторов </Td> и </Tr>;
<tr><td align=center>Bcep.o</td><td align=center>Сегодня</td></tr> - вторая строка состоит из двух ячеек, со словами «Всего» и «Сегодня»;
<tr><td align=center>$read</td><td align=center>$read2</td> </tr> - третья строка тоже состоит из двух ячеек. В первую ячейку под ячейкой со словом «Всего» записываем переменную $read. В ней, если вы внимательно разобрались с кодом, находится общее число посещений страницы. Во вторую ячейку под ячейкой со словом «Сегодня» записываем переменную $read2. В этой переменной находится число посещений страницы за текущие сутки;
<tr><td colspan=2>YHUK.ip: $ipkolich</td></tr></table>" - ну и, наконец, последняя строка, как и первая, состоит из одной большой двойной ячейки, в которой после слов «Униклр» записывается переменная Sipkolich, где хранится число уникальных посетителей, т. е. посетителей с разными IP-адресами.
Вот и все! Я старался как можно понятнее «разжевать» вам каждую строчку кода. Если не совсем поняли, прочтите главу «Основы РНР5» и разбор этого кода еще раз. Код счетчика затрагивает такие важные темы в php, как работа со строками, создание и открытие файла, чтение из файла и запись в файл. Знание и понимание этих тем - очень важно для изучения языка php. Вы не сможете создать ни одной путной программы для своего сайта, не разобравшись в коде и принципе работы счетчика. Поэтому разберитесь с этим внимательно. Код набирайте сами. Постарайтесь набирать его как можно реже, смотря в книгу на листинг этого кода. Постарайтесь понять смысл каждой строчки кода. Только так можно научиться.
Итак, скрипт счетчика готов. Вставим его в нашу главную страницу Index.php при помощи оператора include. Запишите между тегами <?php и?> следующую строку: Include "chetchik.php";
В файле chetchik.php находится, как вы помните, код нашего счетчика (листинг 4.6), который мы подробно разобрали. После выполнения этой команды код счетчика вставится в нашу страницу index.php. Но это еще не все. Нам нужно указать в коде страницы index.php переменную Sstranica. Перед тем как вставить счетчик (до команды include !), определим переменную Sstranica:
$stranica=substr(basename($_SERVER["PHP_SELF"]), 0, -4);
Эту строчку мы уже разбирали выше. Здесь указывается элемент суперглобального массива SSERVERf'PHPSELF"], где хранится путь к текущей странице. На странице index.php элемент SSERVERf'PHPSELF"] у меня, например, будет иметь такое значение: «/MyBook/index.php», так как все РНР - файлы для данной книги я сохраняю в папке МуВоок, которая, в свою очередь, находится в рабочей папке сервера htdocs. Функция basename урезает путь к файлу и оставляет только его название с расширением, т. е. у нас останется index.php. Далее функция substr урезает из названия четыре последних символа, оставляя только index. В итоге переменной Sstranica будет присвоена строка «Index». Теперь переменная Sstranica у нас определена и ее можно использовать в коде счетчика.
Итак, вернемся к листингу 3.6, где находится программный код страницы index. php. Внизу, после строчки </tr></table>, вставьте следующие строки: < ?php
$stranwa=substr(basename($SERVER["PHP_SELF"]), 0, -4);
Include "chetchik. php ";
?>
Мы создали универсальный счетчик. Достаточно на каждую страницу вашего сайта вставить приведенные выше две строчки, чтобы на всех страницах было изображение таблички с данными о посещении конкретной страницы сайта. В созданной вами папке chetchik будут храниться текстовые файлы с данными счетчиков для всех страниц. Для каждой страницы в папке chetchik будут созданы 4 текстовых файла, с которых и будут считываться эти данные для счетчика.
Запустите браузер. Внизу слева на странице вы увидите маленькую табличку с данными о посещении. При первом запуске данные в таблице будут такими, как на рис. 4.1.
Зайдите в папку chetchik. Вы увидите там 4 текстовых файла, которые программа создала сама (рис. 4.2).
В файле chetchikindex записано общее число посещений страницы Index.php. В файле todayindex - число посещений за текущие сутки. В файле Ipindex будут хранится IP-адреса. Откройте этот файл. Там вы можете увидеть пока единственный IP-адрес, после которого стоит маленький прямоугольник. Это указывает на перевод строки. И, наконец, в файле dataindex вы увидите текущее число и месяц.
Chetchikindex Текстовый документ 1 КБ |
Dataindex Текстовый документ 1 КБ |
Ipindex ] Текстовый документ! il КБ ] |
Todayindex Текстовый документ 1 КБ |
Рис. 4.2
Запустите заново файл index.php в браузере или нажмите на панели инструментов значок «обновить». Вы увидите, что общее число посещений и число посещений за сегодняшний день увеличилось на единицу. Число уникальных ip осталось без изменения, и это понятно. Вы пока единственный уникальный посетитель своей странички. Нажмите значск обновления страницы еще несколько раз. При каждом обновлении числа под словами «Всего» И «Сегодня» будут увеличиваться на единицу.
Теперь измените дату на своем компьютере. Поставьте, например, завтрашнее число. Убедитесь потом, что дата на вашем компьютере действительно поменялась. Опять обновите страницу. Вы увидите, что общее число посещений продолжит увеличиваться, а число посещений за текущие сутки опять сбросится до единицы. Все, не забудьте снова установить у себя сегодняшнее число.
Второй вариант кода
Первый вариант кода не очень рационален, и я привел его для того, чтобы вы могли лучше понять, как создавать текстовые файлы, считывать из них данные и выводить эти данные в браузер. Наш счетчик использовал 4 тексто
вых файла. Напрашивается вопрос, а нельзя ли все данные для счетчика поместить в два текстовых файла? Не только можно, но и нужно. Программный код при этом сократится, так как нам придется открывать и закрывать всего два файла вместо четырех. В одном текстовом файле у нас будет массив строк, состоящий из трех элементов: общее число посетителей, текущая дата, число посетителей за текущие сутки. Другой файл будет содержать массив строк, состоящий из IP-адресов посетителей. В листинге 4.7 приведен код второго варианта счетчика. Постарайтесь разобраться в этом коде самостоятельно. Если что-то непонятно, после листинга я вкратце разобрал некоторые строчки кода. В PHP-редакторе создайте новый файл, где будет располагаться второй вариант кода и сохраните его в рабочей папке hdocs под названием Chetchik2.php.
Листинг 4.7 (файл chetchik2.php) <?php
$data=date("d. m"); $ip=$_SERVER["REMOTE_ADDR"l; $filel="chetchik/ip'$stranica. M.txt"; $file2="chetchik/countM.$stranica.".txt";
If (!file_exists($file2))
{
$vsego=l;
$segodna=l;
$ipkolich=l;
$count=$vsego."n".$data."n".$segodna;
$chetcik=fopen($file2, "w+");
Fwrite($chetcik, $count);
FcIose(Schetcik);
$ip2=fopen($filel, "w+M);
Fwrite($ip2, $ip."nM);
Fclose($ip2);
}
Else
{
$file=file($file2);
Foreach($fiIe as Sstroka)
{
$massive[J=$stroka;
}
$vsego=(int)$massive|0|; $data2=(float)$massive[ 11; $segodna=(int)$massive[2]; $vsego++;
If($data2!=$data)
{
$segodna=l; }
Else {
$segodna++;
}
$count2=$vsego."nM.$data."n".$segodna; $chetcik=fopen($fiIe2, "w+"); flock($chetcik, LOCK_EX); fwrite($chetcik, $count2); flock($chetcik, LOCK_UN); fclose(Schetcik); $ip2=file($filel); $ipkolich=count($ip2);
If(in_array($ip. Mnf,,$ip2)==false)
{
$ipopen=fopen($filel, "a"); flock($ipopen, LOCK_EX); fwrite($ipopen, $ip."n"); flock($ipopen, LOCK_UN); $ipkolich++;
Fclose(Sipopen);
}
} -
Echo "<table border=2 bordercolor=orange bgcolor=lime><tr> <td colspan=2 align=center>riocemaeiviocTb</td></tr> <tr><td a! ign=center>Bcero</td><td align=center>CeroflHfl</td></tr> <tr><td align=center>$vsego</td><td align=center>$segodna</td></tr>
<tr><td colspan=2>YHMK. ip: $ipkolich</td></tr></table>";
?>
Многое из этого кода вам должно быть понятно, поэтому больших комментариев ко многим строкам делать не буду: < ?php
Sdata=date ("d. m ");
$ip=$_SER VERf'REMO ТЕ A DDR "];
Sfilel = "chetchik/ip".Sstranica. ".txt" - в переменной Sfilel будет находиться путь к текстовому файлу, в который записываются IP-адреса;
Sfile2="chetchik/count". Sstranica.". txt" - в переменной Sfile2 будет находиться путь к текстовому файлу, в который запишется общее число посетителей, текущая дата, число посетителей за текущие сутки;
If (!file_exists($file2)) - если текстовых файлов (хотя бы одного из них) еще не существует, т. е. ваша страница посещается впервые, то создаем их в блоке команд между фигурными скобками под номером 1;
И
Svsego=l - создаем переменную Svsego, где будет храниться общее число посетителей, и присваиваем ей начальное значение единица;
Ssegodna^l - создаем переменную Ssegodna, где будет храниться число посетителей за текущие сутки, и присваиваем ей начальное значение единица;
Sipkolich=l - создаем переменную Sipkolich, где будет храниться число уникальных IP-адресов, и присваиваем ей начальное значение единица;
Scount=Svsego. "п".Sdata. "п".Ssegodna - переменные Svsego,Sdata И Ssegodna Записываем в одну общую переменную Scount, разделяя их символом перевода строки;
Schetcik=fopen($file2, "w+") - создаем и открываем новый текстовый файл для хранения данных;
Fwrite(Schetcik, Scount) - записываем туда значение переменной Scount, которая содержит 3 строки данных - число посещений, общее и за текущие сутки, и текущую дату в средней строке; Jclose (Schetcik);
$ip2=fopen($filel, "w+") - создаем текстовый файл для хранения адресов;
Fwrite(Sip2, Sip. "п") - записываем туда IP-адрес первого посетителя и переводим строку; Fclose(Sip2);
U
Else - если визит на страницу не первый и текстовые файлы уже существуют, то выполняется другой блок команд ниже, между фигурными скобками под номером 2; 2{
$file=file($file2) - превращаем данные в текстовом файле в массив строк;
Foreach(Sfile as Sstroka) - функция fbreach пробегает массив строк Sfile, присваивая значение элемента этого массива (содержимое строки) переменной Sstroka. Сначала переменной Sstroka присваивается содержимое первой строки (у нас это общее число посещений), далее выполняются команды ниже в фигурных скобках (у нас там всего одна команда). Потом переменная Sstroka опустошается и ей уже присваивается содержимое второй строки (там у нас текущая дата), далее опять выполняется команда за фигурными скобками. Весь цикл будет выполняться между фигурными скобками под номером 3 столько раз, сколько всего элементов в массиве. В нашем случае 3 раза;
3{
Smassivef]=Sstroka - при каждом выполнении этого цикла, мы будем сохранять содержимое переменной Sstroka в массив, который назовем Smassive. Это нужно делать, так как переменная Sstroka обновляется при каждом цикле, и ее старое значение затирается. В нулевом элементе массива Smassive[0] Сохранится содержимое первой строки. В первом элементе massivefl] сохранится содержимое второй строки и т. д.;
3}
Svsego=(int)Smassive[0] - переменной Svsego присваивается нулевой элемент массива Smassive, т. е. общее число посещений. Это целое число, поэтому перед этим элементом массива ставим оператор int. Это нужно, чтобы программа «понимала» какой тип данных хранится в данном элементе массива;
Sdata2=(float)Smassive[l] - переменной Sdata2 присваивается первый элемент массива (там у нас текущая дата), т. е. текущее число и месяц, разделенные точкой. Все это можно представить как десятичное число, поэтому перед этим элементом массива ставим оператор float
Ssegodna=(int)Smassive[2] - ну и, аналогично, присваиваем переменной Sse- godna второй элемент массива, т. е. число посетителей за текущие сутки. Это тоже целое число;
Svsego++ - увеличиваем переменную Svsego на единицу; If($data2!-$data) - если наступили другие сутки:
$segodna=l - сбрасываем значение переменной Ssegodna до единицы;
4}
Else
Ssegodna++ - в противном случае, если дата еще не изменилась, просто увеличиваем эту переменную на единицу;
V $count2=$vsego."n".$data."n".$segodna - переменные $vsego,$data И $se- godna записываем в одь. у общую переменную $count2, разделяя их символом перевода строки;
$chetcik=fopen($fiIe2, "w+") - открываем файл для записи новых данных, удалив старые; Flock($chetcik, LOCKEX);
Fwrite($chetcik, $count2) - записываем в этот файл переменную $count2
Flock($chetcik, LOCKJJN);
Fclose(Schetcik);
$ip2=file($filel) - данные текстового файла, где хранятся IP-адреса превращаем в массив строк $ip2
$ipkolich=coimt($ip2) - в переменную Sipkolich сохраняем число элементов массива (число строк или число IP-адресов);
If(in_array($ip."n",$ip2)==false) - если в текстовом файле (или в массиве строк) такого IP-адреса еще нет, т. е. элемент массива, содержащий данный IP-адрес, не найден, то выполнится блок команд ниже в фигурных скобках под номером 6.
Далее все аналогично, как и в первом варианте кода, разве только название переменных, содержащих данные, имеют другие названия. Б{
$ipopen=fopen($file], "с"); flock($ipopen, LOCK EX); firite($ipopen, $ip."n"); flock($ipopen, LOCKJJN); Sipkolich++; fclose($ipopen); б/ 2}
Echo "<tahle border=2 bordercolor=orange bgcolor=lime><tr>
<td colspan=2 align=cer;ter>noceu(aeMocmb</td></tr>
<tr>< td a I ign=center> Всего </td> < td align=center> Сегодня </td> </tr>
<tr><td a I ign=cer;ter> $ ;sego </td> <td align=center>$segodna</td></tr>
<tr><td colspan=2> Униклр; $ipkolich</td></tr></table> ";
?>
В теге таблицы <table> вместо параметра цвета фона таблицы bgcolor Можно задать фоновый рисунок при помощи параметра background, например, можно записать background=pic 1 .gif. Фоновым рисунком для нашей таблички с данными о посещении будет в этом случае рисунок picl.gif. Естественно, этот рисунок должен находиться в нашей рабочей папке сервера Htdocs. Если же рисунок у вас будет храниться в отдельной папке, например Risunki (которая, в свою очередь, должна находиться в папке htdocs), то в параметре background нужно указать путь к данному графическому файлу: Background^risunki/picl .gif. Цвет текста в таблице можно задать при помощи листа стилей. Естественно, на странице, куда вы поставите счетчик при помощи команды include, должен быть указан файл стилей. На нашей главной странице index.php в начале кода лист стилей указан:
<link type="text/css" rel="stylesheet" href="stil. css"> - См. Листинг 3.4.
Лист стилей у нас в текстовом файле stil.css, который мы создали ранее (см. гл 3, п. 3.3). Откройте этот файл и вставьте в него новую строчку:
#lolo{font-size: 12pt; color :red; font-family:Comic Sans MS}. Здесь создается идентификатор lolo (можете назвать любыми латинскими буквами), в котором задается размер шрифта {font-size), цвет текста (color), название шрифта (font-family). Можете установить эти параметры по своему усмотрению. Сохраните и закройте файл stil.css. Теперь в коде счетчика, в теге <table> допишите id=lolo, т. е. получится строчка: <table border=2 bordercolor=orange bgcolor=lime id=lolo>
Запустите файл index.php в браузере РНР-редакгора. Вы увидите, что шрифт и цвет текста в таблице счетчика изменился.