23.3. Хранение содержимого в базе данных
Информация, сохраненная в базе данных, не ограничивается только короткими строками наподобие 32-символьного названия товара из листинга 23.3. Есть возможность создать большие логические объекты (blob) размером 64 Кбайт, которых достаточно для Web-страниц больших размеров. Преимуществом такого подхода является то, что страницы существуют в хорошо структурированной среде. Их можно идентифицировать с помощью чисел, и связи с ними должны осуществляться с использованием только этих чисел. Недостатком является то, что у разработчика нет возможности воспользоваться любимым текстовым редактором, поскольку информация теперь располагается в базе данных. Поэтому приходится балансировать между затратами и преимуществами, и некоторым Web-узлам совсем не надо, чтобы все его компоненты хранились в базе данных.
Ситуация, когда этот метод можно использовать на практике, - размещение в базе данных содержимого электронной доски объявлений (Bulletin Board System, BBS). Эта система хранит сообщения, которые не являются просто Web-страницами. Каждая из страниц снабжена своим собственным заголовком, на ней указано время создания и приводится информация об авторе. Каждая структура может быть удобно запакована в таблицу базы данных. Кроме того, если каждому сообщению может быть присвоен уникальный идентификатор, он позволяет организовать сообщения в деревьях "родитель-потомок". Пользователь может создавать новую дискуссионную ветвь, которая порождает множество других сообщений. Сообщения могут создаваться в иерархической структуре, позволяющей осуществлять просмотр.
Как и в любом случае с системами, работающими с базами данных, первым шагом является создание таблицы. В листинге 23.7 показано, как создается таблица для хранения сообщений. Каждое сообщение снабжается заголовком, в нем также указывается имя того, кто разместил сообщение, когда сообщение было размещено, и тело самого сообщения. Начальный идентификатор может иметь значение NULL. Это свидетельствует о том, что сообщение является началом темы или потока сообщений. Тело сообщения не обязательно должно быть представлено простым текстом, оно может содержать и HTML-код. Таким образом, пользователи с помощью своих браузеров смогут создавать собственные Web-страницы.

| Листинг 23.7. Создание таблицы message
CREATE TABLE Message
(
ID INT NOT NULL AUTO_INCREMENT,
Title VARCHAR(64),
Poster VARCHAR(64),
Created DATETIME,
Parent INT,
Body BLOB,
PRIMARY KEY(ID)
); 
Сценарий, приведенный в листинге 23.8, имеет два рабочих режима: отображение перечней заголовков сообщений и отображение целого сообщения. Если переменной messageID не задано значение, сценарий отображает список всех сообщений в системе, организованных потоком, вызвав функцию showMessages (см. главу 4, "Функции"). Функция showMessages для перехода на любую ветвь дерева сообщений использует механизм рекурсии. Просмотр начинается с перечня всех сообщений, находящихся на верхнем уровне. Это сообщения корневого уровня или начало тем. После отображения сообщений корневого уровня функция showMessages вызывается для отображения отдельных тем. Этот процесс продолжается до тех пор, пока не будет найдено сообщение, не имеющее порожденных сообщений. Идентификация помогает понять иерархию сообщений.

Листинг 23.8. Простейшая BBS

<html> <head>
^^^^Листинг 23.8</title>
</head>
<body>
<?php
print("<h1>BBS Леона^!!^^");
//Подключиться к серверу, а затем проверить на ошибку if(!($dbLink = mysql_connect("localhost", "httpd", "")))
{
print("Heвoзмoжнo подключиться к серверу!<br>n");
print("Завершение работы!<brn");
exit();
}
//выбрать базу данных, затем проверить на ошибку if(!($dbResult = mysql_query("USE test", $dbLink)))
{
print("Heвoзмoжнo работать с базой данных test!<BR>n");
print("Завершение работы!<BR>n");
exit();
}
/*
** рекурсивная функция, разбивающая все
** последующие сообщения
*/
function showMessages($parentID)
{
global $dbLink;
$dateToUse = Date("U");
print("<ul>n");
$Query = "SELECT ID, Title, Created " . "FROM bbsMessage " . "WHERE Parent=$parentID " .
"ORDER BY Created ";
if(!($dbResult = mysql_query($Query, $dbLink)))
{
// невозможно выполнить запрос
print("Запрос к таблице bbsMessage невозможен!<br>n"] print("MySQL сообщает: " . mysql_error() . "<br>n");
Интеграция баз данных
Интеграция баз данных
Интеграция баз данных