Первый сайт на PHP

         

Внешний вид гостевой книги и файлов с ее сообщениями



Рисунок 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, указав в ее третьем параметре отрицательную величину - число символов от конца строки, которые не должны включаться в выделяемую строку (подробнее см. ):



$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 сообщений. (Код, выводящий остальные сообщения так же, по десяткам, сделайте самостоятельно.)

Так что, как видите, сделать гостевую книгу на РНР не просто, а очень просто. Весь ее код уместится на одном экране, даже на мониторах с небольшим разрешением. Но даже такой простой скрипт таит в себе немало возможностей для творчества.


Содержание раздела