| ФАЙЛ 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 дивитеся в гл. 8).
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 ("Дякуємо вам за оцінку!");

Мал. 10.6. Після успішного голосування

Ріс.10.7. Після спроби повторного голосування
Якщо ж відвідувач вже голосував за дану статтю...
}
else {
...то повідомимо його про це (мал. 10.7) - і нічого робити не станемо, echo ("Ви вже голосували за цю статтю!");
}
Сценарій закінчений. ?>
Останній текст сторінки - на ваш розсуд. Розмістите на ній каталог розділів сайту, список статей або просто красиво оформите. Якщо ж побажаєте поставити на ній заслання на оцінювану статтю - те просто розмістите що в потрібному місці виводить це заслання код:
<?php echo ("<a href=$nazad>ha3afl</a>"); ?>
Змінна Snazad була передана через форму, пам'ятаєте?
Коментар:
У даному сценарії для спрощення сприйняття значення змінних, передаваних через форму, бралися з однойменних змінних в сценарії-обробнику - оскільки на безпеку роботи програми це тут не впливає: навіть якщо зловмисник підставить значення змінної cookie в адресний рядок, то він лише втратить можливість проголосувати, і нічого більшого. Якщо ви бажаєте зробити код краще відповідним правилам РНР - заміните їх на однойменні елементи масиву $HTTP_POST_VARS[] (у РНР версії до 4.1) або Spostfj (у РНР версії 4.1 і старше).
Як завжди, сценарій можна удосконалювати до безкінечності. Можна, наприклад, поєднати його що знався на попередній главі сценарієм гостьової книги - тоді відвідувачі поряд з оцінкою статті можуть залишити і свій відгук на неї. Можна збільшити кількість можливих оцінок, які відвідувачі можуть виставляти статтям -іспользовать 10-бальну або іншу систему. Все у вашій владі - творите...
|