Написать письмо авторам  
 

УЧЕБНИК PHP


справочник функций <Оnline>

Об учебнике

Обновление

Оглавление

  1. Основы PHP
  2. Операторы языка PHP
  3. Строковые функции
  4. Массивы
  5. Функции
  6. Работа с файлами
  7. Регулярные выражения
  8. Сессии и cookies в PHP
  9. Работа с FTP
  10. Проверка данных
  11. Гостевая книга
  12. PHP и MySQL

Продолжение следует



Пишем гостевую книгу на PHP

Предыдущая Следующая

Пишем гостевую книгу на 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, форма для добавления сообщений должна иметь следующий вид:


Добавление записи

Имя:*
Город:
E-Mail:
URL:
Сообщение:*
* - поля, обязательные для заполнения

Листинг файла 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>

Гостевая книга написана.

Если ввести сообщение, то оно отобразится следующим образом:


Предыдущие Добавить запись Следующие

  авторы  Нижний Новгород   http://www.softtime.ru 20-03-04 15 - 00

Мы рады приветствовать Вас!

admin: 



Предыдущие Добавить запись Следующие

При неправильном заполнении полей гостевой книги отобразится сообщение об ошибке:


Добавление записи

Во время добавления записи произошли следующие ошибки:

  • Вы не ввели сообщение
  • Вы не ввели имя
  • Неверно введен е-mail. Введите e-mail в виде: softtime@softtime.ru
Имя:*
Город:
E-Mail:
URL:
Сообщение:*
* - поля, обязательные для заполнения



Предыдущая Следующая

 
  Наверх