[an error occurred while processing this directive]

Программа гостевой книги

Заполним форму, исходный текст которой приводился в листинге 6, и, нажав кнопку PostIt, подтвердим ее!

Листинг 6. Программа обработки данных из формы и вывода их в браузер

#!/usr/local/bin/perl
############################
# SCRIPT: GUESTBOOK.CGI    #
# (c) Michael Yevdokimov   #
############################
&GetFormInput;

$Name=$field{‘name’};
$Email=$field{‘email’};
$City=$field{‘city’};
$Url=$field{‘url’};
$Comments=$field{‘comments’};

print ”Content-type:text/html\n\n”;

&Title;

print ”<B>Name: $Name</B><BR>\n
       <B>Email:</B>
       <A HREF=\”mailto:$Email\”>$Email</A><BR>\n
       <B>City:</B> $City<BR>\n
       <B>Url:</B> 
       <A HREF=\”$Url\”>$Url</A><BR>\n
       <B>Comments:</B> $Comments<BR>\n”;

sub GetFormInput {

	(*fval) = @_ if @_ ;
	local ($buf);
	if ($ENV{‘REQUEST_METHOD’} eq ‘POST’) {
		read(STDIN,$buf,$ENV{‘CONTENT_LENGTH’});
	}
	else {
		$buf=$ENV{‘QUERY_STRING’};
	}
	if ($buf eq ””) {
			return 0 ;
		}
	else {
 		@fval=split(/&/,$buf);
		foreach $i (0 .. $#fval){
		  ($name,$val)=split (/=/,$fval[$i],2);
		  $val=~tr/+/ /;
		  $val=~ s/%(..)/pack(”c”,hex($1))/ge;
		  $name=~tr/+/ /;
		  $name=~ s/%(..)/pack(”c”,hex($1))/ge;

		  if (!defined($field{$name})) { 
			$field{$name}=$val;
		  }
		  else {
			$field{$name} .= ”,$val”;	
#if you want multi-selects to goto into an array change to:
#$field{$name} .= ”\0$val”;
		  }
		 }
		}
  return 1;
}

sub Title {
  print ”<H2>Simple GuestBook</H2><P>\n”;
  return 1;
}

В результате произойдет запуск серверной программы для обработки этой формы и вывода данных в виде отдельной HTML-странички (рис. 3). В форме использовался метод GET, так как в строке ввода адреса вместе с названием самой CGI-программы присутствуют также закодированные данные.

Если использовать метод POST, то в строке адреса отобразится только название самой CGI-программы. В листинге 6 дан ее исходный текст. Алгоритм работы программы очень прост: вызывается подпрограмма &GetFormInput, декодирующая данные из формы, которые затем записываются в соответствующие переменные. Далее с помощью строки print «Content-type:text/html\ n\n» объявляется MIME-тип вывода информации (в данном случае — в виде HTML-страницы), потом запускается подпрограмма &Title для вывода заголовка «Simple Guestbook» и в конце выводятся декодированные данные в Web-браузер в виде HTML-страницы.

Программу можно несколько модернизировать. Гостевая книга должна сохранять введенные пользователем данные в каком-либо файле для дальнейшего их отображения и использования при новом посещении страницы.

Процесс декодирования данных формы практически во всех CGI-программах одинаков. Поэтому, чтобы не повторять его от программы к программе, создаются библиотеки подпрограмм. На сегодняшний день самые популярные из них для Perl — CGI-LIB.PL и CGI.PM. Благодаря этим программам можно сократить размер Perl-программы. Возможностями CGI-LIB.PL воспользуемся ниже.

Для объявления библиотеки необходимо в начале программы написать:

require ”../cgi-lib.pl”;

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

require ”../mylib.pl”;

Один из вариантов библиотеки CGI-LIB.PL был создан Симоном Тнео Чи-Боном. Он доступен для загрузки на Web-узлах по адресам: www.tneon. zoneit.com/cgi и www. basicnet.sonnet. ru/download.

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

&Parse_Data;

