Скрипт форума на PHP своими руками. Часть 1


Прислал: Евгений Токмаков [ 03.07.2008 @ 12:38 ]
Раздел:: [ Статьи по PHP ]


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

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

Итак, приступим.

Все операции на форуме - показ темы, добавление нового сообщения (поста), просмотр профиля участника выполняются одним скриптом index.php. Чтобы знать, какое действие выполняет посетитель форума, методом GET передается параметр action. Вот и первая часть скрипта index.php

<?php
// Параметры соединения с сервером БД
require 'config/connect.php';
// Файл конфигурации
require 'config/config.php';
// Вспомогательные функции
require 'functions/functions.php';

// Соединяемся с сервером БД
mysql_connect DB_LOCATIONDB_USERDB_PASSWORD );
mysql_query'SET NAMES cp1251' );
mysql_select_db DB_NAME );

session_start();

// Содержимое html-тега title
$pageTitle FORUM_TITLE;

if ( !isset( 
$_GET['action'] ) ) $_GET['action'] = 'showMainPage';
$actions = array( 'showMainPage',
                  
'showForum',
                  
'showTheme',
                  
'addForumForm',
                  
'addForum',
                  
'editForumForm',
                  
'updateForum',
                  
'forumUp',
                  
'forumDown',
                  
'deleteForum',
                  
'addThemeForm',
                  
'addTheme',
                  
'editThemeForm',
                  
'updateTheme',
                  
'deleteTheme',
                  
'lockTheme',
                  
'unlockTheme',
                  
'addPostForm',
                  
'addPost',
                  
'quickReply',
                  
'editPostForm',
                  
'updatePost',
                  
'deletePost',
                  
'loginForm',
                  
'login',
                  
'logout',
                  
'addNewUserForm',
                  
'addNewUser',
                  
'activateUser',
                  
'newPasswordForm',
                  
'sendNewPassword',
                  
'activatePassword',
                  
'editUserForm',
                  
'updateUser',
                  
'editUserFormByAdmin',
                  
'updateUserByAdmin',
                  
'showUsersList',
                  
'showUserInfo',
                  
'sendMsgForm',
                  
'sendMessage',
                  
'deleteMsg',
                  
'showMsgBox',
                  
'showInBox',
                  
'showOutBox',
                  
'showMsg',
                  
'sendMailForm',
                  
'sendMail',
                  
'searchForm',
                  
'searchResult' );
if ( !
in_array$_GET['action'], $actions ) ) $_GET['action'] = 'showMainPage';

switch ( 
$_GET['action'] )
{
  case 
'showMainPage':  // главная страница форума
    
$content getMainPage$pageTitle );
    break;
  case 
'showForum':     // список тем форума
    
$content getForum$pageTitle );
    break;
  case 
'showTheme':     // список сообщений темы
    
$content getTheme$pageTitle );
    break;
  case 
'addForumForm':  // форма для добавления нового форума
    
$content getAddForumForm();
    break;
  case 
'addForum':      // добавить новый форум
    
$content addForum();
    break;
  case 
'editForumForm'// форма для редактирования форума
    
$content getEditForumForm();
    break;
  case 
'updateForum':   // обновить запись в таблице БД TABLE_FORUMS
    
$content updateForum();
    break;
  case 
'forumUp':
    
$content forumUp(); // переместить форум "вверх"
    
break;
  case 
'forumDown':
    
$content forumDown(); // переместить форум "вниз"
    
break;
  case 
'deleteForum':   // удалить запись в таблице БД TABLE_FORUMS
    
$content deleteForum();
    break;
  case 
'addThemeForm':  // форма для добавления новой темы
    
$content getAddThemeForm();
    break;
  case 
'addTheme':      // добавить новую тему
    
$content addTheme();
    break;
  case 
'editThemeForm'// форма для редактирования темы
    
$content getEditThemeForm();
    break;
  case 
'updateTheme':   // обновить запись в таблице БД TABLE_THEMES
    
$content updateTheme();
    break;
  case 
'deleteTheme':   // удалить тему
    
$content deleteTheme();
    break;
  case 
'lockTheme':   // закрыть тему
    
$content lockTheme();
    break;
  case 
'unlockTheme'// открыть тему
    
$content unlockTheme();
    break;
  case 
'addPostForm':   // форма для добавления нового сообщения (поста)
    
$content getAddPostForm();
    break;
  case 
'addPost':       // добавить новую запись в таблицу БД TABLE_POSTS
    
$content addPost();
    break;
  case 
