Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Использование файлов DBM для обработки данных. Использованиетекстовых файлов в качестве базы данных.



Существует несколько разновидностей баз данных Berkeley, которые обобщенно называются файлами DBM (от английского Database Manager). Данные в DBM-файле хранятся в двоичном виде, а логически его можно рассматривать как ассоциативный массив, хранящийся на диске. В таких операционных системах, как Linux, FreeBSD или Solaris, Perl часто устанавливается с поддержкой этого формата данных, которая реализована в модуле DB_File. В операционной системе MS Windows этот модуль потребуется установить дополнительно. С помощью этого модуля легко пользоваться базой данных в формате Berkeley DB, потому что с файлом базы данных можно работать как с обычным хэшем. Для этого устанавливается связь между переменной-хэшем и файлом на диске с помощью функции tie(), которой указывается, что для доступа к файлу (например, 'file.db') нужно использовать модуль DB_File. Если указанный файл не существует, он создается. Когда работа с файлом базы данных через хэш-переменную закончена, связь между ними разрывается функцией untie():

use DB_File; # подключить модуль для работы с Berkeley DB

my %hash; # через этот хэш будет происходить работа с БД

tie %hash, 'DB_File', 'file.db' or die; # установить связь

$hash{'КЛЮЧ'} = 'ЗНАЧЕНИЕ'; # добавить элемент в хэш и БД

untie %hash; # разорвать связь между хэшем и БД

 

Формат DBM имеет ограничение, присущее всем ассоциативным массивам: с каждым ключом файла базы данных может ассоциироваться только одно значение. Есть много способов обойти это ограничение, и один из них заключается в использовании модуля Storable, который предназначен для организации хранения во внешней памяти массивов, хэшей и других программных объектов. Функция Storable:: freeze() " замораживает" данные в двоичном виде, например, перед записью на диск, а функция thaw() " размораживает" информацию, восстанавливая первоначальную структуру данных:

use DB_File; # модули для работы с DBM use Storable qw(freeze thaw); # и сохранения данных my %database; # хэш " привязывается"... tie %database, " DB_File", " mollusc.db" or die; #...к БД open my $text, '< ', 'mollusc.txt' or die; # файл, откуда while (my $data = < $text> ) { # читаем данные, chomp($data); # удаляя \n # и разбивая строку на поля по разделителю '; ': my ($id, $name, $latin, $area) = split('; ', $data); my %record = ( # заполняем поля записи БД: ID => $id, # идентификатор экземпляра NAME => $name, # наименование моллюска LATIN => $latin, # латинское название AREA => $area); # ареал обитания my $serialized = freeze \%record; # " замораживаем" $database{$id} = $serialized; # и сохраняем запись } close $text; # закрываем тестовый файл untie %database; # и базу данных


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

use DB_File; # модули для работы с DBM use Storable qw(freeze thaw); # и сохранения данных my %database; # хэш " привязываем"... tie %database, " DB_File", " mollusc.db" or die; #...к БД my $id = 65590; # ищем " Перловицу" if (exists $database{$id}) { # по идентификатору my $serialized = $database{$id}; # считываем и %record = %{ thaw($serialized) }; # " размораживаем" printf " %5d %s %s %s\n", # запись БД в хэш $id, $record{NAME}, $record{LATIN}, $record{AREA}; } untie %database; # " отвязываем" БД от хэша # будет выведено: 65590 Перловица Unio pictorum


Для перебора всех записей файла DBM можно пользоваться функциями keys() и each(), а для удаления записи - применить функцию delete().


 

Создание HTML-форм.

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

Формы в html - особый раздел в документе, который позволяет пользователю вводить информацию для последующей ее обработки. Формы являются самым удобным способом получения информации от пользователя. Та же форма обратной связи обеспечивает связь между пользователем и владельцем сайта. Заполнение своих анкетных данных при регистрации на сайте.

Для создания html-формы используется команда form. У нее могут быть следующие параметры:

  • NAME - определяет имя формы, обычно не указывается. Применяется для идентификации формы, если в документе присутствует несколько форм.
  • ACTION - обязательный параметр, он задает путь к скрипту, который будет запущен веб-сервером.
  • METHOD - определяет способ отправки параметров формы. Принимает значение GET или POST.
  • TARGET - определяет окно, в которое возвращается результат обработки отправленной формы. Возможные значения: _self, _parent, _top, _blank или явно указанное имя окна.
< form method=POST action=/cgi-bin/gb_show.exe> < input type=text name=text value=" Значение по умолчанию" size=40> < input type=submit value=Опубликовать> < /form>

Здесь мы создали форму, которую будет обрабатывать программа gb_show.exe. Параметр method, указывает каким способом передаются параметры в программу gb_show.exe. Какой именно способ указывать, зависит от программы gb_show.exe, которая будет обрабатывать вашу html-форму. В этом параграфе вы должны научиться создавать формы в html-документе. Их использовать вы сможете после установки и настройки веб-сервера, но об этом во второй части книги.
Внутри команды form могут быть следующие элементы:

  • поле ввода для строки
  • поле ввода для пароля
  • кнопки
  • радиокнопки
  • список
  • поле ввода для текста
  • checkbox - поле ввода для атрибутов типа Boolean
  • рисунок

