Обработка данных формы

   
На этом шаге мы рассмотрим общую схему обработки данных формы.

   
Данные формы поступают в CGI-программу в закодированном виде, поэтому в качестве первого шага CGI-сценарий
должен выполнить декодирование полученной информации. При пересылке данных методом GET данные
формы присваиваются переменной среды QUERY_STRING, при передаче методом POST -
передаются в программу через стандартный ввод и тоже могут быть присвоены некоторой внутренней переменной.
Таким образом, декодирование данных сводится к следующей последовательности манипуляций со строкой:

  • замена каждой группы %hh, состоящей из шестнадцатеричного ASCII-кода hh с префиксом
    %, на соответствующий ASCII-символ;
  • замена символов "+" пробелами;
  • выделение отдельных пар имя=значение, разделенных ограничителем &;
  • выделение из каждой пары имя=значение имени и значения соответствующего поля формы.

   
Программа декодирования HTML-формы может выглядеть, например, так:

# ! /usr/bin/perl
# Декодирование данных формы, переданных методом GET
$form_data = $ENV{ ' QUERY_STRING ' } ;
# Преобразование цепочек %hh в соответствующие символы
$form_data =~ s/% ( . . ) /pack ("С", hex ($l))/eg;
# Преобразование плюсов в пробелы
$form_data =~ tr/+/ /;
# Разбиение на пары имя=значение
@pairs = split (/&/, $form_data) ;
# Выделение из каждой пары имени и значения поля формы и сохранение
# их в ассоциативном массиве $form_fields
foreach $pair (@pairs)
{
  ($name, $value) =split (/=/, $pair);
  $form_fields { $name } =$value ;
}

   
Если данные формы переданы методом POST, то в приведенном тексте следует заменить оператор присваивания

   $form_data = $ENV{ ' QUERY_STRING ' } ;

оператором

  read (STDIN,$ form_data, $ENV{ 'CONTENT_LENGTH'});

считывающим из стандартного ввода программы CONTENT_LENGTH байтов, составляющих содержимое
запроса клиента, в переменную $form_data.

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

   
Функция

  pack  template,  list

упаковывает список значений list в двоичную структуру по заданному шаблону template. Аргумент
template представляет собой последовательность символов, определяющих формат представления пакуемых
данных:

  • а/А - текстовая строка, заполненная нулями/пробелами;
  • b/B - двоичная строка, значения расположены в порядке возрастания/ убывания;
  • c/C - обычное символьное значение / символьное значение без знака;
  • f/d - значение в формате с плавающей точкой одинарной/двойной точности;
  • h/H - шестнадцатеричная строка, младший/старший полубайт первый;
  • i/I - целое со знаком / без знака;
  • l/L - значение типа long со знаком/без знака;
  • n/N - значение типа short/long с "сетевым" порядком байтов ("старший в старшем");
  • p/u - указатель на строку / Uu-кодированная строка;
  • s/S - значение типа short со знаком / без знака;
  • v/V - значение типа short/long с VAX-порядком байтов ("старший в младшем");
  • x/X - нулевой байт / резервная копия байта;
  • @ - заполнение нулевыми байтами (до абсолютной позиции).

   
За каждым символом может следовать число, обозначающее счетчик применений данного символа в качестве формата.
Символ * в качестве счетчика означает применение данного формата для оставшейся части списка.

$х = pack  "cccc",   80, 101, 114, 108; 
$х = pack  "c4",   80, 101, 114, 108;
$х = pack  "B32",   "01010000011001010111001001101100";
$х = pack  "H8",   "5065726С";
$х = pack  "H*",   "5065726C";
$х = pack  "cB8H2c",80,"01100101",72,108;

   
Значение переменной $х во всех случаях равно "Perl".

   
Функция

   hex  expr

интерпретирует аргумент ехрr как шестнадцатеричную строку и возвращает ее десятичное значение.

   
В тексте приведенной на этом шаге программы все представляется очевидным. Разберем только наиболее насыщенную строку

  $form_data =~  s/%(..)/pack ("С", hex ($l))/eg;

   
Образец для поиска задан в виде регулярного выражения %(..). Этому образцу удовлетворяет произвольная
последовательность вида %ху, где х, у - любые символы. В результате кодирования данных в качестве
х, у могут появиться только шестнадцатеричные цифры, поэтому можно не задавать более точный, но
менее компактный шаблон %([0-9A-Fa-f] [0-9A-Fa-f]). Часть выражения заключена в скобки (..).
При нахождении подходящего фрагмента %hh его часть, содержащая шестнадцатеричное число hh,
сохраняется в переменной, которая затем будет использована в качестве аргумента функции hex($l) для
преобразования в десятичное значение. Функция pack упакует это десятичное значение в двоичную
структуру, которая в соответствии с шаблоном "С" будет интерпретироваться как символ. Этот символ
заменяет в тексте найденную цепочку %hh.

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

   
Со следующего шага мы начнем рассматривать создание сценария CGI.



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий