ФАЙЛ 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-бальну або іншу систему. Все у вашій владі - творите...

 
На правах реклами: 1 2

:: Меню ::

ГОЛОВНА

Введення

Небагато про Web-программировании

PHP: Історія. Місця. Джерела.

PHP: Основи

PHP: Вибіркове завантаження

PHP: Простий інтернет-магазин

PHP: Папкопотрошилка

PHP: Закачування файлів

PHP: Авторизація доступу

PHP: Гостьова книга

PHP: Система оцінки матеріалів

PHP: Файловий менеджер

PHP: Корисні дрібниці

PHP: Способи передачі даних між окремими сторінками

Висновок

Додаток 1. Перетвори свій сайт на портал

Додаток 2. Використовуй те, що під рукою - і не шукай завжди інше

Додаток 3. На сайті - як в "Вінде"


:: Реклама ::

  Настройка і оптимізація комп'ютера Хотите отдохнуть? Авиабилеты на рейсы Пхукет

 

:: Статистика ::

  Індекс цитування

:: Навігація ::

Головна

Гостьова книга

Додати у вишукане  

 

 

 


Copyright © Asentli, 2008