'quickReply':     // добавить новую запись в таблицу БД TABLE_POSTS
    
$content quickReply();
    break;
  case 
'editPostForm':  // форма для редактирования сообщения (поста)
    
$content getEditPostForm();
    break;
  case 
'updatePost':    // обновить запись в таблице БД TABLE_POSTS
    
$content updatePost();
    break;
  case 
'deletePost':    // удалить запись в таблице БД TABLE_POSTS
    
$content deletePost();
    break;
  case 
'loginForm':     // форма для входа на форум (авторизация)
    
$content getLoginForm();
    break;
  case 
'login':         // вход на форум (авторизация)
    
$content login();
    break;
  case 
'logout':        // выход
    
$content logout();
    break;
  case 
'addNewUserForm'// форма для регистрации нового пользователя
    
$content getAddNewUserForm();
    break;
  case 
'addNewUser':    // добавить нового пользователя
    
$content addNewUser();
    break;
  case 
'activateUser':  // активация учетной записи нового пользователя
    
$content activateUser();
    break;
  case 
'newPasswordForm'// форма для получения нового пароля
    
$content newPasswordForm();
    break;
  case 
'sendNewPassword':    // выслать пользователю новый пароль
    
$content sendNewPassword();
    break;
  case 
'activatePassword'// активация нового пароля
    
$content activatePassword();
    break;
  case 
'editUserForm':  // форма для редактирования профиля
    
$content getEditUserForm();
    break;
  case 
'updateUser':    // обновить данные о пользователе
    
$content updateUser();
    break;
  case 
'editUserFormByAdmin':  // форма редактирования профиля (для администратора)
    
$content getEditUserFormByAdmin();
    break;
  case 
'updateUserByAdmin':    // обновить данные о пользователе (для администратора)
    
$content updateUserByAdmin();
    break;
  case 
'showUsersList'// список пользователей форума
    
$content getUsersList();
    break;
  case 
'showUserInfo':  // информация о пользователе (profile)
    
$content showUserInfo();
    break;
  case 
'sendMsgForm':   // форма для отправки личного сообщения
    
$content getSendMsgForm();
    break;
  case 
'sendMessage':   // отправить личное сообщение
    
$content sendMessage();
    break;
  case 
'deleteMsg':    // удалить личное сообщение
    
$content deleteMessage();
    break;
  case 
'showMsg':      // показать сообщение
    
$content getMessage();
    break;
  case 
'showInBox':    // папка "Входящие"
    
$content getInMsgBox();
    break;
  case 
'showOutBox':   // папка "Исходящие"
    
$content getOutMsgBox();
    break;
  case 
'sendMailForm':  // форма для отправки письма пользователю
    
$content getSendMailForm();
    break;
  case 
'sendMail':      // отправка письма
    
$content sendMail();
    break;
  case 
'searchForm':    // форма для поиска по форуму
    
$content searchForm();
    break;
  case 
'searchResult':  // результаты поиска по форуму
    
$content searchResult();
    break;
  default:
    
$content getMainPage();   
}

$menu getMainMenu();
$html file_get_contents'./templates/default.html' );
$html str_replace'{title}'$pageTitle$html );
$html str_replace'{description}'FORUM_DESCRIPTION$html );
$html str_replace'{menu}'$menu$html );
$html str_replace'{content}'$content$html );

echo 
$html;
?>

Из комментариев должно быть ясно, что для каждого из возможных значений переменной $_GET['action'] вызывается соответствующая функция. Например, чтобы добавить новую тему, вызывается функция addPost(), а для просмотра информации об участнике форума - функция showUserInfo().

Теперь, когда мы определили для себя все возможные значения переменной $_GET['action'], нам осталось лишь реализовать все эти функции. Мы рассмотрим их все по порядку - так что к концу этой серии статей у вас будут все исходные коды форума, и вы сможете установить его, и протестировать у себя на локальном компьютере или на хостинге.

Но пережде чем приступить к рассмотрению функций, мы посмотрим на файл конфигурации config.php. Он содержит настройки форума.

