Для работы форума необходим
веб-сервер 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/