Анимация
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

29: 30: 31: 32: 33: 34:

11 die "Сш/Ёка трл апыпяя $1азЬ Ш.е: $1-eanswers=<QF>; close(QF);

dmp eanswersf t Vpnmb омвспл нжй стрске return(answers);

Проведем анализ программы.

• Строка 6. В переменной $survey dir задается имя каталога, где должны находиться файлы опроса. Чтобы создать новый опрос, вы можете просто поместить текстовый файл с расширением .txt в этот каталог, как бьшо они-сано в начале данного раздела. Этот каталог должен быть доступным для записи процессам Web-сервера Доступность для записи обычно означает наличие у пользователя прав доступа 0755 в системе UNIX или разрешение на

запись в данный каталог для учетной записи guest в системе Windows NT.

• Строка 8. Функции findjast file{) в качестве параметра передается расширение файла (либо ,txtr либо .answer). Она находит в каталоге Ssiirvey dir последний по алфавиту файл заданного типа. Эта функция общего назначения вноследствии иснользуется функцией get file contents(), а также программой записи результатов опроса, которую мы рассмотрим в следующем разделе. Если в данном каталоге нет файлов такого типа, то функция find last file() возвращает значение.undef.

• Строка 20. Функции get file contents(} в качестве параметра также передается расширение файла (опять-таки .txt либо .answer). Она возвращает содержимое последнего файла указанного типа из каталога опроса. Чтобы найти имя этого файла, она вызывает функцию find last file().

Оставшаяся часть программы, приведенная в листинге 24.5, достаточно проста.

Листинг 24.5. ражение опроса, часть

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

45: 46: 47: 48: 49:

♦ получить содержимое последнего текстового айпа с анкетш my(Squestion, Sanswers)=get file contents{"txt");

print header;

print qq{<rORM ACTION="/cgi/writesurvey.cgi" KETH0D=POST>\n}; print "Вопрос: $question<P>\"; Щ $answerO; foreachf§asswers) {

print "<INPirT TYPE=RADIO NAME=answer value=Sanswer>";

print •$ <BR>\n";

$answer+ + ;

print qq{<INPDT TYPE=SUBMIT VALUE="3anpoc>>; jjxiQj qq{</FORM>}; .

ОСНОВНОЙ КОД программы начинается со строки 36. Содержимое последнего .txt-файла загружается в переменную для первой строки и в - для ос-

тальной части файла функцией get file contents!).

24-й ча Сосда аного Web-сервера



В строке 40 вы должны изменить путь /cgi/writesurvey.cgi к CGI-программе записи данных опроса.

Далее выводится заголовок анкеты и ее вопросы посылаются броузеру. Каждая строка в массиве answers оформляется в виде переключателя. Первой по порядку кнопке переключателя присваивается 0, второй - 1 и т.д. до тех пор, пока в массиве §answers не останется ни одного варианта ответа. Тело анкеты будет выглядеть примерно так:

<INPUT TypE=RADIO NAME=answer value=0>Co6aKa<BR> <INPUT TYPE=RADIO NAHE=answer valiie=l>KoinKa<BR> <Шт TYPE=SADIO SWlE=answer valxie=2>PH6xH<BR>

HAME=answer value=3> СНи меня раздраха1от<ВЕ>

После того как пользователь выберет вариант ответа и щелкнет на кнопке подачи запроса, CGI-программе будет передан параметр answer, содержащий номер ответа. CGI-программа /cgi/writesurvey.cgi, обрабатывающая данные формы (полный путь к ней задается в строке 40), запишет ответы в файл. Эта программа рассматривается в следующем разделе.

Часть II: анализ результатов

После того как пользователь щелкнет на кнопке подачи запроса (Submit), начинается настоящая работа. Ответ пользователя (т.е. выбранный им вариант) необходимо записать в файл, а результаты - свести в таблииу, а затем отобразить.

Программа, листинг которой приведен ниже, кажется довольно длинной, но; на самом деле большую ее часть составляют подпрограммы, с которыми вы уже встречались. Подпрограммы блокирования файлов get lock() и release lock( >, которые использовались на протяжении всей книги, и подпрограммы get file contents() и findJastfileO из программы отображения опроса также вносят существенный вклад в увеличение размера данной CGI-программы,

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

Листинг 24.6. Обработка опроса, часть I

1 bin/perl -w

3: use. strict;

4: use Fcntl qw(:flock);

5: use QGI qw(:all);

7: my{Ssurvey dir, $lockfile); 8: $survey dir=*yweb/htdocs/poll"; 9: 51ockfile="/tmp/surveylock";

11: sub finl lastjile { my($type)=§ ; my(efilee, $last file);

13: .....

14: I ОпыЕь каталог, взшь гссщгрий фдйп

15: t н/жюго тит.

16: opendir(SD, $survey dir) [

die "Qii£Ka rp стщыгии SsuTvey dir: $1";

17: efiles=reverse sort grep(/\.$typef/, rraddir SD);

18: closedir{SD);



19:1 $last file=Sfiles[$files];

20:i return{$last file);

£i±) get ile CEntei { iiy(Stype)*g f my(eanswers, $last file);

$last file=find last file($type);

21:i 22:; 23:: 24:; 25: 26: 27:; 28:;

29:1 return if cMdred $last file);

I (>ibiib аш и гртхсвть егс) ас{[»<июе open(QF, "$survey dir/$last file")

11 die "ОиВахрячгаия $last file: $!"; #answers=<QF>; close(QF);

rs; I удалить сиувспы iebcm стрски return{? answers);

siibget lock{

cpai/SEM, >$lockfile")

I die "01»йа15исщ1рЕзияаауС5а:$Г;

31: 32: 33:

34: 35: 36: 37: 38: 39: 40: 41:

flOCik(SEM, LOCK EX)

11 die "Qiiaipi&rratiCBaEMiфайла: $J

42: }

43: siib release lock {

44: close (SEM);

45: >

Пока все в листинге 24.6 должно быть вам понятно и знакомо. Используемые здесь подпрограммы либо взяты из предыдущей программы, как, например, get file contents() и find last file(), либо это подпрограммы get lock() и release lock(). И опять-таки проверьте, Что Web-сервер может осуществлять запись в каталог, имя которого указанно в переменной Ssurveydir).

И поскольку здесь все просто, давайте перейдем к продолжению программы, приведенному в листинге 24.7.

Ли 24.7.

ЯЯВЙШ1ЯЯЯИ111НН11И

ту{$qaestion, eposs answers)=get file contents("txt");

46: 47: 48: 49:

50: i ДобаЕкпъ данные в файл ответов 51: if (defined param("answer")) {

52: my($lastfile);

53: get lock();

54: t ваши имя последнего файла ощхэса и создать

55: t на его остове икя файла ответов.

56: $lastfile=find last file("txt");

57: $lastfile="s/txt/anEwer/;

58: 59: 60:

open(ANS, • »Ssur¥ey dir/ Slastfile")

jj die "01 при открии $lastfile: $!



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