Анимация
JavaScript
|
Главная Библионтека .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 |