Из-за того что используется библиотечная подпрограмма (а она, естественно, отличается названиями переменных), в месте присваивания данных переменным нужно $field{‘ ‘} заменить на $CGI{‘ ‘}. А после внесения всех необходимых изменений в текст программы гостевой книги следует реализовать механизм сохранения пользовательской информации в текстовую базу данных (листинг 7).

Листинг 7. Создание текстовой БД записей посетителей

#!/usr/local/bin/perl
############################
# SCRIPT: GUESTBOOK.CGI    #
# (c) Michael Yevdokimov   #
############################

require ‘cgi_lib.pl’;

&Parse_Data;

$Name=$CGI{‘name’};
$Email=$CGI{‘email’};
$City=$CGI{‘city’};
$Url=$CGI{‘url’};
@Comments=$CGI{‘comments’};
# Убираем символы конца строки из переменной окна прокрутки
$c=0;
foreach (@Comments) {
	$Comments[$c] =~ s/\n/ /g;
	chomp($Comments[$c]);
	$q=$Comments[$c]+$Desc[$c];	
	$q = ~ s/\n/ /g;
	$c++;
}

$file=”guestbook”;
$dbase=”../”;

open (F, ”+>>$dbase/$file”) || die ”Error of adding a record
$!\n”;
  print F join (”::”,”$Name”, ”$Email”, ”$City”, ”$Url”,
”@Comments”),”\n”;
  $i=1;
  foreach (@F) {
  	print F $_;
  	$i++;
  }
close (F);

print ”Content-type:text/html\n\n”;

&Title;

print ”<B>Name: $Name</B><BR>\n
       <B>Email:</B> <A HREF=\”mailto:$Email\”>$Email</A><BR>\n
       <B>City:</B> $City<BR>\n
       <B>Url:</B> <A HREF=\”$Url\”>$Url</A><BR>\n
       <B>Comments:</B> $Comments<BR>\n”;

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

Создавая свой Web-узел, пользователь, вероятно, захочет разместить на нем ссылку на программу гостевой книги, которая будет отображать содержимое базы записей посетителей. В таком случае можно либо создать отдельную программу, либо дополнить уже существующую CGI-программу. Для этого после &Parse_ Data нужно вставить текст, приведенный в листинге 8.

Листинг 8. Проверка наличия команды show

$Command=$CGI{‘command’};

#### Check for a Command ###
if ($Command eq ‘show’) {

  $filepos=$ENV{‘PATH_INFO’};
  $filepos=~s/^\///;
  $filepos=0 if $filepos eq ‘’;

  print ”Content-type:text/html\n\n”;
  &Title;

  $file=”guestbook”;
  $dbase=”../”;
  open (F, ”$dbase/$file”) || die ”Error opening database $!\n”;
  seek (ffile,$filepos,0);
  $i=1;

  while (<F>) {
    ($Name,$Email,$City,$Url,$Comments)=split(/::/,$_);
    print ”<B>Name: $Name</B><BR>\n
           <B>Email:</B> <A HREF=\”mailto:$Email\”>$Email</A><BR>\n
           <B>City:</B> $City<BR>\n
           <B>Url:</B> <A HREF=\”$Url\”>$Url</A><BR>\n
           <B>Comments:</B> $Comments<P>\n>”;
  }
  $i++;
  $newfilepos=tell(ffile);
  close (F);
exit(0);
}
#### End of Checking #####

Эта «вставка» проверяет наличие команды show в командной строке или выполняет URL: /guestbook. cgi?command=show. Если подпрограмма &Read_Data из библиотеки CGI_LIB.PL находит эту команду в адресе, то автоматически начинается обработка «мнимого» метода GET. Мнимым он назван потому, что в действительности для запуска программы с этим методом не используется никакой формы, а соответствующие параметры в адресе тем не менее существуют. После этого в браузере отображается содержимое базы данных. Если же &Read_Data не находит никаких параметров в адресе, то срабатывает функция обработки переданных методом POST данных из формы гостевой книги.

Назад | Содержание | Вперед

  [an error occurred while processing this directive]