В этой статье мы рассмотрим, как написать свою гостевую книгу. И так поставим цель: простейшую гостевую книгу на 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) && ($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> < 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 обязательна!
Оставить комментарий
Вы должны войти, чтобы оставить комментарий.