WebScript.Ru
C:\   главная  ::   о сайте  ::  каталог скриптов  ::  гнездо  ::  форум  ::   авторам  :: Новостройки ::   ХОСТИНГ  ::

|| разделы::
|| поиск по сайту::

|| реклама::
|| новости почтой::
Рассылки Subscribe.Ru ::



Новости сайта WebScript.Ru
Популярные статьи

Hot 5 Stories

|| рекомендуем::




Форум, работающий с базой данных MySQL


Прислал: OlegTr [ 06.06.2001 @ 04:02 ]
Раздел:: [ Статьи по PHP ]


Для работы форума необходим веб-сервер 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>&nbsp; <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>&nbsp;<b>Message:</b><p>&nbsp;&nbsp;<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>&nbsp;<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>&nbsp; <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>&nbsp;<b>Message:</b><p>&nbsp;&nbsp;
<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>&nbsp;<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 ("&lt;br&gt;","",$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> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="mailto:
<?php echo $email ?>"><img src="email.gif" border=0></a> &nbsp;&nbsp;<font face="serif" size=1 color="000080">E-mail </font>
<font face="serif" size=1 color="0000ff"><?php echo $name ?></font> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<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>&nbsp;&nbsp;
<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 ("&lt;br&gt;","",$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> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<a href="mailto:<?php echo $mail ?>">
<img src="email.gif" border=0></a> &nbsp;&nbsp;</font><font face="serif" size=1 color="000080">
E-mail </font><font face="serif" size=1 color="0000ff">
<?php echo $nick ?></font> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<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>&nbsp;&nbsp;
<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>&nbsp; <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>&nbsp;<b>Message:</b><p>&nbsp;&nbsp;
<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>&nbsp;
<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>&nbsp; <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>&nbsp;<b>Message:</b><p>&nbsp;&nbsp;
<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>&nbsp;<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----------------------------------------------------------\n
This 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>&nbsp;
<TR><td><b>E-mail:</b><TD><INPUT TYPE="text" NAME="email" SIZE="20">&nbsp;&nbsp;
<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 } } } ?>

Конечно,данный форум не пример для подражания. У каждого своя манера программирования. Может другой напишет это по-своему. Однако за основу принять можно.


 :::::  Прохожий пишет 07.06.2001 @ 16:11 
Давно хотел чего-то такого...
Разбираться в готовых не очень охота, а тутта русские комментарии!
Теперь проверю и буду переделывать(под свой вкус:))... Наворочаю...
 :::::  Nanotex пишет 23.06.2001 @ 11:06 
Что-то рабочий пример (http://phpmysql.flashmaster.ru/forum.php), совсем не рабочий:

Fatal error: Cannot redeclare connect() in /home/users/phpmysql/www/forum.php on line 71
 :::::  Anatoly Steinpress пишет 04.07.2001 @ 17:08 

Уверен, что просто по забывчивости, а не из-за уверенности в том, что все используют русские версии всех программ, забыта одна НЕОБХОДИМАЯ СТРОКА

<html><head><title>Forum version 1.1</title>

<META CONTENT="text/html; charset=windows-1251" HTTP-EQUIV=Content-Type>
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
</head>

А так, спасибо за эту "историю".
Возможно, использую этот скрипт, если буду организовывать форум на сайте.


 :::::  Vova пишет 24.07.2001 @ 06:47 
Что-то мне не удалось ответить в топик. Некорректный ответ на mysql-запрос в строке 721. Скачивал сегодня. Ф-цию connect (); поправил. Сыровато как-то. Но все равно спасибо. Есть хоть на чем поучится))
 :::::  fuse пишет 25.07.2001 @ 04:57 
подскажите пжалста, как организовать администрирование на этом форуме? .... у меня ниче не получается =(((((((((

и еще: как сделать так, чтобы после того как user заполнил какую-либо форму он не попадал на страницу типа "спасибо, вы добавлены в нашу базу данных", или "ваша тема создана" - а попадали сразу в созданную тему или в тему, куда был добавлен ответ, т.к. на ентот форум запросто по этой причине можно флудить - на странице с "ваша тема создана" жмешь рефреш и создаются такиж же тем неограниченное количество =(ААААААА) косяк...... или хотя бы подскажите как установить таймаут на создание сообщений или тем....



заранее спасибо......


можете написать сюд: fuse@inbox.ru
 :::::  fuse пишет 25.07.2001 @ 04:59 
это опять я =) как можно сделать так, чтобы сообщения мог редактировать не только его автор, но и администратор (модератор) ???
 :::::  Мари пишет 11.09.2001 @ 17:08 
Скажите, пожайлуста, где можно узнать информацию о Microsoft-IIS/4.0 on NT4/Windows 98 (как работает). Если есть какие книги, то порекомендуйте наилучшие. К сожалению, у меня стоит не Apache
 :::::  Dolce пишет 04.10.2001 @ 00:00 
Ну форум на русском это не единственный, я тоже тут один накалякал!!! :

http://www.ita-studio.com/forum/ru/
 :::::  Chainik пишет 28.10.2001 @ 09:37 
Я, конечно, извиняюсь, но что-то мне не совсем все понятно.
Я скопировал весь исходник в forum.php.
Потом пытаюсь запустить, после настройки, но кроме заглавной страницы мне ничего не показывается. Сколько не нашимал Registration - ничего не помогало.
Может я что-то забыл сделать?
 :::::  mar пишет 06.11.2001 @ 01:09 
Пример нравится, пойду смотреть исходники. Спасибо :)))
 :::::  mick пишет 03.03.2002 @ 16:01 
круто.
Тока вот два замечания:
1. Что делать с этим скриптом если необходимо быстро поменять дезайн? Переписывать? Хорошо бы использовать шаблоны.
2. Зачем каждый раз требовать от пользователя имя и пароль? Пользуйтесь сессиями.
3. И ёще неплохо с помощью cookies помечать новые сообщения для каждого посетителями.
 :::::  movies пишет 03.03.2002 @ 17:22 
Насколько принципиально, чтобы имена были латинскими буквами?
Кириллица допустима?
 :::::  Goody пишет 21.03.2002 @ 19:08 
Хороший пример. И не надо от него требовать сесии, шаблоны, куки,хрюки. Как я понимаю это все сделано для обучения и должно быть не сильно навороченным, но и не сильно простым. Сейчас в самый раз. Есть одно НО. Приведенная структура базы данных - не лучший пример. Поле replies дублирует существующую информацию. Так быть не должно. Количество ответов может быть получено функцией SELECT. Да и вообще таблицы topics и replies лучше было бы сомместить: используются они для хранения сообщений и информация примерно одинакова. Таким образом несколько полей таблиц можно было бы просто удалить.
Хороший пример использования БД можете найти на http://goody.oxena.net в онлайн играх. БД используется для хранения результатов онлайн игр.
 :::::  Igor пишет 18.04.2002 @ 08:07 
Да..... Если в предлагаемом "полный листинг здесь" еще и эксплоит раздается.....
Ну ваще круто! Вместе с форумом получаешь вирус! Два в одном.
Спасибо за вирус.
Так что скачивайте и благодарите :-)
 :::::  xxx пишет 18.04.2002 @ 16:53 
Да..... Если в предлагаемом "полный листинг здесь" еще и эксплоит раздается.....
Ну ваще круто! Вместе с форумом получаешь вирус! Два в одном.
Спасибо за вирус.
Так что скачивайте и благодарите :-)

Какой на хрен вирус?
О чем ты?
 :::::  некто пишет 02.11.2002 @ 15:13 
дада такаеже фигня каспер обнару
 :::::  некто пишет 02.11.2002 @ 15:17 
А вирус всётаки паищи он есть и это факт
 :::::  lieps пишет 04.12.2002 @ 07:44 
Вирус точно есть, может кто подскажет как его излечить.
 :::::  Parad0X пишет 15.12.2002 @ 12:14 
Ну совсем дуралеи.. ну какой же в звизду тут вирус? как всегда кто-то ляпнул по накурке, а потом понеслось! Инерция сознания, понимаете ли :) В общем не нойте - всё ОК...
А авторам за скрипт спасибо.. учу SQL и этот примерчик ничего так помог.. только я половину обрезал :))) оптимизировать есть что...
 :::::  DaDDY пишет 17.03.2003 @ 09:44 
