Скрипт форума php своими руками


Скрипт форума php своими руками

В этой серии статей я постараюсь рассказать, как написать форум самому. Возможности этого форума довольно ограничены - но я и не ставил целью написать полнофункциональный форум, вроде 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', '' );
// Под этим именем будет показано сообщение (пост) 
// не зарегистрированного пользователя
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().':&nbsp;'.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>&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 ) == 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>

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




Скрипт форума php своими руками

Скрипт форума php своими руками

Скрипт форума php своими руками

Скрипт форума php своими руками

Похожие новости:

   Сделать своими руками телегу для катера
   Как необычно рассказать мужу о беременности
   Блюда из говяжьих почек рецепт с фото
   За какое время восстанавливаются ресницы
   Салат из свеклы без чеснока рецепт