Флажок (checkbox)

Флажки checkbox предлагаю пользователю ряд вариантов, и разрешает выбор нескольких из них.

< input name=" Имя переключателя " type=" Тип " value=" Значение " >

Группа флажков состоит из элементов < input> , имеющих одинаковые атрибуты name и type(checkbox). Если вы хотите, чтобы элемент был отмечен по умолчанию необходимо пометить его как checked. Если элемент выбран, то сценарию поступит строка имя=значение, в противном случае в обработчик формы не придет ничего, т.е. не выбранные флажки вообще никак не проявляют себя в переданном наборе данных.

Пример:

< input name=" mycolor" type=" checkbox" value=" red" checked> Красный(выбран по умолчанию)
< input name=" mycolor" type=" checkbox" value=" blue" > Синий
< input name=" mycolor" type=" checkbox" value=" black" > Черный
< input name=" mycolor" type=" checkbox" value=" white" > Белый

Переключатель(radio)

Переключатели radio предлагают пользователю ряд вариантов, но разрешает выбрать только один из них.

< input name=" Имя переключателя " type=" Тип " value=" Значение " >

Переключатель (radio) имеет атрибуты name, type и value. Атрибут name задает имя переключателя, type задает тип radio, а атрибут value задает значение. Если пользователь выберет переключатель, то сценарию будет передана строка имя=значение. При необходимости можно указать параметр checked, который указывает на то, что перключатель будет иметь фокус (т.е. будет отмечен по умолчанию) при загрузке страницы. Переключатели также можно объединять в группы, для этого они должны иметь одно и тоже имя.

Пример:

< input name=" mycolor" type=" radio" value=" white" > Белый
< input name=" mycolor " type=" radio" value=" green" checked> Зеленый (выбран по умолчанию)
< input name=" mycolor " type=" radio" value=" blue" > Синий
< input name=" mycolor " type=" radio" value=" red" > Красный
< input name=" mycolor " type=" radio" value=" black" > Черный

Текстовое поле (text)

Позволяет пользователям вводить различную информацию.

< input type=" Тип " name=" Имя поля " size=" Размер " maxlength=" Макс. количество символов " >

При создании обычного текстового поля размером size и максимальной допустимой длины maxlength символов, атрибут type принимает значение text. Если указан параметр value, то поле будет содержать отображать value-текст. При создании поля не забывайте указывать имя поля, т.к. этот атрибут является обязательным.

Пример:

< input type=" text" name=" txtName" size=" 10" maxlength=" 5" value=" Текст по умолчанию" >

7) Поле для ввода пароля (password)

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

Пример:

< input type=" password" name=" txtName" size=" 10" maxlength=" 5" >


Форма задаётся с помощью элемента < form>, внутри которого и располагаются элементы управления. Кроме общих для HTML атрибутов, в < form> могут присутствовать следующие[1][2]:

  • action (действие) — обязательный атрибут (в HTML5 — нет), содержащий URI обработчика формы;
  • method (метод отправки формы) — атрибут, принимающий значения GET (по умолчанию) или POST;
  • enctype (тип кодирования для содержимого) — по умолчанию application/x-www-form-urlencoded (всегда для метода GET), но обычно употребляется multipart/form-data;
  • accept — список MIME-типов для загрузки файлов;
  • name — имя формы;
  • onsubmit — обработчик события «форма отправлена» (для скриптов);
  • onreset — обработчик события: «форма очищена» (тоже для скриптов);
  • accept-charset список поддерживаемых наборов символов.

Отправка формы[править | править вики-текст]

Для отправки формы имеются два метода: GET и POST. Метод GET рекомендуется использовать в случаях, когда при обработке формы на стороне сервера не происходит побочных действий, например, поиск. В противном случае, когда на стороне сервера подразумевается модификация в базах данных и т. п., требуется использовать метод POST.


 

Структура CGl-программы.

CGI (от англ. Common Gateway Interface — «общий интерфейс шлюза») — стандарт интерфейса, используемого для связи внешней программы с веб-сервером. Программу, которая работает по такому интерфейсу совместно с веб-сервером, принято называть шлюзом, хотя многие предпочитают названия «скрипт» (сценарий) или «CGI-программа».

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

Все скрипты, как правило, помещают в каталог cgi (или cgi-bin) сервера, но это необязательно: скрипт может располагаться где угодно, но при этом большинство веб-серверов требуют специальной настройки. В веб-сервере Apache, например, такая настройка может производиться при помощи общего файла настроек httpd.conf или с помощью файла.htaccess в том каталоге, где содержится этот скрипт.

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

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

Весь процесс получения данных от веб-сервера можно представить следуюшим образом:

