Прагматический подход к разработке приложений Web баз данных

         

Добавление данных


Результатом исполнения скрипта create.php3 является файл test. Каждая запись этого файла состоит из двух типов данных: номера по списку id и соответствующих ему фамилии и инициалов - name.

Операция добавления данных позволяет создавать новые записи и заполнять их поля заданными значениями.

Примитив добавления данных

<? // *** соединение с БД *** require "primitive/connect.inc";

// *** добавление данных *** $result = pg_Exec( $cnct, "INSERT INTO test values(1, 'Иванов')" ); if ( $result ) { echo "Data insert \n"; } ?>

назовем insert.php3.

Поместите его на сервер и запустите на исполнение Netscape Navigator'ом.

Если данные будут добавлены, то вы увидите сообщение: "Data insert".



Формы - средство ввода данных


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

Рассмотрим в качестве примера реализацию примитива добавления данных с параметром.

В частном случае, когда номер по списку id = 1 и соответствующая ему фамилия - name = "Иванов", он может быть записан так

<? // *** соединение с БД *** require "primitive/connect.inc"; // *** добавление данных *** $result = pg_Exec( $cnct, "INSERT INTO test values(1, 'Иванов')" ); if ( $result ) { echo "Data insert \n"; } ?>

Параметры примитива можно изменять с помощью html форм.

Начало описания формы обозначают оператором <FORM>. Заканчивают форму оператором </FORM>. Например,

<FORM METHOD=Get ACTION="insert.php3"> </FORM>

Рассмотрим основные параметры оператора <FORM>.

METHOD- задает метод передачи данных от браузера расширению сервера Web (в нашем случае CGI скрипту). Мы указали метод Get, поскольку объем передаваемых данных невелик. Для передачи больших объемов данных используют метод Post. В этом случае скрипт получает данные, читая их из стандартного потока ввода.
ACTION- указывает путь к CGI скрипту. Когда пользователь нажмет кнопку, предназначенную для отправки заполненной формы, этот скрипт будет запущен.

Ввод данных производят посредством однострочных полей. Их помещают в форму с помощью оператора <INPUT>: <INPUT TYPE=text NAME="na" SIZE=20>

Параметр TYPE определяет тип органа управления, вставленного в форму оператором <INPUT>. Если значение этого параметра равно text, вставляется однострочное поле, предназначенное для редактирования текстовой строки. Параметр NAME определяет имя поля, которое будет посылаться на сервер вместе с содержимым поля. И, наконец, параметр SIZE определяет ширину поля редактирования в символах.

Для отправки вводимых с помощью формы данных на сервер используют кнопки. Их вставляют в форму с помощью оператора <INPUT>: <INPUT TYPE=Submit VALUE="Ввод">

Значение TYPE, определяющее тип кнопки, здесь равно Submit, поскольку кнопка предназначена для передачи данных из формы на сервер. Надпись на кнопке определяют параметром VALUE.



Изменение значений данных




Можно произвести SQL командой UPDATE. Например, так

UPDATE test

SET name = 'Петров'

   WHERE name = 'Иванов'

Такие запросы, как правило, образуют конкатенацией (символ ".=" ) и хранят в переменной. В ниже следующем скрипте это переменная $query.

<? // *** соединение с БД *** require "primitive/connect.inc";

// *** изменение значений данных *** // формирование запроса $query = "UPDATE test " ; $query .= "SET name = 'Петров' " ; $query .= "WHERE name = 'Иванов' " ; // Исполнение запроса $result = pg_Exec( $cnct, $query ); if ( $result ) { echo "Data update \n"; } ?>

Сохраните скрипт под именем udate.php3. Запустите его и убедитесь, что фамилия "Иванов" была изменена на "Петров".



Литература и ресурсы


Selena Sol. Introduction to Databases for the Web - John Paul Ashenfelter. Getting Started with Web Databases - Дмитрий Котеров. Apache + Perl + PHP 3.0 для Windows 95/98: руководство по установке - Relational Databases - Stig S. Bakken and all. PHP3 Manual - Дик Брэндон. PHP/FI Version 2.0 /Пер. с англ. Юрия Плетнева - Jay Greenspan. Working with Forms -

|



Прагматический подход к разработке приложений Web баз данных


В настоящее время проблема распределенных вычислений решается либо в рамках Web технологий, либо DCOM/CORBA моделей. Сравнение этих решений по стоимости дает предпочтение Web технологиям.

Модель распределенных вычислений в рамках Web технологий, в случае реализации доступа к базе данных на стороне сервера, можно изобразить так []

Из рисунка видно, что в состав любого приложения Web баз данных входит компонент, который реализуют CGI скриптом. Однако это не единственный компонент таких приложений. Кроме него в состав приложения входит компонент отображения результатов обработки базы данных. Его часто реализуют на языке HTML.

Таким образом, приложения Web баз данных (WebDBApp) - это сплав компонент, который в общем случае можно графически представить так []

Как видно WebDBApp можно создавать на основании различных комбинаций компонент. Мы ограничимся рассмотрением комбинации

WebDBApp = HTML + PhP3 + SQL

Разрабатывать WebDBApp можно различными способами. Выбранный здесь способ основан на компоновке базовых примитивов и их модификаций.

Используемый подход к разработке приложений не нов. Он основан на идее повторного использования кода. Эта идея, например, в эволюции процедурных языков привела к появлению объектно-ориентированного программирования.

1.

2.

3.

4.



Справочник телефонов


Приложение Web баз данных "справочник телефонов" выбрано из следующих соображений:

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

Данное приложение позволяет по заданой фамилии или ее части найти в базе данных все похожие фамилии. Затем оно формирует html документ, который содержит список из этих фамилий и соответствующих им номеров телефонов.

Для ввода фамилии или ее части пользователь должен заполнить однострочную форму, которой соответствует следующий htm код

<html> <body> <FORM METHOD=Get ACTION="view.php3"> <P><INPUT TYPE=Text NAME=_fio SIZE=20><P> <P><INPUT TYPE=Submit VALUE="Введите фамилию"></P> </FORM> </body> </html>

Теперь обсудим текст скрипта view.php3. Структурно он должен состоять из трех частей, которые должны обеспечить:

соединение с БД; выборку данных из БД на основании совпадения фамилий с введенной в форму комбинацией символов; динамическое формирование html документа.

Первую из перечисленных задач можно решить примитивом connect.inc.

Вторую задачу SQL командой

SELECT * FROM phone WHERE lower(fio) LIKE '_fio%'

Для решения третьей задачи можно предложить следующий скрипт, который разработан на основе view_n.php3

<? // *** динамическое формирование html документа *** $RecCount = pg_NumRows( $result ); // число записей, которые следует отобразить на экране if (empty( $RecCount )) { echo "No Data\n"; // нет таких фамилий } else{ ?> <HTML> <BODY> <TABLE BORDER="1" WIDTH="200"> <? // *** построчное отображение записей *** $i = 0; do { $arr = pg_Fetch_Array ($result, $i); ?> <TR> <TD>Name:&nbsp;</TD><TD><? echo $arr['fio']; ?>&nbsp;</TD> <TD>Phone:&nbsp;</TD><TD><? echo $arr['num']; ?>&nbsp;</TD> </TR> <? $i = $i + 1; // номер следующей записи, которую будем отбражать строкой таблицы } while ($i < $RecCount); } ?> </TABLE> <BR>

</BODY> </HTML>

Назовем его примитивом view_m.inc.

Окончательно текст скрипта view.php3, который обеспечивает реализацию "справочника телефонов" следующий:

<? //*** соединение с БД *** require "primitive/connect.inc";

// *** выборка данных *** $result = pg_Exec( $cnct, "SELECT * FROM phone WHERE lower(fio) LIKE '$_fio%'" );

// *** отображение данных *** require "primitive/view_m.inc"; ?>

Результат работы приложения "справочник телефонов" в случае просмотра абонентов, фамилии которых начинаются на "Ив" приведен ниже.



Приступая к работе


Прежде, чем приступить к разработке базовых примитивов, организуем рабочую среду.

Под средой будем понимать физическую реализацию модели распределенных вычислений и средств манипулирования WebDBApp. Средства манипулирования должны обеспечить создание и удаление WebDBApp, а также редактирование его кода.

Графически используемую реализацию модели распределенных вычислений можно представить так

Для определенности клиентскую часть реализуем Netscape Navigator.

Серверная часть функционирует под управлением ОС UNIX. В качестве Web-сервера используем Apache. Данные будем хранить в Postgres95 реляционной базе. Назовем эту базу данных - chek.

WebDBApp будем хранить на том же компьютере, что и базу данных. Например, в папке WebDBApp. Для манипуляций приложениями используем FAR менеджер. Можно приложение Windows Notepad.exe (Блокнот).

Для освоения излагаемого материала можно реализовать клиентскую и серверную части модели распределенных вычислений на одном копьютере (локально), например, в среде Windows. Вместо Postgres95 можно использовать ODBC или . Отличия команд PhP этих серверов от PhP Postgres95 можно уточнить . Инсталляция Apache описана в статье [].

|



Просмотр данных


Предварительно задают объем просматриваемых данных.

Эту операцию называют "выборка". Ее реализуют SQL командой SELECT. Например, так

SELECT * FROM test

Затем данные, которые выбраны из таблицы, распечатывают построчно. Для этого используют функции, которые сохраняют строки таблиц, как массивы, например,

array pg_Fetch_Array(int result, int row);

Здесь row - номер строки. Их нумеруют, начиная с 0.

Итак, примитив просмотра данных

<? // *** соединение с БД *** require "primitive/connect.inc";

// *** просмотр данных *** $result = pg_Exec( $cnct, "SELECT * FROM test" ); if ( $result ) { $arr = pg_Fetch_Array ($result, 0); echo $arr['name']; } ?>

назовем view.php3.

Поместите его на сервер и запустите на исполнение.

Обратите внимание, что данный скрипт позволяет просмотреть значение поля name только одной записи.

Если в таблице несколько строк, и вы хотите просмотреть результат выбоки как таблицу, то используйте следующий скрипт