<?php
// Названое форума
define 'FORUM_TITLE''Форум web-мастера' );
// Описание форума форума
define 'FORUM_DESCRIPTION''Форум для тех, кто делает сайты' );
// Названия таблиц в БД форума
define 'TABLE_FORUMS''forums' );
define 'TABLE_THEMES''themes' );
define 'TABLE_POSTS''posts' );
define 'TABLE_USERS''authors' );
define 'TABLE_MESSAGES''messages' );
// Максимальный размер файла вложения в байтах
define 'MAX_FILE_SIZE'524288 );
// Максимальный размер файла аватара в байтах
define 'MAX_AVATAR_SIZE'65536 );
// Минимальная длина пароля пользователя
define 'MIN_PASSWORD_LENGTH');
// Адрес электронной почты администратора; этот e-mail
// будет указан в поле FROM писем, которое один пользователь
// напишет другому; этот же e-mail будет указан в письмах
// с просьбой активировать учетную запись или пароль 
// (в случае его утери)
define 'ADMIN_EMAIL''admin@mail.ru' );
// Под этим именем будет показано сообщение (пост) 
// не зарегистрированного пользователя
define 'NOT_REGISTERED_USER''Посетитель' );
// Максимальная длина тела сообщения (поста)
define 'MAX_POST_LENGTH'12288 );
// Максимальная длина тела личного сообщения, которое
// один пользователь форума может написать другому
define 'MAX_MESSAGE_LENGTH'8192 );
// Максимальная длина тела письма, которое один пользователь форума
// может написать другому
define 'MAX_MAILBODY_LENGTH'8192 );
// Задержка в секундах перед редиректом; когда пользователь выполняет
// какое-то действие (например, добавляет сообщение) ему выдается
// сообщение, что "Ваше сообщение было успешно добавлено" и делается
// редирект на нужную страницу
define 'REDIRECT_DELAY');
// Включает режим отладки - на экран выдаются сообщения об ошибках
define 'DEBUG_MODE');
// Время жизни cookies в днях; в cookies сохраняются логин и пароль пользователя,
// если была выбрана опция "Автоматически входить при каждом посещении"
define 'COOKIE_TIME'30 );
// Максимальное количество личных сообщений в папках
// "Входящие" и "Исходящие"
define 'MAX_COUNT_MESSAGES'50 );
// Время в минутах, в течение которого считается, что пользователь "on-line"
define 'TIME_ON_LINE');
// Количество пользователей на одну страницу
// в списке зарегистрированных пользователей
define 'USERS_PER_PAGE'20 );
// Количество сообщений (постов) на одной странице
define 'POSTS_PER_PAGE');
// Количество тем на одной странице
define 'THEMES_PER_PAGE'20 );
?>

Итак, первая функция - getMainPage() возвращает главную страницу форума. Главная страница выглядит как список всех форумов. Для каждого форума выводится список трех тем форума, в которых были новые сообщения.

<?php
// Функция возвращает html главной страница форума (список форумов)
function getMainPage( &$pageTitle )
{
  
$pageTitle $pageTitle.' / Список форумов';
  
$query "SELECT id_forum, name, description FROM ".TABLE_FORUMS." WHERE 1 ORDER BY pos";
  
$res mysql_query$query );
  if ( !
$res ) {
    
$msg 'Ошибка при получении списка форумов';
    
$err 'Ошибка при выполнении запроса: <br/>'.
           
$query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
           
'(Файл '__FILE__ .', строка '__LINE__ .')';
    return 
showErrorMessage$msg$errtrue'' );
  }
  