1. Получить все необходимые переменные окружения. Наиболее важной на данном этапе является REQUEST_METHOD.

2. Получить данные от сервера в зависимости от метода передачи:

3. Если (REQUEST_METHOD=" GET" ) то

4. Взять данные из переменной окружения QUERY_STRING

5. Иначе

6. Если (REQUEST_METHOD=" POST" ) то

7. Проанализировать переменную QUERY_STRING

8. Получить длинну данных из CONTENT_LENGTH

9. Если (CONTENT_LENGTH> 0) то

10. Считать CONTENT_LENGTH байт из sdtin как данные.

11. Иначе

12. Выдать сообщение об ошибке и выйти.

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

С анализом переменной REQUEST_METHOD думаю все ясно, а вот, что значит в методе POST проанализировать QUERY_STRING, наверно, не все ясно. При передаче методом POST сервер посылает данные через стандартный поток ввода, но это не значит, что пользователь не пользовался URL 'ом для передачи данных. Примером может служить многопользовательский шлюз, в котором для идентификации пользователя используется URL, а для передачи данных stdin:

http: //.../cgi-bin/guestbook.cgi? user=bob& rec=0

В этом случае шлюзу гостевой книги (guestbook.cgi) сообщается два параметра user и rec, с помощью которых она может узнать " куда записывать" или " как обрабатывать" данные поступающие через поток ввода.

Считывание данных через поток sdtin должно осуществляться в динамическую память, или же во временный файл, если размер памяти ограничен или данные слишком велики для полного размещения в ОЗУ. С чем это связано? Это связано с тем, что при использовании статичестких буферов может произойти его переполнение.

Пример:

char cgi_data[1000];

...

long content_length=atol(getenv(" CONTENT_LENGTH" ));

fread(cgi_data, content_length, 1, stdin);

...

Надеюсь все сразу видно: -)). Если content_length> 1000, то произойдет переполнение cgi_data. Переполнение буферов это излюбленный метод атаки хакеров. Вместо этого лучше выделять память динамически:

char *cgi_data;

...

long content_length=atol(getenv(" CONTENT_LENGTH" ));

cgi_data=(char *)malloc(content_length);

if (cgi_data! =NULL)

fread(cgi_data, content_length, 1, stdin);

...

После получения данных от сервера их надо еще декодировать. Можно это сделать сразу, а можно по мере надобности. Если Вы будете это делать сразу, то Вам также придется их разбить на куски, так как при декодировании могут появиться лишние знаки " & " и " = ", которые больше не позволят вам отделять пары " имя=значение" друг от друга.

Вот пример процедуры, которая декодирует данные из буфера:

/* Возвращает верхний регистр символа*/

char upperchar(char ch)

{

if ((ch> ='a') & & (ch< ='z'))

{

ch='A'+(ch - 'a');

return ch;

}

else return ch;

};

 

/* Переводит из Hex в Dec*/

char gethex(char ch)

{

ch=upperchar(ch);

if ((ch> ='0')& & (ch< = '9')) return (ch-'0');

if ((ch> ='A')& & ( ch< ='F')) return (ch-'A'+10);

};

 

/*

Ищет и возвращает параметр с именем name, в buffer.

Если параметр name не найден, возвращает NULL.

 

Пример: message = getparam(post_buffer, " message=" );

 

Замечание: символ " =" после имени параметра не удаляется

и входит в возвращаемый результат, поэтому рекомендуется

искать параметр вместе с символом " =".

*/

 

char *getparam(char *buffer, char *name)

{

if (buffer==NULL) return NULL;

 

char *pos;

long leng=512, i=0, j=0;

char h1, h2, Hex;

 

char *p=(char *)malloc(leng);

pos=strstr(buffer, name);

if (pos == NULL) return NULL;

 

if ((pos! =buffer) & & (*(pos-1)! ='& ')) return NULL;

 

pos+=strlen(name);

 

while ( (*(pos+i)! ='& ')& & ( *(pos+i)! ='\0' ))

{

if ( *(pos+i)=='%' )

{

i++;

h1=gethex(*(pos+i));

i++;

h2=gethex(*(pos+i));

h1=h1< < 4;

*(p+j)=h1+h2;

}

else

{

if (*(pos+i)! ='+') *(p+j)=*(pos+i);

else *(p+j)=' ';

};

i++;

j++;

if (j > = leng) p=(char*)realloc(p, leng+20);

leng+=20;

};

if (j < leng) p=(char*)realloc(p, j+1);

 

*(p+j)='\0';

return p;

};

Технология CGI позволяет просто поменять содержимое веб-сервера. Простым примером может служить скрипт, который при каждом новом обновлении страницы вставляет в нее новую ссылку(банер) или анекдот. Более сложными скриптами являются гостевые книги, чаты, форумы и естественно поисковые сервераили базы данных построенные на технологиях интернета.


 


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-05-03; Просмотров: 678; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.085 с.)
Главная | Случайная страница | Обратная связь