Гостевая книга на PHP

На тему создания гостевых книг было написано большое количество статей, однако большинство из них раскрывали процесс написания не полностью, а частично. К тому же, написанные книги были максимально просты и не могли ничего, кроме как добавлять сообщения. В данной статье я постараюсь подробно описать процесс создания гостевой книги с неплохим набором функций. Гостевая книга написана на PHP с использованием текстовых файлов для хранения данных.

Итак, прежде всего нам необходимо разобраться с файлами. Их у нас будет четыре, хотя можно объединить и в один, но это уже вам решать.

Файл №1 - guestbook.inc.dat

Создадим его, оставим пустым, и укажем ему права (0777-*nix, rwx/rwx/rwx)

Сюда будут записываться все сообщения. Да-да! Именно в один файл! Но не пугайтесь. Мной лично проверялось на всеми известном сервере WallSt. база данных размером в 5, 10, 100, 250, 500, 1000 Кб! Торможения были только на 1000 Кб книге, поверьте, это более 3000 средних записей! Вам хватит ее с лихвой.

Файл №2 – config.inc
<?php
$gb_on_page = "10"; // кол-во сообщений в гостевой на стр.
$name_max_size = "15"; // максимальная длина ника
$email_max_size = "50"; // максимальная длина мыла
$message_max_size = "1000"; // максимальная длина сообщения
$recipient ="Name.Sirname@email.zone";
$subject = "Новое сообщение на сайте";
$site_name = "Ваш сайт";
?>
Файл №3 – gb.php
<html>
  <head>
    <title>Guestbook</title>
  </head>
  <body>
    <!-- включаем вышеописанный файл -->
    <? include(‘config.inc’); ?>

    <!-- пишем форму для добавки сообщений -->
    <!-- ниже указываем в свойствах формы защиту от повторного нажатия кнопки Submit -->
    <form onSubmit="newmsg.Submit.disabled='true'" name='newmsg' action='gbadd.php' method=post>

      <!-- для всех трех полей устанавливаются максимально возможные размеры для полей имени, адреса электронной почты и сообщения -->
      *Имя:<input type=text maxlength="<? echo $name_max_size; ?>" name=name><br>
      E-mail:<input type=text maxlength="<? echo $email_max_size; ?>" name=email><br>
      *Сообщение:<br><textarea maxlength="<? echo $message_max_size; ?>" name=guesttext cols=42 rows=10></textarea><br>

      <!-- ниже указано, что при нажатии кнопки Submit она станет недоступна, и взамен ее появится кнопка с надписью «ждите!!!» -->
      <input type="Submit" onClick="newmsg.Submit.value='ждите!!!'" name="Submit" value="Отправить">
      <input type="reset" value="Стереть">
    </form>

    <!-- думаете это весь файл? :) нет, ошибаетесь… Сейчас начнется самое интересное! -->

    <?
      $data=file("guestbook.inc.dat");
      $c=count($data);
      if (!isset($page)) { $page=0; }
      for ($i=$page*$gb_on_page;$i<$page*$gb_on_page+$gb_on_page;$i++)  {
        if($i>$c-1)break;
        list($name,$email,$date,$time,$guesttext)=split(":::","$data[$i]", 5);

        echo "<a href=\"mailto:$email\">$name</a> @ [$date, $time]<br>$guesttext<br><hr>";
      }
      $col=$c/$gb_on_page;
      echo "<center>";
      if ($c<$gb_on_page){ echo ""; }
      else {
        echo "<b>Страницы: </b>";

        if($c>$gb_on_page & $page>0){ echo "<a href=\"gb.php?page=".($page-1)."\"><<</a>"; }

        for($i=0;$i<$col;$i++)  {
          if(($i)!=$page)echo "[<a href=\"gb.php?page=$i\">".($i+1)."</a>] ";
          else echo "<b><i>".($i+1)."</b></i>"." ";
        }
      }

      if($c>$gb_on_page & $page<$col-1){ echo "<a href=\"gb.php?page=".($page+1)."\">>></a>"; }
      echo "<br>Всего сообщений: $c";
      echo "</center></font>";
    ?>

    <!-- Уффффффффффф. Все! С этим файлом покончили, но остался главный, отвечающий собственно за добавление сообщения в гостевую книгу -->

  </body>
