Главная | Учебник | Статьи | FAQ | Книги | Ссылки |
Гостевая книга на PHP
Последнее время, все чаще и чаще в нашем форуме всплывают вопросы связанные с написанием гостевых книг.
Обычно гостевая книга состоит из двух частей: первая часть выводит записи, а вторая добавляет их.
В рассмотренном примере гостевой книги каждая запись хранится в отдельном файле. Имя файла создается автоматически, и состоит из двух частей - префикса и уникального идентификатора. Префикс нам необходим для того, чтобы отличить наш файл, от любого другого находящегося в том же каталоге (Честно говоря, по хорошему, в том же каталоге больше ничего не должно находиться), а уникальный идентификатор необходим для того, чтобы отличить одну запись от другой, и предоставить возможность сортировки записей.
В нашем случае префикс будет - "rec", а уникальный идентификатор мы получим с помощью функции time(). Функция time() возвращает текущее время, измеренное в числе секунд с эпохи Unix (1 Января 1970 00:00:00 GMT). Конечно, абсолютно уникальное число мы с помощью этой функции мы получить не сможем, но она нас устроит.
Сначала мы рассмотрим исходный текст модуля добавления записи в гостевую книгу.
В переменной $err мы будем хранить сообщения о произошедших ошибках. Если переменная пуста, то ошибок не происходило.
<? $err="";
Если переменная $action не пуста, то значит происходит обращение при котором необходимо добавить запись, иначе необходимо просто вывести форму добавления записи. Переменная $action задается в форме с помощью тега <input type=hidden>
$action=$HTTP_POST_VARS["action"]; if (!empty($action)) {
Первым делом необходимо проверить введено ли сообщение и указан ли его автор.
$name=trim($name); $msg=trim($msg); if (empty($msg)) {$action="";$err=$err."<LI>Вы не ввели сообщение\n";} if (empty($name)) {$action="";$err=$err."<LI>Вы не ввели имя\n";}
после этого мы должны осуществить преобразование введенных данных, проверить их длину. Слишком длинные записи могут сильно испортить внешний вид страницы. Необходимо убрать слеши "\" перед кавычками и заменить специальные символы HTML.
$name=substr($HTTP_POST_VARS["name"],0,32); $name=htmlspecialchars(stripslashes($name)); $email=substr($HTTP_POST_VARS["email"],0,64); $email=htmlspecialchars(stripslashes($email)); $www=substr($HTTP_POST_VARS["www"],0,64); $www=htmlspecialchars(stripslashes($www)); $city=substr($HTTP_POST_VARS["city"],0,64); $city=htmlspecialchars(stripslashes($city)); $msg=substr($HTTP_POST_VARS["msg"],0,1024); $msg=htmlspecialchars(stripslashes($msg));
Если не произошло ошибок, то можно заменить специальные символы (такие как [b],[i],[u]) на их HTML аналоги (<b>, <i>, <u>)
if (!empty($err)) { $msg=nl2br($msg); $msg=str_replace("[u]","<u>",$msg); $msg=str_replace("[i]","<i>",$msg); $msg=str_replace("[b]","<b>",$msg); $msg=str_replace("[/u]","</u>",$msg); $msg=str_replace("[/i]","</i>",$msg); $msg=str_replace("[/b]","</b>",$msg);
С помощью регулярного выражения заменим запись типа [url]http://www.codenet.ru/[/url] на <a href=http://www.codenet.ru/>http://www.codenet.ru/</a>
$msg=eregi_replace("(.*)\\[url\\](.*)\\[/url\\](.*)", "\\1<a href=\\2>\\2</a>\\3",$msg); $msg=str_replace("\n"," ",$msg); $msg=str_replace("\r"," ",$msg);
Теперь данные готовы к сохранению в файл. Файлы с записями у нас будут храниться в каталоге ./records.
$fp=fopen("records/rec.".time(),"w"); fputs($fp,$name."\n"); fputs($fp,$email."\n"); fputs($fp,$city."\n"); fputs($fp,$www."\n"); fputs($fp,$msg."\n"); fclose($fp);
Все действия произведены, и мы можем смело отправить пользователя на главную страницу гостевой книги, где он сможет увидеть свою запись.
print "<HTML><HEAD>\n"; print "<META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.php'>\n"; print "</HEAD></HTML>\n"; } }
Если переменная $action пуста, то выводим форму добавления записи
if (empty($action)) { ?> <HTML> <HEAD> <TITLE>Гостевая книга - добавить запись</TITLE> </HEAD> <BODY> <? if (!empty($errro)) { print "<P>Во время добавления записи произошли следующие ошибки: </P>\n"; print "<UL>\n"; print $err; print "</UL>\n"; } ?> <H3>Добавление записи.</H3> <center> <table width=1 border=0> <form action=add.php method=post> <input type=hidden name=action value=post> <tr><td width=50%>Имя<font color=red><sup>*</sup></font>:</td> <td align=right> <input type=text name=name maxlength=32 value='<? echo $name; ?>'></td></tr> <tr><td width=50%>E-Mail:</td> <td align=right> <input type=text name=email maxlength=64 value='<? echo $email; ?>'></td></tr> <tr><td width=50%>Домашняя страница (WWW):</td> <td align=right> <input type=text name=www maxlength=64 value='<? echo $www; ?>'></td></tr> <tr><td width=50%>Город:</td> <td align=right> <input type=text name=city maxlength=64 value='<? echo $city; ?>'></td></tr> <tr><td colspan=2>Сообщение<font color=red><sup>*</sup></font>:<br> <textarea cols=50 rows=8 name=msg><? echo $msg; ?></textarea></td></tr> <tr><td colspan=2><input type=submit value='Добавить'></td></tr> </form> </table> </center> <P>Используйте размету для [b]<B>выделения текста</B>[/b] и вставки [url]гиперссылок[/url] </P> </BODY> </HTML> <? } ?>
Теперь рассмотрим модуль, ответственный за вывод записей гостевой книги.
<HTML> <HEAD> <TITLE>Гостевая книга</TITLE> </HEAD> <BODY> <?
Первым делом, с помощью объекта dir, считаем содержимое каталога, в котором у нас хранятся записи. Все идентификаторы записей мы сохраним в массив, для его последующей сортировки.
$d = dir("records"); $i=0; while($entry=$d->read()) { if (substr($entry,0,3)=="rec") { $names[$i]=substr($entry,4); $i++; } } $d->close();
Сортируем массив
@rsort($names); $count=$i; $cnt=$count; if (empty($start)) $start=0; $start=intval($start); if ($start<0) $start=0;
Выводим ссылки навигации по гостевой книги "Предыдущие" и "Следующие"
print "<center>"; if ($count>$start+10) $count=$start+10; if ($start!=0) print "[ <A href=index.php?start=".($start-10).">Предыдущие</A> ]"; print " [ <a href=add.php>Добавить запись</A>] "; if ($cnt>$start+10) { print "[ <A href=index.php?start=".($start+10).">Следующие</A> ]\n"; print "</center><br>";
Теперь самое главное - считываем нужные нам записи и выводим их.
for ($i=$start;$i<$count;$i++) { $entry=$names[$i]; $data=file("records/rec.".$entry); $date=$entry; $name=trim($data[0]); $email=trim($data[1]); $city=trim($data[2]); $www=trim($data[3]); $question=trim($data[4]); $answer=trim($data[5]); print "<table border=0 cellspacing=0 cellpadding=2 width=100%>"; print "<tr bgcolor=#F0F0F0><td> "; if (!empty($email)) print "<a href=mailto:$email>$name</A>\n"; else print $name; if (!empty($www)) print "[<a href=$www>$www</A>]"; print "</td><td align=right>".date("H-i-s <b>d-m-Y</b>",$date); print "</td></tr>\n<tr><td colspan=2>\n"; print "<P>".$question."</P>\n"; if (!empty($answer)) print "<P><B><I>$answer</I></B></P>\n"; print "</td></tr></table>\n<br><br>\n"; }
Опять выводим ссылки навигации по гостевой книги "Предыдущие" и "Следующие"
print "<center>"; if ($start!=0) print "[ <A href=index.php?start=".($start-10).">Предыдущие</A> ]"; print " [ <a href=add.php>Добавить запись</A>] "; if ($cnt>$start+10) print "[ <A href=index.php?start=".($start+10).">Следующие</A> ]\n"; print "</center>"; ?> </BODY> </HTML>
Ну вот вроде все. Скачать исходный текст в архиве можно здесь.