- •Удк 681.3
- •Isbn 5-230-03973-6
- •Оглавление
- •Введение
- •1. Протокол http
- •2. Технологии стороны клиента
- •2. 1. Язык разметки гипертекста html
- •2. 2. Сценарии стороны клиента. Язык JavaScript
- •2. 3. Технология Dynamic html
- •3. Технологии стороны сервера
- •3. 1. Общий интерфейс шлюзов cgi
- •3. 2. Сценарии стороны сервера. Технология php
- •4. Публикация баз данных в internet
- •Олег Иванович Стрельников Основы Web-технологий
4. Публикация баз данных в internet
Публикация баз данных в Internet является одной из наиболее популярных и быстро развивающихся отраслей Web. Под публикацией БД в Internet будем понимать создание программного обеспечения, позволяющего частично или полностью осуществлять работу с удаленной БД при помощи клиента Web. Как правило, при публикации предоставляется возможность просмотра содержимого БД, однако в общем случае подразумевается также возможность модификации и администрирования БД. Публикация в Internet подразумевает также публикацию в локальных сетях, созданных по технологии Internet (Intranet). С точки зрения создания программного обеспечения БД, публикацию БД можно рассматривать с двух сторон:
Создание программного обеспечения БД, формирующего отчеты в виде документов HTML.
Создание Web-интерфейса к БД.
Публикация в Internet имеет следующие преимущества по сравнению с обычными локальными и сетевыми БД:
возможность удаленного доступа к БД через глобальную или локальную сеть;
использование преимуществ протокола HTTP при передаче различной, в том числе мультимедийной, информации;
наличие стандартного интерфейса у БД.
Web-интерфейс является стандартом де-факто для любого программного обеспечения, в том числе БД.
Существует два основных подхода к публикации БД в Internet. Первый подход подразумевает формирование статических документов HTML из содержимого БД с последующим доступом к сформированным документам при помощи сервера Web. При модификации содержимого БД осуществляется обновление документов HTML. Программу, осуществляющую преобразование содержимого БД в набор документов HTML, будем называть преобразователем. На рис. 4 показано взаимодействие программ при публикации БД в Internet в рамках первого подхода.
Публикация БД в Internet в рамках первого подхода сводится к написанию программы-преобразователя, которая будет периодически или при изменении БД полностью или частично модифицировать документы HTML. К недостаткам первого подхода можно отнести сложности модификации БД и поиска в БД.
Второй подход состоит в динамической генерации документов HTML в соответствии с запросами пользователя Web. При запросе пользователя к БД сервер Web запускает программу, которая передает запрос БД, получает ответ, формирует в соответствии с полученным ответом документ HTML и отправляет его клиенту Web. Программа, осуществляющая работу с БД, может быть создана с использованием любой технологии стороны сервера (например, CGI), либо быть сценарием стороны сервера (например, PHP). На рис. 5 показано взаимодействие программ при публикации БД в Internet с использованием технологии CGI.
Приложение CGI фактически является в данном случае посредником между СУБД и клиентом Web. Архитектура системы на рис. 5 является трехзвенной, в отличие от двухзвенной архитектуры "Клиент-Сервер". Общий вид трехзвенной архитектуры изображен на рис. 6.
При публикации БД вInternet с использованием технологии CGI тонким клиентом является клиент Web, толстым клиентом – приложение CGI, а сервером – СУБД, которая в данном случае называется сервером баз данных.
Приведенные два подхода к публикации БД в Internet могут комбинироваться. В любом случае, при публикации существует программа, которая обращается к СУБД для работы с БД. Как правило, взаимодействие между программой, работающей с БД, и СУБД осуществляется посредством запросов на каком-либо языке запросов. Стандартным языком запросов является язык SQL. Данный язык содержит команды создания таблиц и схемы БД, добавления записей в таблицу, извлечения данных из БД, модификации и удаления записей в таблице. SQL запросы передаются от приложения к серверу БД посредством какого-либо зависящего от реализации сервера средства межпроцессного взаимодействия. Наиболее перспективным является использование интерфейса сокетов, поскольку в этом случае запросы могут передаваться между различными хостами. Существуют также реализации СУБД в виде библиотек статической компоновки. В этом случае код СУБД входит в код программы, работающей с БД, что приводит к увеличению размера загрузочного модуля приложения и неэффективному расходу памяти. Поэтому такой способ реализации СУБД целесообразно применять только для однозадачных операционных систем.
Программный интерфейс сервера БД зависит от реализации. Как правило, производители СУБД поставляют вместе с сервером БД библиотеки, в которых реализован API для доступа к БД. Ниже приведен список наиболее распространенных в настоящее время СУБД (серверов БД):
BDE;
ODBC;
InterBase Server;
Microsoft SQL Server;
MySQL;
mSQL;
PostgreSQL;
SyBase;
Informix;
Oracle.
Программный интерфейс, как правило, включает средства инициализации СУБД, установления связи с БД, передачи запросов БД и разбора ответов от сервера. Рассмотрим подробнее API некоторых серверов БД.
Фирма Inprise поставляет вместе со своей СУБД BDE два программных интерфейса различного уровня. Программный интерфейс низкого уровня (IDAPI) - это библиотека функций для доступа к базам данных в различных форматах. Интерфейс высокого уровня - это библиотека компонентов для сред визуального программирования Delphi и C++Builder, которая использует интерфейс низкого уровня. В табл. 13 приведены основные классы библиотеки компонентов BDE.
Таблица 13 | |
Основные классы библиотеки компонентов BDE | |
Название класса |
Описание |
TDataModule |
Контейнер для хранения остальных компонентов BDE |
TDatabase |
База данных. Содержит название БД или папку с таблицами БД |
TQuery |
SQL запрос. Включает содержимое запроса и метод для его отправки серверу |
TDataSet |
Набор данных. Включает данные, полученные от сервера в качестве ответа |
Вместе с сервером MySQL фирмы TcX поставляется библиотека, реализующая API для доступа к БД MySQL. В табл. 14 приведены основные функции этой библиотеки.
Таблица 14 | |
Основные функции библиотеки MySQL | |
Функция |
Описание |
MYSQL *mysql_init( MYSQL *mysql); |
Инициализация структуры MYSQL для последующего подключения к СУБД |
MYSQL *mysql_connect( MYSQL *mysql, const char *host, const char *user, const char *passwd); |
Установка соединения с СУБД без соединения с БД |
int mysql_create_db( MYSQL *mysql, const char *db); |
Создание новой БД. Возвращает 0 в случае успешного завершения |
int mysql_select_db( MYSQL *mysql, const char *db); |
Установить соединение с БД. Возвращает 0 в случае успешного завершения |
Продолжение табл. 14 | |
Функция |
Описание |
int mysql_query( MYSQL *mysql, const char *query); |
Отправить запрос SQL. Возвращает 0 в случае успешного завершения |
int mysql_real_query( MYSQL *mysql, const char *qyery, unsigned int length); |
Отправить запрос SQL, содержащий двоичные данные. Возвращает 0 в случае успешного завершения |
MYSQL_RES * mysql_store_result( MYSQL *mysql); |
Получить результат последнего запроса |
unsigned int mysql_num_fields( MYSQL_RES *result); |
Количество полей в полученном результате |
int mysql_num_rows( MYSQL_RES *result); |
Количество записей в полученном результате |
MYSQL_FIELD * mysql_fetch_fields( MYSQL_RES *result); |
Возвращает массив структур MYSQL_FIELD, содержащих поля полученного ответа |
MYSQL_ROW mysql_fetch_row( MYSQL_RES *result); |
Выбрать текущую запись из набора и переместить указатель на следующую запись |
void mysql_data_seek( MYSQL_RES *res, unsigned int offset); |
Перемещение указателя в наборе данных на указанную позицию |
my_bool mysql_eof( MYSQL_RES *res); |
Возвращает ненулевое значение, если указатель набора данных перемещен за последнюю запись в наборе |
void mysql_free_result( MYSQL_RES *result); |
Освобождает память, занятую результатами последнего запроса |
Окончание табл. 14 | |
Функция |
Описание |
int mysql_drop_db( MYSQL *mysql, const char *db); |
Уничтожение БД. Возвращает 0 в случае успешного завершения |
unsigned int mysql_errno( MYSQL *mysql); |
Возвращает номер последней ошибки |
char *mysql_error( MYSQL *mysql); |
Возвращает строку с сообщением о последней ошибке |
void mysql_close( MYSQL *mysql); |
Разрыв соединения с сервером БД |
Внастоящее время также разработаныAPI доступа к БД для сценариев стороны сервера, в частности, для PHP. Взаимодействие программ при публикации БД с использованием технологии PHP изображено на рис. 7.
Библиотеки для доступа к БД подключаются к проигрывателю сценариев PHP в виде внешних загружаемых модулей. В настоящее время разработаны модули для большинства распространенных серверов БД. Если подключен модуль, реализующий API доступа к БД, то в сценарии PHP определяются специальные, зависящие от сервера БД, функции.
В табл. 15 приведены основные функции для доступа к БД MySQL.
Таблица 15 | |
Основные функции PHP для доступа к БД MySQL | |
Функция |
Описание |
int mysql_affected_rows(int [link_identifier] ) |
Количество столбцов, использованных предыдущими mysql операциями |
int mysql_close(int [link_identifier] ) |
Закрывает mysql соединение |
int mysql_connect(string [hostname] [:port] , string [username] , string [password] ) |
Открывает соединение с mysql сервером |
int mysql_create_db(string database name, int [link_identifier] ) |
Создает базу данных mysql |
int mysql_data_seek(int result_identifier, int row_number) |
Перемещает внутренний указатель результата |
int mysql_db_query(string database, string query, int [link_identifier] ) |
Посылает mysql запрос |
int mysql_drop_db(string database_name, int [link_identifier] ) |
Удаляет базу данных mysql |
int mysql_errno(int [link_identifier] ) |
Возвращает номер сообщения об ошибке предыдущей операции mysql |
string mysql_error(int [link_identifier] ) |
Возвращает текст сообщения об ошибке предыдущей операции mysql |
array mysql_fetch_array(int result) |
Выбрать результат как ассоциативный массив |
object mysql_fetch_field(int result, int [field_offset] ) |
Получает информацию о столбце из результата и возвращает ее как объект |
Продолжение табл. 15 | |
Функция |
Описание |
array mysql_fetch_lengths(int result) |
Получает максимальный размер данных для каждого выходного значения |
object mysql_fetch_object(int result) |
Получает строку результата как объект |
array mysql_fetch_row(int result) |
Получите строку результата как пронумерованный массив |
string mysql_field_name(int result, int field_index) |
Получает имя определенного поля в результате |
int mysql_field_seek(int result, int field_offset) |
Устанавливает указатель запроса в определенное поле |
string mysql_field_table(int result, int field_offset) |
Получает имя таблицы, в которой находится указанное поле |
string mysql_field_type(int result, int field_offset) |
Получает тип указанного поля в результате |
string mysql_field_flags(int result, int field_offset) |
Получает флаги, связанные с указанным полем в результате |
int mysql_field_len(int result, int field_offset) |
Возвращает длину указанного поля |
int mysql_free_result(int result) |
Освобождает память результата |
int mysql_insert_id(int [link_identifier] ) |
Получает id сгенерированный предыдущим выполнением SQL-запроса INSERT |
int mysql_list_fields(string database_name, string table_name, int [link_identifier] ) |
Показывает список полей mysql в результате запроса |
int mysql_list_dbs(int [link_identifier] ) |
Показывает список доступных Баз Данных на сервере |
int mysql_list_tables(string database, int [link_identifier] ) |
Показывает список таблиц в базе данных mysql |
Окончание табл. 15 | |
Функция |
Описание |
int mysql_num_fields(int result) |
Получает количество полей в результате |
int mysql_num_rows(int result) |
Получает количество столбцов в результате |
int mysql_pconnect(string [hostname] [:port] , string [username] , string [password] ) |
Открывает устойчивое соединение с mysql-сервером |
int mysql_query(string query, int [link_identifier] ) |
Отправляет SQL-запрос на mysql |
int mysql_result(int result, int row, mixed field) |
Получает данные результата |
int mysql_select_db(string database_name, int [link_identifier] ) |
Выбирает Базу Данных mysql |
string mysql_tablename(int result, int i) |
Получает имя таблицы, содержащей указанное поле |
Более подробную информацию о доступе к базам данных MySQL из сценариев PHP можно получить в руководствах по СУБД MySQL и языку интерпретатора PHP.
Литература
1. Золотов С. Протоколы Internet. – СПб.: BHV – Санкт-Петербург, 1998. – 304 с.
2. Семенов Ю. А. Протоколы и ресурсы Internet. – М.: Радио и связь, 1996. – 320 с.
3. Фролов А. В., Фролов Г. В. Сервер Web своими руками. – М.: ДИАЛОГ-МИФИ, 1997. (Библиотека системного программиста, т. 29).
4. Браун М., Ханнатт Д. HTML 3.2 в подлиннике. – СПб.: BHV – Санкт-Петербург, 1997.
5. Фролов А. В., Фролов Г. В. Javascript. – М.: ДИАЛОГ-МИФИ, 1998. (Библиотека системного программиста, т. 34).
6. Тихомиров Ю. Microsoft SQL Server 7.0 в подлиннике. – СПб.: BHV – Санкт-Петербург, 1999. – 720 с.
7. Яргер Р., Риз Дж., Кинг Т. MySQL и mSQL. Базы данных для небольших предприятий и Интернета – СПб.: Символ-Плюс, 2000. – 560 с.
8. Фролов А. В., Фролов Г. В. Microsoft Visual J++. Создание приложений и аплетов на языке Java. В 2-х ч. – М.: ДИАЛОГ-МИФИ, 1997. (Библиотека системного программиста, т. 30, 32).
9. Фролов А. В., Фролов Г. В. Разработка приложений для Internet. – М.: ДИАЛОГ-МИФИ, 1997. – 286 c. (Библиотека системного программиста, т. 31).
10. Храмцов П. Б. Лабиринт Internet. Практическое руководство. – М.: ”Электронинформ”, 1996. – 256 c.
11. Джамса К., Коуп К. Программирование для Internet в среде Windows: Пер. с англ. – СПб.: Питер, 1996. – 688 с.
12. Барфилд Э., Уолтерс Б. Программирование "клиент-сервер" в локальных вычислительных сетях: Пер. с англ. – М.: Информационно-издательский дом "Филинъ", 1997. – 424 с.