| |
Создание гостевой книги на PHP
Как создать гостевую книгу? На тему создания гостевых книг было написано
большое количество статей, однако большинство из них раскрывали
процесс написания не полностью, а частично. К тому же,
написанные книги были максимально просты, и не могли ничего,
кроме как добавлять сообщения. В данной статье я постараюсь
подробно описать процесс создания гостевой книги с неплохим
набором функций. Гостевая книга написана на PHP с использованием
текстовых файлов для хранения данных.
Итак, прежде всего нам необходимо разобраться с файлами. Их у
нас будет четыре, хотя можно объединить и в один, но это уже вам
решать...
Файл №1 - guestbook.inc.dat
Создадим его, оставим пустым, и укажем ему права (0777-*nix, rwx/rwx/rwx)
Сюда будут записываться все сообщения... Да-да!!! Именно в один
файл! Но не пугайтесь :) Мной лично проверялось на всеми
известном сервере WallSt. база данных размером в 5, 10, 100,
250, 500, 1000 Кб! Торможения были только на 1000 Кб книге,
поверьте, это более 3000 средних записей! Вам хватит ее с лихвой
:)
Файл №2 - config.inc :
<?
$gb_on_page = "10";//кол-во мессаг в гостевой на стр.
$name_max_size = "15"; // максимальная длина ника
$email_max_size = "50"; // максимальная длина мыла
$message_max_size = "1000";//максимальная длина сообщения
$recipient ="Name.Sirname@email.zone";
$subject = "Новое сообщение на сайте";
$site_name = "Ваш сайт";
?>
Файл №3 - gb.php :
<html>
<head>
<title>Guestbook</title>
</head>
<body>
<!-- включаем вышеописанный файл -->
<? include('config.inc'); ?>
<!-- пишем форму для добавки сообщений -->
<!-- ниже указываем в свойствах формы защиту от повторного
нажатия кнопки Submit -->
<form onSubmit="newmsg.Submit.disabled='true'" name='newmsg'
action='gbadd.php' method=post>
<!-- для всех трех полей устанавливаются максимально возможные
размеры для полей имени, адреса электронной почты и сообщения
-->
*Имя:<input type=text maxlength="<? echo $name_max_size; ?>"
name=name><br>
E-mail:<input type=text maxlength="<? echo $email_max_size; ?>"
name=email><br>
*Сообщение:<br><textarea maxlength="<? echo $message_max_size;
?>" name=guesttext cols=42 rows=10></textarea><br>
<!-- ниже указано, что при нажатии кнопки Submit она станет
недоступна, и взамен ее появится кнопка с надписью "ждите!!!"
-->
<input type="Submit" onClick="newmsg.Submit.value='ждите!!!'"
name="Submit" value="Отправить">
<input type="reset" value="Стереть"></form>
<!-- думаете это весь файл? :) нет, ошибаетесь… Сейчас начнется
самое интересное! -->
<?
$data=file("guestbook.inc.dat");
$c=count($data);
if (!isset($page)) { $page=0; }
for ($i=$page*$gb_on_page;$i<$page*$gb_on_page+$gb_on_page;$i++)
{
if($i>$c-1)break;
list($name,$email,$date,$time,$guesttext)=split(":::","$data[$i]",
5);
/* я нарочно не стал делать супер_мега_навороченных дизайнов, я
лишь ограничусь простым выводом текста! Кому надо, тот легко
поймет, что нужно делать! Кто не поймет, мыло будет ниже, посему
читайте дальше… */
echo "<a href=\"mailto:$email\">$name</a> @ [$date, $time]<br>$guesttext<br><hr>";
}
$col=$c/$gb_on_page;
echo "<center>";
if ($c<$gb_on_page){ echo ""; }
else {
echo "<b>Страницы: </b>";
/* Здесь такая штука, что если можно перейти на предыдущую
страницу, то показывается примерно что то вроде этого :) << [1]
2 */
if($c>$gb_on_page & $page>0){ echo "<a href=\"gb.php?page=".($page-1)."\"><<</a>";
}
/* Ниже функция, которая отвечает за вывод нумерации страниц с
сообщениями… */
for($i=0;$i<$col;$i++)
{
if(($i)!=$page)echo "[<a href=\"gb.php?page=$i\">".($i+1)."</a>]
";
else echo "<b><i>".($i+1)."</b></i>"." ";
}
}
/* Здесь такая штука, что если можно перейти на следующую
страницу, то показывается примерно что то вроде этого :) 1 [2]
>>*/
if($c>$gb_on_page & $page<$col-1){ echo "<a href=\"gb.php?page=".($page+1)."\">>></a>";
}
echo "<br>Всего сообщений: $c";
echo "</center></font>";
?>
<!-- Уффффффффффф. Все! С этим файлом покончили, но остался
главный, отвечающий собственно за добавление сообщения в
гостевую книгу -->
</body>
</html>
Файл №4 -- gbadd.php :
<?
include('config.inc');
/* укажем, что данные должны передаться скрипту из формы...
иначе можно было бы отправить сообщение примерно таким образом:
http://myhost.ru/gb/gbadd.php?name=admine&email=you@#admin.
com&guesttext=message_have_been_posted
спасибо CompDocs */
$name=$_POST['name'];
$email=$_POST['email'];
$guesttext=$_POST['guesttext'];
if ($name !="" and $guesttext !="")
{
$date=date('d.m.Y');
$time=date('H:i');
// заменяем двоеточия
$guesttext = ereg_replace(":::",":::",$guesttext);
$name = ereg_replace(":::",":::",$name);
$email = ereg_replace(":::",":::",$email);
// разрешим только шрифты, картинки и списки
// теги как украшение
$guesttext = ereg_replace("<", "<", $guesttext);
$guesttext = ereg_replace(">", ">", $guesttext);
$name = ereg_replace("<", "<", $name);
$name = ereg_replace(">", ">", $name);
$email = ereg_replace("<", "<", $email);
$email = ereg_replace(">", ">", $email);
// нет кавычкам! 2=DeaD= thanX!
$name = ereg_replace("\"", """, $name);
$email = ereg_replace("\"", """, $email);
$guesttext = ereg_replace("\"", """, $guesttext);
// удаление лишних пробелов
// в центре
$guesttext=ereg_replace(" +"," ",$guesttext);
$name=ereg_replace(" +"," ",$name);
$email=ereg_replace(" +"," ",$email);
//cправа и слева
$name=trim($name);
$email=trim($email);
$guesttext=trim($guesttext);
// перевод строки
$guesttext = ereg_replace("\n", "<br>", $guesttext);
// чтобы весь текст был на одной строке!
$guesttext = ereg_replace("\r", "", $guesttext);
// мегакавычки
$name = stripslashes($name);
$email = stripslashes($email);
$guesttext= stripslashes($guesttext);
// правильные тире
$guesttext = preg_replace ("/[ ]{1,}-[ ]{1,}/", " - ",
$guesttext);
$guesttext = preg_replace ("/^- /", "- ", $guesttext);
// число-число
$guesttext = preg_replace ("/(\d)-(\d)/", "\\1-\\2", $guesttext);
// слова с дефисом
$guesttext = preg_replace ("/(\S+)-(\S+)/", "<nobr>\\1-\\2</nobr>",
$guesttext);
// частицы и предлоги
$guesttext = preg_replace ("/([А-Яа-яA-Za-z]) (ли|ль|же|ж|бы|б)([^А-Яа-яA-Za-z])/",
'\\1 \\2\\3', $guesttext);
$guesttext = preg_replace ("/(\s)([А-Яа-я]{1})\s/", '\\1\\2 ',
$guesttext);
// A.C. Пушкин
$guesttext = preg_replace ("/([А-ЯA-Z])([\. ]{1})[ ]{0,1}([А-ЯA-Z])([\.
]{1})[ ]{0,1}([А-ЯA-Z][А-Яа-яA-Za-z]*)/", '\\1. \\3. \\5',
$guesttext);
// Пушкин А. С.
$guesttext = preg_replace ("/([А-ЯA-Z][А-Яа-яA-Za-z]*) ([А-ЯA-Z])[\.
]{1}[ ]{0,1}([А-ЯA-Z])\.([,\ )]{1})/", '\\1 \\2. \\3.\\4',
$guesttext);
// преобразовываем адреса в ссылки!
$guesttext = eregi_replace("([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3}))",
"<a href=\"mailto:\\0\">\\0</a>", $guesttext); $guesttext =
eregi_replace("((ht|f)tp://www\.|www\.)([a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})((/|\?)[a-z0-9~#%&\\/'_\+=:\?\.-]*)*)",
"http://www.\\3", $guesttext);
$guesttext = eregi_replace("((ht|f)tp://)((([a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3}))|(([0-9]{1,3}\.){3}([0-9]{1,3})))((/|\?)[a-z0-9~#%&'_\+=:\?\.-]*)*)",
"<a href=\"\\0\" target=\"_top\">\\0</a>", $guesttext);
// делаем "обрезание" слишком большого куска информации
$name=substr($name,0,$name_max_size);
$email=substr($email,0,$email_max_size);
$guesttext=substr($guesttext,0,$message_max_size);
// BBcodes
$guesttext = ereg_replace("\[b\]", "<b>", $guesttext);
$guesttext = ereg_replace("\[\/b\]", "</b>", $guesttext);
$guesttext = ereg_replace("\[i\]", "<i>", $guesttext);
$guesttext = ereg_replace("\[\/i\]", "</i>", $guesttext);
$guesttext = ereg_replace("\[u\]", "<u>", $guesttext);
$guesttext = ereg_replace("\[\/u\]", "</u>", $guesttext);
$guesttext = ereg_replace("\[red\]", "<font color=\"red\">",
$guesttext);
$guesttext = ereg_replace("\[\/red\]", "</font>", $guesttext);
$guesttext = ereg_replace("\[green\]", "<font color=\"green\">",
$guesttext);
$guesttext = ereg_replace("\[\/green\]", "</font>", $guesttext);
$guesttext = ereg_replace("\[blue\]", "<font color=\"blue\">",
$guesttext);
$guesttext = ereg_replace("\[\/blue\]", "</font>", $guesttext);
$guesttext = ereg_replace("\[yellow\]", "<font
color=\"yellow\">", $guesttext);
$guesttext = ereg_replace("\[\/yellow\]", "</font>", $guesttext);
// отправка сообщения на мой электронный адрес
// сообщение
$message .="".$date.", ".$time." \n";
$message .="Имя: ".$name.", e-mail: ".$email."\nСообщение\n";
$message .="".$guesttext."\n ";
$message .="----------\r\n";
$message .="Сообщение из гостевой книги";
// заголовки
$headers .="From: $site_name <$recipient>\n";
$headers .="X-Mailer: Pseon's Guestbook\n";
$headers .="X-Priority: 1\n";
$headers .="Content-Type: text/plain; charset=windows-1251\n";
// отправляем все нафиг!
mail($recipient, $subject, $message, $headers);
$msg="$name:::$email:::$date:::$time:::$guesttext ";
$lines = file("guestbook.inc.dat");
$fp = fopen("guestbook.inc.dat", "w");
fwrite($fp, "$msg\n");
for ($i = 0; $i < count($lines); $i++)
{
@fwrite($fp, "$lines[$i]");
}
fclose($fp);
clearstatcache();
}
// если не удалось, отсылаем его обратно!
else
{
header("Location: gb.php");
}
?>
<!-- какой то умник пытается нас сломать :) пошел он на индекс
:) -->
<html>
<body onload='window.location="gb.php?page=0"'>
</html>
Ну а теперь банановый :) На закуску хочу предложить вам набор
BB-codes, которые помогут вашим посетителям несколько
разнообразить сообщения в гостевых книгах :)
[i]test[/i] - наклонный
[b]test[/b] - жирный
[u]test[/u] - подчеркнутый
[red]test[/red] - красный
[blue]test[/blue] - синий
[green]test[/green] - зеленый
[yellow]test[/yellow] - желтый
И еще! "Шура, я вас умоляю"(с), если у вас что-то не получилось,
не надо (*Предупреждение! Не удалите эту ссылку:
любопытные статьи, шокирующие факты, развлечении:
http://tebea.ru *).
обвинять автора в криворукости и тупости, ибо я сам
только что все проверил, и книга пошла отлично… Попробуйте
вернуться к искомому и начните заново… А для тех, у кого совсем
ничего не получилось, скачайте архив книги отсюда: http://pseon.dax.ru/scripts/gb.rar
(3670 Bytes)
Автор: Papulovskii S. aka 'pseon'
|
|