Наша совместная команда Banwar.org

Связаться с нами

  • (097) ?601-88-87
    (067) ?493-44-27
    (096) ?830-00-01

Статьи

Реальні проекти на PHP і MySQL. Розробка Web-форумів: Частина 1. Постановка завдання, огляд використовуваних компонентів і створення БД для проекту

  1. Серія контенту:
  2. Цей контент є частиною серії: Реальні проекти на PHP і MySQL. Розробка Web-форумів
  3. використовувані компоненти
  4. Основи роботи з MySQL
  5. Таблиця 1. Параметри настройки, що зберігаються у файлі php.ini
  6. Створення бази даних для форуму
  7. Лістинг 1. SQL-сценарій для створення бази даних форуму
  8. Малюнок 1. Виконання SQL-сценарію за допомогою phpMyAdmin
  9. Малюнок 2. PHP-проект форуму в Eclipse IDE
  10. Ресурси для скачування

Реальні проекти на PHP і MySQL. Розробка Web-форумів

Серія контенту:

Цей контент є частиною # з серії # статей: Реальні проекти на PHP і MySQL. Розробка Web-форумів

https://www.ibm.com/developerworks/ru/library/?series_title_by=**auto**

Слідкуйте за виходом нових статей цієї серії.

Цей контент є частиною серії: Реальні проекти на PHP і MySQL. Розробка Web-форумів

Слідкуйте за виходом нових статей цієї серії.

Для прикладів, представлених в статті, використовується EasyEclipse for LAMPP версії 1.2.2.2 і вбудований PHP-browser. Як сервер додатків застосовується LAMPP, описаний в попередніх статтях.

Одним з найбільш ефективних способів привернути (і найголовніше утримати) увагу користувачів до деякого Web-сайту або Інтернет-магазину є створення Web-форуму. Web-форум (далі просто форум) - це Web-додаток для організації спілкування відвідувачів Web-сайту. Сьогодні форуми використовуються для вирішення найрізноманітніших завданнях - від організації дискусій на певні теми до технічної підтримки випускаються програмних продуктів або апаратних засобів.

Для розгортання форуму на сайті можна скористатися вже готовими «коробковими» продуктами, такими як phpBB. Але якщо є бажання розібратися в алгоритмах, що лежать в основі функціонування форумів, і зміцнити знання в області програмування на PHP, то варто подумати про розробку власного форуму. У цьому циклі статей будуть розглянуті питання написання форуму на PHP «з нуля» і просунуті аспекти програмування на PHP.

Основна функціональність форуму полягає в тому, що один користувач може публікувати на ньому свої повідомлення ( «пости») або створювати нові теми з кількох повідомлень, а інші учасники можуть відповідати на них у вигляді повідомлень або цитат. Однак список можливостей хорошого форуму цим не обмежується, і тому в якості наочного прикладу в цій серії статей буде розроблений форум, що дозволяє:

  • додавати нові повідомлення для створення нової теми для обговорення;
  • відповідати на існуючі повідомлення;
  • переглядати вже опубліковані повідомлення;
  • відслідковувати взаємозв'язок між повідомленнями, які повідомлення були опубліковані в якості відповіді, а які є незалежними;
  • переглядати існуючі теми повідомлень.

Першим кроком по реалізації подібної функціональності має стати створення бази даних Web-форуму. У ній буде зберігатися інформація про автора, заголовку і вмісті повідомлення. Зберігання інформації в базі даних має бути організовано так, щоб користувач міг визначити статус повідомлення - чи є воно самостійної публікацією або служить відповіддю на інший «пост». У цьому полягає основна відмінність бази даних Web-форуму від інших варіантів, що розглядаються в раніше опублікованих циклах.

використовувані компоненти

Варто зазначити, що хоча зручний і красивий інтерфейс - це один з основних факторів, що визначають «вистрілить» форум чи ні, в розглянутому прикладі не будуть використовуватися передові дизайнерські рішення з цієї області. При створенні інтерфейсу була встановлена ​​тільки одна мета: продемонструвати, як реалізувати необхідні функції за допомогою PHP. Тому, як «домашнього» завдання і для створення закінченого продукту можна додати розробку сучасного GUI для отриманого Web-форуму.