<? //*** соединение с БД *** require "primitive/connect.inc";

// *** просмотр данных *** $result = pg_Exec( $cnct, "SELECT * FROM test" ); $RecCount = pg_NumRows( $result ); // число записей, которые следует отобразить на экране ?> <HTML> <BODY> <TABLE BORDER="1" WIDTH="200"> <? $i = 0; do // отображаем записи построчно { $arr = pg_Fetch_Array ($result, $i); ?> <TR> <TD>Name:&nbsp;</TD><TD><? echo $arr['name']; ?>&nbsp;</TD> </TR> <? $i = $i + 1; // номер следующей записи, которую будем отбражать строкой таблицы } while ($i < $RecCount); ?> </TABLE> <BR> </BODY> </HTML>

Назовем этот скрипт view_n.php3.

Результат его исполнения такой



Разработка базовых примитивов


Примитивы можно разделить на две группы: манипулирования таблицами базы данных и самими данными. К первой группе относят:

создание таблиц баз данных; удаление таблиц из базы данных.

Во вторую группу входят:

добавление данных; просмотр данных; изменение значений данных; удаление записей таблиц.

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



Соединение с базой данных


Для баз данных Postgres95 это делают с помощью функции

int pg_Connect(string host, string port, string options, string tty, string dbname);

Эта функция возвращает идентификатор соединения. Он равен 1, если соединение прошло успешно. В противном случае его значение равно 0.

Сохраните ниже приведенный скрипт в файле connect.php3 и поместите его в папку WebDBApp.

<? $cnct = pg_Connect( "host=localhost port=5432 dbname=chek user=chek" ); if( !$cnct ) { // соединения нет echo "Connect to database failed! Please, consult the system administrator. \n"; exit; } else { // соединение прошло успешно echo "Do Something \n"; } ?>

Запустите скрипт на исполнение, для чего воспользуйтесь, например, Netscape Navigator. Введите в его адресной строке путь к папке WebDBApp, например, так http://ssu.sumy.ua/teach/WebDBApp/connect.php3

Если соединение с базой данных произойдет успешно, то вы увидите следующее сообщение

Как мы уже отмечали приложения Web баз данных - это сплав PhP и HTML кодов. Как же сервер их различает. Для указания начала PhP кода используют такую комбинацию символов <?, а его завершение помечают так ?>. Цвет символов серверу безразличен. Этот цвет выбран для того, чтобы в дальнейшем было зрительно легко отличать PhP код от остального текста.

Комментарии выделены зеленым цветом.

Создайте в папке WebDBApp папку primitive и сохраните там примитив соединения с базой данных

<? $cnct = pg_Connect( "host=localhost port=5432 dbname=chek user=chek" ); if( !$cnct ) { // соединения нет echo "Connect to database failed! Please, consult the system administrator. \n"; exit; ?>

как connect.inc файл.



Если вы хотите очистить форму,


. Если вы хотите очистить форму, то значение параметра TYPE должно быть равно Reset.
Окончательно, текст html формы для ввода параметра name примитива добавления данных будет иметь вид
<html> <body>
<FORM METHOD=Get ACTION="insert.php3"> <P><INPUT TYPE=Text NAME=na SIZE=20><P> <P><INPUT TYPE=Submit VALUE="Ввод"></P> </FORM>
</body> </html>
Последнее, что необходимо - это заменить строку примитива
$result = pg_Exec( $cnct, "INSERT INTO test values(1, 'Иванов')" );
на следующую
$result = pg_Exec( $cnct, "INSERT INTO test values(1, '$na')" );
Это позволит добавлять в таблицу БД строки с любыми значениями параметра name.

Создание таблиц


А теперь нам осталось совсем чуть-чуть, чтобы создать таблицу test - воспользоваться SQL командой CREATE TABLE. Например, так

<? //*** соединение с БД *** require "primitive/connect.inc";

//*** создание таблицы *** $result = pg_Exec( $cnct, "CREATE TABLE test (id int, name char(20))" ); if ( $result ) { // таблица создана echo "Table create \n"; } ?>

Используемая здесь функция

int pg_Exec(int connection, string query)

позволяет переадресовать SQL запрос Postgres95 для исполнения. Ключевое слово require позволяет включить текст примитива connect.inc, который был помещен в папку primitive.

Сохраните этот скрипт под именем create.php3 и запустите его на исполнение.



Удаление таблиц из базы данных


Таблицу удаляют следующей SQL командой

DROP TABLE test;



Удаление записей таблиц


Для удаления всех записей из таблицы используют команду SQL вида

DELETE FROM test;

Записи, где значения полей, которые удовлетворяют некоторым условиям, удаляют так:

DELETE FROM test WHERE name='Иванов';



Анализируя процесс разработки Web приложений


Анализируя процесс разработки Web приложений БД на основе примитивов можно указать ряд очевидных преимуществ:
на этапе разработки приложений основное внимание уделяется реализации логики приложения, а не его деталям; наличие базовых прототипов упрощает разработку приложений для решения конкретных задач путем их адаптации; подход к построению приложений на основе примитивов упрощает сопровождение приложений.