PHP

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

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

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

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

Все операции на форуме - показ темы, добавление нового сообщения (поста), просмотр профиля участника выполняются одним скриптом index.php. Чтобы знать, какое действие выполняет посетитель форума, методом GET передается параметр action. Вот и первая часть скрипта index.php
<?php 
// Параметры соединения с сервером БД 
require 'config/connect.php'; 
// Файл конфигурации 
require 'config/config.php'; 
// Вспомогательные функции 
require 'functions/functions.php'; 

// Соединяемся с сервером БД 
mysql_connect ( DB_LOCATION, DB_USER, DB_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', 6 ); 
// Адрес электронной почты администратора; этот 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', 2 ); 
// Включает режим отладки - на экран выдаются сообщения об ошибках 
define ( 'DEBUG_MODE', 1 ); 
// Время жизни cookies в днях; в cookies сохраняются логин и пароль пользователя, 
// если была выбрана опция "Автоматически входить при каждом посещении" 
define ( 'COOKIE_TIME', 30 ); 
// Максимальное количество личных сообщений в папках 
// "Входящие" и "Исходящие" 
define ( 'MAX_COUNT_MESSAGES', 50 ); 
// Время в минутах, в течение которого считается, что пользователь "on-line" 
define ( 'TIME_ON_LINE', 5 ); 
// Количество пользователей на одну страницу 
// в списке зарегистрированных пользователей 
define ( 'USERS_PER_PAGE', 20 ); 
// Количество сообщений (постов) на одной странице 
define ( 'POSTS_PER_PAGE', 5 ); 
// Количество тем на одной странице 
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().': '.mysql_error().'<br/>'. 
           '(Файл '. __FILE__ .', строка '. __LINE__ .')'; 
    return showErrorMessage( $msg, $err, true, '' ); 
  } 
  $html = '<h1>Список форумов</h1>'."\n"; 
  if ( mysql_num_rows( $res ) > 0 ) { 
    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> '."\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%">Последнее сообщение</th>'."\n"; 
      $html = $html.'</tr>'."\n"; 
       
      if ( mysql_num_rows( $r ) == 0 ) { 
        $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] == 0 ) // тема открыта 
              $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] == 0 ) // тема открыта 
              $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] == 0 ) // тема открыта 
            $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 http-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>

Пожалуй, на сегодня это все. Продолжение следует...
Теги:
форум
Добавлено: 22 Сентября 2013 01:50:56 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...