<
  • Главная
Статьи

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

  1. Серія контенту:
  2. Цей контент є частиною серії: Реальні проекти на PHP і MySQL. Розробка Web-форумів
  3. Про цю серії статей
  4. Перегляд повідомлень у вигляді дерева
  5. Малюнок 1. Головна сторінка Web-форуму
  6. PHP-сценарій для згортання і розгортання повідомлень
  7. Лістинг 1. PHP-сценарій для маніпулювання станом ланцюжків повідомлень
  8. Короткий огляд протоколу HTTP
  9. Витяг повідомлень з бази даних
  10. Лістинг 2. PHP-код для розгортання повідомлень
  11. Лістинг 3. Функція expand_all ()
  12. Лістинг 4. PHP-код для згортання повідомлень
  13. відображення повідомлень
  14. Лістинг 5. Функція display_tree () для відображення повідомлень у вигляді дерева
  15. Лістинг 6. PHP-сценарій для перегляду повідомлення і відповідей на нього
  16. Ресурси для скачування

Реальні проекти на 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-сайту. Сьогодні форуми використовуються для вирішення найрізноманітніших завданнях - від організації дискусій на певні теми до технічної підтримки випускаються програмних продуктів або апаратних засобів.

Про цю серії статей

Web-форум (далі просто форум) - це Web-додаток для організації спілкування відвідувачів Web-сайту. У цій серії статей будуть розглянуті питання написання форуму на PHP «з нуля» і просунуті аспекти програмування на PHP.

В першій статті цієї серії були розглянуті загальні питання функціонування форумів і створена база даних для форуму. Також в статті було наведено короткий огляд команд SQL і приклад налаштування PHP для взаємодії з СУБД MySQL за допомогою файлу php.ini.

У цій, другій за рахунком, статті буде обговорюватися, як реалізувати таку функціональність:

  • вилучення інформації з бази даних,
  • представлення її в деревовидної формі,
  • відображення, розгортання і згортання цитат форуму.

Перегляд повідомлень у вигляді дерева

Після створення бази даних форуму необхідно реалізувати механізм для добування інформації з бази даних і представлення її в деревовидної формі. Основна частина цієї функціональності буде зосереджена в PHP-сценарії, що відповідає за головну сторінку форуму.

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

Малюнок 1. Головна сторінка Web-форуму

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

Якщо поруч з повідомленням присутній символ +, це означає, що на нього вже були отримані відповіді. Щоб побачити всі відповіді на дане повідомлення, користувач повинен клацнути мишею по цьому символу, і повідомлення «розгорнеться» у вигляді послідовності відповідей (як показано на малюнку 1 ). Після розкриття повідомлення символ + змінюється на -, який використовується для згортання структури в початковий стан.

При цьому ланцюжок відповідей може мати будь-яку глибину, і точно також можна згортати і розгортати вже самі відповіді. На панелі меню (див. малюнок 1 ) Є кнопки Розгорнути і Згорнути, які дозволяють розгорнути і згорнути всі ланцюжки відповідей, представлені на сторінці. Якщо подивитися в вихідний код, то можна побачити що натискання кнопки Розгорнути призводить до передачі параметра expand зі значенням all.

PHP-сценарій для згортання і розгортання повідомлень

Вихідний код для маніпулювання ланцюжками повідомлень представлений в лістингу 1.

Лістинг 1. PHP-сценарій для маніпулювання станом ланцюжків повідомлень
<? Php include ( 'include_fns.php'); session_start (); // Переконатися в створенні змінної HTTP-сесії if (! Isset ($ _ SESSION [ 'expanded'])) {$ _SESSION [ 'expanded'] = array (); } // Перевірити факт натискання кнопки Розгорнути // Значення параметра expand може дорівнювати all // або postid певного повідомлення або взагалі бути відсутнім в HTTP-запиті. if (isset ($ _ GET [ 'expand'])) {if ($ _ GET [ 'expand'] == 'all') expand_all ($ _ SESSION [ 'expanded']); else $ _SESSION [ 'expanded'] [$ _ GET [ 'expand']] = true; } // Перевірити факт натискання кнопки Згорнути // Значення параметра collapse може дорівнювати all // або postid певного повідомлення або взагалі бути відсутнім в HTTP-запиті. if (isset ($ _ GET [ 'collapse'])) {if ($ _ GET [ 'collapse'] == 'all') $ _SESSION [ 'expanded'] = array (); else unset ($ _ SESSION [ 'expanded'] [$ _ GET [ 'collapse']]); } Do_html_header ( 'Повідомлення в дискусіях'); display_index_toolbar (); // вивести вміст ланцюжків повідомлень у вигляді дерева display_tree ($ _ SESSION [ 'expanded']); do_html_footer (); ?>

