ФАЙЛ (угау.рнр)

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

<?php

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

$namecook=$nom."haveest";

...и весь дальнейший код выполним только втом случае, если такого cookie установлено не было.

if  ($$namecook=="") Примечание:

Вместо этой строки можно использовать строку

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

или в РНР версии 4.1 и выше - строку if ($_COOKIE[$haveestim]=="")

как уже указывалось выше.

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

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

Итак, если посетитель еще не голосовал за данную статью... {

...установим cookie, говорящий, что такое голосование наконец совер­шилось. Время жизни cookie установим в месяц - пожалуй, хватит. (Пояснение по функции установки cookie смотрите в гл. 8).

SetCookie("$namecook","1",time()+2592000);

Запишем в переменные имена директории с файлами оценок и са­мих этих файлов:

$dirct="cnt";

$kolvooc="$nom"."kol";

$ocenka="$nom"."est";

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

if  ((file_exists("$dirct/$kolvooc")!=True)||

(file_exists("$dirct/$name2")!=True))

{

...то запишем в файл со сведениями о количестве оценивших число 1 (так ведь и есть, не правда ли?)...

$hdll = fopen(,,$dirct/$kolvooc", "а+");

fwrite($hdll, 1) ;

fclose($hdll);

...а в файл со сведениями о среднем балле - выставленную посетите­лем оценку (она ведь и есть "среднее" от самой себя):

$hdl2 = fopen("$dirct/$ocenka", "а+");

fwrite($hdl2, $ocen);

fclose($hdl2);

Если же файлы со сведениями об оценке уже существуют...

}

else

{

...то считаем для начала содержимое файла с количеством оценок в пе­ременную $kvo...

$hdll = fopen{"$dirct/$kolvoocM, "r+");

$kvo = fread($hdll,   filesize("cnt/$kolvooc"));

...а затем увеличим значение этой переменной на 1 - что и будет но­вым количеством оценок, с учетом последней выставленной:

$kvo++;

Теперь нам надо вернуть точку считывания (так называемый "ука­затель") в начало файла - для того, чтобы записать в файл новое значение количества оценок. Ведь в результате проведения операции чте­ния количества оценок из файла точка считывания - указатель - пере­местилась в его конец. Для совершения данной операции воспользуем­ся командой rewind:

rewind($hdll); Примечание:

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

Следует помнить, что если файл был открыт командой fopen с параметром а или a +, то независимо от положения указателя за­пись новых данных командой fwrite будет осуществляться вконец файла.

Запишем новое значение количества оценок в предназначенный для хранения этой величины файл...

fwrite($hdll,$kvo);

...и закроем его.

fclose($hdll);

Теперь разберемся со средним баллом. Откроем файл, где хранится его значение...

$hdl2 = fopen("$dirct/$ocenkau, "r+");

...запишем это значение в переменную...

$sred= fread($hdl2,  filesize("cnt/$ocenka"));

...и рассчитаем новую величину среднего балла - на основе его старого значения, а также информации о количестве оценок и новой оценки.

$sred=($sred*($kvo-l)+$ocen)/$kvo;

Теперь запишем эти сведения в предназначенный для них файл -точно так же, как и парой абзацев выше.

rewind($hdl2); fwrite($hdl2,$sred); fclose($hd!2); Собственно, и все.

}

Можно выводить информацию посетителю об итоговом результате (рис. 10.6) или краткую благодарность.

echo  ("Благодарим вас за оценку!");

http://exper/otziv,php - Microsoft Internet6

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

}

Сценарий закончен.

?>

Остальной текст страницы - на ваше усмотрение. Разместите на ней каталог разделов сайта, список статей или просто красиво оформи­те. Если же пожелаете поставить на ней ссылку на оцениваемую ста­тью - то просто разместите в нужном месте выводящий эту ссылку код:

<?php echo ("<а href=$nazad>Ha3afl</a>"); ?>

Переменная Snazad была передана через форму, помните? Комментарий:

В данном сценарии для упрощения восприятия значения перемен­ных, передаваемых через форму, брались из одноименных переменных в сценарии-обработчике - так как на безопасность работы програм­мы это здесь не влияет: даже если злоумышленник подставит значе­ние переменной cookie в адресную строку, то он только потеряет возможность проголосовать, и ничего больше. Если вы желаете сде­лать код лучше соответствующим правилам РНР - замените их на одноименные элементы массива $HTTP_POST_VARS[J (в РНР версии до 4.1) или $_POST[J (в РНР версии 4.1 и старше).

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