Сделай сам PHP-форум

В статье описываются все шаги, необходимые для создания своего форума PHP+MySQL. Форум пишется с нуля. Статья не только о программировании, но и о администрировании форума – как получить хостинг, создать отладочную локальную среду и прочее.

В разработке активно использовалась книга Лауры Тосон и Люка Веллинга «Разработка Web-приложений на PHP и MySQL».

Предполагается, что у читателя есть базовые познания в программировании на PHP и SQL.

Локальная отладочная среда

Локальный сервер Apache + PHP + MySQL

Прежде чем сделать форум доступным для пользователей, его нужно отладить на локальной машине.

Для этого нужно использовать какой-нибудь движок. Полностью портабельный движок я так и не нашел, но нашел очень близкий к нему WAMP (http://www.wampserver.com).

Его  можно установить на флешку или переносной диск по фиксированному пути, например R:\wamp. После этого, когда вы придете на следующий компьютер, вам нужно будет всего лишь установить службы Apache и MySQL из меню WAMP:

После этого перезапустить сервисы и все, можно работать.

Из проблем было только то, что Apache конфликтовал по 80 порту с запущенным Skype. Решается путем замены 80 на любой другой порт (я взял 1313) в файле httpd.conf (этот файл тоже можно открыть из меню WAMP).

Зеленый значок в трее обозначает, что сервер запущен.

Обратите внимание, WAMP сервер может давать доступ к контенту извне, поэтому в меню должна быть надпись «Put Online», которая обозначает что сервер не доступен извне:

Рекомендую для удобства также выбрать русский язык.

Для проверки работы сервера выбираем первые два пункта «Localhost» и «phpMyAdmin». В браузере должны открыться стартовая страница WAMP и страница управления SQL базой.

Я поменял порт 80 на 1313, поэтому у меня возникли проблемы с запуском этих страниц. Проблема решается просто – нужно к адресу дописывать порт через двоеточие:

Проверка работы PHP

Скрипты PHP нужно размещать в папке WWW (\wamp\www\), ее можно открыть из меню:

 

В опциях PHP нужно поставить в истина настройку «short open tag», тогда инструкции php можно записывать как <? ?> иначе придется писать как <?php ?>, что не очень удобно.

 

В ней создаем папку forum, где будем размещать скрипты форума, создаем файл helloworld.php, содержащий код:

<?

echo "Hello World!";

?>

Теперь можно зайти на адрес: http://localhost:1313/forum/helloworld.php и увидеть сообщение «Привет, мир!».

Настройка почты в PHP

http://www.wampserver.com/phorum/read.php?2,31302,70969#msg-70969  !!!

Разработка первичного кода

Архитектура форума

Мы будем реализовывать не стандартный, а продвинутый форум. Хотя в некоторых вопросах он будет упрощен.

Сообщения и  темы

Форум будет состоять из сообщений (post). Каждое сообщение будет иметь заголовок (subject) и текст (text). Сообщения могут являться одновременно и темами (topic).

Иерархия сообщений

Каждое сообщение может иметь много родителей (parent). Такое решение позволяет использовать вместо тегов темы. При этом, используя связки по 2 элемента, можно реализовать любой набор тегов. Применение тегов станет более осмысленным и классифицируемым.

Например, тема «голод в Индии» используется для связки тем «голод» и «Индия».

Теги и категории

Каждая тема может быть ключевым словом. Для этого используется галочка is_topiс. Для ключевых слов гарантируется уникальность.

Предполагается использование следующих ключевых слов:

Визуальное представление

На заглавную страницу будут выводиться сообщения без родителя – темы (topics). Их будет выводиться столько, сколько задано в настройке topics_on_main_page. Выводиться будут в порядке от новых к предыдущим по времени последнего ответа. Такое решение позволяет обойтись без нумерации страниц, а просто добавить кнопки «Вперед» и «Назад» для перехода к следующей и предыдущей странице со списком тем.

При выборе сообщения в новой странице открывается список сообщений, принадлежащих непосредственно этому сообщению.

Сначала идут сообщения, которые тоже являются темами, затем обычные сообщения. Сортировка также осуществляется по дате последнего ответа.

Для сообщений выводится количество ответов (без вложенных сообщений).

Первый набросок таблиц

Для реализации такого функционала нужны в первом приближении таблицы:

Под проверкой пользователя подразумевается подтверждение почтового адреса.

E-mail – уникальный ключ таблицы пользователей, т.к. нельзя, чтобы один адрес использовался у нескольких пользователей.

Использование базы MySQL

В phpMyAdmin  создадим новую базу, назовем ее base. Наш форум – для начинающих. Обычно на хостингах на самых дешевых тарифах разрешают иметь только одну базу. Поэтому назовем базу base, а не forum. Возможно, в будущем, она будет использоваться не только для форума, но и для отображения сайта.

Соответственно, всем таблицы форума будем давать префикс «fforum_», чтобы их имена не конфликтовали с другими таблицами (сокращенно от fixin forum).

Создание таблиц пользователей и сообщений

Написать все сразу невозможно, поэтому сначала поработаем с пользователями и сообщениями. Создадим нужные нам таблицы в базе base – вручную или запросом SQL в панели phpMyAdmin: (!!!)

Для таблиц используется кодировка utf-8.

 

CREATE TABLE IF NOT EXISTS `fforum_users` ()

 

CREATE TABLE IF NOT EXISTS `fforum_posts` (

)

 

Добавим несколько пользователей:

 

Заполним таблицу сообщений (синим фоном отмечены темы):

 

id

parent

parent2

subject

user

length

answer_date

text

created

1

0

0

Новичкам отмечаться здесь

1

0

0

Новички, пишите в этой ветке, что вас привело на ф...

2011-02-27 00:01:00

2

1

2

Интересно, что из этого получится

2

0

0

Даже не знаю, что меня занесло в это форум, наверн...

2011-02-27 00:02:00

3

1

0

Ну я тут только ради Фиксина

3

0

0

Мне нравится все, что он делает руками.

2011-02-27 00:03:00

4

0

0

Кто такой Фиксин

1

0

0

Как вы считаете?

2011-02-27 00:04:00

5

4

0

Я не знаю, я тут случайно

2

0

0

Но любопытно было бы узнать, кто он

2011-02-27 00:05:00

6

4

0

Фиксин - это великий человек

3

0

0

Добрый гений современности!

2011-02-27 00:06:00

7

0

0

Сколько языков программирования вы знаете?

1

0

0

Перечислите, пожалуйста

2011-02-27 00:07:00

8

0

0

Какое у вас есть хобби?

1

0

0

Озвучьте пожалуйста

2011-02-27 00:08:00

9

0

0

Что такое гламур?

3

0

0

Это синоним слова мода или нет?

2011-02-27 00:09:00

10

11

0

Я люблю рыбалку, а вы?

2

0

0

Как относитесь к рыбкам?

2011-02-27 00:10:00

11

10

0

1

0

0

Я рыбачил в детстве, но сейчас забросил.

2011-02-27 00:11:00

12

10

0

3

0

0

Девочки рыбу не ловят!

2011-02-27 00:12:00

13

10

0

1

0

0

Не все, некоторые девочки рыбу все же ловят.

2011-02-27 00:13:00

14

10

0

3

0

0

Совершенно согласен, одна моя подруга была заядлым...

2011-02-27 00:14:00

Организация файлов сайта

В папке forum создадим каталоги:

 

Защита файлов библиотеки от исполнения

Файлы из папки includes нельзя исполнять, поэтому каждый файл из этой папки имеет в начале строчку:

require_once('locale.php');

Файл locale.php из каталога includes содержит код:

<? die("Hacking attempt - not executable PHP"); ?>

Таким образом, если мы вызовем любой скрипт из этого каталога, например, получим сообщение об ошибке.

В то же время, в каталоге forum файл locale.php пустой.

Глобальные переменные и константы

Глобальные переменные и константы записываются большими буквами.

Глобальных переменных немного, это:

 

Константы используются для:

Подключение к базе SQL

Подключение к базе SQL используется с помощью используемого мною ранее для движка сайта класса SQLBase, основанного на классе Basic.

В файле access описываются логины и пароли для доступа к базе.

Этот файл должен быть различным на локальном и удаленном сервере. 

Кодировка UTF

Для таблиц используется кодировка UTF. Поэтому в каждой сессии подключения к базе нужно выполнять код:

mysql_query('SET NAMES "utf8"', $this -> DB);

mysql_query("set character_set_connection=utf8");

mysql_query("set names utf8");

В каждой странице, выводимой на экран нужно вставлять мета-тег, указывающий кодировку кодом:

echo("<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>");

Первая протяжка кода

Вывод в виде простого текста

После всех усилий хочется увидеть первый результат труда.

Запустим test_index.php и увидим первые плоды своего труда, текст:

main index page
1    Новички, пишите в этой ветке, что вас привело на форум и что вы от него ждете.
2    Даже не знаю, что меня занесло в это форум, наверное просто любопытство.
3    Мне нравится все, что он делает руками.
4    Как вы считаете?
5    Но любопытно было бы узнать, кто он
6    Добрый гений современности!
7    Перечислите, пожалуйста
8    Озвучьте пожалуйста
9    Это синоним слова мода или нет?
10    Как относитесь к рыбкам?
11    Я рыбачил в детстве, но сейчас забросил.
12    Девочки рыбу не ловят!
13    Не все, некоторые девочки рыбу все же ловят.
14    Совершенно согласен, одна моя подруга была заядлым рыболовом.

Вывод в виде шаблона

Теперь попробуем тот же самый текст вывести с применением шаблонов (patterns).

 

Код для вывода сообщений

Размещение на хостинге

Приобретение хостинга

Размещение форума на хостинге

 

 

 

Код

идентификатор

Скачать (пока нечего качать)