$html '<h1>Список форумов</h1>'."\n";
  if ( 
mysql_num_rows$res ) > ) {
    while ( 
$forum mysql_fetch_array$res ) ) {
    
      
$html $html.'<table width="100%" cellpadding="0" cellspacing="0">'."\n";
      
$html $html.'<tr>'."\n";
      
// Выводим название форума
      
$html $html.'<td>';
      
$html $html.'<div><a class="header" href="'.
              
$_SERVER['PHP_SELF'].'?action=showForum&idForum='.
              
$forum['id_forum'].'">'.
              
$forum['name'].'</a></div>'."\n";
      
$html $html.'<div style="font-size:smaller">'.$forum['description'].'</a></div>';
      
// Выводим краткое описание форума
      
$html $html.'</td>'."\n";
      
// Ссылка "Править форум"
      
if ( isset( $_SESSION['user'] ) and $_SESSION['user']['status'] == 'admin' ) {
        
$html $html.'<td align="right"><a href="'.$_SERVER['PHP_SELF'].
                
'?action=editForumForm&idForum='.$forum['id_forum'].'"><img 
                src="./images/icon_edit.gif"
                alt="Править" title="Править" /></a>&nbsp;'
."\n";
        
$html $html.'<a href="'.$_SERVER['PHP_SELF'].
                
'?action=deleteForum&idForum='.$forum['id_forum'].'"><img 
                src="./images/icon_delete.gif" alt="Удалить" title="Удалить" /></a></td>'
."\n";                
      }
      
$html $html.'</tr>'."\n";
      
$html $html.'</table>'."\n";
              
      
// Выводим три темы форума, сортирируя их по последнему сообщению
      
$q "SELECT a.id_theme, a.name, a.time, a.locked,
                   IFNULL(b.id_author, 0), 
                   IFNULL(b.name, '"
.NOT_REGISTERED_USER."'),         
                   (COUNT(*)-1), IFNULL(MAX(c.time), '0000-00-00 00:00:00') AS last_post
            FROM "
.TABLE_THEMES." a LEFT JOIN ".TABLE_USERS." b
            ON a.id_author=b.id_author
            LEFT JOIN "
.TABLE_POSTS." c
            ON a.id_theme=c.id_theme
            WHERE id_forum="
.$forum['id_forum']."
            GROUP BY a.id_theme, a.name, a.time,
                     IFNULL(b.id_author, 0), 
                     IFNULL(b.name, '"
.NOT_REGISTERED_USER."')
            ORDER BY last_post DESC
            LIMIT 3"
;            
      
$r mysql_query$q );
      
      
$html $html.'<table class="showTable">'."\n";
      
$html $html.'<tr>'."\n";
      
$html $html.'<th width="23"><img src="./images/null.gif" width="23" height="1" alt="" /></th>'."\n";
      
$html $html.'<th width="50%">Тема</th>'."\n";
      
$html $html.'<th width="12%">Автор</th>'."\n";
      
$html $html.'<th width="12%">Добавлена</th>'."\n";
      
$html $html.'<th width="12%">Ответов</th>'."\n";      
      
$html $html.'<th width="12%">Последнее&nbsp;сообщение</th>'."\n";
      
$html $html.'</tr>'."\n";
      
      if ( 
mysql_num_rows$r ) == ) {
        
$html $html.'<tr>'."\n";
        
$html $html.'<td colspan="6">'."\n";
        
$html $html.'В этом форуме пока нет сообщений';
        
$html $html.'</td>'."\n";
        
$html $html.'</tr>'."\n";
        
$html $html.'</table>'."\n";
        continue;        
      }

      while ( 
$theme mysql_fetch_row$r ) ) {
        
$html $html.'<tr>'."\n";
        if ( isset( 
$_SESSION['user'] ) ) { // это для зарегистрированного пользователя
          // Если есть новые сообщения (посты) - только для зарегистрированных пользователей
          
if ( isset( $_SESSION['newThemes'] ) and in_array$theme[0], $_SESSION['newThemes'] ) ) {
            if ( 
$theme[3] == // тема открыта
              
$html $html.'<td align="center" valign="middle"><img src="./images/folder_new.gif" width="19"
                      height="18" alt="Новые сообщения" title="Новые сообщения" /></td>'
;
            else 
// тема закрыта        
              
$html $html.'<td align="center" valign="middle"><img src="./images/folder_lock_new.gif" width="19"
                      height="18" alt="Новые сообщения" title="Новые сообщения" /></td>'
;
          } else {
            if ( 
$theme[3] == // тема открыта
              
$html $html.'<td align="center" valign="middle"><img src="./images/folder.gif" width="19" 
                      height="18" alt="Нет новых сообщений" title="Нет новых сообщений" /></td>'
;
            else 
// тема закрыта
              
$html $html.'<td align="center" valign="middle"><img src="./images/folder_lock.gif" width="19" 
                      height="18" alt="Нет новых сообщений" title="Нет новых сообщений" /></td>'
;          
          }
        } else { 
// это для не зарегистрированного пользователя
          
if ( $theme[3] == // тема открыта
            
$html $html.'<td align="center" valign="middle"><img src="./images/folder.gif" width="19" 
                    height="18" alt="" /></td>'
;
          else 
// тема закрыта
            
$html $html.'<td align="center" valign="middle"><img src="./images/folder_lock.gif" width="19"
                    height="18" alt="" /></td>'
;        
        }
        
// Название темы
        
$html $html.'<td>';
        
$html $html.'<a class="topictitle" href="'.$_SERVER['PHP_SELF'].'?action=showTheme&idForum='.
                
$forum['id_forum'].'&id_theme='.$theme[0].'">'.$theme[1].'</a>';
        
$html $html.'</td>';
        
$html $html.'<td align="center" nowrap="nowrap">'."\n";
        
// Автор темы
        
if ( $theme[4] ) {
          
$html $html.'<a href="'.$_SERVER['PHP_SELF'].'?action=showUserInfo&idUser='.
                  
$theme[4].'">'.$theme[5].'</a>';
        } else {
          
$html $html.$theme[5];
        }
        
$html $html.'</td>';
        
// Дата добавления темы
        
$html $html.'<td align="center" nowrap="nowrap">';
        
$html $html.$theme[2];
        
$html $html.'</td>'."\n";
        
// Количество ответов
        
$html $html.'<td align="center" nowrap="nowrap">';
        
$html $html.$theme[6];
        
$html $html.'</td>'."\n";
        
// Дата последнего обновления
        
$html $html.'<td align="center" nowrap="nowrap">';
        
$html $html.$theme[7];
        
$html $html.'</td>'."\n";
        
$html $html.'</tr>'."\n";
      }
      
$html $html.'</table>'."\n";
    }      
  } else {
    
$html '<p>Не найдено ни одного форума</p>'."\n";
  }
  
  