В процесі виконання цього сценарію використовуються три змінні. Параметр HTTP-запиту expand визначає, що саме має бути розгорнуто: тільки певне повідомлення, всі повідомлення або взагалі нічого. Завдяки цьому на сторінку можна вивести відразу кілька повідомлень з розгорнутими ланцюжками відповідей. Мінлива HTTP-сесії expanded є асоціативний масив, що містить ідентифікатори postid повідомлень, відповіді на які відображаються в розгорнутому вигляді. Параметр HTTP-запиту collapse має такий же діапазон значень, як і параметр expand, але використовується, щоб позначити повідомлення, які необхідно згорнути.

В результаті натискання на символи +/- або кнопок Розгорнути / Згорнути виконується виклик сценарію з лістингу 1 з новими значеннями параметрів expand або collapse. Значення змінної expanded зберігається між запитами і використовується для відстеження стану ланцюжків повідомлень (розгорнуті / НЕ розгорнуті).

На початку сценарію відбувається створення HTTP-сесії (якщо вона ще не було створено), за цим слід ініціалізація і збереження змінної expanded в HTTP-сесію (якщо це також не було зроблено при попередніх запитах).

Короткий огляд протоколу HTTP

У цьому розділі представлений короткий огляд протоколу HTTP, так як знання цього протоколу необхідно як для розуміння деяких фрагментів в представленому вихідному коді, так і взагалі для успішного використання можливостей PHP. Якщо читач вже знайомий з особливостями протоколу HTTP, то він може пропустити цей розділ.

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

Ця проблема виникла не вчора і для неї давно запропоновано рішення - сервер передає деяку інформацію в першому HTTP-відгуку, а потім ця інформація відправляється на сервер при всіх наступних запитах. Існує кілька способів реалізації подібного алгоритму:

  1. відправляти дані за допомогою POST-запиту через HTTP-форму;
  2. відправляти дані за допомогою GET-запиту, додаючи цю інформацію до URL (цей спосіб називається - URL-rewriting);
  3. відправляти дані в заголовку HTTP (у формі cookie-файлу).

Найчастіше використовуються варіант з cookie-файлами або URL-rewriting. cookie-файли надсилаються в заголовку HTTP і являють собою пару «ім'я - значення». Недолік цього підходу в тому, що підтримку cookie можна відключити в Web-браузері. Також існують обмеження і для самих cookie-файлів:

  1. cookie прив'язані до того домену, який їх посилає;
  2. cookie можна прив'язати до певних шляхах на Web-сервері;
  3. cookie можуть містити тільки текст, зазвичай 4096 байт;
  4. браузери можуть приймати тільки до 20 cookie-файлів від одного домен і не більше 300 файлів взагалі (хоча існують і виключення).

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

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

Таким чином, клієнту достатньо передати на сервер ідентифікатор HTTP-сесії, щоб отримати доступ до решти даними в HTTP-сесії, що зберігаються на сервері. Це усуває необхідність в інтенсивному обміні інформацією між клієнтом і сервером, що позитивно впливає на швидкодію і безпеку додатки. Конфігураційні параметри HTTP-сесії в PHP знаходяться в розділі [session] файлу php.ini. Значення параметрів, що використовуються за замовчуванням, можуть не підійти конкретному Web-додатком, тому при розробці нової програми, вміст файлу php.ini цей файл бажано відредагувати під вимоги конкретного проекту.

Витяг повідомлень з бази даних

У лістингу 2 наведено фрагмент коду, в якому в залежності від значення параметра expand розгортаються певні повідомлення.

Лістинг 2. PHP-код для розгортання повідомлень
if (isset ($ _ GET [ 'expand'])) {if ($ _ GET [ 'expand'] == 'all') expand_all ($ _ SESSION [ 'expanded']); else $ _SESSION [ 'expanded'] [$ _ GET [ 'expand']] = true; }

В результаті натискання кнопки Розгорнути викликається функція expand_all (), яка додає в масив expanded всі повідомлення, які мають відповіді. Для розгортання конкретного повідомлення його ідентифікатор postid повинен бути переданий через параметр expand і в цьому випадку в масив expanded додається новий запис. У лістингу 3 представлений код функції expand_all ().

