Етап перший: планування.

Для початку визначимося з таблицею 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 і в ній
будуть визначені наступні поля:


Етап другий: скрипт установки


Рядовий користувач може бути незнайомий з 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>
";
mysql_connect($host,$login,$password) or error();
echo "Обираємо базу даних $ database … <br>
";
mysql_select_db($database) or error();
echo "Видаляємо таблицю (якщо існує) $ table … <br>
";
mysql_query ("DROP TABLE IF EXISTS $ table") or error ();
echo "Створюємо нову таблицю $ table … <br>
";
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
$login
$password
$database
$table
$pass");
flock ($ f, LOCK_UN); / / Знімаємо блокування з файлу
fclose($f);
/ / Створимо файл. Htaccess і зазначимо в ньому
/ / Що за замовчуванням потрібно відкривати файл gbook.php
$f=fopen(“.htaccess”,”w”);
flock($f,LOCK_EX);
fputs($f,"DirectoryIndex gbook.php
");
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 MYH: i: s"). "GMT");
}
function my_redirect($url)
/ / Включити перенаправлення
{
echo "<html> <head> <meta Http-equiv="refresh" content=1>
<script language=JavaScript> location ="".$ url .""</ script> </ head> ";
}
$ 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://zolotov.h14.ru> http://zolotov.h14.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://zolotov.h14.ru> http://zolotov.h14.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>"
?>

Ось і весь скрипт. Залишилося тільки встановити і використовувати.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*