Шаг 155.
Создание собственного CGI-сценария (начало)

    На этом шаге мы начнем создавать свой сценарий CGI.

    Программа должна декодировать полученные данные, проверять заполнение обязательных полей формы и правильность подтверждения пароля, в зависимости от результатов проверки формировать документ для отсылки клиенту. Сохраним сценарий в файле /cgi-bin/registrar.cgi. Полный маршрут к данному файлу определяется параметрами конфигурации Web-сервера. Местоположение каталога cgi-bin обычно указывается относительно корня дерева документов Web-сервера, а не корневого каталога файловой системы. Например, если корнем является каталог /home/httpd/html/, то файл сценария будет иметь маршрутное имя /home/httpd/html/cgi-bin/registrar.cgi, которое в запросе клиента будет указано как /cgi-bin/registrar.cgi. В первом приближении текст сценария может выглядеть следующим образом.

#! /usr/bin/perl
print "Content-type:text/html\n\n"; 
$method = $ENV{'REQUEST_METHOD'}; 
if ($method eq "GET") 
{
  $form_data = $ENV{'QUERY_STRING'}; 
} 
else  
{
  read (STDIN, $form_data, $ENV{'CONTENT_LENGTH'}); 
}
$form_data =~ s/%(..)/pack ("C", hex ($1))/eg; 
$form_data =~ tr/+/ /; 
@pairs = split (/&/, $form_data); 
foreach $pair (@pairs) 
{
  ($name, $value)=split(/=/,$pair);
  $FORM{$name}=$value; 
}
#Проверка заполнения обязательных полей 
if (!$FORM{'regname'} || !$FORM{'password1'}) 
{ 
print <<goback
<html>
<head><title>Неполные данные</title></head>
<body><h2>Извините, Вы пропустили обязательные данные</h2>
<br>
Попробуйте еще раз, пожалуйста.
</body></html> 
goback
;}
#Проверка правильности ввода пароля
elsif ($FORM{'password1'} eq $FORM{'password2'})
{ 
print <<confirmation
<html>
<head><title>Поздравляем!</title></head> 
<body><h2>Поздравляем!</h2><br>
Ваша регистрация прошл успешно.   
Вы можете пользоваться нашей библиотекой.   
Спасибо за внимание.
</body></html>
confirmation
;}
else
{
print <<new_form
<html><head><title>Ошибка при вводе пароля</title></head>
<body><h3>Введенные Вами значения пароля не совпадают</h3>
<br><form method="get" action="/cgi-bin/registrar.cgi">
<pre>
  Введите пароль:  <input type="password" name="password1">
  Подтвердите пароль: <input type="password" name="password2">
</pre>
new_form
;
foreach $key (keys %FORM) 
{
  if ($key ne "password1" && $key ne "password2") 
  {
    print "<input type=\"hidden\" name=$key value=$FORM{$key}>\n";
  }
}
print <<EndOfHTML
<br><br>
<input type="submit" value="OK"> 
<input type="reset" value="Отменить">
</form></body></html>
EndOfHTML
;}
Текст сценария вместе с формой можно взять здесь.

    После вывода строки заголовка осуществляется считывание переданной серверу информации в переменную $form_data. В зависимости от метода передачи, эта информация считывается из переменной среды QUERY_STRING (метод GET) или из стандартного ввода программы (метод POST).

    Считанная информация декодируется и помещается в ассоциативный массив %FORM.

    Отсутствие обязательных данных - регистрационного имени и пароля - проверяется помощью условия

  if (!$FORM{'regname '} || !$FORM{'password1' } ) .

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


Рис.1. Ответ сервера в случае отсутствия обязательной информации

    При выводе этого документа в операции print использована конструкция "документ здесь". Она позволяет использовать внутри себя символы, которые при заключении в обычные двойные кавычки необходимо маскировать символом "\", например, сами двойные кавычки, символы "@", "$", "%".


    Примечание. Обратите внимание на то, что, "имя документа" (например, в первом случае это goback) должно идти СРАЗУ ЖЕ за символами <<.

    Условие

  elsif  ($FORM{'password1'}  eq $FORM{'password2'})
предназначено для проверки совпадения двух копий введенного пользователем пароля. Если значения совпадают, то пользователю посылается сообщение, подтверждающее успешную регистрацию (рисунок 2).


Рис.2. Подтверждение регистрации

    В противном случае формируется HTML-документ, предлагающий ввести пароль повторно (рисунок 3).


Рис.3. Повторное приглашение для ввода пароля

    Этот новый документ содержит форму, в состав которой входят два видимых поля типа "password" - для ввода и подтверждения пароля, и скрытые поля типа "hidden" - для сохранения остальных данных, введенных при заполнении исходной формы. Каждое скрытое поле новой формы наследует у соответствующего поля исходной формы атрибуты name и value. Если эти данные не сохранить, то их придется вводить заново, принуждая пользователя повторно выполнять уже сделанную работу. Информация, сохраненная в скрытых полях, невидима пользователю и недоступна для изменения.

    На следующем шаге мы продолжим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг