Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 [ 90 ] 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122

.7. Форма службе! техческой псддержки

1: <FORH action="/cgi-bin/helpclesk.cgi" name="helpdesk«>

2: Тип Проблемы;

3: <1МР0Т TYPE=radio name=probtype value=hardware>

4: Аппаратное обеспечение

5: <INPUT TYPE=mdio ranie=probtYpe value=software>

6: ГЬюграммйое обеспечение

7: <BR>

8: lEXTARHA name=problem rows=10 cols=40>

9: Опишите гребле!.

10: </TEXTAREA>

11: <BR>

12; Baffle имя:

13 : <INPUT TYPE=text width=40 name=name><BR>

14: <IIIPUT TYPE=sabniit name=submit value="3anpQc">

15: </FORM>

Форму должна обрабатывать gi-bin/helpdesk.cgi. Текст этой программы представлен в листинге 18.8. Если вы хотите поместить программу в другое место или назвать ее как-нибудь иначе, измените URL в коде формы, приведенной в листинге 18.7 *

18,8. CGI-сrрма служ1 техческой поддержки

:L: I!/usr/bin/perl -wT

2: и£Ю Strict;

3: 1-Ш CGE qw{!all);

4: иж Fcntl qw(:flock);

6: I Путь к фай! Я5фнала гостевой книги. Можете его изменить

7: ту $gbdata="/tmp/guestbook";

8: * Для семафора может &.пь использовано любое имя.

Э: my Ssemaphore file="/tmp/helpdesk.sem;

I функция блокировки (ояипает бесконечно дого)

10: 11:

12 : sub get lock { 13: open{SEM, ">$semaphore file")

14: и die "Невозможно создать семафор: $1";

15: 16: 17: 18: 19: 20: 21: 22 : 23: 24: 25:

flock(SEM, LOCK EX) die "Невозмояно заблоквать фа: $!";

i /нкпия отмене! блокзовке фата sub release lock { close(SEM);

I Эта функпет сохраняет данные формы в файле sub save {

get 1оск(); open{GB, "»$gbdata")

[I die "Невозможно открьпъ файл $gtjdata: ?!"; 26: print GB "name; ", param(name), "\n"; 27: print GB "type: ", para(probtype), "\n";



28: 29: 301 31:} 32: f

34: 35:

print GB "problem: close(GB); release lock();

pardm(problem), "Vn"

36: 37: 38: 39: 40: 41: 42: 43: 44: 45:

функция эажа ссдержи файла всй книги t в фсрате НШЬ с минимальным фсратсфованкем. sub display {

openfGB, $data)

11 die "Невозмжю агщль файл $gbdata: $1"; while(<GB>){

prin ><p>"; # ИМЯ my{$type, $prob); $type=<GB>; * Кащцая запизь $db=<GB>; # состоит из 3-х слрок...

"$pe<P>"; print "$prob<BR><HR>";

close(GB);

47: print header;

48: I Пфажф suhnif предается этсй CGI-nporpamie,

49: t есш сш выошяется в резута/гате нахатня кюжи

50: 1 suhnif фсрш лилмнга 18,7

51: if (dined paran(submit)) {

52: save;

53: display;

54:} else {

55: display; 56:}

Большая часть кода листинга 18.8 должна быть вам понятна, обратите лишь "•внимание на следующее.

Данная форма не может обойтись без функций и

Как вы знаете, одновременно может быть запушено несколько экземпляров одной CGI-профаммы. Это означает, что с файлом журнала может работать сразу несколько экземпляров программы helpdesc.cgi. Поэтому перед выполнением операции записи в файл его нужно заблокировать. Перед операцией чтения файл блокировать не нужно, поскольку чтение файла в тот момент, когда в него производится запись другим процессом, не вызывает никаких опасных последствий.

Эта предусматривает два варианта использования. При вы-

зове из формы, приведенной в листинге 18.7, она добавляет новые записи в файл журнала. При вызове не из формы - отображает содержимое файла журнала.



Резюме

На этом занятии вы изучили взаимодействие форм HTML и программ CGL Мы показали, как может получать содержимое формы с помощью функ-

ции рагаш модуля CGL Мы также коснулись тем безопасного написания программ и регистрации данных. Вашему вниманию было предложено простое CGI-пршюжение гостевой книги. Оно может быть легко модифицировано и усовершенствовано для использования в ваших целях.

Вопросы и ответы

Моя форма не работает, я получаю сообщение об ошибке.

Для локализации нроблемы воспользуйтесь руководством по отладке CGI, приведенном на 17-м занятии, "Введение в CGI". Отладка программы, обрабатывающей форму, не отличается от отладки обычной CGI-лрограммы.

Я нашел в Internet прекрасную программу, но не могу понять, почему для получения параметров формы она использует переменную $ENV{QUERY STRING}?

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

Я запускаю программу с ключом -Т в строка # !, при этом появляется сообщение об ошибке Too late for -т option и программа прекращает выполнение. Почему?

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

perl -Т -d foo. cgi

Может ли контроль данн1х г1 уберечь программиста от совершения нелеп1х ошибок в CGI-программе? Гарантировавд ли теперь безопасность профаммы?

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

Семинар

Контрольные вопросы

1 Что возвращает функция param без аргументов в контексте списка?

а) undef;

б) количество элементов формы;

в) список имен элементов формы.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 [ 90 ] 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122