| ФАЙЛ NIZ.PHP
Код этого файла выводит информацию об уже выставленных оценках - их количество и средний балл, а также в том случае, если посетитель еще не выставлял свою оценку - форму для ее ввода.
<?php
Файлы со значениями среднего балла и количества оценок будут храниться в папке с именем cnt. Запишем для удобства ее имя в переменную:
$dirct="cnt";
А сами эти файлы будут иметь имена, составляемые на основе имени файла со статьей. Сначала "вытащим" это имя из полного имени файла (пояснения к используемым функциям смотрите в предыдущей главе):
$nom=substr(basename($PHP_SELF), 0, -4);
...а сами файлы назовем на основе этого имени, получив имя файла с количеством оценок прибавлением к нему окончания "kol", а имя файла со средним баллом - окончания "est" (рис. 10.1):
$kolvooc="$nom"."kol"; $ocenka="$nom"."est";

Рис. 10.1. Файлы системы оценивания.
Слева - статьи, файлы со сценариями и папка с файлами оценок, справа -содержимое этой папки
Теперь выведем сведения об уже выставленных оценках.
echo ("Оценок этой статье - ");
Если файл со сведениями о количестве оценок существует (он создается при первом оценивании)...
if (file_exists("$dirct/$kolvooc")==True)
{
...то вставим его значение в документ.
include ("$dirct/$kolvooc");
Если же такового файла нет, т. е. документ ни разу не оценивался...
}
else
{
...выведем значение "0".
echo ( " 0 " ) ;
}
Если файл со средним баллом существует...
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);
...а переменную $sred - округлить до десятых
$sred=round ($sred, 1);
Примечание:
Функция round (число, количество разрядов) округляет дробное число в ее первом параметре до количества разрядов, указанного в ее втором параметре. Скажем, round (число, 1) округлит число до десятых, round (число, 2) - до сотых и т. д.
В РНР до четвертой версии функция round могла округлять числа только до целых, поэтому в том случае, если вы располагаете только такой версией РНР, то команда округления до десятых должна выглядеть как
$sred=(round ($sred*10))/10; ...и вывести на страницу.
echo ("$sred.");
}
Имя cookie, в котором будет находиться информация о том, голосовал ли посетитель за данную статью или нет, тоже будет образовываться из имени файла статьи. Запишем это имя в переменную $haveestim...
$haveestim=$nom."haveest";
...и проверим, определена ли переменная с таким именем - т. е. установлен ли одноименный cookie или нет (рис. 10.2). Можно было бы также проверять, какое значение имеет данная переменная, но для нашего сценария это неважно - если переменная установлена и cookie определен, то посетитель уже голосовал за данную статью: ведь cookie с данным именем устанавливается ему в этом и только в этом случае.
if ($$haveestim=="")
Обратите внимание на имя проверяемой переменной - это имя само является значением переменной Shaveestim (подобную конструкцию допускают правила РНР, подробнее смотрите в гл. 3).
Рис. 10.2. Содержимое cookie - пометки о состоявшемся голосовании
Поскольку значения cookies доступны и через массив $HTTP_COOKIE_VARS[], то проверить наличие cookie можно и на основе анализа значений этого массива:
if ($HTTP_COOKIE_VARS[$haveestim]=="")
или в РНР версии 4.1 и выше
if ($_COOKIE[$haveestim]==" ") Комментарий:
Помните, что доступность данных cookie зависит от настроек в файле php.ini (рис.10.3) - если в файле php.ini установлен в on параметр register_globals, то содержимое cookie доступно в сценарии в переменной с тем же именем, что и cookie, а если ephp.ini установлен в on параметр trackjvars, то содержимое cookie доступно в сценарии в одноименном с этим cookie элементе массива SHTTPCOOKIEVARSfJ (с РНР 4.1 -и $_СООК1Е[]).
Использовать массивы $HTTP_COOKIE_VARS[] и $_СООК1Е[] лучше с точки зрения безопасности. Если в сценарии используются одноименные cookie переменные, а не элементы этих массивов, то в том случае, если cookie не установлен, злоумышленник все равно может передать сценарию значение такой переменной, попросту указав его в адресной строке браузера. В указанные же массивы попадают исключительно полученные с cookie данные. Однако в рассматриваемом в данной главе сценарии это несущественно. 118

Рис. 10.3. Файл php.ini. Вышеупомянутые настройки
Если cookie не установлен - т. е. посетитель ранее не голосовал за данную статью...
{
то выведем ему форму для голосования
. ?>
<form method="post" action="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 (Отлично)
«DPTION VALUE=4>4 (Хорошо)
<OPTION VALUE=3>3 (Удовлетворительно)
<OPTION VALUE=2>2 (Плохо)
<OPTION VALOE=1>1 (Очень плохо)
</SELECT>
В результате в сценарий-обработчик будет передана переменная Socen (и одноименные элементы массивов $HTTP_POST_VARS, $_POST при соответствующих версиях РНР и настройках в php.ini) со значением, равным параметру value выбранного пользователем пункта выпадающего списка.
Выведем кнопку отправки формы (рис. 10.4).
Рис. 10.4. Система оценивания в действии...
<input name="submit" type="submit" value="Послать оценку"></form>
<?php
А если посетитель уже голосовал за данную статью - т. е. cookie с соответствующим именем у него установлен...
}
else {
...то сообщим ему об этом (рис. 10.5).
echo ("Вы уже голосовали за эту статью!"); 
Рис. 10.5. ...но голосование уже состоялось
Вот и все.
|