Лістинг 3. Функція expand_all ()
function expand_all ($ expanded) {// вибрати всі повідомлення з відповідями для відображення в розгорнутому вигляді $ conn = db_connect (); $ Query = 'select postid from header where children = 1'; $ Result = $ conn-> query ($ query); $ Num = $ result-> num_rows; for ($ i = 0; $ i <$ num; $ i ++) {$ this_row = $ result-> fetch_row (); $ Expanded [$ this_row [0]] = true; }}

Функція expand_all () займається пошуком повідомлень, на які є відповіді. Для цього вона виконує наступний SQL-запит:

$ Query = 'select postid from header where children = 1';

Після виконання запиту знайдені повідомлення в циклі додаються в масив expanded.

Процес згортання статей працює таким же чином, але в протилежному напрямку, як показано в лістингу 4:

Лістинг 4. PHP-код для згортання повідомлень
if (isset ($ _ GET [ 'collapse'])) {if ($ _ GET [ 'collapse'] == 'all') $ _SESSION [ 'expanded'] = array (); else unset ($ _ SESSION [ 'expanded'] [$ _ GET [ 'collapse']]); }

Якщо треба згорнути всі повідомлення на сторінці (значення параметра collapse одно all), то масив expanded просто очищається. Якщо ж треба згорнути конкретне повідомлення (в параметрі collapse переданий ідентифікатор postid цього повідомлення), тоді тільки вказане повідомлення видаляється з масиву expanded.

В лістингу 1 виконується попередня обробка, під час якої визначається, які повідомлення повинні бути розгорнуті, а які згорнуті. Потім виконується виклик функції display_tree ($ _ SESSION [ 'expanded']), яка і відповідає за подання повідомлень у вигляді дерева.

відображення повідомлень

Функція display_tree () в лістингу 5 трансформує список повідомлень з бази даних в HTML-представлення у вигляді дерева.

Лістинг 5. Функція display_tree () для відображення повідомлень у вигляді дерева
function display_tree ($ expanded, $ row = 0, $ start = 0) {global $ table_width; echo "<table width = '$ table_width'>"; // перевірити, чи відображається повний список або подсписок if ($ start> 0) $ sublist = true; else $ sublist = false; // створити деревоподібну структуру, що представляє всі повідомлення $ tree = new treenode ($ start, '', '', '', 1, true, -1, $ expanded, $ sublist); // вказати дереву на необхідність самоотображенія $ tree-> display ($ row, $ sublist); echo '</ table>'; }

Функція display_tree () приймає три параметри: $ expanded - список ідентифікаторів повідомлень, які необхідно вивести в розгорнутому вигляді; $ row - індикатор, що визначає колір фону при виведенні повідомлення (він повинен чергуватися - білий, чорний, білий і т.д.); $ start - ідентифікатор повідомлення, з якого необхідно починати висновок.

Основне завдання функції display_tree () - це створення екземпляра класу treenode, що представляє кореневої елемент дерева. Цей елемент не є повідомленням, але служить батьком для вихідних повідомлень, у яких немає явного батька. Після створення дерева виконується виклик функції display (), яка відповідає за генерацію HTML. Крім того, що функція display_tree () відповідає за відображення всього дерева на сторінці index.php, вона ж використовується на сторінці для перегляду окремого повідомлення для цитування відповідей. PHP-сценарій для генерації цієї сторінки приведений в лістингу 6:

Лістинг 6. PHP-сценарій для перегляду повідомлення і відповідей на нього
<? Php // включити бібліотеки необхідних функцій include ( 'include_fns.php'); $ Postid = $ _GET [ 'postid']; // отримати детальну інформацію про обраний повідомленні $ post = get_post ($ postid); do_html_header ($ post [ 'title']); // відобразити вибране повідомлення display_post ($ post); // якщо з повідомленням пов'язані будь-які відповіді, то вивести їх у вигляді дерева if ($ post [ 'children']) {echo '<br /> <br />'; display_replies_line (); display_tree ($ _ SESSION [ 'expanded'], 0, $ postid); } Do_html_footer (); ?>

висновок

У цій статті з серії «Реальні проекти на PHP і MySQL. Розробка Web-форумів » виконаний другий етап розробки Web-форуму за допомогою PHP: витяг повідомлень з бази даних і подання їх на HTML-сторінці у вигляді дерева. Запропоновані PHP-сценарії дозволяють не тільки виводити на сторінку всі повідомлення, наявні в базі, але і розгортати / згортати окремі повідомлення і відповіді до них. Подібна функціональність є обов'язковою для будь-якого форуму. Також в статті коротко описані основні ідеї та механізм реалізації HTTP-сесії в Web-програмуванні в загальному і в PHP зокрема.

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

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

Com/developerworks/ru/library/?


Новости
  • Виртуальный хостинг

    Виртуальный хостинг. Возможности сервера распределяются в равной мере между всеми... 
    Читать полностью

  • Редизайн сайта

    Редизайн сайта – это полное либо частичное обновление дизайна существующего сайта.... 
    Читать полностью

  • Консалтинг, услуги контент-менеджера

    Сопровождение любых интернет ресурсов;- Знание HTML и CSS- Поиск и обновление контента;-... 
    Читать полностью

  • Трафик из соцсетей

    Сравнительно дешевый способ по сравнению с поисковым и контекстным видами раскрутки... 
    Читать полностью

  • Поисковая оптимизация

    Поисковая оптимизация (англ. search engine optimization, SEO) — поднятие позиций сайта в результатах... 
    Читать полностью