Если вы имеете некий опыт блужданья по интернету, должны знать, что каждого второго жителя сети так и прет где-нибудь да наследить, и если некий сайт предоставляет такую возможность, то персона, сделавшая целью собственного бытия изливанье на бел свет содержимого своего внутреннего мира, непременно зависнет на нем.. Предпосылкой этому будет, само собой, служить соответствие тематики сайта этому самому содержимому..

Как бы то ни было, но научиться создавать на сайте сервисы, позволяющие оставлять некую информацию, необходимо. В их число входят форумы, комментарии, доски объявлений (рассчитаны на произвольнго пользователя), новостные ленты (рассчитаны на владельца сайта), и прочие.

Так.. Я думаю, что сама техника отправки и сохранения текста сложности вызывать не должна - заполнил форму, кликнул "поехали!" и лицезреешь "здесь был Вася" на форуме или на чем-то подобном.
Потому я предпочту обсудить в этом уроке различные варианты архитектуры вышеупомянутых скриптов. А если тот или иной способ ее реализации будет стоить того - опишу и его.

Начну, пожалуй, с форума. Итак, как правильно спроектировать форум?
Для начала, пропишем его функции.
Здесь встаем перед определенной дилеммой: требовать ли с посетителя регистрации на форуме, или нет.
Посмотрим на проблему с двух точек зрения, а именно - с нашей, программистской, и с точки зрения пользователя.
- пользовательская точка зрения -
«Что дает мне регистрация на данном форуме?»
Тут же переключаемся на точку зрения владельца форума -
«Зачем мне регистрация пользователей?»
Ответ - да мне ж надо удержания их у себя на сайте, да увеличить количество посетителей (если форум интересен, то зарегестрировавшийся пользователь привлечет своих знакомых, коллег).

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

Во-первых, форум должен быть четко структурирован, как и любой информационный ресурс. А именно иметь строгое разделение по темам и подтемам. Его участники не должны путаться и чувствовать какие бы то ни было неудобства при поиске информации.

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

Приступим к реализации! Коль мы решили сделать форум с регистрацией, начнем именно с нее.
Урок по регистрации и авторизации (php) на сайтах приведен здесь. Если необходимо, просмотрите его, а я пока поговорю о том где и как мы будем хранить информацию о пользователях форума.
Держать все будем в Б.Д. Основные данные о юзерах - в таблице users_main, имеющей следующие поля:

id - уникальный идентификатор в таблице, будет увеличиваться на 1 при регистрации нового пользователя.
login - логин пользователя
pass - пароль
nick - никнейм
email - почта пользователя.
reg_date - дата регистрации
status - статус пользователя (зарегестрирован/не зарегестрирован)
confirmation_id - идентификатор подтверждения регистрации.
Как _первичным_, так и _внешним_ ключем будет служить id.
Зарегестрированные пользователи смогу хранить дополнительную информацию о себе, она будет помещена в таблице users_secondary.

id - идентификатор пользователя (соответствует id в users_main)
name - Реальное имя
surname - фамилия
skype - скайповский контакт.
icq - аська
last_date - дата последнего посещения
last_time - время последнего посещения.
Также нам нужна таблица themes, где мы будем хранить темы, созданные на сайте и привязывать их к конкретным пользователям.

theme_id - идентификатор темы, первичный ключ.
theme_title - наименование темы.
section - тематический раздел, коему сессия принадлежит.
user_id - идентификатор пользователя, создавшего тему
theme_date - дата создания темы
Еще таблица с сообщениями пользователей messages.

msg_id - идентификатор сообщения
msg_text - текст сообщения
msg_date - дата оставления сообщения
user_id - идентификатор пользователя, оставившего сообщение.
theme_id - идентификатор темы, в которой находится сообщение
Начнем писать код.

Код:
<?php?> // forum.php
//Подключаем файлы
require("cfg.php");
require("funcs.php");
require("connect_db.php");

if(isset($_REQUEST[session_name()])) 
{
   session_start();
}

/*Не забывайте проверить авторизован ли пользователь.*/
if($_SESSION['usr_id'] == md5(crypt($_SESSION['login'],$_SESSION['pass']))) 
{
   $checked = true;
}

