Ваш первый Сайт С использованием РНР-скриптов

СЧЕТЧИК ПОСЕТИТЕЛЕЙ САЙТА

Итак, приступим, наконец, к практическому использованию языка РНР для создания сценариев. Создадим счетчик посещений для страниц нашего сайта, который будет выводить в браузер общее число посещений какой-либо страницы сайта, число посещений за текущие сутки и число посетителей с разными 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. Можно, конечно, выбрать другую переменную, но я не стал этого делать. Одной и той же переменной можно присвоить другое новое значение, при этом старое значение аннулируется. То есть переменная Schet­cik будет уже идентификатором для нового созданного нами файла 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), будет проигнорирован;

4{

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) - если наступили другие сутки:

4{

$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 в браузере РНР-редакгора. Вы увидите, что шрифт и цвет текста в таблице счетчика изменился.

Ваш первый Сайт С использованием РНР-скриптов

Создание сайта

Итак, при помощи данной книги вы создали сайт. Конечно, сайт в таком виде не очень привлекателен, так как он создавался исключительно для при­мера. Но используя полученные знания в этой книге, …

ИСПОЛЬЗОВАНИЕ СЕРВИСА ROBOXCHANGE ДЛЯ ОПЛАТЫ

Если у вас нет никакой возможности получить персональный аттестат, или просто лень это делать, то для оплаты товаров со своего сайта вы можете воспользоваться сервисом Roboxchange. Этот сервис дает возможность …

ИСПОЛЬЗОВАНИЕ СЕРВИСА WEB MERCHANT INTERFACE ДЛЯ ОПЛАТЫ

Сервис Web Merchant Interface позволяет получать денежные средства на свои электронные кошельки от клиентов при оплате ими электронных товаров на вашем сайте. Электронные кошельки WebMoney и Yandex мы с вами …

Как с нами связаться:

Украина:
г.Александрия
тел./факс +38 05235  77193 Бухгалтерия

+38 050 457 13 30 — Рашид - продажи новинок
e-mail: msd@msd.com.ua
Схема проезда к производственному офису:
Схема проезда к МСД

Партнеры МСД

Контакты для заказов оборудования:

Внимание! На этом сайте большинство материалов - техническая литература в помощь предпринимателю. Так же большинство производственного оборудования сегодня не актуально. Уточнить можно по почте: Эл. почта: msd@msd.com.ua

+38 050 512 1194 Александр
- телефон для консультаций и заказов спец.оборудования, дробилок, уловителей, дражираторов, гереторных насосов и инженерных решений.