Написать письмо авторам |
УЧЕБНИК PHP |
справочник функций <Оnline> |
Об учебнике |
Обновление |
Пишем гостевую книгу на PHP (вариант на файлах)Сейчас мы разработаем приложение "Гостевая книга на PHP". Сообщения будут храниться в файлах, которые расположены в директории RECORDS (позже мы разработаем вариант гостевой книги, основанный на хранении сообщений в базе данных). Код размещен в двух файлах: index.php (отображение сообщений) и addrec.php (добавление сообщений, их проверка и запись в файл). Итак, создайте файл addrec.php и в той же директории, в которой расположен этот файл создайте директорию RECORDS. Сначала проверяем, ввел ли пользователь данные и правильно ли он их ввел: <? $error = ""; $action = $HTTP_POST_VARS["action"]; if (!empty($action)) { $name = trim($name); $msg = trim($msg); if (empty($msg)) // если не введено сообщение { $action = ""; $error = $error."<LI>Вы не ввели сообщение\n"; } if (empty($name)) // если не введено имя { $action = ""; $error = $error."<LI>Вы не ввели имя\n"; } if (!empty($email)) /* если введен e-mail, то проверяем с помощью регулярного выражения правильность ввода */ { if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $email)) { $action = ""; $error = $error."<LI> Неверно введен е-mail.&nbsр Введите e-mail в виде <i>softtime@softtime.ru</i> \n"; } } Теперь обрабатываем введенный пользователем текст функциями удаления HTML-тегов и обратных слешей: $name = substr($HTTP_POST_VARS["name"],0,32); $name = htmlspecialchars(stripslashes($name)); // обрабатываем имя $city = substr($HTTP_POST_VARS["city"],0,32); $city = htmlspecialchars(stripslashes($city)); // обрабатываем город $email = substr($HTTP_POST_VARS["email"],0,32); $email = htmlspecialchars(stripslashes($email)); // обрабатываем e-mail $url = substr($HTTP_POST_VARS["url"],0,36); $url = htmlspecialchars(stripslashes($url)); // обрабатываем url-адрес $msg = substr($HTTP_POST_VARS["msg"],0,1024); $msg = htmlspecialchars(stripslashes($msg)); // обрабатываем сообщение В нашей гостевой книге поддерживается полужирное начертание, курсив, подчеркивание, верхние и нижние индексы. Для того, чтобы пользователь мог, к примеру, выделить блок текста в сообщении курсивом, его необходимо заключить в теги <i></i> и т.д. Поэтому для после того, как текст введен, нужно заменить эти искусственные теги на их реальное HTML-представление: if (empty($error)) // если ошибок нет, обрабатываем сообщение { $msg = nl2br($msg); $msg = str_replace("[u]","<u>",$msg); $msg = str_replace("[U]","<u>",$msg); $msg = str_replace("[i]","<i>",$msg); $msg = str_replace("[I]","<i>",$msg); $msg = str_replace("[b]","<B>",$msg); $msg = str_replace("[B]","<B>",$msg); $msg = str_replace("[sub]","<SUB>",$msg); $msg = str_replace("[SUB]","<SUB>",$msg); $msg = str_replace("[sup]","<SUP>",$msg); $msg = str_replace("[SUP]","<SUP>",$msg); $msg = str_replace("[/u]","</u>",$msg); $msg = str_replace("[/U]","</u>",$msg); $msg = str_replace("[/i]","</i>",$msg); $msg = str_replace("[/I]","</i>",$msg); $msg = str_replace("[/b]","</B>",$msg); $msg = str_replace("[/B]","</B>",$msg); $msg = str_replace("[/SUB]","</SUB>",$msg); $msg = str_replace("[/sub]","</SUB>",$msg); $msg = str_replace("[/SUP]","</SUP>",$msg); $msg = str_replace("[/sup]","</SUP>",$msg); $msg = eregi_replace("(.*)\\[url\\](.*)\\[/url\\](.*)","\\1<a href=\\2>\\2</a>\\3",$msg); $msg = str_replace("\n"," ",$msg); $msg = str_replace("\r"," ",$msg); Открываем файл и добавляем в него, введенную пользователем информацию: /* создаем файл с именем вида "rec.+время добавления сообщения" */ $file = fopen("records/rec.".time(),"w"); // записываем информацию в файл, по одной строчке на каждое поле fputs($file,$name."\n"); fputs($file,$city."\n"); fputs($file,$email."\n"); fputs($file,$url."\n"); fputs($file,$msg."\n"); // закрываем файл fclose($file); Вызываем скрипт index.php, ответственный за отображение сообщений: print "<HTML><HEAD>\n"; print "<META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.php'>\n"; print "</HEAD></HTML>\n"; } } Добавляем код вывода сообщений об ошибках и HTML-код формы добавления сообщения: if (empty($action)) { <? <HTML> <HEAD> <TITLE>Гостевая книга - добавление записи</TITLE> </HEAD&tg; <BODY> <H3> <? print "<center>"; ?> <font color=#1E90FF>Добавление записи</font> </H3> <? if (!empty($error)) /* если есть ошибки, выводим сообщение об ошибках */ { print "<P><font color=green>Во время добавления записи произошли следующие ошибки:</font></P>\n"; print "<UL>\n"; print $error; print "</UL>\n"; } ?> <!-- пишем HTML-код формы добавления сообщений !--> <center> <table width=1 border=0> <form action=addrec.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%>Город:</td> <td align=right> <input type=text name=city maxlength=32 value='<? echo $city;; ?>'> </td> </tr> <tr> <td width=50%>E-Mail:</td> <td align=right> <input type=text name=email maxlength=32 value='<? echo $email; ?>'> </td> </tr> <tr> <td width=50%>URL:</td> <td align=right> <input type=text name=url maxlength=36 value='<? echo $url; ?>'> </td> </tr> <tr> <td colspan=2>Сообщение:<font color=red<sup>*</sup></font><br> <textarea cols=50 rows=8 name=msg><? echo $url; ?> </textarea> </td> </tr> <tr> <td colspan=2><input type=submit value='Добавить'></td> </tr> </form> <tr> <td colspan=2><font color=red><sup>*</sup></font> - поля, обязательные для заполнения </td><td align=left> </table> </center> </BODY> </HTML> <? } ?> После окончания работы с кодом, размещенным в файле addrec.php, форма для добавления сообщений должна иметь следующий вид: Добавление записи
Листинг файла index.php, используемого для отображения сообщений: <HTML> <HEAD> <TITLE>Гостевая книга</TITLE> </HEAD> <BODY> <? /* открываем директорию и считываем из нее файлы */ $dir_rec = dir("records"); $i = 0; while($entry = $dir_rec->read()) { if (substr($entry,0,3)=="rec") { $names[$i]=substr($entry,4); $i++; } } $dir_rec->close(); // закрываем директорию @rsort($names); // сортируем файлы /* определяем очередность сообщений и выводим их */ $count = $i; $count1 = $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=addrec.php>Добавить запись</A>"; if ($count1 > $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]); $city = trim($data[1]); $email = trim($data[2]); $url = trim($data[3]); $msg = trim($data[4]); /* поле, в которое администратор может добавить ответ */ $answer = trim($data[5]); print "<table border=0 cellspacing=0 cellpadding=2 width=100%> <tr bgcolor=#F0F0F0><td>&nbsр;"; print "<b>$name</b>&nbsр;"; if (!empty($city)) print "$city&nbsр"; if (!empty($email)) print "<a href=mailto:$email><i>$email</i></A>\n"; if (!empty($url)) print "<a href=$url>$url</a>"; print "</td><td align=right>".date("<b>d-m-Y</b> H - i, $date)." </td></tr>\n<tr><td colspan=2>\n"; print "<P>".$msg."</P>\n"; if (!empty($answer)) // если администратор что-то ответил { print "<P><font color=#1E90FF>admin:&nbsр$answer</font></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=addrec.php>Добавить запись</A>"; if ($count1 > $start + 10) { print "<A href=index.php?start=".($start + 10).">Следующие</A> \n"; } print "</center>"; ?> </BODY> </HTML> Гостевая книга написана. Если ввести сообщение, то оно отобразится следующим образом: Предыдущие Добавить запись Следующие
При неправильном заполнении полей гостевой книги отобразится сообщение об ошибке: Добавление записиВо время добавления записи произошли следующие ошибки:
|
Наверх |