// Инициализируем массив с секциями и присваиваем значения его элементам.
$sections = array("intrigues"=>"Интриги", "investigations"=>"Расследования");
// Нам будут нужны некоторые данные пользователя:
$usr_q = mysql_query("Select id, nick from users_main Where login='".
  $_SESSION['login']."' AND pass=md5('".$_SESSION['pass']."'");
if(mysql_num_rows($usr_q) == 0)
{
   echo "<p>Вы не авторизованы! Чтоб пользоваться форумом 
     <a href=auth.php>авторизуйтесь.</a></p>";
}
$usr_res = mysql_fetch_assoc($usr_q);
$_SESSION['uid'] = $usr_res('id');


echo '<table border="1">';
//Начальная страница форума - секция не выбрана
if(!isset($_GET['section']))
{
   Выводим список секций
   echo 'foreach($sections as $ind=>$v) echo '<li><a
     href="?section='.$ind.'">'.$v.'</a>';  ';
}
else Если выбрали секцию
{
   // Кидаем в $_SESSIONS индекс секции (у меня он строкоа) - в дальнейшем будет удобней
   $sect = $_SESSION['sect'] = clear($_GET['section']);
	
    // Выводим название текущей секции
   echo '<font style="font-size: 11pt; color:
     red;">'.$sections[$sect].'</font><br><br> ';
	 
   if(!isset($_GET['theme'])) // Не выбрана тема форума
   {
        // Если пользователь авторизован, позволяем осуществлять манипуляции
      if($checked) 
      {
         echo '<tr><td>Действия:</td><td><a href="ins_theme.php">Создать тему</a></td></tr>';
      }

      // Выбираем темы указанного раздела, сортируя их по убыванию даты создания. Выводим их.
      $thm_q = mysql_query("Select * From themes Where section='".
        $_SESSION['sect']."' Order By theme_date Desc");
      
      if(mysql_num_rows($thm_q) == 0){ echo "Нет тем в данном разделе!"; }
      else //Если секция не пустует
      {
         while($res = mysql_fetch_assoc($thm_q))
         {
            echo'<tr><td><ahref="?section='.$sect.'&theme='.
              $res['theme_id'].'">$res['theme_title']</a></td></tr>';
         }
      }
      echo " <br><a href=forum.php>Назад</a>  "; 
   }
   else // Если выбрали тему из списка
   {
      // Кидаем в $_SESSIONS id темы
      $theme = $_SESSION['theme'] = clear($_GET['theme']); 
	  
      // Узнаем заглавие выбранной темы, выводим
      $theme_title_q = mysql_query("Select theme_title From themes Where theme_id=".$theme);
      $th_r = mysql_fetch_row($theme_title_q);
      echo ' <br><font style="font-size: 10pt; color: blue;">'.$th_r[0].'</font><br><br> ';

      // Если авторизован - доступ к манипуляциям
      if($checked) echo '<tr><td><a href="ins_msg.php">Добавить сообщение</a></td></tr>';

      // Выборка сообщений выбранной темы, сортируем по дате, выводим
      $msg_q = mysql_query("Select * From messages Where theme_id=".
        $theme." Order By msg_date Desc");
	  
      if(mysql_num_rows($msg_q) == 0){ echo "Нет сообщений в данной теме!"; }
      else Усли в теме присутствуют сообщения
      {
         while($res = mysql_fetch_assoc($msg_q))
         {
            $user_q = mysql_query("Select nick From users_main Where id=".$res['user_id']);
            $user_res = mysql_fetch_row($user_q);
            $msg_user = $user_res[0];

            // Выводим строку  _пользователь_:_сообщение_
            echo '<tr><td><p><font style="color: red;">'.
              $msg_user.': </font>'.$res['msg_text'].'</p></td></tr>';
         }
      }
      echo " <br><a href=forum.php?section=".$_GET['section'].">Назад</a>";
   }
}

echo '</table>';
if($checked) echo '<a href="logout.php">Выйти</a>';
?>

Скрипт добавления темы в форум:

