Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Гостевая книга на PHP 
:(
    Опции темы
DezmASter
Дата 26.4.2007, 12:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дизайнер :)
***


Профиль
Группа: Участник
Сообщений: 1520
Регистрация: 3.2.2006
Где: Украина, Запорожь е

Репутация: 1
Всего: 109



Последнее время, все чаще и чаще в нашем форуме всплывают вопросы связанные с написанием гостевых книг.

Обычно гостевая книга состоит из двух частей: первая часть выводит записи, а вторая добавляет их.

В рассмотренном примере гостевой книги каждая запись хранится в отдельном файле. Имя файла создается автоматически, и состоит из двух частей - префикса и уникального идентификатора. Префикс нам необходим для того, чтобы отличить наш файл, от любого другого находящегося в том же каталоге (Честно говоря, по хорошему, в том же каталоге больше ничего не должно находиться), а уникальный идентификатор необходим для того, чтобы отличить одну запись от другой, и предоставить возможность сортировки записей.

В нашем случае префикс будет - "rec", а уникальный идентификатор мы получим с помощью функции time(). Функция time() возвращает текущее время, измеренное в числе секунд с эпохи Unix (1 Января 1970 00:00:00 GMT). Конечно, абсолютно уникальное число мы с помощью этой функции мы получить не сможем, но она нас устроит.

Сначала мы рассмотрим исходный текст модуля добавления записи в гостевую книгу.

Файл add.php:

В переменной $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));


Если не произошло ошибок, то можно заменить специальные символы (такие как ,[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>",$msg);
        $msg=str_replace("[/u]","</u>",$msg);
        $msg=str_replace("[/i]","</i>",$msg);
        $msg=str_replace("
","</b>",$msg);


С помощью регулярного выражения заменим запись типа http://www.codenet.ru/ на <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>
и вставки [url]гиперссылок[/url] </P>
</BODY>
</HTML>
<?
    }
?>


Теперь рассмотрим модуль, ответственный за вывод записей гостевой книги.

Файл index.php:

Код

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


Ну вот вроде все. Скачать исходный текст в архиве можно здесь. А если у вас остались вопросы, вы их можете задать здесь. 

[B]Авторы: Создатели codenet.ru
Сайт авторов: http://www.codenet.ru/

PM WWW ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0449 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.