ФАЙЛ NIZ.PHP

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

<?php

Файлы со значениями среднего балла и количества оценок будут храниться в папке с именем cnt. Запишем для удобства ее имя в пере­менную:

$dirct="cnt";

А сами эти файлы будут иметь имена, составляемые на основе име­ни файла со статьей. Сначала "вытащим" это имя из полного имени файла (пояснения к используемым функциям смотрите в предыдущей главе):

$nom=substr(basename($PHP_SELF),   0,   -4) ;

...а сами файлы назовем на основе этого имени, получив имя файла с количеством оценок прибавлением к нему окончания "kol", а имя файла со средним баллом - окончания "est" (рис.10.1):

$kolvooc='I$riomn . "kol" ; $ocenka-"$nom"."est";

4Sft F:\Www\exper

Теперь выведем сведения об уже выставленных оценках.

echo   ("Оценок этой статье -  ");

Если файл со сведениями о количестве оценок существует (он соз­дается при первом оценивании)...

if  (file_exists{"$dirct/$kolvooc")==True) {

...то вставим его значение в документ, include  ("$dirct/$kolvooc");

Если же такового файла нет, т. е. документ ни разу не оценивался... }

else

{

...выведем значение "О".

echo ("О");

}

Если файл со средним баллом существует...

if  (file_exists("$dirct/$ocenka")==True)

{

...то надо вывести его значение.

echo  (". Средний балл - ");

Но просто включить содержимое файла на страницу нельзя - сред­ний балл может быть и длинной десятичной дробью. Поэтому откроем файл для чтения командой f open (подробнее об этой команде смот­рите в предыдущей главе)...

$hdl = fopen("$dirct/$ocenka", "r+");

...и считаем в переменную Ssred все содержимое этого файла.

$sred = fread($hdl,  filesize("$dirct/$ocenka"));

Примечание:

Функция fread (дескриптор файла, длина считываемо­го фрагмента) считывает из открытого файла, для которого по­лучен указанный в ее первом параметре дескриптор, столько байт, сколько указано в ее втором параметре (чтение начинается с место­нахождения так называемого указателя файла - отметки, показы­вающей текущее место работы с файлом; указатель двигается при чтении или записи в файл, а также при использовании команды

fseek).

Функция filesize (полный путь к файлу) возвращает размер указанного в ее параметре фата в байтах.

Файл можно закрыть...

fclose{$hdl) ;

...а переменную Ssred - округлить до десятых

$sred=round  <$sred,   1) ;

Примечание:

Функция round (число, количество разрядов) округляет дробное число в ее первом параметре до количества разрядов, указан­ного в ее втором параметре. Скажем, round (число, 1) округ­лит число до десятых, round  (число, 2)   - до сотых и т. д.

В РНР до четвертой версии функция round могла округлять числа только до целых, поэтому в том случае, если вы располагаете только такой версией РНР, то команда округления до десятых должна выгля­деть как

$sred=(round  ($sred*10))/10;

...и вывести на страницу, echo  ("$sred.");

}

Имя cookie, в котором будет находиться информация о том, голо­совал ли посетитель за данную статью или нет, тоже будет образовы­ваться из имени файла статьи. Запишем это имя в переменную Shaveestim...

$haveestim=$nom."haveest";

...и проверим, определена ли переменная с таким именем - т. е. уста­новлен ли одноименный cookie или нет (рис. 10.2). Можно было бы также проверять, какое значение имеет данная переменная, но для на­шего сценария это неважно - если переменная установлена и cookie определен, то посетитель уже голосовал за данную статью: ведь cookie с данным именем устанавливается ему в этом и только в этом случае.

if   ($$haveestim=="")

Обратите внимание на имя проверяемой переменной - это имя само является значением переменной Shaveestim (подобную конструкцию допускают правила РНР, подробнее смотрите в гл. 3).

Поскольку   значения   cookies доступны $HTTP_COOKIE_VARS[], то проверить наличие основе анализа значений этого массива:

и через массив cookie можно и на

if   <$HTTP_COOKIE_VARS[$haveestim]=="")

или в РНР версии 4.1 и выше

if  ($_COOKIE[$haveestim]=="")