А вирь м по сей день есть! Exploit.Applet.ActiveXComponent. БУДЬТЕ БДИТЕЛЬНЫ!!!
 :::::  Venom пишет 22.04.2003 @ 08:09 
Вирус и по сей день здесь
 :::::  Nrg пишет 05.05.2003 @ 23:56 
Привет всем почитал вроде нечего!
 :::::  Nrg пишет 06.05.2003 @ 01:50 
Если до этого дня сам не написал совой форум!
 :::::  Wispa пишет 22.06.2003 @ 19:43 
Напишите кто-нибудь, где можно взять этот листинг. А то сначала 2 трояна прыгают, а потом к чешской компании переходишь. Хорошая ссылочка
 :::::  ar пишет 30.06.2003 @ 13:29 
Privet narod,skajite kto nibud , kto uje vse proverjal,ves etot kod xranitsja v odnom file ili v rasnix. Ja sovsem chajnik v PHP ,nedelju tolko sanimajus im. saranee sposibo!!!
 :::::  ArtEm пишет 15.11.2003 @ 12:56 
Епрст! вирусы-вырусы...
 :::::  ssv пишет 29.12.2003 @ 08:40 
спасибо за вирус

 :::::  SmaSh пишет 09.01.2004 @ 13:20 
этот пример куча сайтов выкладывает, но никто даже не попытался разобраться...
там некторые куски не дописаны приходилось доделывать (когда я в нем года 2 назад разбирался)
 :::::  andy пишет 09.02.2004 @ 22:34 
TO ar
Predlogaja tebe perekvalifizirovatsja iz chajnika v koffeinik
Говорят помогает

 :::::  Zork пишет 17.02.2004 @ 00:08 
А троян есть до сих пор !!!
 :::::   пишет 13.03.2004 @ 16:27 
мне нужен сам exe. а не текст
 :::::  Sanika пишет 04.04.2004 @ 15:15 
какой ехе ? :о))) А вирик и ныне там ...
 :::::  Mih@il пишет 12.05.2004 @ 15:16 
Огромнейшее спасибо тебе за инфу,предоставленную на сайте-она меня просто выручила
 :::::  Macedonian пишет 25.06.2004 @ 18:40 
плз киньте кто-нить исходники на мыло, а то по ссылочке кроме какой-то муры и трояна ничего не вылазит
 :::::  Alex пишет 01.09.2004 @ 17:21 
Да не трогай те вы этот форум! К сказали он не доделан!!! Его либо резать надо, либодописывать!
В инете дофига всяких форумов (с русскими описаниями)!
 :::::  Mufasa King пишет 14.10.2004 @ 07:02 
Хм. А про авторизацию то забыли. ;) Надо бы исходник глянуть, кто может, намыльте, плиз.
 :::::  Well пишет 26.10.2004 @ 16:25 
В примере нет описания поиска, а поиск это один из важнейших пунктов форума.
Ну и полный текст скрипта почему-то недоступен :(
 :::::  nikon пишет 14.09.2007 @ 16:12 
Можите сделать урок или объяснить мне как сделать форму типа купить моник (относится к интернет магазу) с участием MySQL я самаучка .....и нет людей знакомых которые могли бы рассказать и показать на примере,т.ч обращаюсь к вам программисты помогите с проблемкой!Заранее спасибо
Имя:
Email:
URL

Введите сумму двух чисел девять и одинн (девять+одинн=?)
Запомнить мою информацию

* Html запрещен* Ваш E-mail опубликован не будет.

Copyright © 2000-2001 WebScript.Ru nas@webscript.ru
Design © 2001 by Parallax Design Studio (aka Spectator.ru)
Все торговые марки и авторские права на эту страницу принадлежат их соответствующим владельцам.
Сгенерировано за: 0.0451229