В этой статье мы рассмотрим, как написать свою гостевую книгу. И так поставим цель: простейшую гостевую книгу на PHP с использованием базы данных MySQL. Наша гостевая не будет обременена красивым интерфейсом и защитой, главное, чтобы она работала. Приведенные здесь скрипты основаны на скриптах мой гостевой книги, но значительно упрощены для лучшего понимания принципа работы скриптов, а все остальное: форматирование текста, смайлы, скины и пр. можно легко добавить. Скачать готовые скрипты можно здесь. Этап первый: планирование.
Для начала определимся с таблицей MySQL, в которой мы будем хранить сообщения нашей гостевой книги. Нам хватит одной таблицы. Основные параметры, которые должны быть в любой гостевой это имя, сообщение и дата, когда было оставлено сообщение. Но мы введем еще пару полей: адрес электронной почты, url сайта, и ICQ. Исходя из этого нам нужно составить SQL-запрос, создающий нужную нам таблицу. Он будет выглядеть так:
Что же мы сделали. Этот запрос создаст таблицу 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
Вот и все. Это самое основное, осталось сделать панель модерирования гостевой книги, чтобы можно было легко удалять и редактировать оставленные сообщения. Для входа в режим администрирования создадим отдельный скрипт. Когда пользователь вводит пароль, то на основе его и текущей даты генерируется код сессии, если переданный в скрипт код сессии правильный, то считается, что зашел администратор, и ему открываются все возможности. admin.php
В главном скрипте в режиме администратора мы создали ссылки для редактирования и удаления сообщений. Для начала приведу скрипт для удаления сообщения - он короче. 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