Код:
<?php // ins_theme.php
require("cfg.php");
require("funcs.php");
require("connect_db.php");

if(isset($_REQUEST[swssion_name()])) { session_start();} 

// Проверка пользователя! Если не авторизован - выкидываем его!
if($_SESSION['usr_id'] == md5(crypt($_SESSION['login'],$_SESSION['pass'])))
{
   if(isset($_POST['sbm_theme']))
   {
      if($_POST['theme_txt'] != "")
      {
         $section = clear($_SESSION['sect']);  // $_SESSION['sect'] получили из forum.php
         $text = clear($_POST['theme_txt']);
         $uid = $_SESSION['uid'];
         $date = date("Y-m-d");
         if (!mysql_query("Insert Into themes Values(NULL, '".$text."', '".
           $section."', ".$uid.", '".$date."')") )
         {
            echo "Ошибка ввода: "; die(mysql_error()); /*вывод значения, возвращаемого
  функцией mysql_error используем при поиске ошибок, когда скрипт начинает 
  функционировать выводим сгенерированное нами самими сообщение,
  скажем, о неправильном вводе данных. mysql_error же 
  может дать злоумышленнику небезопасные данные.*/
         }
         else
         {
            header("Location: forum.php?section=".$section);
         }
      }
      else {echo "Введи текст";}
}

echo '<form action="" method="post">
<table>
<tr><td>Введите название темы</td> 
<td><input type="text" name="theme_txt" length="20"></td></tr>
echo '<tr><td><input type="submit" name="sbm_theme" value="Создать"></td></tr>
</table>
</form>'; 
}
else{header("Location: forum.php");}
?>

Скрипт добавления сообщений:

Код:
<?php // ins_msg.php
session_start();

require("cfg.php");
require("funcs.php");
require("connect_db.php");
// Проверка пользователя! Если не авторизован - выкидываем его!
if($_SESSION['usr_id'] == md5(crypt($_SESSION['login'],$_SESSION['pass'])))
{
   if(isset($_POST['sbm_msg']))
   {
      $sect = clear($_SESSION['sect']);
      $theme = clear($_SESSION['theme']);
      if($_POST['msg_txt'] != "")
      {
         $text = clear($_POST['msg_txt']);
         $uid = $_SESSION['uid'];
         $date = date("Y-m-d");

         if(!mysql_query("Insert Into messages Values (NULL, '".
           $text."', '".$date."', ".$uid.", ".$theme.")") )
         {
            echo "Не ввелось"; die(mysql_error());
         }
         else { header("Location: forum.php?section=".$sect."&theme=".$theme); }
	}
	else {echo "Да введи же! Потом кнопки тыкай..";}
}

echo '<form action="" method="post">
<table>
<tr><td>Ну ляпни чо-нить..</td></tr>
<tr><td><textarea name="msg_txt" cols="20" rows="10"></textarea></td></tr>
<tr><td><input type="submit" name="sbm_msg" value="Принять"></td></tr>
</table></form>';
<a href="forum.php?section='.$_SESSION['sect'].
'&theme='.$_SESSION['theme'].'">НАЗАД</a>';  
}
else
{
   header("Location: forum.php");
}
?>

В данном скрипте у вас возникнет проблема с функциями header(); Они вернут ошибку с текстом "Заголовки уже посланы..". Ысе дело в том, что заголовки запроса должны стоять ДО его тела и, соответственно, до любого вывода на экран. Скрипт я привожу именно в этом виде по двум причинам: во-первых, вы лучше запомните этот урок. Во-вторых, в данном варианте лучше видна структура алгоритма (а использование header() здесь вовсе не обязательно. Цель ее использования - "обнулять" POST - данные после посылок их серверу. Чтобы лучше понять, затрите все header(), пошлите одну из форм на сервер, после же нажмите F5, обновив страницу. Вам выведется сообщение с предупреждением того, что POST - данные будут посланы заново. Для избежания этого и применяется header().) А чтоб закрепить урок во веки веков, перекроите скрипт так, чтоб функция header() работала как надо. (Обработку запросов делать ДО выводов в окно браузера.)