Создание гостевой книги

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

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

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

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

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

Файл №2 – config.inc

<?
$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);
$page=$_GET['page'];
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>";
   /* Здесь такая штука, что если можно перейти на предыдущую страницу, то показывается примерно что то вроде этого :) << [1] 2 */
   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>"." ";
   }
}


/* Здесь такая штука, что если можно перейти на следующую страницу, то показывается примерно что то вроде этого :)  1 [2] >>*/
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

<?
include("config.inc");
/* укажем, что данные должны передаться скрипту из формы... иначе можно было бы отправить сообщение примерно таким образом:
http://myhost.ru/gb/gbadd.php?name=admine&email=you@#admin.com&guesttext=message_have_been_posted спасибо CompDocs */
$name=$_POST['name'];
$email=$_POST['email'];
$guesttext=$_POST['guesttext'];

if ($name !="" and $guesttext !="")
{
   $date=date('d.m.Y');
   $time=date('H:i');
   // заменяем двоеточия
   $guesttext = ereg_replace(":::",":::",$guesttext);
   $name = ereg_replace(":::",":::",$name);
   $email = ereg_replace(":::",":::",$email);
   // разрешим только шрифты, картинки и списки
   // теги как украшение
   $guesttext = ereg_replace("<", "<", $guesttext);
   $guesttext = ereg_replace(">", ">", $guesttext);
   $name = ereg_replace("<", "<", $name);
   $name = ereg_replace(">", ">", $name);
   $email = ereg_replace("<", "<", $email);
   $email = ereg_replace(">", ">", $email);
   // нет кавычкам! 2=DeaD= thanX!
   $name = ereg_replace(""", """, $name);
   $email = ereg_replace(""", """, $email);
   $guesttext = ereg_replace(""", """, $guesttext);
   // удаление лишних пробелов
   // в центре
   $guesttext=ereg_replace(" +"," ",$guesttext);
   $name=ereg_replace(" +"," ",$name);
   $email=ereg_replace(" +"," ",$email);
    //cправа и слева
    $name=trim($name);
    $email=trim($email);
   $guesttext=trim($guesttext);
   // перевод строки
   $guesttext = ereg_replace("n", "<br>", $guesttext);
   // чтобы весь текст был на одной строке!
  $guesttext = ereg_replace("r", "", $guesttext);
   // мегакавычки
   $name = stripslashes($name);
   $email = stripslashes($email);
   $guesttext= stripslashes($guesttext);
   // правильные тире
   $guesttext = preg_replace ("/[ ]{1,}-[ ]{1,}/", " — ", $guesttext);
   $guesttext = preg_replace ("/^- /", "— ", $guesttext);
   // число-число
   $guesttext = preg_replace ("/(d)-(d)/", "\1–\2", $guesttext);
   // слова с дефисом
   $guesttext = preg_replace ("/(S+)-(S+)/", "<nobr>\1-\2</nobr>", $guesttext);
   // частицы и предлоги
   $guesttext = preg_replace ("/([А-Яа-яA-Za-z]) (ли|ль|же|ж|бы|б)([^А-Яа-яA-Za-z])/", '\1 \2\3', $guesttext);
   $guesttext = preg_replace ("/(s)([А-Яа-я]{1})s/", '\1\2 ', $guesttext);
   // A.C. Пушкин
   $guesttext = preg_replace ("/([А-ЯA-Z])([. ]{1})[ ]{0,1}([А-ЯA-Z])([. ]{1})[ ]{0,1}([А-ЯA-Z][А-Яа-яA-Za-z]*)/", '\1. \3. \5', $guesttext);
   // Пушкин А. С.
   $guesttext = preg_replace ("/([А-ЯA-Z][А-Яа-яA-Za-z]*) ([А-ЯA-Z])[. ]{1}[ ]{0,1}([А-ЯA-Z]).([, )]{1})/", '\1 \2. \3.\4', $guesttext);
   // преобразовываем адреса в ссылки!
   $guesttext = eregi_replace("([_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,3}))", "<a href="mailto:\0">\0</a>", $guesttext); 
   $guesttext = eregi_replace("((ht|f)tp://www.|www.)([a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,3})((/|?)[a-z0-9~#%&\/'_+=:?.-]*)*)", "http://www.\3", $guesttext);
   $guesttext = eregi_replace("((ht|f)tp://)((([a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,3}))|(([0-9]{1,3}.){3}([0-9]{1,3})))((/|?)[a-z0-9~#%&'_+=:?.-]*)*)", "<a href="\0" target="_top">\0</a>", $guesttext);

   // делаем "обрезание" слишком большого куска информации
   $name=substr($name,0,$name_max_size);
   $email=substr($email,0,$email_max_size);
   $guesttext=substr($guesttext,0,$message_max_size);

   // BBcodes
   $guesttext = ereg_replace("[b]", "<b>", $guesttext);
   $guesttext = ereg_replace("[/b]", "</b>", $guesttext);
   $guesttext = ereg_replace("[i]", "<i>", $guesttext);
   $guesttext = ereg_replace("[/i]", "</i>", $guesttext);
   $guesttext = ereg_replace("[u]", "<u>", $guesttext);
   $guesttext = ereg_replace("[/u]", "</u>", $guesttext);
   $guesttext = ereg_replace("[red]", "<font color="red">", $guesttext);
   $guesttext = ereg_replace("[/red]", "</font>", $guesttext);
   $guesttext = ereg_replace("[green]", "<font color="green">", $guesttext);
   $guesttext = ereg_replace("[/green]", "</font>", $guesttext);
   $guesttext = ereg_replace("[blue]", "<font color="blue">", $guesttext);
   $guesttext = ereg_replace("[/blue]", "</font>", $guesttext);
   $guesttext = ereg_replace("[yellow]", "<font color="yellow">", $guesttext);
   $guesttext = ereg_replace("[/yellow]", "</font>", $guesttext);

   // отправка сообщения на мой электронный адрес
   // сообщение
   $message .="".$date.", ".$time." n";
   $message .="Имя: ".$name.", e-mail: ".$email."nСообщениеn";
   $message .="".$guesttext."n ";
   $message .="----------rn";
   $message .="Сообщение из гостевой книги";
   // заголовки
   $headers .="From: $site_name <$recipient>n";
   $headers .="X-Mailer: Pseon’s Guestbookn";
   $headers .="X-Priority: 1n";
   $headers .="Content-Type: text/plain; charset=windows-1251n";

   // отправляем все нафиг!
   mail($recipient, $subject, $message, $headers);
   $msg="$name:::$email:::$date:::$time:::$guesttext ";
   $lines = file("guestbook.inc.dat");
   $fp = fopen("guestbook.inc.dat", "w");
   fwrite($fp, "$msgn");
  for ($i = 0; $i < count($lines); $i++)
   {
      @fwrite($fp, "$lines[$i]");
   }
   fclose($fp);
   clearstatcache();
}
// если не удалось, отсылаем его обратно!
else
{
   header("Location: gb.php");
}
?>

