| ФАЙЛ 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. ...але голосування вже відбулося
От і все.
|