ГЛАВА 9. РНР: ГОСТЬОВА КНИГА

Ви напевно неодноразово зустрічали в Інтернеті такий сервіс, як гостьові книги, тобто web-страницы, на яких кожен відвідувач може залишити свій відгук, який буде «видний» іншим відвідувачам, що згодом зайшли на сторінку. Швидше за все, ви думали, що створення гостьової книги вимагає довгого і складного програмування.
Не сперечаюся, зробити крупний інтернет-портал, що надає що всім бажає гостьові книги для установки на сайт, досить важко. Проте на мові програмування РНР організація простий системи залишення повідомлень може бути створена всього декількома рядками коди. Причому неважко змусити ці рядки обслуговувати відразу декілька окремих гостьових книг, скажімо, дати відвідувачам можливість залишати свої коментарі і відгуки про різні матеріали, розміщені на сайті, на тих же самих сторінках, на яких ці матеріали розміщені. Або, допустимий, організувати різні книги для різних категорій відвідувачів.
Дана глава, як ви, напевно, вже зрозуміли, присвячена розповіді про сценарій на РНР для створення простої гостьової книги. В главі розібраний сценарій, що дозволяє зробити на одному сайті декілька гостьових книг. Очевидно, що пристосувати його для роботи всього однієї гостьової книги елементарно.
Схема роботи сценарію простий гостьової книги така.
Для зберігання повідомлень виділена спеціальна тека, в якій кожне повідомлення зберігається в окремому текстовому файлі. Для того, щоб можна було розрізняти повідомлення, що належать різним гостьовим книгам, кожна книга має свій індекс (наприклад, "gbol"), який вказується в спеціальному сценарії в її тексті. Ім'я кожного файлу з повідомленням починається з цього індексу (див. мал. 9.1).
Оскільки в гостьовій книзі, як неважко здогадатися, кількість повідомлень вельми скоро перевищить одне, то файли з ними потрібно ще і послідовно нумерувати. Вірніше, не "послідовно", а так, щоб їх можна було відсортувати - напевно, досить можливості сортування лише по даті появи.
У РНР є цікава функція - time (); вона видає кількість секунд між 1 січня 1970 року (цей момент вважається початком "епохи Unix") і поточним часом, так звану "тимчасову мітку Unix". (В даний час ця величина - трохи більше мільярда.) Поглянете - якщо ім'я файлу з повідомленням складати з індексу гостьової книги і тимчасової мітки Unix (див. мал. 9.1), то, по-перше, кожне повідомлення володітиме своїм унікальним ім'ям (посилка декількох повідомлень в гостьову книгу різними користувачами в одну і ту ж секунду теоретично можлива, але маловірогідна), а, по-друге, їх легко можна буде відсортувати за часом появи (адже час назад не тече - кожне нове повідомлення отримуватиме велику мітку, ніж будь-яке попереднє).
Безперечно, оскільки сортування імен, що складаються з індексу і тимчасової мітки, проводитиметься за законами сортування рядків (т. е., скажімо, 21 стоятиме раніше 3 при сортуванні за збільшенням - оскільки порівняння ведеться з початку рядка), то при збільшенні розрядності тимчасової мітки нові повідомлення виявляться посеред старих. Проте які-небудь проблеми в нашому випадку почнуться не раніше моменту досягнення тимчасовою міткою значення в 10 мільярдів, а до нього ще більше, ніж дві з половиною сотні років...

Мал. 9.1. Гостьова книга - всі її файли

Отже, ось алгоритм роботи сценарію гостьової книги:

  1. 1. При завантаженні відвідувачем сторінки книги просканувати теку з повідомленнями, вибрати звідти повідомлення, що відносяться до даної книги (просто знайшовши в іменах файлів, що містять їх, індекс цієї книги), відсортувати їх і вставити в web-страницу.
  2. 2. При введенні відвідувачем повідомлення перерахувати що вже є і зберегти нове повідомлення у файлі з ім'ям, що складається з індексу поточної гостьової книги і тимчасової мітки Unix.