<!-- какой то умник пытается нас сломать :) пошел он на индекс :) -->
<html>
<body onload='window.location="gb.php?page=0"'>
</html>

Ну а теперь банановый 🙂 На закуску хочу предложить вам набор BB-codes, которые помогут вашим посетителям несколько разнообразить сообщения в гостевых книгах 🙂

  • [i]test[/i] — наклонный;
  • [b]test[/b] — жирный;
  • [u]test[/u] — подчеркнутый;
  • [red]test[/red] — красный;
  • [blue]test[/blue] — синий;
  • [green]test[/green] — зеленый;
  • [yellow]test[/yellow] — желтый.

И еще! «Шура, я вас умоляю»(с), если у вас что-то не получилось, не надо обвинять автора в криворукости и тупости, ибо я сам только что все проверил, и книга пошла отлично… Попробуйте вернуться к искомому и начните заново…

Подписывайтесь на наши группы в социальных сетях
Подписаться
Уведомить о
19 комментариев
Новые
Старые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
VEROnika

Спасибо. У меня все заработало. Теперь понять бы еще все это...)

Sam

Скажите пожалуйста,как мне запустить теперь все эти файлы???

kotompazb

Спасибо. Со скрипом, но заработало.

Romero

ПРИ ОТПРАВКЕ СООБЩЕНИЯ ВЫДАЁТ ВОТ ЭТО:

HTTP 500 - внутренняя ошибка сервера.

Веб-узел не может отобразить страницу HTTP 500 
 
Возможные причины:

•Веб-узел находится в состоянии обслуживания.
•Программа веб-узла содержит ошибку.

Ячес

А что написать на странице на которй должна появиться гостевая???

Евгений

"Создадим его, оставим пустым, и укажем ему права (0777-*nix, rwx/rwx/rwx)"
Что значит указать ему права?? Как это? Кто знает скиньте плиз на мыло!

Yura

Доброго времени суток Вам.

Warning: include(): URL file-access is disabled in the server configuration in /hsphere/local/home/hptu14/hptu14.com.ua/gb.php on line 7 Warning: include(http://hptu14.com.ua/config.inc): failed to open stream: no suitable wrapper could be found in /hsphere/local/home/hptu14/hptu14.com.ua/gb.php on line 7
Warning: include(): Failed opening 'http://hptu14.com.ua/config.inc' for inclusion (include_path='.:/hsphere/shared/apache/libexec/php5ext/php/') in /hsphere/local/home/hptu14/hptu14.com.ua/gb.php on line 7
Сделал все как Вы описываете но вы ходит вот что http://hptu14.com.ua/gb.php

bekof

Спасибо большое. Сделал гостевую, все работает на ура!!!

Creator

Пожалуйста, создайте тему на форуме, он более приспособен к решению подобных проблем.

JIEIIIUK

Сделал все по иструкции, но вот после нажатия "отправить", открывает gbadd.php и она пустая. файл Помогите решить проблемку))
Заранее благодарен.

Creator

Попробуйте создать в корневом каталоге файл ".htaccess" с содержанием "php_flag register_globals on"
Это костыль, к тому же небезопасный.
Подробнее почитайте здесь: https://www.internet-technologies.ru/articles/register-globals-on-vy-v-opasnosti.html

Alex

Здравсвуйте еще раз, вроде исправил, но появилась другая ошибка, а может это быть из-за того, что на локальном сервере проверяю? теперь ошибка в другой строке вот: $col=$c/$gb_on_page;
не могу понять что это может быть, помогите плизз

Creator

Внес в код необходимые исправления, теперь все должно работать.

Alex

доброго времени суток! подскажите плиззз, у меня в этой строке выдает ошибку в синтаксисе, что делать?
else echo "<i>".($i+1)."</i>"." ";

вроде делал все как написано 🙁

Nika

Спасибо! Очень помогла статья! Правда были некоторые недочёты, но всё работает!

muxa, сама поняла не всё, но может пригодиться, вот: http://chmod.ru/