</html>
Файл №4 — gbadd.php
<?php
    include('config.inc');
    $name = $_POST['name'];
    $email = $_POST['email'];
    $guesttext = $_POST['guesttext'];
    if (!empty($name) && !empty($guesttext)) {
        $date = date('d.m.Y');
        $time = date('H:i');
        $guesttext = str_replace(":::", ":::", $guesttext);
        $name = str_replace(":::", ":::", $name);
        $email = str_replace(":::", ":::", $email);
        $guesttext = htmlspecialchars($guesttext, ENT_QUOTES);
        $name = htmlspecialchars($name, ENT_QUOTES);
        $email = htmlspecialchars($email, ENT_QUOTES);
        $guesttext = preg_replace("/\s+/", " ", $guesttext);
        $name = preg_replace("/\s+/", " ", $name);
        $email = preg_replace("/\s+/", " ", $email);
        $guesttext = nl2br($guesttext);
        $guesttext = str_replace("\r", "", $guesttext);
        $guesttext = stripslashes($guesttext);
        $name = stripslashes($name);
        $email = stripslashes($email);
        $message = $date.", ".$time."\n";
        $message .= "Имя: ".$name.", e-mail: ".$email."\nСообщение\n";
        $message .= $guesttext."\n ";
        $message .= "Сообщение из гостевой книги";
        $headers = "From: $site_name <$recipient>\n";
        $headers .= "X-Mailer: Pseon’s Guestbook\n";
        $headers .= "X-Priority: 1\n";
        $headers .= "Content-Type: text/plain; charset=UTF-8\n";
        mail($recipient, $subject, $message, $headers);
        $msg = "$name:::$email:::$date:::$time:::$guesttext ";
        $lines = file("guestbook.inc.dat");
        $fp = fopen("guestbook.inc.dat", "w");
        fwrite($fp, "$msg\n");
        for ($i = 0; $i < count($lines); $i++) {
            fwrite($fp, $lines[$i]);
        }
        fclose($fp);
        clearstatcache();
    } else {
        header("Location: gb.php");
    }
?>

Ну и вот что мы получаем после наших недолгих мытарств...

Визуальное представление гостевой книги в веб-браузере Internet Explorer

Как видно из приведенного примера, интерфейс состоит из вводной формы, расположенной в верхней части, и отображения сообщений, которые сортируются по страницам в нижней части.

Следует подчеркнуть, что если у вас возникли трудности при реализации данного функционала, не стоит делать поспешных выводов о недостатках руководства. Автор убедился в корректности представленного материала, проведя самостоятельное тестирование. В случае возникновения проблем рекомендуется вернуться к исходным пунктам и проанализировать выполненные шаги заново.

BB-коды

BB-коды, или Bulletin Board Codes, являются специальными инструкциями, заключенными в квадратные скобки, которые используются для форматирования и стилизации текста на форумах, в гостевых книгах и других веб-приложениях. Эти коды облегчают процесс оформления текста, позволяя, например, делать его жирным, курсивным или изменять его цвет без необходимости знания HTML или CSS.

В данной части рассматривается набор BB-кодов, предназначенный для дополнительной стилизации сообщений в гостевых книгах.

Форматирование текста
[i]test[/i]наклонный
[b]test[/b]жирный
[u]test[/u]подчеркнутый
[s]test[/s]перечеркнутый
[size=12]test[/size]изменение размера шрифта
Цвет
[red]test[/red]красный
[blue]test[/blue]синий
[green]test[/green]зеленый
[yellow]test[/yellow]желтый
Выравнивание
[center]test[/center]выравнивание по центру
[left]test[/left]выравнивание по левому краю
[right]test[/right]выравнивание по правому краю
Списки и скрытый текст
[list]test[/list]создание списка
[li]test[/li]элемент списка
[spoiler]test[/spoiler]скрытый текст
Специальные функции
[quote]test[/quote]цитирование
[code]test[/code]вставка кода
[url]test[/url]гиперссылка
[img]test[/img]вставка изображения