Для работы форума необходим
                        веб-сервер Apache с поддержкой PHP и база данных MySQL.
                        Скрипт forum.php3 помещается в каталог
                        /usr/local/apache/htdocs. Работающий форум можно
                        посмотреть здесь, а полный листинг здесь 
                        
Начало
Прежде,чем
                        начать рассмотрение практического применения PHP,нужно
                        войти в MySQL как администратор и создать базу данных,в
                        которой будет храниться вся информация. 
                        Создаем базу данных forum. 
                        mysqladmin -u root -p create
                        forum;
use forum;
                        Создаем 3 таблицы в базе данных
                        forum.В них будет записываться вся информация. 
                        create table info (
id int (4)
                        not null auto_increment primary key,
name varchar
                        (15) not null,
password varchar (15) not
                        null,
email varchar (40) not null,
posts int (4)
                        default '0',
key (name),key (password));
                        
create table topics
                        (
top_id int (4) not null auto_increment primary
                        key,
top_name varchar (255) not null,
name varchar
                        (15) not null,
message text not null,
replies int
                        (4) default '0',
post_date datetime default
                        '0000-00-00 00:00:00',
last_reply datetime default
                        '0000-00-00 00:00:00',
key (top_name),key
(name));
                        create table replies (
name
                        varchar (15) not null,
top_name varchar (255) not
                        null,
reply text not null,
reply_date datetime
                        default '0000-00-00 00:00:00',
key (name),key
                        (top_name));
                        
                        Регистрация пользователя в
                        БД
Далее пойдет чистый PHP и HTML. 
                        Сгенерируем форму для регистрации:
                        
                        
                        <h2 align=center><font
                        color="ff0000">Registration.</font></h2>
<p><font
                        face="serif" size=2> Please,fill in the form
                        below.
<p>You may use only english chars in
                        your name,and name's length should be not less than 3
                        and
not more than 15
                        characters.
<br>Remember:all form fields are
                        case sensitive.It means the names <font face="arial"
                        size=2
color="0000ff">name</font> and
                        <font face="arial" size=2
                        color="0000ff">Name</font>
are
                        different.
<p>Password's length should be not
                        less than 6 characters.<br>
Don't forget to
                        enter your e-mail address, you may need it if you'll
                        forget your password.
<p><FORM ACTION=""
                        METHOD="POST" name="reg">
<p
                        align=right><a
                        href="">Home</a>
<center><TABLE
                        BGCOLOR="bfbfbf">
<tr><td colspan=2>
                        </td></tr>
<tr><TD><b>Login:</b><TD><INPUT
                        TYPE="text" NAME="login" SIZE="20" maxlength="15" >
                        
<tr><TD><b>Password:</b><TD><INPUT
                        TYPE="password" NAME="pass" SIZE="20"
                        onFocus="is_ValidLogin (this.form.login.value)";return
                        true> 
<tr><TD><b>Verify
                        password:</b><TD><INPUT TYPE="password"
                        NAME="verpass" SIZE="20" onFocus="is_ValidPass
                        (this.form.pass.value)";return true>
                        
<tr><TD><b>E-mail:</b><TD><INPUT
                        TYPE="text" NAME="email" SIZE="20" onFocus="verPasswd
                        ()";return true> 
<tr><td
                        colspan=2><input type="hidden" name="action"
                        value="register">
<tr><td
                        colspan=2><input type="hidden" name="verify"
                        value="ok">
<tr><TD
                        colspan=2><p><center><INPUT
                        TYPE="submit" name="submit" VALUE="Submit"
                        onMouseOver="true_Email (this.form.email.value)";return
                        true></center>
<tr><td
                        colspan=2> 
</table>
</form>
                        Если что-то пока
                        непонятно-посмотрите полный код. Функции,использованные
                        в форме, служат для проверки информации,введенной
                        пользователем. Далее, нужно обработать данные. Для
                        соединения с БД используется функция mysql_connect
                        ().Поскольку соединяться с БД придется не раз,я вынес
                        все данные в функцию connect () 
                        
function connect ()
                        {
$hostname="localhost:3306";
$user="root";
$password="ваш
                        пароль";
$db="forum";
                        mysql_connect
                        ($hostname,$user,$password);
$request=mysql_select_db
                        ($db);
if (!mysql_connect) {
echo "Error:
                        ".mysql_error ();
}
}
                        Эта функция подключает базу данных
                        и проверяет наличие ошибок соединения. Теперь можно
                        получить и обработать данные пользовательского ввода.
                        
                        