если в файле php.ini установлен в on па-

cookie

Комментарий:

Помните, что доступность данных cookie зависит от настроек в файле php.ini (рис. 10.3) -

раметр register_globals, то содержимое cookie доступно в сценарии в переменной с тем же именем, что и cookie, а если ephp.ini установлен в on параметр track vars, то содержимое cookie доступно в сценарии в одноименном с этим cookie элементе массива $HTTP_COOKlE_VARS[J (с РНР 4.1-и $_СООК1Е[]).

Использовать массивы $HTTP_COOKIEJVARS[] и $_СООК1Е[] лучше с точки зрения безопасности. Если в сценарии используются одноименные cookie переменные, а не элементы этих массивов, то в том случае, если cookie не установлен, злоумышленник все равно

может передать сценарию значение такой переменной, попросту ука­зав его в адресной строке браузера. В указанные же массивы попадают исключительно полученные с cookie данные. Однако в рассматривае­мом в данной главе сценарии это несущественно.

; Data Handling ; variables order

 

lobals

 

*agic_quotes~sybase

"EGPCS" ; This directive describes the order in which PHP registers

; GET, POST. Cookie, Environment and Built­; C, £ & 5 respectively , often referred to ; Registration is done fron left to right, ; older values.

On ] ; Whether or not to register the EGPCS variables as global

; variables.   Von *ay want to torn this off ; to clutter your scripts' global scope wit j ; nost sense when coupled with track_uars -jj ; access all of the GPC variables through t ; variables.

On ; This directive tells PHP whether to declare the argvfiargc

; variables (that would contain the GET inf ; don't use these variables„ you should tor -\ : increased performance ; enable the $KTTP * UARS[] arrays, where * is one ; ENU, POST,"GET. COOKIE or SERUER.

GPC"    ; This directive is deprecated.   Use variables order instea

Off Off Off

; nagic quotes for inconing GET/POST/Cookie data ; nagic quotes for runtlne-generated data, e.g. data fron S ; Use Sybase-style nagic quotes (escape ' with " instead o

Если cookie не установлен - т. е. посетитель ранее не голосовал за данную статью...

{

то выведем ему форму для голосования.

?>

<form method="postn actiorr="otziv.php">

Передадим в скрытом поле формы имя файла со статьей без расши­рения - для определения на основе него сценарием-обработчиком имен файлов со сведениями о количестве оценок и среднем балле, а также полное имя, вместе с путем, файла со статьей - для вывода ссылки "Назад" на странице со сценарием-обработчиком. В принципе можно было бы передавать через форму только полное имя файла со статьей, а "чистое" имя файла статьи определять в сценарии-обработчике точно так же, как и в сценарии из niz.php - на основе функции basename, но для сокращения длины кода в обработчике вос­пользуемся передачей его через форму.

<input name="nom"  type="hidden" value="<?php echo $nom; ?>">

<input type=hidden name=nazad value=<?php echo

($PHP SELF) ; ?»

Выведем форму ввода оценки:

Поставьте оценку статье:

<SELECT NAME=ocen>

<OPTION VALUE=5>5 (Отлично)

<OPTION VALUE=4>4 (Хорошо)

<OPTION VALUE-3>3 (Удовлетворительно)

<OPTION VALUE=2>2 (Плохо)

<OPTION VALUE=1>1   (Очень плохо)

</SELECT>

В результате в сценарий-обработчик будет передана переменная $осеп (и одноименные элементы массивов $HTTP_POST_VARS, $_POST при соответствующих версиях РНР и настройках в php.ini) со значением, равным параметру value выбранного пользователем пункта выпадающего списка.

Выведем кнопку отправки формы (рис. 10.4).

 

http://eKper/5tatt.php - Microsoft Interne*

<input name=11 submit" type="submit" value="Послать оценку"></form>

< ?php

А если посетитель уже голосовал за данную статью - т. е. cookie с соответствующим именем у него установлен...

}

 

{

то сообщим ему об этом (рис. 10.5). echo  ("Вы уже голосовали за эту статью!");

}

'3http://exper/stall.php Microsoft Internet Explorer

Вот и все.