ФАЙЛ OTZIV.PHP
ФАЙЛ OTZIV.PHP
Код в этом файле рассчитывает новый средний балл статьи на основе переданной через форму оценки посетителя и текущего среднего балла, записывает значения среднего балла и количества оценок в соответствующие файлы, а также помечает браузер посетителя cookie для недопущения повторного голосования того же самого посетителя.
<?php
Поскольку изменять значения среднего балла и количества оценок имеет смысл лишь в том случае, если посетитель еще не голосовал за статью, то вновь составим имя cookie, служащего "пометкой" свершившегося голосования...
$namecook=$nom."haveest";
...и весь дальнейший код выполним только в том случае, если такого cookie установлено не было.
if ($$namecook=="")
Примечание:
Вместо этой строки можно использовать строку
i f ($HTTP_COOKIE_VARS[$haveestim]=="") или в PHP версии 4.1 и выше — строку
if ($_COOKIE[$haveestim]=="") как уже указывалось выше.
Комментарий:
Казалось бы — а зачем, собственно, проверять на этой странице, установлен ли cookie? Ведь форма для выставления оценки на предыдущей странице может появиться на ней только в том случае, если cookie отсутствует, не так ли? Но все дело в том, что посетитель, желающий сделать "накрутку" статьи, проголосовав за нее множество раз, вполне может сохранить на своем компьютере локальную копию статьи с формой для выставления оценки, и уже с нее осуществлять голосование. Ясно, что отображение формы на локальной копии страницы от наличия или отсутствия cookie не зависит, — поэтому и приходится осуществлять проверку еще и здесь.
Итак, если посетитель еще не голосовал за данную статью...
{
...установим cookie, говорящий, что такое голосование наконец совершилось. Время жизни cookie установим в месяц - пожалуй, хватит. (Пояснение по функции установки cookie смотрите в ).
SetCookie("$namecook","1",time()+2 592000);
Запишем в переменные имена директории с файлами оценок и самих этих файлов:
$dirct="cnt";
$kolvooc="$nom"."kol";
$ocenka="$nom"."est";
Если файлы оценок не существуют (т. е. выставляемая оценка - вообще первая по счету)...
if ((file_exists("$dirct/$kolvooc")!=True)
(file_exists("$dirct/$name2")!=True)) {
...то запишем в файл со сведениями о количестве оценивших число 1 (так ведь и есть, не правда ли?)...
$hdll = fopen("$dirct/$kolvooc", "a+"); fwrite($hdll,l); fclose($hdll);
...а в файл со сведениями о среднем балле - выставленную посетителем оценку (она ведь и есть "среднее" от самой себя):
$hdl2 = fopen("$dirct/$ocenka", "a+");
fwrite($hdl2,$ocen);
fclose($hdl2);
Если же файлы со сведениями об оценке уже существуют...
else
...то считаем для начала содержимое файла с количеством оценок в переменную
kvo...
$hdll = fopen("$dirct/$kolvooc", "r+");
$kvo ¦ fread($hdll, filesize("cnt/$kolvooc"));
...а затем увеличим значение этой переменной на 1 - что и будет новым количеством оценок, с учетом последней выставленной:
$kvo++;
Теперь нам надо вернуть точку считывания (так называемый "указатель") в начало файла - для того, чтобы записать в файл новое значение количества оценок. Ведь в результате проведения операции чтения количества оценок из файла точка считывания - указатель - переместилась в его конец. Для совершения данной операции воспользуемся командой rewind:
rewind($hdll);
Примечание:
Команда rewind (дескриптор открытого файла) перемещает точку считывания и записи данных в файл (т. е. указатель файла), в начало этого файла. Если вы записываете что-либо в файл после считывания из него данных, то вам необходимо перед записью воспользоваться этой командой.
Следует помнить, что если файл был открыт командой fopen с параметром а или a+, то независимо от положения указателя запись новых данных командой fwrite будет осуществляться вконец файла.
Запишем новое значение количества оценок в предназначенный для хранения этой величины файл...
fwrite($hdll,$kvo);
...и закроем его.
fclose($hdll);
Теперь разберемся со средним баллом. Откроем файл, где хранится его значение...
$hdl2 = fopen("$dirct/$ocenka", "r+");
...запишем это значение в переменную...
$sred= fread($hdl2, filesize("cnt/$ocenka"));
...и рассчитаем новую величину среднего балла - на основе его старого значения, а также информации о количестве оценок и новой оценки.
$sred=($sred*($kvo-l)+$ocen)/$kvo;
Теперь запишем эти сведения в предназначенный для них файл -точно так же, как и парой абзацев выше.
rewind($hdl2); fwrite($hdl2,$sred); fclose($hdl2);
Собственно, и все.
Можно выводить информацию посетителю об итоговом результате (Рисунок 10.6) или краткую благодарность.
echo ("Благодарим вас за оценку!");