В ході реалізації проекту необхідно не тільки зберігати інформацію про автора і тексті повідомлення, але і забезпечити навігацію по наявним темам, повідомленнями та зв'язків між ними. Якраз організація подібної ієрархії в базі даних і представляє найбільшу складність. В якості стартової точки необхідно розглядати первинне повідомлення, використане для створення теми. Решта повідомлення можна розглядати як «відповіді» певної ступеня споріднення на вихідне повідомлення. Якщо візуалізувати подібне текстове представлення, то воно буде схоже на дерево, в якому гілка породжує нирки, ті в свою чергу листя і т.д. Така структура в програмуванні називається деревовидної, і у випадку з форумом можна в ній виділити елементи (nodes) (повідомлення) і зв'язки між елементами (відносини між повідомленнями).

Далі залишається тільки знайти спосіб відображення такої структури на реляційну СУБД (в розглянутому прикладі використовується СУБД MySQL в складі пакету LAMPP - http://www.apachefriends.org/en/index.html ) І механізм відновлення даних у разі їх втрати. Інтеграція Web-форуму з СУБД дозволить зберігати повідомлення в проміжках між їх використанням, а, після створення нескладного API на PHP користувач отримає можливість ними маніпулювати.

При завантаженні списку повідомлень з бази даних для перегляду, вони будуть завантажуватися в спеціальний PHP-клас, в якому буде зберігатися заголовок повідомлення і список відповідей на нього. Відповідні повідомлення будуть зберігатися у вигляді масиву, при цьому кожен елемент цього масиву також буде об'єктом і зберігати вже список відповідних повідомлень для себе. В результаті виходить своєрідна вкладена структура, яка може «розкручуватися» до тих пір, поки її розгалуження не дійде до термінальних елементів ( «листя»), які вже не містять відповідей і є кінцевою точкою в низці вкладень.

Для подальшого обговорення необхідно визначити кілька термінів.

  • батьківський елемент поточного повідомлення - повідомлення, для якого поточний повідомлення служить відповіддю;
  • відповідь на будь-яке повідомлення в форумі - це його дочірній елемент;
  • сама перше повідомлення, що не має батьківського елемента - це кореневий елемент.

Розроблюване Web-додаток буде складатися з двох сторінок. На головній сторінці у вигляді посилань будуть виводитися всі повідомлення, наявні в форумі. На цій сторінці можна буде додавати нові повідомлення, переглядати наявні або змінювати спосіб перегляду повідомлень, розкриваючи або звертаючи глобальний список повідомлень. На цій сторінці також будуть розміщуватися елементи управління для відправки відповіді на повідомлення або перегляду вже наявних відповідей

Друга сторінка буде використовуватися для створення нових повідомлень: відповідей на існуючі повідомлення і незалежних повідомлень, використовуваних для створення нових тем.

Основи роботи з MySQL

Хоча найбільше поширення серед методів роботи з MySQL отримала програма phpMyAdmin, проте корисно вміти проробляти базові операції та в «ручному» режимі. Тому в статті буде детально описаний процес створення нової таблиці в базі даних MySQL і перш, ніж переходити до опису реалізації бази даних, необхідно сказати кілька слів про основи роботи з MySQL.

На сьогоднішній день саме реляційні бази даних найчастіше використовуються для зберігання інформації. Вони базуються на законах реляційної алгебри і побудовані на основі відносин, які називаються таблицями, які і являють собою таблицю з даними. У кожної таблиці є ім'я, а складається вона з декількох стовпців і рядків, в яких зберігаються дані. Повний опис таблиць, що входять в базу даних, називають схемою бази і відображають у вигляді «сутність - відношення».

Стовпці в таблиці повинні мати унікальні назви та певний тип даних - від цілочисельного до булевского. Синонімами стовпців є слова «поля» і «атрибути».

Кожен рядок складається з набору значень, що відповідають стовпцям. Тип даних кожного значення має відповідати типу даних, заданих стовпцем, до якого відноситься це значення. Рядки ще називають «записами» або «кортежами».

Ключі - це ідентифікатори даних в таблиці. Ключ може складатися з декількох стовпців і бути первинним або зовнішнім ключем. Як правило, бази складаються з декількох таблиць, сполучною ланкою між якими є ключі (коли первинний ключ однієї таблиці є ще й ключем для іншого - його називають зовнішнім).

Для роботи в системі MySQL необхідно створити користувачів з певним набором повноважень. Для кожного користувача необхідно встановити обліковий запис і пароль, які не повинні збігатися з системними. Для налаштування облікових користувачів застосовують команди GRANT і REVOKE (антонім) з параметрами.

Існує три основних типи повноважень. Ними наділяються звичайні користувачі та адміністратори. Крім того існує ряд спеціальних повноважень. Завдання таких повноважень пов'язано з дозволами на виконання певних SQL-команд. До їх числа відносяться команди SELECT, INSERT, UPDATE, DELETE, INDEX, ALTER, CREATE і інші.

Команда REVOKE - антонім команди GRANT і застосовується для позбавлення повноважень. Наприклад, команда REVOKE ALL PRIVILEGES, GRANT FROM user_name позбавить користувача user_name всіх повноважень, в тому числі наданих функцією GRANT.

Для створення бази даних застосовується команда

CREATE DATABASE db-name,

а для створення таблиць застосовується команда

CREATE TABLE table_name.

Щоб вибрати використовувану базу даних необхідно в командному рядку MySQL ввести команду

USE db_name.

Для перегляду таблиць в базі використовується команда

SHOW TABLES,

а для перегляду наявних баз

SHOW DATABASES.

Дуже часто для отримання потрібної інформації з бази даних можуть знадобитися дані з декількох таблиць. Так як ці дані зберігаються в різних таблицях, то для отримання такої зведеної інформації при введенні запиту потрібно вказати оператори об'єднання. Для отримання зведеної інформації в SQL використовується операція з'єднання - JOIN. Вона означає з'єднання двох і більш таблиць відповідно до відносинами між даними.

Щоб вибрати використовувану базу даних необхідно в командному рядку MySQL ввести команду

USE db_name.

Для перегляду вмісту таблиці з ім'ям my_table потрібно команда

SELECT * FROM MY_TABLE,

а для вставки даних в цю таблицю використовується команда:

INSERT INTO MY_TABLE VALUES ...

Повний список всіх команд і їх синтаксису можна знайти в офіційній документації на MySQL. Також корисно ознайомитися з таблицею налаштувань для MySQL, які повинні зберігатися в файлі php.ini.

Таблиця 1. Параметри настройки, що зберігаються у файлі php.ini

Параметр Опис Рекомендоване значення max_execution_time Скільки тактів CPU-секунд може задіяти SQL-сценарій 30 max_input_time як довго (в секундах) SQL-сценарій може чекати вхідних даних 60 memory_limit яка кількість пам'яті (в байтах) може витрачати SQL-сценарій, перш ніж він буде убитий 32M output_buffering яка кількість даних (в байтах) накопичується в буфері, перш ніж вони будуть відправлені клієнту 4096

Створення бази даних для форуму

Для кожного повідомлення, що відправляється в форум, необхідно зберегти його атрибути: автора і заголовок повідомлення, час відправки і вміст. Все це необхідно помістити в таблицю, де для кожного повідомлення буде згенеровано унікальний ідентифікатор postid.

У повідомлення обов'язково повинен бути мати певний атрибут, який визначає його місце в загальній ієрархії. Один з варіантів вирішення цього завдання: зберігати інформацію про відповіді на повідомлення разом з ним самим. Однак, так як на одне повідомлення може бути опубліковано кілька відповідей, то виникає невизначеність. Щоб уникнути її, необхідно зберігати посилання на батьківське повідомлення, тобто на те, для якого поточний повідомлення є відповіддю. Для реалізації такої схеми зберігання потрібно визначити наступні параметри:

  • postid - ідентифікатор повідомлення; повинен бути унікальним;
  • poster - автор повідомлення;
  • parent - ідентифікатор батьківського повідомлення (такий же postid);
  • title - заголовок;
  • posted - час і дата публікації повідомлення;
  • message - вміст.

Тепер, для того щоб з'ясувати чи є відповіді на повідомлення, необхідно виконати запит для пошуку інших повідомлень, для яких дане є батьківським. Цей запит буде потрібно виконати для кожного повідомлення, що може негативно позначитися на продуктивності форуму. Для підвищення швидкодії можна додати поле з інформацією про наявність хоча б однієї відповіді. Це поле буде називатися children і мати логічний тип даних, його значення дорівнюватиме 1, якщо для повідомлення є відповіді, і 0, якщо відповідей немає. При реалізації подібного рішення під час додавання / видалення дочірнього повідомлення буде потрібно також оновити і батьківське, змінивши значення його поля children.

Так як вміст повідомлення має текстовий тип даних, його наявність в таблиці з повідомленнями може уповільнити виконання SQL-запитів. Тому для додаткової оптимізації вміст повідомлення необхідно зберігати в окремій таблиці, окремо від інших даних. Завдяки такому підходу вміст повідомлення можна буде завантажувати саме тоді, коли користувач вирішить переглянути його.

Відомо, що в MySQL пошук записів фіксованого розміру виконується швидше, ніж змінного. Тому при використанні даних змінної довжини обов'язково потрібно організувати індекси, які будуть задіяні при пошуку і збільшать швидкість виконання запитів. Однак у індексів є і «побічний» ефект: вони повинні перераховуватися при додаванні / видаленні / оновленні записів, і так як всі ці дії відбуваються на форумах постійно, можлива зменшення швидкодії вже через частого поновлення індексів.

Також варто додати в таблицю атрибут area, який буде використовуватися для створення повідомлень, пов'язаних спільною темою. У прикладі подібна функціональність відсутня, але це одна з перших можливостей для майбутнього розвитку проекту.

Повністю SQL-сценарій для створення бази даних і таблиць, необхідних для розроблюваного форуму, представлений в лістингу 1:

Лістинг 1. SQL-сценарій для створення бази даних форуму

create database discussion; use discussion; create table header (parent int not null, poster char (20) not null, title char (20) not null, children int default 0 not null, area int default 1 not null, posted datetime not null, postid int unsigned not null auto_increment primary key); create table body (postid int unsigned not null primary key, message text); grant select, insert, update, delete on discussion. * to discussion @ localhost identified by 'password';

Існують різні способи виконання цього коду в СУБД. Наприклад, зайти в консоль MySQL і ввести його вручну або запустити його у вигляді SQL-сценарію через командний рядок за допомогою команди:

mysql -u root -p <create_mydata.sql,

де create_mydata.sql - це файл з SQL-сценарієм з лістингу 1 .

Також можна скористатися надбудовою phpMyAdmin (див. Рисунок 1.).

Малюнок 1. Виконання SQL-сценарію за допомогою phpMyAdmin
Реальні проекти на PHP і MySQL

Відображення форуму в PHP-браузері, вбудованому в Eclipse IDE, можна побачити на малюнку 2.

Малюнок 2. PHP-проект форуму в Eclipse IDE

висновок

Хоча використання «коробкових» продуктів (наприклад, phpBB, invision Power Board) дозволяє швидко розгорнути форум на будь-якому інтернет-ресурсі, розробка індивідуального рішення дозволяє краще інтегрувати форум з основним сайтом, врахувати особливості цільової аудиторії і заодно підвищити навички розробки Web-додатків.

У цій статті з циклу «Реальні проекти на PHP і MySQL. Розробка Web-форумів » описані основні характеристики і принципи реалізації Web-форумів. Також в ній представлений приклад форуму, який буде розроблятися в наступних статтях, і виконаний перший етап робіт по реалізації форуму - створена база даних для зберігання повідомлень.

Ресурси для скачування

Підпишіть мене на повідомлення до коментарів

Com/developerworks/ru/library/?

Новости

Banwar.org
Наша совместная команда Banwar.org. Сайт казино "Пари Матч" теперь доступен для всех желающих, жаждущих волнения и азартных приключений.