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

Этап первый: планирование.
Для начала определимся с таблицей MySQL, в которой мы будем хранить сообщения нашей гостевой книги. Нам хватит одной таблицы. Основные параметры, которые должны быть в любой гостевой это имя, сообщение и дата, когда было оставлено сообщение. Но мы введем еще пару полей: адрес электронной почты, url сайта, и ICQ. Исходя из этого нам нужно составить SQL-запрос, создающий нужную нам таблицу. Он будет выглядеть так:

  CREATE TABLE $table(
    k_msg int primary key auto_increment,
    guest varchar(20),
    email varchar(40),
    url varchar(60),
    icq varchar(15),
    time int,
    msg mediumtext,
    replay mediumtext

Что же мы сделали. Этот запрос создаст таблицу gbook и в ней будут определены следующие поля:

k_msg - уникальный номер сообщения, первичный ключ таблицы, он нам понабиться, когда мы будем работать над панелью модерирования нашей гостевой.
guest - имя гостя, 30 символов должно быть достаточно, но при желании можно и увеличить;
email - адрес электронной почты гостя;
url - URL-адрес сайта;
icq - аська гостя;
time - время, когда было оставлено сообщение;
msg - собственно сообщение. Тип mediumtext позволяет хранить текст размером до 64Кб;
replay - ответное сообщение от администратора.

Этап второй: скрипт установки
Рядовой пользователь может быть незнаком с PHP или MySQL, по этому мы не будем его обременять ручным созданием нужной нам таблицы и настройки нашей гостевой книги. Поэтому нам нужен инсталляционный скрипт который все сделает за него (и за нас тоже). Наш инсталляционный скрипт должен запросить у пользователя основные параметры у пользователя, подключиться к базе данных, создать таблицу и конфигурационный файл нашей гостевой книги.

install.php

< html>
< head>< title>Установка гостевой книги< /title>< /head>
< body>
< h2>Установка гостевой книги< /h2>
< form action=< ?=$SCRIPT_NAME?> method=post>
< table>
< tr>< td align=right>Хост:< /td>
< td align=left>< input type=text name=host value=< ?=$host?>>< /td>< /tr>
< tr>< td align=right>Логин:< /td>
< td align=left>< input type=text name=login value=< ?=$login?>>< /td>< /tr>
< tr>< td align=right>Пароль:< /td>
< td aling=left>< input type=password name=password>< /td>< /tr>
< tr>< td align=right>База:< /td>
< td align=left>< input type=text name=database value=< ?=$database?>>< /td>< /tr>
< tr>< td align=right>Таблица:< /td>
< td align=left>< input type=text name=table value=< ?=$table?>>< /td>< /tr>
< tr>< td align=right>Пароль админа:< /td>
< td align=left>< input type=password name=pass>< /td>< /tr>
< /table>
< input type=submit name=go value="Install">
< /form>
< ?
function error()
// Выводим сообщение об ощибке и выходим
{
  echo "Error #".mysql_errno().": ".mysql_error();
  exit;
}
if(isset($go)):// Если пользователь передал параметры
echo "Полключаемся к MySQL...< br>n";
mysql_connect($host,$login,$password) or error();
echo "Выбираем базу данных $database...< br>n";
mysql_select_db($database) or error();
echo "Удаляем таблицу (если существует) $table...< br>n";
mysql_query("DROP TABLE IF EXISTS $table") or error();
echo "Создаем новую таблицу $table...< br>n";
mysql_query("
  CREATE TABLE $table(
    k_msg int primary key auto_increment,
    guest varchar(20),
    email varchar(40),
    url varchar(60),
    icq varchar(15),
    time int,
    msg mediumtext,
    replay mediumtext
  )") or error();
// Создадим файл конфигурации и запишим в него
// параметры подключения и пароль модератороа гостевой
$f=fopen('gbook.conf','w');
flock($f,LOCK_EX); // Исключительная блокировка файла
fputs($f,"$hostn$loginn$passwordn$databasen$tablen$pass");
flock($f,LOCK_UN); // Снимаем блокировку с файла
fclose($f);
// Создадим файл .htaccess и укажем в нем
// что поумолчанию нужно открывать файл gbook.php
$f=fopen('.htaccess','w');
flock($f,LOCK_EX);
fputs($f,"DirectoryIndex gbook.phpn");
flock($f,LOCK_UN);
fclose($f);
// Установим права на чтение/запись
// только для владельца
exec('chmod 600 gbook.conf');
exec('chmod 600 install.php');
// Все сделано можно перейти на готовую гостевую
echo "< b>Инсталяция завершена< /b>< br>";
echo "< a href=gbook.php>Гостевая книга< /a>";
endif;
?>
< /body>
< /html>

Замечание. После создания конфигурационного файла мы выставляем на него права для чтения и записи только для хозяина. Это сделано для того, чтобы злоумышленник не смог прочесть наш файл конфигурации: в нем мы храним параметры подключения к базе данных и пароль модератора гостевой книги. Данная защита будет работать только на Unix/Linux хостинге. Для Windows-хостинга нужна другая защита, но приведенные команды не должны порождать ошибок.

Этап третьий: отображение гостевой книги
ЗЗдесь мы рассмотрим скрипт, отображающий нашу гостевую книгу. Мы в нескольких скриптах будем выполнять ряд одинаковых действий и, чтобы не повторяться вынесем их в один файл gbook.lib.

gbook.lib

< ?
function htmltrim($str)
{ // Просто для краткости
  return HtmlSpecialChars(trim($str));
}
function error($msg)
// Выведм сообщение об ощибке и остановим скрипт
{
  echo "< b>Ошибка:< /b> $msg";
  exit;
}
function my_error()
// Ошибка MySQL
{
  echo "< b>Ошибка MySQL< /b> #".mysql_errno().": ".mysql_error()."< /b>< br>";
  exit;
}
function my_no_cache()
// Отключить кеширование страницы
{
  Header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
  Header("Cache-Control: no-cache, must-revalidate");
  Header("Pramga: no-cache");
  Header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
}
function my_redirect($url)
// Включить перенаправление
{
  echo '< html>< head>< meta http-equiv="refresh" content=1>
  < script language=JavaScript>location="'.$url.'"< /script>< /head>< /html>';
}
$MY_MONTH_RU=array('января','февраля','марта','апреля','мая',
  'июня','июля','августа','сентября','октября','ноября','декабря');
function my_date($d)
// Форматирвание даты
{
  global $MY_MONTH_RU;
  return date("j ",$d).$MY_MONTH_RU[date("m",$d)-1].date(" Y - H:i:s",$d);
}
function gbook_init()
// Инициализация
{
// Объявим глобальные переменные
global $table, $admin;
// Прочитаем праметры подключения к БД
$f=@fopen('gbook.conf','r') or error("< b>Нет файла конфигурации< /b>");
flock($f,LOCK_SH);
$host=trim(fgets($f));
$login=trim(fgets($f));
$password=trim(fgets($f));
$database=trim(fgets($f));
$table=trim(fgets($f));
$pass=trim(fgets($f));
flock($f,LOCK_UN);
fclose($f);
// Подключаемся к БД
mysql_connect($host,$login,$password) or my_error();
mysql_select_db($database) or my_error();
// Проверим пароль
if(isset($_GET['sid']) || isset($_POST['sid']) || isset($_COOKIE['sid']))
{
  if(isset($_POST['sid'])) $sid=$_POST['sid'];
  elseif(isset($_GET['sid'])) $sid=$_GET['sid'];
  else $sid=$_COOKIE['sid'];
  @SetCookie("sid",$sid,time()+60*15);
  $admin=($sid===md5($pass.date('dmYH')));
}
}
my_no_cache();
?>

Итак собственно скрипт отображающий гостевую книгу:

gbook.php

< ?
require_once "gbook.lib";
gbook_init();
// Выберем все сообщения из таблицы
// записи сортируем по убыванию времени:
// от последних сообщений к первым
$r=mysql_query("select k_msg, guest, email, url, icq, time,
  msg, replay from $table order by time desc") or my_error();
$pgsz=8; // Количество сообщений на страницу
$pgbar=''; // Здесь будет сформирован текст ссылок на страницы
if(!isset($pg))$pg=0; // По умолчанию с первого сообщения
$rows=mysql_num_rows($r); // Число записей = число сообщений
$pgcnt=$rows/$pgsz; // Число страниц
// Формируем строку страниц
for($i=0;$i< $rows;$i+=$pgsz)
  if( ($i>=$pg) &#038;& ($i< ($pg+$pgsz)) )
    $pgbar.=($i/$pgsz+1);
  else
    $pgbar.="< a href=gbook.php?pg=$i>".($i/$pgsz+1)."< /a> ";
?>
< html>
< head>
< title>Гостевая книга< /title>
< meta http-equiv=Content-Type content="text/html; charset=windows-1251">
< /head>
< body>
< h2 align=center>Гостевая книга< /h2>
< div align=center>< ?=$pgbar?>< /div>
< table width=100% border=1>
< ?
// Выведем сообщения
$i=0;
while($f=mysql_fetch_array($r))
{
  if( ($i>=$pg) &#038;& ($i< ($pg+$pgsz)) )
  {
    echo "< tr>< td align=center valign=top width=25%>";
    echo htmltrim($f['guest'])."< br>";
    $email=htmltrim($f['email']);
    $href='mailto:'.$email;
    echo "< a href=$href>$email< /a>< br>";
    $url=htmltrim($f['url']);
    echo "< a href=$url>$url< /a>< br>";
    echo "ICQ: ".htmltrim($f['icq'])."< br>";
    echo my_date($f['time']);
    echo "< /td>";
    $mes=nl2br(htmltrim($f['msg']));
    echo "< td align=left valign=top>$mes";
    $replay=nl2br(htmltrim($f['replay']));
    if($replay):
      echo "< hr>$replay";
    endif;
    echo "< /td>";
    if($admin):
      // А это только для адмнистратора
      echo "< td width=10% align=center valign=top>";
      // Ссылка для редактирования сообщения
      echo "< a href=replay.php?sid=$sid&#038;id=$f[k_msg]>Ответить< /a>< br>";
      // Ссылка для удаления сообщения
      echo "< a href=drop.php?sid=$sid&#038;id=$f[k_msg]>Удалить< /a>";
      echo "< /td>";
    endif;
    echo "< /tr>";
  }
  $i++;
  if($i>=($pg+$pgsz)) break;
}
?>
< /table>
< div align=center>< ?=$pgbar?>< /div>
< table align=center>< tr>< td>
< form action="post.php" name=frm method=post>
< H2 align=center>Оставьте свое сообщение< /H2>
< table>
< tr>< td align=right>< b>< font color=red>*< /font>Имя:< /b>< /td>
< td>< input class=e type=text name=Login size=40>< /td>< /tr>
< tr>< td align=right>< b>e-mail:< /b>< /td>
< td>< input class=e type=text name=Email size=40>< /td>< /tr>
< tr>< td align=right>< b>URL сайта:< /b>< /td>
< td>< input class=e type=text name=Url size=40>< /td>< /tr>
< tr>< td align=right>< b>ICQ:< /b>< /td>
< td>< input class=e type=text name=Icq size=40>< /td>< /tr>
< /table>
< b>< font color=red>*< /font>Сообщение:< /b>< br>
< center>
< textarea class=t cols=40 rows=8 name=Msg>< /textarea>< br>
< input type=submit value="Отправить">
< /center>
< /form>
< /div>
< /body>
< /html>

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

admin.php

< ?
$addr=dirname($SCRIPT_NAME);
if($addr=='/')$addr='/gbook.php'; else $addr.='/gbook.php';
$addr="http://".$SERVER_NAME.$addr;
require_once "gbook.lib";
if(isset($pass))
{
  my_redirect($addr."?sid=".md5($pass.date('dmYH')));
  exit;
}
?>
< html>
< head>
< title>Гостевая книга< /title>
< meta http-equiv=Content-Type content="text/html; charset=windows-1251">
< /head>
< body>
< H2 align=center>Вход в режим модерирования< /H2>
< form action=admin.php method=post>
< table align=center>< tr>< td>
< b>Введите пароль:< /b>
< input type=password name=pass>
< input type=submit value="Войти">
< /td>< /tr>< /table>< /form>
< /body>
< /html>

В главном скрипте в режиме адмнистратора мы создали ссылки для редактирования и удаления сообщений. Для начала приведу скрипт для удаления сообщения - он короче.

drop.php

< ?
require_once "gbook.lib";
$id=trim($id);
gbook_init();
if(!$admin) error("Отказано в доступе");
if(!$id) error("Незадан идентификатор удаляемого собщения< b>id< /b>");
// Удалим сообщение
mysql_query("delete from $table where k_msg=$id") or my_error();
$addr=dirname($SCRIPT_NAME);
if($addr==='/') $addr.='gbook.php'; else $addr.='/gbook.php';
$addr="http://".$SERVER_NAME.$addr;
my_redirect($addr);
echo "< b>Сообщение удалено. < a href=$addr>Назад< /a>< /b>"
?>

А теперь скприпт, отображающий страницу для редактирования сообщения.

replay.php

< ?
require_once "gbook.lib";
$id=trim($id);
gbook_init();
if(!$admin) error("Отказано в доступе");
if(!$id) error("Незадан идентификатор редактируемого собщения< b>id< /b>");
$r=mysql_query("select k_msg, guest, email, url, icq, time, msg, replay
  from $table where k_msg=$id") or my_error();
if(mysql_num_rows($r)==0) error("Сообщения с id=$id нет в гостевой таблице");
$f=mysql_fetch_array($r);
$name=htmltrim($f['guest']);
$email=htmltrim($f['email']);
$url=htmltrim($f['url']);
$icq=htmltrim($f['icq']);
$msg_n=htmltrim($f['k_msg']);
$replay=htmltrim($f['replay']);
$msg=htmltrim($f['msg']);
$date=my_date($f['time']);
?>
< html>
< head>
< title>Гостевая книга< /title>
< meta http-equiv=Content-Type content="text/html; charset=windows-1251">
< /head>
< body>
< H2 align=center>Редактирование сообщения< /H2>
< form action=save.php method=post>
< table align=center>< tr>< td>
< table>
< tr>< th align=right>Имя:< /th>
< td>< input class=e type=edit name=Login value='< ?=$name?>'>< /td>< /tr>
< tr>< th align=right>E-Mail:< /th>
< td>< input class=e type=edit name=Email value='< ?=$email?>'>< /td>< /tr>
< tr>< th align=right>ICQ:< /th>< td>
< input class=e type=edit name=Icq value='< ?=$icq?>'>< /td>< /tr>
< tr>< th align=right>Сайт:< /th>< td>
< input class=e type=edit name=Url value='< ?=$url?>'>< /td>< /tr>
< tr>< th align=right>Дата:< /th>< td>< ?=$date?>< /td>< /tr>
< /table>
< /td>< td>
< b>Сообщение:< /b>< br>
< textarea cols=40 rows=10 name=Msg>< ?=$msg?>< /textarea>< br>
< b>Ответ:< /b>< br>
< textarea cols=40 rows=10 name=Replay>< ?=$replay?>< /textarea>
< /td>< /tr>< /table>
< input type=hidden name=sid value=< ?=$sid?>>
< input type=hidden name=id value=< ?=$msg_n?>>
< center>< input type=submit value='Сохранить'>< /center>
< /from>
< /body>< /html>

Сохранение редактированного сообщения происходит в скрипте save.php

save.php

< ?
require_once "gbook.lib";
$Login=trim($Login);
$Email=trim($Email);
$Url=trim($Url);
$Icq=trim($Icq);
$Msg=trim($Msg);
$Replay=trim($Replay);
$k_msg=trim($id);
gbook_init();
if(!$admin) error("Отказано в доступе");
if(!$k_msg) error("Неуказан идентификатор < b>id< /b> сохраняемого сообщения");
if(!$Login || !$Msg) error("Поля < b>Имя< /b> и < b>Сообщение< /b> должны быть заданы");
// Обновим запись
mysql_query("update $table set guest='$Login', email='$Email', url='$Url',
  icq='$Icq', msg='$Msg', replay='$Replay' where k_msg=$k_msg") or my_error();
$addr=dirname($SCRIPT_NAME);
if($addr==='/') $addr.='gbook.php'; else $addr.='/gbook.php';
$addr="http://".$SERVER_NAME.$addr;
my_redirect($addr);
echo "< b>Сообщение отправлено. < a href=$addr>Назад< /a>< /b>"
?>

Вот и весь скрипт. Осталось только установить и использовать.



Постоянные ссылки

При копировании ссылка на TeaM RSN обязательна!

URI

Html (ЖЖ)

BB-код (Для форумов)

Оставить комментарий

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