Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 12
На сайте нет зарегистрированных пользователей

Пользователей: 13,364
новичок: eqvufy
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

База данных склада на Delphi + Схема БД
Игра Sokoban на Delphi + Блок схемы
Диплом RSA, ЭЦП, сертификаты, шифрование на C#

Пишем скрипт гостевой книги
© Золотов Алексей, 14.02.2005



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

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

?>






Вот и весь скрипт. Осталось только установить и использовать.
Опубликовал Kest November 05 2008 21:41:09 · 0 Комментариев · 13275 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Х. М. Дейтел, П. ...
Программирование ...
ActiveX в Delphi
Illusion
ICQ
Cтатьи Королевств...
De Knop
Delphi 2005 для .NET
TelBook
Пример создания W...
BDEPack
Задача о 8ми ладьях
Анимированное поя...
Программа рисует ...
Print Grid
Стелтинг Стивен, ...
CaptionButton
Dnavigator
Delphi и технолог...
DiZsubmit

Топ загрузок
Приложение Клие... 100774
Delphi 7 Enterp... 97832
Converter AMR<-... 20268
GPSS World Stud... 17014
Borland C++Buil... 14191
Borland Delphi ... 10290
Turbo Pascal fo... 7373
Калькулятор [Ис... 5984
Visual Studio 2... 5207
Microsoft SQL S... 3661
Случайные статьи
5.1. От псевдокода...
Выравнивание текст...
Паскаль сегодня
15.4. Принципы Зад...
Процедура GetAspec...
Правильная настрой...
Сайты для обмена и...
Работа с фильтрами...
Университет
Wildcard О.О.О.О. ...
Службы
Уровень статей раз...
Знаки пунктуации
Стеки как структур...
SAVEVALUE (СОХРАНИ...
Клуб Вулкан снова ...
Система SVR4
Project
Уборка коттеджей
Динамические БД в ...
Рабочие нагрузки
Разработать резиде...
Кодирование инстру...
Простой метаинтерп...
Как сделать так, ч...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?