Главная » Полезные статьи » Язык PHP » Пишем скрипт гостевой книги
Распечатать статью

Пишем скрипт гостевой книги

В этой статье мы рассмотрим, как написать свою гостевую книгу. И так поставим
цель: простейшую гостевую книгу на 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,"$host\n$login\n$password\n$database\n$table\n$pass");

flock($f,LOCK_UN); // Снимаем блокировку с файла

fclose($f);

// Создадим файл .htaccess и укажем в нем

// что по умолчанию нужно открывать файл gbook.php

$f=fopen('.htaccess','w');

flock($f,LOCK_EX);

fputs($f,"DirectoryIndex gbook.php\n");

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) && ($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) && ($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&id=$f[k_msg]>Ответить</a><br>";

// Ссылка для удаления сообщения

echo "<a href=drop.php?sid=$sid&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>

<h3 align=center>Оставьте свое сообщение</h3>

<table>

<tr><td align=right><b><font color=red>*</font>Имя:</b></td>

<td><input type=text name=Login size=40></td></tr>

<tr><td align=right><b>e-mail:</b></td>

<td><input type=text name=Email size=40></td></tr>

<tr><td align=right><b>URL сайта:</b></td>

<td><input type=text name=Url size=40></td></tr>

<tr><td align=right><b>ICQ:</b></td>

<td><input type=text name=Icq size=40></td></tr>

</table>

<b><font color=red>*</font>Сообщение:</b><br>

<center>

<textarea cols=40 rows=8 name=Msg></textarea><br>

<input type=submit value="Отправить">

</center>

</form>

<div align=center><br>gbook 1.0 beta © Золотов Алексей 2005<br>

<a href=http://zolotov.h14.ru>http://zolotov.h14.ru</a>

</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>

<h3 align=center>Вход в режим модерирования</h3>

<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>

<div align=center><br>gbook 1.0 beta © Золотов Алексей 2005<br>

<a href=http://codingrus.ru>http://codingrus.ru</a></div>

</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>

<h3 align=center>Редактирование сообщения</h3>

<form action=save.php method=post>

<table align=center><tr><td>

<table>

<tr><th align=right>Имя:</th>

<td><input type=edit name=Login value='<?=$name?>'></td></tr>

<tr><th align=right>E-Mail:</th>

<td><input type=edit name=Email value='<?=$email?>'></td></tr>

<tr><th align=right>ICQ:</th><td>

<input type=edit name=Icq value='<?=$icq?>'></td></tr>

<tr><th align=right>Сайт:</th><td>

<input 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>

<div align=center><br>gbook 1.0 beta © Золотов Алексей 2005<br>

<a href=http://codingrus.ru>http://codingrus.ru</a></div>

</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>"

?>

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

Источник:   codingrus.ru

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

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

Похожие статьи