if ($action=="register")
                        {
connect ();
if ($verify) {
                        $query="select id from info where
                        name='$login'"; // Запрос к БД.
$result=mysql_query
                        ($query);
                        if (mysql_num_rows ($result)) { //
                        Проверяем,не существует ли уже такой
                        пользователь.
print_header ();
echo "<p
                        align=center><b>Error!</b>";
echo
                        "<p>Name <b>".$login."</b> already
                        exists.Please,go back and choose another
                        name.";
?>
<p><center><a
                        href="?action=register">Go
                        back</a></center>
<?php
} else
                        {
// Если все ОК вставляем данные в таблицу info.
                        $query="insert into info
                        (name,password,email) values
                        ('$login','$pass','$email')";
$result=mysql_query
                        ($query);
                        // Говорим пользователю спасибо и
                        распечатываем информацию.
print_header ();
echo
                        "<h3 align=center>Thank you,<font
                        color='ff0000'>".$login."!</font></h3>";?>
<p>You
                        are successfuly registered and your information added to
                        our database.
<p>Please,remember your
                        information.Only registered users may post messages and
                        replies.
<p><font face='arial' size=2
                        color='0000ff'>Your login:</font>
<font
                        face='arial' size=2
                        color='ff0000'></font><br>
<font
                        face='arial' size=2
                        color='0000ff'>Password:</font>
<font
                        face='arial' size=2
                        color='ff0000'></font><br>
<font
                        face='arial' size=2
                        color='0000ff'>E-mail:</font>
<font
                        face='arial' size=2
                        color='ff0000'></font>
<p>Good
                        luck!
<center><a href="">| Go to
                        topics</a> |
<a
                        href="?action=add_new_top"> Post new topic</a>
                        |</center>
<?php
}
}
                        Функция print_header ()-это
                        заголовок html-страницы. Она тоже использована для
                        уменьшения количества кода. 
                        
function print_header ()
                        {
?>
<html><head><title>Forum
                        version 1.1</title>
</head><style>
                        A:link
                        {font-family:arial;font-size:10pt;text-decoration:none;color:#0000ff;}
A:hover
                        {font-family:arial;font-size:10pt;text-decoration:none;color:red;}";
A:visited
                        {font-family:arial;font-size:10pt;text-decoration:underline;color:#0000ff;}
BODY
                        {background-color:#e6e8fa;font-family:arial;font-size:10pt;color:#333300;}
TD
                        {font-family:arial;font-size:10pt;color:#333300;}
H2
                        {text-align:center;color:blue;}
</style><body>
<?php
}
                        Ну вот и все. Пользователь
                        зарегистрирован и может помещать сообщения в форуме.
                        
                        
Создание нового
                        топика.
Для создания нового топика используем
                        следующую форму: 
                        
<h3
                        align=center><font color="0000ff">New
                        topic</font></h3>
<p align=right>|
                        <a href="<?php echo $script ?>">Go to
                        topics</a>
| <a href="<?php echo $script
                        ?>?action=register"> Register</a> |
<p
                        align=right><font color="0000ff">Only
                        registered users may post messages in this
                        forum.</font>
                        <p><form action="<?php
                        echo $script ?>" name="newtop"
                        method="POST">
<table width=60% align=center
                        bgcolor="aaaaaa">
<tr><td> 
<tr><td><b>Your
                        nick:</b><td><input type="text"
                        name="nick"
                        size=20>
<tr><td><b>Your
                        password:</b><td><input type="password"
                        name="passwd"
                        size=20>
<tr><td><b>Topic
                        name:</b><td><input type="text"
                        name="theme" size=20>
<tr><td
                        colspan=2> <b>Message:</b><p>  <textarea
                        cols=40 rows=15
WRAP="VIRTUAL"
                        name="message"></textarea>
<tr><td
                        colspan=2><input type="hidden" name="action"
                        value="add_new_top">
<tr><td
                        colspan=2><input type="hidden" name="test"
                        value="ok">
<tr><td colspan=2
                        align=center> <br><input
                        type="submit" name="post"
                        value="Submit"></table>
<?php
                        Все поля обязательны для
                        заполнения.Пользователь должен ввести свое имя,под
                        которым он регистрировался в БД и пароль.Скрипт
                        проверяет наличие их в БД,и если все нормально-помещает
                        сообщение в таблицу topics.Если же имя и пароль введены
                        неверно-выдается ошибка.Помещать сообщения могут только
                        зарегистрированные пользователи. Вот как это выглядит:
                        
                        
elseif
                        ($action=="add_new_top") {
connect (); // Соединяемся
                        с БД.
if ($test) {
                        // Читаем данные из
                        формы.
$date=date ( "Y-m-d H:i:s",mktime
                        ());
$message=htmlspecialchars
                        ($message);
$message=nl2br($message);
$message=str_replace
                        ("'"," ",$message);
$theme=str_replace ("'","
                        ",$theme);
$theme=str_replace ('"',"
                        ",$theme);
$theme=htmlspecialchars ($theme);
                        // Здесь следует дать пояснения об
                        использовании //функций htmlspecialchars (),str_replace
                        () и nl2br ().
// htmlspecialchars () используется
                        для того,чтобы //преобразовать html-теги.Это делается в
                        целях безопасности
и для защиты от разного рода
                        шутников :)
// str_replace () заменяет символ
                        одинарной кавычки на пробел, //т.к. внесение одинарной
                        кавычки в БД
//недопустимо-это специальный служебный
                        символ.Это защитит БД от взлома.
// nl2br ()
                        преобразует символ конца строки в
                        html-тег<br>.//Это используется для того,чтобы
                        текст,введенный в форму сохранился
                        неизменным.
$query="select id from info where
                        name='$nick' AND password='$passwd'"; // Запрос к
                        БД.Проверка имени и пароля.
$result=mysql_query
                        ($query);
                        // Если все ОК,проверяем,чтобы
                        поля формы не были пустыми.
if (mysql_num_rows
                        ($result)) {
if (strlen ($theme)!=0 && strlen
                        ($message)!=0) {
                        // Если все ОК,вставляем данные в
                        таблицу topics.
$query="insert into topics
                        (top_name,name,message,post_date,last_reply) values
                        ('$theme','$nick','$message','$date','$date')";
$result=mysql_query
                        ($query);
                        // Обновляем таблицу
                        info-увеличиваем количество постов для данного
                        пользователя на 1.
$query="update info set
                        posts=posts+1 where
                        name='$nick'";
$result=mysql_query
                        ($query);
print_header ();
                        // Говорим пользователю
                        спасибо.
?>
<h3 align=center>Thank
                        you,<font color="ff0000"><?php echo $nick
                        ?>!</font></h3>
<p>Your topic
                        has been submitted.
<p><center>| <a
                        href="<?php echo $script ?>">Go to
                        topics</a> |<a href="<?php echo $script
                        ?>?action=add_new_top"> Post new topic</a>
                        |</center>
<?php
} else {
print_header
                        ();
                        // Если одно из полей формы
                        оказалось пустым-выдается ошибка.
?>
<h2
                        align=center>Error!</h2>
<p>You didn't
                        enter topic name or message.Please,go back and try
                        again.
<p><center>
| <a
                        href="<?php echo $script
                        ?>?action=add_new_top">Go back</a>
|
                        <a href="?action=remind_pass">Forgot
                        password?</a>
                        |</center>
<?php
}
} else
                        {
print_header ();
                        // Если введены неверные имя или
                        пароль,также выдается ошибка.
?>
<h2
                        align=center>Error!</h2>
<p>You
                        entered incorrect name or password.Please,go back and
                        try again.
<p><center>| <a
                        href="<?php echo $script
                        ?>?action=add_new_top">Go back</a>
|
                        <a href="<?php echo $script
                        ?>?action=remind_pass">Forgot
                        password?</a>|</center>
<?php
}
}
                        Все эти предосторожности не
                        лишние. Во-первых в целях безопасности самой базы
                        данных. Во-вторых для защиты форума от случайных
                        посетителей и от взлома. Новый топик создан и информация
                        добавлена в таблицу topics. Далее рассмотрим,как
                        разместить ответ на сообщение. 
                        
                        
Посылка ответа на сообщение
Она ничем
                        не отличается от создания нового топика,только ответ
                        помещается в таблицу replies. Сгенерируем форму. 
                        
<h3
                        align=center><font color="0000ff">Post
                        reply.</font></h3>
<p align=right>|
                        <a href="<?php echo $script ?>">Go to
                        topics</a>
| <a href="<?php echo $script
                        ?>?action=register"> Register</a> |
<p
                        align=right><font color="0000ff">Only
                        registered users may post messages in this
                        forum.</font>
                        <p><form action="<?php
                        echo $script ?>" name="reply"
                        method="POST">
<table width=60% align=center
                        bgcolor="aaaaaa">
<tr><td> 
<tr><td><b>Your
                        nick:</b><td><input type="text"
                        name="nick"
                        size=20>
<tr><td><b>Your
                        password:</b><td><input type="password"
                        name="passwd" size=20>
<tr><td
                        colspan=2> <b>Message:</b><p>  <textarea
                        cols=40 rows=15
WRAP="VIRTUAL"
                        name="message"></textarea>
<tr><td
                        colspan=2><input type="hidden" name="action"
                        value="post_reply">
<tr><td
                        colspan=2><input type="hidden" name="top_name"
                        value="<?php echo $top_name
                        ?>">
<tr><td colspan=2><input
                        type="hidden" name="validate"
                        value="ok">
<tr><td colspan=2
                        align=center> <br><input
                        type="submit" value="Submit"></table>
                        И обработка данных: 
                        
elseif ($action=="post_reply")
                        {
if ($validate) {
connect ();
$date=date (
                        "Y-m-d H:i:s",mktime ());
$message=htmlspecialchars
                        ($message);
$message=nl2br($message);
$message=str_replace
                        ("'"," ",$message);
                        $query="select id from info where
                        name='$nick' AND
                        password='$passwd'";
$result=mysql_query
($query);
                        if (mysql_num_rows ($result))
                        {
if (strlen ($message)!=0) {
print_header
                        ();
$query="insert into replies
                        (name,top_name,reply,reply_date) values
                        ('$nick','$top_name','$message','$date')";
$result=mysql_query
                        ($query);
                        $query="update topics set
                        replies=replies+1,last_reply='$date' where
                        top_name='$top_name'";
$result=mysql_query
                        ($query);
                        $query="update info set
                        posts=posts+1 where
                        name='$nick'";
$result=mysql_query ($query);
                        echo "<h3 align=center>Thank
                        you,<font
                        color='ff0000'>".$nick."!</font></h3>";
echo
                        "<p>Your reply has been
                        submitted.";
?>
<p><center>| <a
                        href="<?php echo $script ?>">Go to
                        topics</a>
|<a href="<?php echo $script
                        ?>?action=add_new_top"> Post new topic</a>
                        |</center><?php
} else {
print_header
                        ();
?>
<h2
                        align=center>Error!</h2>
<p>You didn't
                        enter message.Please,go back and try
                        again.
<p><center>| <a href="<?php
                        echo $script
                        ?>?action=post_reply&top_name=<?php echo
                        $top_name ?>">Go back</a>
| <a
                        href="<?php echo $script
                        ?>?action=remind_pass">Forgot password?</a>
                        |</center>
<?php
}
}
                        С этим,думаю,все понятно,так же
                        как и в предыдущем примере. 
                        
                        
Чтение топика
Это
                        довольно объемная часть скрипта,по ходу дела я буду
                        давать пояснения. 
                        
elseif ($action=="read_topic")
                        {
if ($top_name) {
connect ();
                        // В этом случае данные выбираются
                        из 2-х таблиц-topics и info.
$query="select
                        message,post_date,info.posts,info.email from topics,info
                        where topics.name=info.name and
                        topics.top_name='$top_name' and
                        topics.name='$name'";
$result=mysql_query
                        ($query);
                        $row=mysql_fetch_array
                        ($result);
$message=$row["message"];
$post_date=$row["post_date"];
$posts=$row["posts"];
$email=$row["email"];
//
                        Вырезаем теги <br>,чтобы они не отображались на
                        странице.
$message=str_replace
                        ("<br>","",$message);
$char=$message;
                        // Эта куча преобразований
                        позволяет помещать //в сообщения смайлики и выводить их
                        на экран в виде рисунков.
$char=str_replace
                        (":)","<img
                        src='./images/smile.gif'>",$char);
$char=str_replace
                        (":(","<img
                        src='./images/frown.gif'>",$char);
$char=str_replace
                        (":o","<img
                        src='./images/redface.gif'>",$char);
$char=str_replace
                        (":D","<img
                        src='./images/biggrin.gif'>",$char);
$char=str_replace
                        (";)","<img
                        src='./images/wink.gif'>",$char);
$char=str_replace
                        (":p","<img
                        src='./images/tongue.gif'>",$char);
$char=str_replace
                        (":cool:","<img
                        src='./images/cool.gif'>",$char);
$char=str_replace
                        (":rolleyes:","<img
                        src='./images/rolleyes.gif'>",$char);
$char=str_replace
                        (":mad:","<img
                        src='./images/mad.gif'>",$char);
$char=str_replace
                        (":eek:","<img
                        src='./images/eek.gif'>",$char);
$char=str_replace
                        (":confused:","<img
                        src='./images/confused.gif'>",$char);
                        print_header ();
?>
                        // Теперь все выбранные данные
                        помещаем в html-таблицу и выводим на экран.
<p
                        align=right>| <a href="<?php echo $script
                        ?>">Go to topics</a> |<a href="<?php
                        echo $script ?>?action=add_new_top"> Post new
                        topic</a> |
<a href="<?php echo $script
                        ?>?action=post_reply&top_name=<?php echo
                        $top_name ?>"> Post reply</a>
                        |
<p><table cellspacing=0 cellpadding=5
                        border=1 width=100%>
<tr><td align=center
                        width=150 bgcolor="D5E6E1"><font face="Arial"
                        size=2 color="808080">Author</font>
<td
                        bgcolor="D5E6E1"><font face="serif" size=2
                        color="0000ff">Topic:</font><font
                        face="serif" size=2 color="ff0000"><?php echo
                        $top_name
                        ?></font></td></tr>
<tr><td
                        rowspan=2 bgcolor="D5E6E1" align=center><font
                        face="serif" size=3 color="ff0000"><?php echo
                        $name ?></font>
<br><font
                        face="serif" size=2 color="0000ff">Posts:<?php
                        echo $posts ?></font></td>
<td
                        bgcolor="e6e8fa" height=30><font face="serif"
                        size=1 color="000080">Posted:<?php echo $post_date
                        ?></font>
      <a
                        href="mailto:<?php echo $email ?>"><img
                        src="email.gif"
                        border=0></a>
  <font
                        face="serif" size=1 color="000080">E-mail
                        </font><font face="serif" size=1
                        color="0000ff"><?php echo $name
                        ?></font>
      <a
                        href="<?php echo $script
                        ?>?action=edit&top_name=<?php echo $top_name
                        ?>&nick=<?php echo $name
                        ?>&type=message">
<img src="edit.gif"
                        border=0></a>  <font
                        face="serif" size=1 color="000080">Edit
                        message</font></td></tr>
<tr><td
                        bgcolor="f7f7f7"><font face="serif" size=2
                        color="000080"><?php echo $char
                        ?></font></td></tr></table>
<?php
                        // Ограничиваем количество записей
                        на странице 20
                        сообщениями.
$lines=20;
$begin=$page*$lines;
if
                        (empty ($page)) {
$page=0;
}
                        // Делаем новый запрос для вывода
                        ответов на топик.
$query="select
                        replies.name,reply,reply_date,info.posts,info.email from
                        replies,info where replies.name=info.name and
                        replies.top_name='$top_name' order by reply_date limit
                        $begin,$lines";
$result=mysql_query ($query);
                        // Дальше все так же,как и в
                        предыдущий раз.
while ($row=mysql_fetch_array
                        ($result))
                        {
$nick=$row["name"];
$reply=$row["reply"];
$reply_date=$row["reply_date"];
$posts=$row["posts"];
$mail=$row["email"];
$reply=str_replace
                        ("<br>","",$reply);
$char=$reply;
$char=str_replace
                        (":)","<img
                        src='./images/smile.gif'>",$char);
$char=str_replace
                        (":(","<img
                        src='./images/frown.gif'>",$char);
$char=str_replace
                        (":o","<img
                        src='./images/redface.gif'>",$char);
$char=str_replace
                        (":D","<img
                        src='./images/biggrin.gif'>",$char);
$char=str_replace
                        (";)","<img
                        src='./images/wink.gif'>",$char);
$char=str_replace
                        (":p","<img
                        src='./images/tongue.gif'>",$char);
$char=str_replace
                        (":cool:","<img
                        src='./images/cool.gif'>",$char);
$char=str_replace
                        (":rolleyes:","<img
                        src='./images/rolleyes.gif'>",$char);
$char=str_replace
                        (":mad:","<img
                        src='./images/mad.gif'>",$char);
$char=str_replace
                        (":eek:","<img
                        src='./images/eek.gif'>",$char);
$char=str_replace
                        (":confused:","<img
                        src='./images/confused.gif'>",$char);
                        if (mysql_num_rows ($result))
                        {
?>
<table cellspacing=0 cellpadding=5
                        border=1 width=100%>
<tr><td rowspan=2
                        bgcolor="e6e8fa" align=center width=150><font
                        face="serif" size=2 color="0000ff">
<?php echo
                        $nick ?></font><br><font face="serif"
                        size=2 color="333300">Posts:<?php echo $posts
                        ?></font></td>
<td bgcolor="e6e8fa"
                        height=30><font face="serif" size=1
                        color="000080">Posted:<?php echo $reply_date
                        ?></font>
      <a
                        href="mailto:<?php echo $mail ?>"><img
                        src="email.gif"
                        border=0></a>
  </font><font
                        face="serif" size=1 color="000080">E-mail
                        </font><font face="serif" size=1
                        color="0000ff"><?php echo $nick
                        ?></font>
      <a
                        href="<?php echo $script
                        ?>?action=edit&top_name=<?php echo $top_name
                        ?>&nick=<?php echo $nick
                        ?>&type=reply&reply_date=<?php echo
                        $reply_date ?>">
<img src="edit.gif"
                        border=0></a>  <font
                        face="serif" size=1 color="000080">Edit
                        message</font></td></tr>
<tr><td
                        bgcolor="f7f7f7"><font face="serif"
                        size=2><?php echo $char
                        ?></td></tr></table>
<?php
}
}
                        // Формируем ссылки для навигации
                        по// страницам в случае,если количество записей больше
                        20.
// Для этого подсчитываем количество записей //в
                        таблице replies для данного топика.
$query="select
                        COUNT(*) as count from replies where
                        top_name='$top_name'";
$result=mysql_query
                        ($query);
$items=mysql_fetch_array
                        ($result);
$count=$items["count"];
$pages=ceil
                        ($count/$lines);
                        // В случае,если количество
                        ответов больше 20,//формируем ссылки с номерами
                        страниц.
if ($count>$lines) {
echo "<p
                        align=right>";
for ($i=0;$i<$pages;$i++)
                        {
?>
|<a href="<?php echo $script
                        ?>?action=read_topic&top_name=<?php echo
                        $top_name ?>&name=<?php echo $name
                        ?>&page=<?php echo $i ?>"><?php echo
                        ($i+1) ?></a><?php
}
}
}
}
                        Вот и все.Теперь вы видите,как
                        просто можно работать с БД с помощью PHP,и как это
                        облегчает жизнь. Все это остается за кадром,а посетители
                        форума видят обычную html-страницу.Далее рассмотрим, как
                        можно редактировать сообщения. 
                        
Редактирование
                        сообщения
Редактирование сообщения может
                        понадобиться,если пользователь допустил ошибку, или
                        хочет изменить что-нибудь в тексте. Редактировать можно
                        только свои сообщения, за этим следит скрипт и БД.В
                        зависимости от того, является сообщение топиком или
                        ответом на топик, выводятся 2 разные формы. 
                        
connect ();
                        // Если это топик,находим его в
                        таблице topics.
if ($type=="message")
                        {
$query="select message from topics where
                        name='$nick' and
                        top_name='$top_name'";
$result=mysql_query
                        ($query);
$row=mysql_fetch_array
                        ($result);
$message=$row["message"];
$message=str_replace
                        ("<br>","",$message);
                        print_header ();
                        // Помещаем сообщение в форму для
                        редактирования.
?>
<h3
                        align=center><font color="0000ff">Edit
                        message.</font></h3>
<p
                        align=right>| <a href="<?php echo $script
                        ?>">Go to topics</a> | <a href="<?php
                        echo $script ?>?action=register">
                        Register</a> |
<p align=right><font
                        color="0000ff">Only registered users may post
                        messages in this forum.</font>
                        <p><form action="<?php
                        echo $script ?>" name="editmsg"
                        method="GET">
<table width=60% align=center
                        bgcolor="aaaaaa">
<tr><td> 
<tr><td><b>Your
                        nick:</b><td>
<input type="text"
                        name="name"
                        size=20>
<tr><td><b>Your
                        password:</b><td><input type="password"
                        name="passwd" size=20>
<tr><td
                        colspan=2> <b>Message:</b><p>  <textarea
                        cols=40 rows=15 WRAP 80="virtual"
                        name="post">
<?php echo $message
                        ?><br></textarea>
<tr><td
                        colspan=2><input type="hidden" name="action"
                        value="edit">
<tr><td
                        colspan=2><input type="hidden" name="submit"
                        value="1">
<tr><td colspan=2><input
                        type="hidden" name="top_name" value="<?php echo
                        $top_name ?>">
<tr><td
                        colspan=2><input type="hidden" name="nick"
                        value="<?php echo $nick
                        ?>">
<tr><td colspan=2><input
                        type="hidden" name="type" value="<?php echo $type
                        ?>">
<tr><td colspan=2><input
                        type="hidden" name="reply_date" value="<?php echo
                        $reply_date ?>">
<tr><td colspan=2
                        align=center> <br><input
                        type="submit"
                        value="Submit"></table>
<?php
} elseif
                        ($type=="reply") {
                        // Если это ответ на топик,находим
                        его в //таблице replies по названию
                        топика.
$query="select reply from replies where
                        name='$nick' and top_name='$top_name' and
                        reply_date='$reply_date'";
$result=mysql_query
                        ($query);
$row=mysql_fetch_array
                        ($result);
$reply=$row["reply"];
$reply=str_replace
                        ("<br>","",$reply);
                        print_header
                        ();
?>
<h3 align=center><font
                        color="0000ff">Edit
                        reply.</font></h3>
<p align=right>|
                        <a href="<?php echo $script ?>">Go to
                        topics</a> | <a href="<?php echo $script
                        ?>?action=register"> Register</a> |
<p
                        align=right><font color="0000ff">Only
                        registered users may post messages in this
                        forum.</font>
                        <p><form action="<?php
                        echo $script ?>" name="editmsg"
                        method="GET">
<table width=60% align=center
                        bgcolor="aaaaaa">
<tr><td> 
<tr><td><b>Your
                        nick:</b><td><input type="text"
                        name="name"
                        size=20>
<tr><td><b>Your
                        password:</b><td><input type="password"
                        name="passwd" size=20>
<tr><td
                        colspan=2> <b>Message:</b><p>  <textarea
                        cols=40 rows=15 WRAP 80="virtual"
                        name="post">
<?php echo $reply
                        ?><br></textarea>
<tr><td
                        colspan=2><input type="hidden" name="action"
                        value="edit">
<tr><td
                        colspan=2><input type="hidden" name="submit"
                        value="1">
<tr><td colspan=2><input
                        type="hidden" name="top_name" value="<?php echo
                        $top_name ?>">
<tr><td
                        colspan=2><input type="hidden" name="nick"
                        value="<?php echo $nick
                        ?>">
<tr><td colspan=2><input
                        type="hidden" name="type" value="<?php echo $type
                        ?>">
<tr><td colspan=2><input
                        type="hidden" name="reply_date" value="<?php echo
                        $reply_date ?>">
<tr><td colspan=2
                        align=center> <br><input
                        type="submit"
                        value="Submit"></table>
<?php
}
}
                        Далее,можно считать и обработать
                        данные. 
                        
elseif ($action=="edit")
                        {
if ($submit) {
connect ();
                        // Делаем все как
                        обычно.Переменная //$end-это строка,добавляемая в конце
                        редактируемого сообщения.
$date=date ( "Y-m-d
                        H:i:s",mktime
                        ());
$end="\n----------------------------------------------------------\nThis
                        message was edited by $nick
                        $date.";
$post=str_replace ("'","
                        ",$post);
$post.=$end;
$post=htmlspecialchars
                        ($post);
$post=nl2br ($post);
                        // Проверяем имя и пароль.
if
                        ($type=="message") {
$query="select id from info
                        where name='$name' and
                        password='$passwd'";
$result=mysql_query
($query);
                        // Если все ОК и это
                        топик-обновляем таблицу topics.
if (mysql_num_rows
                        ($result) && $name==$nick) {
$query="update
                        topics set message='$post' where
                        top_name='$top_name'";
$result=mysql_query
                        ($query);
print_header ();
?>
                        // Говорим пользователю
                        спасибо.
<h3 align=center>Thank you,<font color='ff0000'><?php
                        echo $nick
                        ?></font>!</h3>
<p>Your message
                        was changed.
<p><center>| <a
                        href="<?php echo $script ?>">Go to
                        topics</a> |<a href="<?php echo $script
                        ?>?action=add_new_top"> Post new topic</a>
                        |</center>
<?php
} else {
print_header
                        ();
?>
                        // Если имя и пароль не найдены
                        или пользователь //не является автором сообщения
                        выдается ошибка.
<h3
                        align=center>Error!</h3>
<p>This
                        message cannot be edited.May be you entered incorrect
                        nick or password,
or you are not an author of this
                        message.
<p>Please,go back and try
                        again.
<p><center>| <a
                        href='javascript:history.back ()'> Go back</a>|
                        <a href="<?php echo $script ?>">Go to
                        topics</a> |</center>
<?php
}
}
                        elseif ($type=="reply") {
                        // Если это ответ на
                        топик,изменяем таблицу replies.
$query="select id
                        from info where name='$name' and
                        password='$passwd'";
$result=mysql_query
($query);
                        if (mysql_num_rows ($result)
                        && $name==$nick) {
$query="update replies set
                        reply='$post' where top_name='$top_name' and
                        name='$nick' and
                        reply_date='$reply_date'";
$result=mysql_query
                        ($query);
print_header ();
?>
<h3
                        align=center>Thank you,<font
                        color='ff0000'><?php echo $nick
                        ?></font>!</h3>
<p>Your message
                        was changed.
<p><center>| <a
                        href="<?php echo $script ?>">Go to
                        topics</a> |<a href="<?php echo $script
                        ?>?action=add_new_top"> Post new topic</a>
                        |</center>
<?php
} else {
print_header
                        ();
?>
<h3
                        align=center>Error!</h3>
<p>This
                        message cannot be edited.May be you entered incorrect
                        nick or password,
or you are not an author of this
                        message.
<p>Please,go back and try
                        again.
<p><center>| <a
                        href='javascript:history.back ()'> Go back</a>|
                        <a href="<?php echo $script ?>">Go to
                        topics</a>
                        |</center>
<?php
}
}
}
                        Как видите,ничего нового.Те же
                        SQL-запросы в связке с PHP-функциями. 
                        
                        
Если пользователь забыл
                        пароль
Если пользователь забыл пароль, ему
                        достаточно ввести свой e-mail, который он указал при
                        регистрации, и пароль будет выслан ему на этот e-mail.
                        Форма для ввода: 
                        
<p><h4
                        align=center>Please,enter your e-mail address,you
                        provided while
                        registered.</h4>
<p><FORM
                        ACTION="<?php echo $script ?>"
                        METHOD="POST">
<p align=right><a
                        href="forum.php3">Home</a>
<center><TABLE
                        BGCOLOR="bfbfbf">
<tr><td
                        colspan=2> 
<TR><td><b>E-mail:</b><TD><INPUT
                        TYPE="text" NAME="email"
                        SIZE="20">  
<tr><td
                        colspan=2><input type="hidden" name="action"
                        value="remind_pass">
<TR><TD
                        colspan=3><p><center><INPUT
                        TYPE="submit" VALUE="Submit"></center>
                        Обработка данных: 
                        
elseif
                        ($action=="remind_pass") {
if ($email) {
connect
                        ();
                        // Проверяем,есть ли такой e-mail
                        в БД.
$query="select name,password from info where
                        email='$email'";
$result=mysql_query ($query);
                        $row=mysql_fetch_array
                        ($result);
$name=$row["name"];
$password=$row["password"];
                        // Если есть,отправляем сообщение
                        с паролем.
if (mysql_num_rows ($result))
                        {
$to=$email;
$subject="Password
                        reminder";
$mes="Your
                        password:".$password.".";
mail
                        ("$to","$subject","$mes");
                        print_header
                        ();
?>
<h3 align=center>Hello,<?php
                        echo $name ?>!</h3>
<p>You entered
                        valid e-mail!
<p>Your password sent to your
                        e-mail address.
<p><center>| <a
                        href="<?php echo $script ?>">Go to
                        topics</a> |<a href="<?php echo $script
                        ?>?action=add_new_top"> Post new topic</a>
                        |</center>
<?php
} else {
print_header
                        ();
?>
                        // Если e-mail не найден,выводится
                        ошибка.
<h3
                        align=center>Sorry!</h3>
<p>This
                        e-mail address hasn't been found in our
                        database.<br>
Please,verify your e-mail address
                        an try again,or go to our registration page and
                        register.
<p><center>| <a
                        href="<?php echo $script
                        ?>?action=remind_pass">Go back</a> |<a
                        href="<?php echo $script ?>?action=register">
                        Register</a>
                        |</center>
<?php
}
}
                        
Главная страница
                        форума
Вот мы и добрались до конца, точнее до
                        начала-главной страницы форума, на которой показывается
                        список топиков, количество ответов, автор топика, дата
                        создания топика и дата последнего ответа на него. 
                        В принципе,ничего нового.
                        Количество записей на страницу также ограничено 20. 
                        
print_header
                        ();
?>
<h2 align=center><font
                        color="0000ff">Webboard.</font></h2>
<p
                        align=right>| <a href="<?php echo $script
                        ?>?action=add_new_top">Post new topic</a>
                        |
<a href="<?php echo $script
                        ?>?action=register">Registration</a> | <a
                        href="<?php echo $script
                        ?>?action=remind_pass"> Forgot
                        password?</a>
| <a href="<?php echo
                        $script ?>?action=search">Search</a>
                        |
<p><table cellspacing=0 cellpadding=5
                        border=1>
<tr bgcolor="D5E6E1"><td
                        align=center width=300 height=50><font
                        face="arial" size=2 color="0000ff">Topic
                        name</font></td>
<td align=center
                        width=120 height=50><font face="arial" size=2
                        color="0000ff">Topic
                        starter</font></td>
<td align=center
                        width=50 height=50><font face="arial" size=2
                        color="0000ff">Replies</font></td>
<td
                        align=center width=120 height=50><font
                        face="arial" size=2
                        color="0000ff">Posted</font></td>
<td
                        align=center width=120 height=50><font
                        face="arial" size=2 color="0000ff">Last
                        reply</font></td>
                        <?php
connect
                        ();
$lines=20;
$begin=$page*$lines;
if (empty
                        ($page)) {
$page=0;
}
                        $query="select
                        top_name,name,replies,post_date,last_reply from topics
                        order by last_reply desc limit
                        $begin,$lines";
$result=mysql_query ($query);
                        while ($row=mysql_fetch_array
                        ($result))
                        {
$name=$row["name"];
$top_name=$row["top_name"];
$replies=$row["replies"];
$post_date=$row["post_date"];
$last_reply=$row["last_reply"];
?>
<tr
                        bgcolor='e6f8fa'><td><a href="<?php echo
                        $script ?>?action=read_topic&top_name=<?php
                        echo $top_name ?>&name=<?php echo $name
                        ?>"><?php echo $top_name
                        ?></a>
<?php echo
                        "</td><td>".$name."</td><td
                        align=center>".$replies."</td><td>".$post_date."</td><td>".$last_reply."</td></tr>";
}
echo
                        "</table>";
                        $query="select COUNT(*) as count
                        from topics";
$result=mysql_query
                        ($query);
$items=mysql_fetch_array
                        ($result);
$count=$items["count"];
$pages=ceil
                        ("$count/$lines");
                        if ($count>$lines) {
echo
                        "<p align=right>";
for ($i=0;$i<$pages;$i++)
                        {
?>
|<a href="<?php echo $script
                        ?>?page=<?php echo $i ?>"><?php echo
                        ($i+1)
                        ?></a><?php
}
}
}
?>
                        Конечно,данный форум не пример для
                        подражания. У каждого своя манера программирования.
                        Может другой напишет это по-своему. Однако за основу
                        принять можно. 
                        Автор: OlegTr
Информация взята
                        с сайта http://www.zk.ru/