Є, втім, ще одне побажання. Звернете увагу - якщо слідувати даному алгоритму, то повідомлення, поміщене відвідувачем в гостьову книгу, буде просто вставлено в текст тієї сторінки, на якій вона розташована. А це означає, що який-небудь зловмисник сповна може помістити в повідомлення гостьової книги код на РНР і той буде спокійнісінько виконаний! А результат такого виконання для власника сайту непередбачуваний. Це може бути і видалення з сайту всіх файлів, і розміщення на нім зовсім не того, що хотілося б, і масова поштова розсилка... .поетому наш алгоритм слід доповнити ще одним пунктом:

  1. 3. Перед збереженням повідомлення відвідувача у файл видалити з нього всі теги або зробити їх нерозпізнаваними ні інтерпретатором РНР, ні браузером - наприклад, конвертіровав у відповідні їм поєднання символів, що просто відображують їх на екрані.

Ну а тепер поглянемо, як все це реалізується на РНР.
У текст кожної web-страницы, на якій має бути розташована гостьова книга, слід вставити наступний код (див. мал. 9.2):

<?php
$пот="уникальная абревіатура книги, без пропусків і спеціальних символів, наприклад, book01";
include ("niz.php"); ?>

Думається, сенс цього сценарію ясний - спочатку встановлюється індекс гостьової книги, а потім включається єдиний для всіх книг файл з кодом, що власне відображує повідомлення, - в даному випадку niz.php.
Оскільки саме код файлу niz.php відображує повідомлення гостьової книги, то і наведений вище фрагмент коди слід поміщати саме там, де ці повідомлення повинні на web-странице розташовуватися.

Мал. 9.2. Всього три файли - і гостьова книга. А можна навіть два

Вміст же файлу niz.php (див. мал. 9.2) може бути таким (пояснення відносяться до коду під ними):

<?php

Вкажемо ім'я теки, в якій зберігатимуться відгуки (її, зрозуміло, спочатку треба буде створити на аккаунте сайту уручну). Само ім'я може бути будь-яким - поважно лише, щоб воно не містило пропусків або спеціальних символів:

$dirct="gb";

Ну а далі слідує вже знайомий вам сценарій "Папкопотрошилки" (див. гл. 6) вживаний до цієї самої теки з відгуками. Ось практично такий самий, як і в "Папкопотрошилке", код, що записує в масив $а[] імена всіх файлів, в імені яких міститься вказаний вище індекс книги:

$hdl=opendir($dirct) ;
while ($file = readdir($hdl))
if (strstr($file, $nom)!=False)
$a[]=$file;
closedir($hdl);

Примітка:
Функція strstr шукає в своєму першому аргументі рядок, вказаний другим аргументом, і повертає True, якщо її там знаходить.

Тепер відсортуємо отриманий масив. Для цього спочатку взнаємо кількість повідомлень книги:

$l=sizeof($a);

а потім, в тому випадку, якщо повідомлення в книзі є, виробимо сортування (якщо повідомлень немає, тобто масив $а порожній, то функція сортування видасть помилку, а подальша робота з елементами масиву взагалі безглузда - тому потрібна перевірка розміру масиву):

