В этой статье мы рассмотрим, как написать свою гостевую книгу. И так поставим цель: простейшую гостевую книгу на 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(); ?>
|