$html $html.getUsersOnLine();
  
  return 
$html;
}
?>

Интерес здесь представляет лишь запрос на выборку трех тем для каждого форума. Темы сортируются по последнему сообщению (посту). Как видите, здесь идет связывание трех таблиц БД: TABLE_THEMES, TABLE_USERS и TABLE_POSTS.

<?php
$q 
"SELECT a.id_theme, a.name, a.time, a.locked,
             IFNULL(b.id_author, 0), 
             IFNULL(b.name, '"
.NOT_REGISTERED_USER."'),         
             (COUNT(*)-1), IFNULL(MAX(c.time), '0000-00-00 00:00:00') AS last_post
      FROM "
.TABLE_THEMES." a LEFT JOIN ".TABLE_USERS." b
      ON a.id_author=b.id_author
      LEFT JOIN "
.TABLE_POSTS." c
      ON a.id_theme=c.id_theme
      WHERE id_forum="
.$forum['id_forum']."
      GROUP BY a.id_theme, a.name, a.time,
               IFNULL(b.id_author, 0), 
               IFNULL(b.name, '"
.NOT_REGISTERED_USER."')
      ORDER BY last_post DESC
      LIMIT 3"
;
?>

Прежде чем продолжить наше повествавание, необходимо сделать небольшое лирическое отступление и рассказать о структуре базы данных форума. База данных содержит шесть таблиц.

Таблица TABLE_USERS содержит информацию о пользователях форума. Вот запрос на создание таблицы

CREATE TABLE `authors` (
`id_author` int(6) NOT NULL AUTO_INCREMENT,
`name` varchar(32) NOT NULL DEFAULT '',
`passw` varchar(255) NOT NULL DEFAULT '',
`email` varchar(64) NOT NULL DEFAULT '',
`timezone` tinyint(2) NOT NULL DEFAULT '0',
`url` varchar(64) NOT NULL DEFAULT '',
`icq` varchar(12) NOT NULL DEFAULT '',
`about` tinytext NOT NULL,
`signature` tinytext NOT NULL,
`photo` varchar(32) NOT NULL DEFAULT '',
`puttime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`last_visit` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`themes` mediumint(8) UNSIGNED NOT NULL DEFAULT '0',
`posts` int(10) UNSIGNED NOT NULL DEFAULT '0',
`status` enum('user','moderator','admin') NOT NULL DEFAULT 'user',
`activation` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY  (`id_author`)

) ENGINE=MyISAM  DEFAULT CHARSET=cp1251;

Поля таблицы TABLE_USERS:

  • id_author - первичный ключ таблицы, снабженный механизмом auto_increment
  • name - имя пользователя
  • passw - пароль пользователя, зашифрованный с помощью алгоритма md5
  • email - e-mail пользователя
  • timezone - временная зона
  • url - URL домашней странички
  • icq - ICQ
  • about - интересы
  • signature - подпись
  • photo - фото (аватар)
  • puttime - время регистрации
  • last_visit - время последнего посещения форума
  • themes - количество тем, начатых пользователем
  • posts - количество сообщений (постов)
  • status - статус пользователя
  • activation - поле для хранения кода активации

Таблица TABLE_FORUMS содержит информацию о всех форумах. Запрос на создание таблицы

CREATE TABLE `forums` (

`id_forum` int(6) NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`description` mediumtext NOT NULL,
`pos` smallint(6) NOT NULL DEFAULT '0',
PRIMARY KEY  (`id_forum`)

) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

Поля таблицы TABLE_FORUMS:

  • id_forum - первичный ключ таблицы
  • name - название форума
  • description - краткое описание форума
  • pos - позиция в списке

Таблица TABLE_THEMES содержит информацию о темах форума. Запрос на создание таблицы

CREATE TABLE `themes` (

`id_theme` int(11) NOT NULL AUTO_INCREMENT,
`name` tinytext NOT NULL,
`author` tinytext NOT NULL,
`id_author` int(6) NOT NULL DEFAULT '0',
`time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`id_forum` int(2) NOT NULL DEFAULT '0',
`locked` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY  (`id_theme`),
FULLTEXT KEY `search` (`name`)

) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

Поля таблицы TABLE_THEMES:

  • id_theme - первичный ключ таблицы
  • name - название темы
  • author - имя автора темы
  • id_author - ID автора темы
  • time - время создания темы
  • id_forum - ID форума, которому принадлежит тема
  • locked - если равно 1, значит тема закрыта (заблокирована)

Таблица TABLE_POSTS содержит информацию о сообщениях (постах) форума. Запрос на создание таблицы

CREATE TABLE `posts` (

`id_post` int(11) NOT NULL AUTO_INCREMENT,
`name` text NOT NULL,
`putfile` tinytext NOT NULL,
`author` tinytext NOT NULL,
`id_author` int(6) UNSIGNED NOT NULL DEFAULT '0',
`time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`edittime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`id_editor` int(6) UNSIGNED NOT NULL DEFAULT '0',
`id_theme` int(11) NOT NULL DEFAULT '0',
`locked` tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY  (`id_post`),
FULLTEXT KEY `search` (`name`)

) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

Поля таблицы TABLE_THEMES:

  • id_post - первичный ключ таблицы
  • name - сообщение (пост)
  • putfile - имя файла вложения
  • author - имя автора сообщения
  • id_author - ID автора сообщения
  • time - время создания сообщения
  • edittime - время редактирования сообщения
  • id_editor - ID пользователя, который редактировал сообщение
  • id_theme - ID темы, которому принадлежит сообщение
  • locked - если равно 1, значит сообщение заблокировано

Таблица TABLE_MESSAGES содержит сообщения, которымы могут обмениваться зарегистрированные аользователи форума. Запрос на создание таблицы

CREATE TABLE `messages` (
`id_msg` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`to_user` int(10) UNSIGNED NOT NULL DEFAULT '0',
`from_user` int(10) UNSIGNED NOT NULL DEFAULT '0',
`sendtime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`subject` varchar(255) NOT NULL DEFAULT '',
`message` text NOT NULL,
`id_rmv` int(10) UNSIGNED NOT NULL DEFAULT '0',
`viewed` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY  (`id_msg`)

) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

Поля таблицы TABLE_MESSAGES:

  • id_msg - первичный ключ таблицы
  • to_user - ID пользователя, котоый получит сообщение
  • from_user - ID автора сообщения
  • sendtime - время создания сообщения
  • subject - тема сообщения
  • message - сообщение
  • id_rmv - ID пользователя, который удалил сообщение
  • viewed - если равно 1, значит сообщение было просмотрено получателем

Ну вот, с базой данных форума мы разобрались, теперь давайте посмотрим вот на этот кусок кода и разберемся, что из себя представляет "файл шаблона форума":

<?php
........................................................
// Получаем в переменную содержимое файла шаблона форума
$html file_get_contents'./templates/default.html' );
$html str_replace'{title}'$pageTitle$html );
$html str_replace'{description}'FORUM_DESCRIPTION$html );
$html str_replace'{menu}'$menu$html );
$html str_replace'{content}'$content$html );
........................................................
?>

Файл шаблона форума

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>{title}</title>
<meta http2-equiv="Content-Type" content="text/html; charset=windows-1251">
<meta name="description" content="{description}">
<link rel="stylesheet" href="./style/style.css" type="text/css">
</head>
<body><a name="top"></a>

<table class="bodyTable">
<tr height="10%">
  <td>
  <!-- Здесь место для логотипа и рекламы -->
  </td>
</tr>
<tr height="5%">
  <td>
  {menu}
  </td>
</tr>
<tr height="80%" valign="top">
  <td>
  {content}
  </td>
</tr>
<tr height="5%">
  <td>
  <!-- Здесь место для разных счетчиков посещаемости или рекламы -->
  </td>
</tr>
</table>

</body>
</html>

Пожалуй, на сегодня это все. Продолжение следует...