if ($l!=0)
{
rsort($a);

Тепер масив $а містить імена файлів з повідомленнями, причому в перших елементах масиву містяться імена файлів з найбільшими номерами (тобто найновіші - як і виходить з приведеного вище алгоритму). Якщо ж потрібний зворотний порядок (тобто щоб нові повідомлення поміщалися в кінець сторінки), то замість функції rsort (сортування по убуванню) слід використовувати функцію sort (тобто сортування за збільшенням).
Ну і, нарешті, вставимо всі файли з повідомленнями в сторінку з гостьовою книгою за допомогою оператора include, перебравши послідовно елементи масиву з іменами цих файлів конструкцією foreach:

foreach ($a as $value)
{
include ("$dirct/$value");
echo ("<br>(роздільник повідомлень)");

Як вже говорилося, foreach прочитує у вказану в його параметрах змінну - в даному випадку $value - всі елементи масиву - в даному випадку $а - по черзі, виконуючи кожного разу вказаний після нього у фігурних дужках код, в якому вказана змінна може використовуватися. Оскільки в масиві першими йдуть елементи з іменами файлів з найбільш новими повідомленнями, то і на сторінці ці повідомлення з'являться зверху.

Коментар:
Оператор foreach працюватиме лише в РНР 4.0 і вище. Якщо ви можете використовувати лише РНРЗ, то замість нього можна використовувати цикл for, вказавши в його параметрах величину масиву $1:
for ($k = 1; $k < $1; $k++) {

Для зручності можна записати значення чергового елементу масиву в змінну: $value=$a[$k] ;

Все - код виведення наявних повідомлень завершений!

}>

Тепер залишилося розмістити на сторінці форму для додавання нового повідомлення. У її заголовку вкажемо ім'я файлу, в якому буде розміщений код додавання нового відгуку, - допустимий, це otziv.php:

<form method="post" action="otziv.php">

Щоб обійтися одним файлом-обробником нових відгуків, передамо йому в прихованому полі форми індекс гостьової книги - щоб обробник знав, до якої книги відноситься передане йому повідомлення. Для зручності назвемо його так само, як і змінну, що містить індекс, - nom.

<input name="nom" type="hidden" value="<?php echo $nom; ?>">

Коментар:
Приховане поле (типа hidden) не відображується в браузере, проте передається разом з формою.

Ну і - безпосередньо поле введення повідомлення, вже, ясна річ, не приховане:

<textarea name="otziv" cols="60" rows="10" wrap="virtual"></textarea>

І усюдисуща кнопка відправки форми:

<input name="submit" type="submit" value="добавіть отзив"></form>

Тепер залишилося зробити програма-обробник нових відгуків. Як це ні дивно, але вона уміщатиметься всього в п'ять рядків. Розмістити її треба в тому файлі, ім'я якого вказане в заголовку форми для введення повідомлення - в нашому випадку це otziv.php (див. мал. 9.2).

<?php

Вкажемо сценарію ім'я теки з відгуками:

$dirct="gb";

В принципі, можна було б це ім'я і передати через форму за допомогою прихованого поля - типа hidden. А можна було б і взагалі не запам'ятовувати в змінну - вказувати в сценарії в потрібних місцях само ім'я теки (тобто "gb" в нашому випадку) - і справа з кінцем. Просто так декілька наочніше, та і у разі потреби змінити це ім'я виконати дану операцію буде досить лише в цьому місці.
Згенеруємо ім'я для нового файлу з повідомленням - просто з'єднаємо разом індекс гостьової книги і тимчасову мітку Unix, отриману функцією time():

$otznam=$nom.time();

Як ви пам'ятаєте, при передачі сценарію РНР інформації через форму значення її полів записуються в змінні, імена яких відповідають значенням параметрів паті цих полів, тому індекс гостьової книги, переданий через поле форми з ім'ям піт, і виявився в змінній Snom.
Тепер створимо новий файл з ім'ям, що згенерувало, і відкриємо його для запису - все це робиться однією командою - f open з параметром w+.

Примітка:
Для того, щоб з програми на РНР рахувати вміст якого-небудь файлу або записати в нього дані, цей файл потрібно спочатку відкрити - командою fopen (такий вже влаштований РНР). При цьому відкритому файлу привласнюється якесь "внутрішнє ім'я" - так званий дескриптор, і саме його повертає функція fopen. Перший параметр fopen - ім'я файлу (разом з відносним або абсолютним дорогою до нього), другий - спосіб відкриття файлу.
Залежно від другого параметра функції fopen файл може бути відкритий по-різному - для читання, для запису, з очищенням вмісту або без такої. Можливі параметри fopen такі:
• r - відкрити файл лише для читання і приготуватися читати його з початку.;
• r+ - відкрити файл для читання і для запису і приготуватися працювати з ним з його початку;
• w - відкрити файл лише для запису, заздалегідь видаливши з нього весь вміст, причому якщо файл з вказаним ім'ям не існує, то створюється новий файл з таким ім'ям;
• w+ - відкрити файл як для запису, так і для можливого подальшого читання, заздалегідь видаливши з нього весь вміст, причому якщо файл з вказаним ім'ям не існує, то створюється новий файл з таким ім'ям;
• а - відкрити файл лише для запису і приготуватися дописувати дані в його кінець. Якщо файл з вказаним ім'ям не існує, то створюється новий файл з таким ім'ям;
• а+ - відкрити файл для запису і для читання і приготуватися дописувати дані в його кінець. Якщо файл з вказаним ім'ям не існує, то створюється новий файл з таким ім'ям.
Файл, що відкривається, може розташовуватися і на видаленому сервері - в цьому випадку він буде доступний лише для читання незалежно від параметрів відкриття файлу. Дорога до файлу у такому разі слід вказувати повністю - починаючи з http://muftp://.

(У нашому випадку можна також використовувати параметр а+ - відмінність цих двох параметрів, що полягає в тому, що fopen з параметром w+ очищає весь вміст файлу, що відкривається, а fopen з параметром а+ немає, неістотно, оскільки файл все одно створюється новий):

$hdl = fopen("$dirct/$otznam", "w+");

Проводити операції запису або читання з файлу засобами РНР можна лише через дескриптор цього файлу - якесь "внутрішнє ім'я", "потік виведення даних". Саме дескриптор, а не ім'я файлу, доведеться вказувати у функціях, що здійснюють ці дії. Дескриптор створюється при відкритті файлу функцією fopen, яка його і повертає -в даному випадку він записується в змінну Shdl.
Тепер запишемо у відкритий файл відгук (що знаходиться в змінній Sotziv - саме такий ім'я мало поле введення відгуку у формі для його введення), заздалегідь прибравши з нього спеціальною командою, можливо, теги HTML і команди РНР, що містяться в нім, - щоб забезпечити сайт від дій зловмисників:

fwrite($hdl,strip_tags($otziv));

Примітка:
Команда fwrite (дескриптор файлу, записуваний у файл рядок) записує вказаний в другому параметрі рядок у файл, дескриптор якого вказаний в її першому параметрі.
Те місце у файлі, з якого здійснюється читання даних і в яке здійснюється запис, називається покажчиком файлу. (Якщо файл представити як зошит, то покажчик - це відкрита сторінка, вірніше, номер відкритої сторінки.) При відкритті файлу командою fopen з параметрами r, r+, w або w+ покажчик файлу ставиться на його початок, а при відкритті з параметром а або а + -в самий кінець.
При записі у файл командою fwrite в тому випадку, якщо покажчик знаходиться не в кінці файлу, записувані дані пишуться поверх тих, що є. Якщо ж файл був відкритий командою fopen з параметром а або а +, то незалежно від позиції покажчика запис у файл йде в його кінець, тобто - після всіх даних файлу.
Функція strip tags (рядок) вирізує з рядка, вказаного в її параметрах, всі теги - тобто "все в кутових дужках", як HTML, так і РНР, ASP та інші, повертаючи цей рядок з вирізаними тегами. Якщо які-небудь теги вирізувати не слідує, то їх можна перерахувати в другому параметрі даної функції: команда
strip_tags (рядок ' <a><b><ixu> ') ;
виріже з вказаного в першому параметрі рядка всі теги, окрім <а>, <Ь>, </>, <і>, тобто залишить відвідувачеві можливість оформляти ними свій текст.


В результаті зловмисник не зможе розмістити в гостьовій книзі ні HTML-текст, ні PHP-программу, а значить, не зможе ні зіпсувати дизайн сайту, ні виконати на нім які-небудь свої команди РНР.
Замість повного видалення всіх тегів з відгуку можна провести конвертацію спеціальних символів, що містяться в нім, - кутових дужок, лапок, амперсандів - в їх еквіваленти, що просто відображують ці символи на екрані. Це робить команда htmlspecialchars:

fwrite($hdl, htmlspecialchars($otziv));

Примітка:
Функція htmlspecialchars (рядок) конвертує всі "спеціальні символи" у вказаному в її параметрі рядку в так звані "мнемоніки HTML", які відображуються браузером на сторінці як ці самі символи. Конвертація відбувається таким чином:
• & (амперсанд) замінюється на поєднання символів &атр;
• " (подвійна лапка) замінюється на поєднання символів &quot ;
• < (менше) замінюється на поєднання символів &11 /
• > (більше) замінюється на поєднання символів &gt ;
Поєднання символів "&атр;", "&quot;", "&lt;", "&gt;" відображуються в браузере як амперсанд, подвійна лапка, знаки "менше" і "більше" відповідно.
У РНР третьої (починаючи з підверсії 3.0.17) і четвертої (починаючи з підверсії 4.0.3) версій як другий аргумент можна також вказати параметр Entjquotes або ENTNOQUOTES. Якщо вказаний перший, то окрім вищезгаданих замін виконується ще і заміна символу ' (одинарної лапки) на поєднання символів &#039;, а якщо вказаний другий - те жодні лапки не замінюються.

В результаті всі теги відображуватимуться на екрані точно так, як і при їх введенні в полі введення повідомлення - тобто не стануть оброблятися браузером або інтерпретатором РНР.

Коментар:
Будь-яку інформацію, що запрошується від відвідувача і згодом виводиться на яку-небудь сторінку, вельми бажано перед виводом обробити який-небудь з цих функцій, htmlspecialchars або strip_tags, - для забезпечення стійкості сайту до злому. Бо навіть в тому випадку, якщо ви на одній сторінці запрошуєте у відвідувача e-mail, а на іншій - його виводите на сторінку, зловмисник в полі введення e-mail'a може помістити код на РНР, і тоді, будучи включеним у виведену сторінку без якої-небудь обробки, цей код благополучно виконається! Адже в цьому коді може бути що завгодно - аж до команд видалення файлів. Тому не забувайте обробляти даними функціями все інформацію, що була введена в елементи форми і відображуватиметься на якій-небудь сторінці.
Навіть приховані поля і випадні списки можуть нести в собі загрозу безпеці сайту - якщо отримувана з них інформація виводиться на екран. Ніщо не заважає зловмисникові зробити локальну копію сторінки з формою на своєму жорсткому диску, прописати як сторінку-обробника повну дорогу до неї - разом з адресою сайту і змінити у формі вміст будь-яких полів, у тому числі і прихованих, помістивши туди PHP-код. Отже будьте пильні!

Якщо Ви бажаєте, щоб при відображенні на сторінці повідомлень зберігалося їх розбиття відправниками на абзаци, то обробіть записуване у файл повідомлення командою nl2br для конвертації символів кінця рядка в теги <br>, які цей розрив рядка і означають:

fwrite($hdl,nl2br(strip_tags($otziv)));

або, якщо хочете, запишіть всі команди обробки записуваного повідомлення в два рядки:

$otziv=nl2br(strip_tags($otziv)); fwrite($hdl,$otziv);

Примітка:
Функція nl2bг (рядок) вставляє перед кожним символом початки рядка, зустрінутому в рядку в її параметрі, тег <br> -в РНР версії до 4.0.5, або <'г /> - в РНР пізніших версій. (Останній тег сумісний і з мовою XML.)
Файл можна закрити - і закінчити сценарій.

fclose($hdl);
?>

Такий код працюватиме в РНР версії 3. У РНР версії 4 і вище з цим кодом теж проблем не буде, проте лише в тому випадку, якщо в конфігураційному файлі РНР встановлена як on опція register_globals. Налаштування даного файлу - прерогатива адміністратора web-сервера (хоча за умовчанням дана опція включена). Якщо register_globals встановити в off, то змінні форми по їх іменах в сценарії-обробнику доступні не будуть.
Проте всі змінні, що передаються через форму, записуються ще і в спеціальний масив - з ім'ям $HTTP_POST_VARS (якщо передача вироблена методом post - тобто в адресному рядку значення передаваних змінних не відображуються; вигляд передачі вказується в заголовку форми) або $HTTP_GET_VARS (якщо передача вироблена методом get-с відображенням в адресному рядку передаваних змінних). У Рнр4 так відбувається завжди, а в РНРЗ - лише в тому випадку, якщо в конфігураційному файлі РНР (що набудовується адміністратором web-сервера) встановлена як on опція track_vars. Елементи цих масивів названі іменами цих змінних; так, змінна, вказана в полі з ім'ям otziv форми, передавальної введені в неї значення методом POST сценарію у файлі scen.php, буде доступна в цьому сценарії в елементі масиву $HTTP_POST_VARS['otziv'].
Тому для того, щоб не залежати від налаштування РНР адміністратором сервера, наведений вище код можна переписати, використовуючи в нім замість імен змінних форми - елементи масиву, пойменовані як ці елементи форми. У такому разі він виглядатиме таким чином:

<?php
$dirct="gb";
$otznam=$HTTP_POST_VARS['nom'].time();
$hdl = fopen("$dirct/$otznam", "w+");
fwrite($hdl,nl2br(strip_tags($HTTP_POST_VARS['ot ziv1])));
fclose($hdl);
?>

Починаючи з РНР версії 4.1, окрім масивів $HTTP_POST_VARS і $HTTP_GET_VARS, програмі на РНР доступні ідентичні ним масиви $_POST і $_GET, отже в тому випадку, якщо на сервері, де мають бути розміщені ваші сценарії, встановлений РНР цій або більш старшою версій, то ви можете використовувати і такі імена.
Версію РНР ви можете взнати, включивши в сценарій команду phpinf про ();. Вона дасть вичерпну інформацію як по цьому, так і по безлічі інших питань.

Мал. 9.3. Зовнішній вигляд гостьової книги і файлів з її повідомленнями

При роботі приведеного вище сценарію після додавання нового повідомлення в гостьову книгу (мал. 9.3) відвідувач виявиться на сторінці обробки відгуків, в даному випадку otziv.php. Можна помістити на ній, наприклад, фразу з вдячністю за додане повідомлення. Проте куди краще буде, якщо після додавання нового повідомлення відвідувач автоматично повернеться в гостьову книгу, куди він тільки що додав своє повідомлення. Для того, щоб це зробити, можна помістити вкінець обробника строчку Header ("Location: імя_меь-страніци_с_гостевой_кнігой"); вказавши ім'я потрібної сторінки (наприклад, передавши його у формі разом з останніми змінними, тобто кількістю відгуків і індексом сторінки), або просто включити обробник в сам файл niz.php, а як сторінка-обробник форми вказати ту ж саму сторінку з гостьовою книгою.
У такому разі після відправки форми просто завантажиться та ж сама гостьова книга, але вже з доданим новим повідомленням. В результаті весь код гостьової книги уміщатиметься в одному файлі (а обслуговувати він може хоч пару десятків окремих гостьових книг!).
Отже, ось повний, готовий до вживання код сценарію гостьової книги. Спробуйте розібратися в нім самостійно - це буде легко, адже всі його рядки вже були детально розібрані вище.
У кожну сторінку, на якій розташовується гостьова книга, слід включити такий сценарій:

<?php
$пот="имя (без розширення) web-страницы, на якій розташована гостьова книга";
include ("niz.php"); ?>
Ну а файл niz.php повинен містити весь останній код:
<?рпр
$dirct="gb"; if ($otziv!="")
{
$otznam=$nom.time();
$hdl = fopen("$dirct/$otznam", "w+"); fwrite($hdl,nl2br(strip_tags($HTTP_POST_VARS['ot ziv'])));
fclose($hdl);
}
$hdl=opendir($dirct); while ($file= readdir($hdl))
{
if (strstr($file, $nom)==True) { $a[]=$file;
$l=sizeof($a); if ($l!=0)
{
rsort($a);
foreach ($a as $k)
include ("$dirct/$k");
echo ("<br>(роздільник повідомлень)");
Ваш коментар:
<form method="post" action="<?php echo ("$nom".".php"); ?>" name="form">
<textarea name="otziv" cols="60" rows="10" wrap="virtual"></textarea>
<input name="submit" type="submit" value="послать отзив"></form>

На відміну від розібраної нами коди тут немає необхідності передавати у формі індекс гостьової книги (оскільки він все одно встановлюється на сторінці гостьової книги і тим самим доступний і на всьому протязі включеного в неї niz.php), проте необхідно повідомити ім'я що містить цю гостьову книгу файлу - щоб саме його вказати як обробника форми введення повідомлення. Найпростіше саме це ім'я і вказувати як індекс гостьової книги.
Хоча в принципі вказувати в сценарії ім'я файлу як індекс гостьової книги не треба. У початок коди у файлі niz.php можна включити код, який би цей самий індекс визначав би автоматично. Скажімо, брав би значення змінної $PHP_SELF - вона містить ім'я поточного файлу разом з дорогою до нього від кореневої директорії сайту (навіть якщо вона знаходиться у файлі, включеному в поточний за допомогою оператора include), скажімо, "/guestbooks/gbol.php", а потім витягував з нього само це ім'я.
У РНР версії 4.1 і вище ім'я файлу без розширення можна взнати командою basename (), вказавши в її параметрах це саме розширення:

$nom=basename($PHP_SELF, ".php");

Примітка:
Команда basename виділяє ім'я файлу з його повного імені, вказаного в її параметрі, - разом з дорогою по дереву директорій. Починаючи з РНР версії 4.1, в ній можна також вказувати розширення, яке має бути відкинуте в тому випадку, якщо воно буде знайдено в імені файлу. До версії 4.1 можливостей лише за допомогою цієї команди взнавати ім'я файлу без розширення немає

У РНР версії до 4.1 команда basename () ім'я файлу без розширення видати не зможе, проте розширення можна відкинути шляхом використання команди substr, вказавши в її третьому параметрі негативну величину - число символів від кінця рядки, які не повинні включатися в рядок, що виділяється (детальніше за див. гл. 8):

$nom=substr(basename($PHP_SELF), 0 -4);

Якщо цю команду визначення імені файлу без розширення включити в самий початок коди файлу niz.php, то установку значення змінної Snom на web-страницах, що містять гостьові книги, можна прибрати - досить одного оператора include:

<?php include ("niz.php"); "?>

...і абсолютно вся програма гостьової книги поміститься в одному файлі. Вам залишиться лише вставляти його командою include усюди, куди захочете (та хіба що ще саму теку для повідомлень створити уручну спочатку).
Наполягати на тому, щоб як індекс гостьової книги використовувати ім'я сторінки, на якій вона розташовується, саме без розширення, не обов'язково - якщо цього не зробити, то в результаті роботи розглянутого сценарію повідомлення поміщатимуться у файли, імена яких починатимуться з цього повного імені (тобто разом з розширенням) - всього лише невелика косметична незручність.
Безперечно, даний код можна покращувати. Можна, наприклад, зробити так, щоб на сторінці відображувалися не відразу всі повідомлення, а лише частина, скажімо, останній десяток. Для цього слід трохи змінити код виведення повідомлень, замість конструкції foreach використавши, скажімо, оператора for в тому випадку, якщо кількість повідомлень більше десяти:

<?php
$dirct="gb";
$nom=substr(basename($PHP_SELF), 0 -4);
if ($otziv!=B")
{
$otznam=$nom.time();
$hdl = fopen("$dirct/$otznam", "w+")
fwrite($hdl, nl2br(strip_tags($HTTP_POST_VARS['otziv']))
fclose($hdl); }
$hdl=opendir($dirct); while ($file = readdir($hdl)) {
if (strstr($file, $nom)==True) { $a[]=$file;
$1=sizeof($a); if ($l!=0) {
rsort($a);
if ($l>10)
{
for ($i = 0; $i < 10; $i++)
{
include ("$dirct/$a[$i]n);
echo ("<br>(роздільник повідомлень)");
else
foreach ($a as $k)
{
include ("$dirct/$kb);
echo ("<br>(роздільник повідомлень)");
}
}

}
?>
Ваш коментар:
<form method="post" action="<?php echo ($nom.".php"); ?>" name="form">
<textarea name="otziv" cols="60" rows="10" wrap="virtual"></textarea>
<input name="submit" type="submit" value="послать відгук">
</form>

(Змінена частина коди виділена жирним.)
Тоді на сторінці відображуватимуться лише останні 10 повідомлень. (Код, що виводить останні повідомлення так само, по десятках, зробіть самостійно.)
Отже, як бачите, зробити гостьову книгу на РНР не просто, а дуже просто. Весь її код уміщатиметься на одному екрані, навіть на моніторах з невеликим дозволом. Але навіть такий простий скрипт таїть в собі немало можливостей для творчості.

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

:: Меню ::

ГОЛОВНА

Введення

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

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

PHP: Основи

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

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

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

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

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

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

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

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

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

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

Висновок

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

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

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


:: Реклама ::

  Настройка і оптимізація комп'ютера

 

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

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

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

Головна

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

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

 

 

 


Copyright © Asentli, 2008