Приглашаем посетить
Тургенев (turgenev-lit.ru)

Декодирование форм html с использованием метода get

Декодирование форм html с использованием метода get

Как вы увидели, использование подсказки ISINDEX для создания одиночного за­проса достаточно просто. Но для получения от пользователя больше чем одного значения необходимо использовать формы. Следующий скрипт на языке Perl ге­нерирует форму. Используя метод GET , скрипт дает команду броузеру послать значения запроса как часть U RL , так же как при использовании ISINDEX . Разни­ца между использованием GET и ISINDEX состоит в том, что при использовании метода GET броузер может соединить несколько величин полей в одну строку запросов, разделяя поля с помощью амперсанда (&).

Для того чтобы скрипт мог определять значения полей, броузер включает имена полей в строку запроса. Например, если база данных содержит три поля (имя, возраст и день рождения) с такими значениями ( Bob , 27, 11-1-68), то строка запро­сов будет содержать значения полей в следующем формате: « name = Bob & age = =27& birthday = l 1-1-68». В следующем примере скрипт декодирует поля и выводит на экран их значения с помощью создания HTML-формы:

            ($cgi_bin, $cgi_script) = ($0 =~ m:(.*)[/\\](.*):);

            $query = $ENV{QUERY_STRING};

           

            if ($query eq ‘’)

            {

                        # сгенерируем форму

                        print <<FORM;

Content-type: text/html

<HTML>

<HEAD><TITLE>Sample GET Form </TITLE></HEAD>

<BODY>

What is your query? <P>

<FORM METHOD=”GET” ACTION=”$cgi_script”>

A checkBox. <BR>

<INPUT TYPE=”checkbox” NAME=”chek” VALUE=”on”><P>

A radio button set. <BR>

<INPUT TYPE=”radio” NAME=”button” VALUE=”1”> 1<BR>

<INPUT TYPE=”radio” NAME=”button” VALUE=”2”> 2<BR>

<INPUT TYPE=”radio” NAME=”button” VALUE=”3”> 3<P>

A data entry field<BR>

<INPUT NAME=”field”><P>

Send the data.<BR>

<INPUT TYPE=”submit”>

</FORM>

</HTML>

FORM

                 }

else   {

            # распечатаем результаты

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

print “<HTML>\n”;

print “<HEAD><TITLE>GET Form Result</TITLE></HEAD>\n”

print “<BODY>\n”;

print “Your query values:<P>\n”;

@fields = split(‘&’, $query);

forech (@field) {

           Switch: {

                       /^check=(.*)/ && do {

                                   $check = $1;

                                   last Switch;

                       };

                       /^button=(.*)/ && do {

                                   $button = $1;

                                   last Switch;

                       };

                       /^field=(.*)/ && do {

                                   $field = $decode(1);

                                   last Switch;

                       };

           }

}

            print “Check Box: $check<BR>\n”;

            print “Radio Button: $button<BR>\n”;

            print “Data Field:”, &html($field), “<BR>\n”;

            print “<HTML>\n”;

}

            sub decode{

                        local ($value) = @_;

                        $value =~ s/\+/ /g;

                        $value =~ s/%([0-9A-H]{2})/pack(‘C’,hex($1))/eg;

                        return $value;

                        }

            sub html {

                        local ($value) = @_;

                        $value =~ s/</&lt;/g;

                        $value =~ s/>/&gt;/g;

                        return $ value ’

                        }

Обратите внимание на первую строку скрипта:

($cgi_bin, $cgi_script) = ($0 =~ m:(.*)[/\\](.*):);

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

Скрипт определяет, создавать ли форму или обработать запрос, в зависимости от­того, поступил ли запрос от пользователя. Для обработки строки запросов скрипт разделяет запрос на поля, используя функцию split . Далее скрипт сравнивает по­ля запроса с ожидаемыми именами полей.

Рассмотрим следующий пример:

forech (@field) {

Switch: {

           /^check=(.*)/ && do {

                       $check = $1;

                       last Switch ;

           };

Обычная форма цикла foreach включает переменную {$ VAR ). Если цикл foreach опускает эту переменную, то Perl использует переменную по умолчанию $_. Ана­логично, оператор регулярного выражения обычно выглядит следующим образом $ VAR =~/ PATTERN /. Если переменная в выражении опущена, Perl использует $_ как переменную по умолчанию, в результате чего цикл и регулярное выражение соответствуют друг другу. Однако если слишком полагаться на переменные по умолчанию, то код на языке Perl может получиться неясным.   В данном же случае использование переменных, определенных по умолчанию, делает код более коротким и лучше читаемым.

Далее обратите внимание на регулярное выражение, имеющее форму /^ field =(. *)/. Данное выражение указывает на необходимость начать поиск от начала строки, что предотвращает совпадения в середине имени другого поля. Иными словами, имя поля и знак равенства (=) должны соответствовать сами себе. Остающаяся часть регулярного выражения соответствует значению поля и извлекает его в пе­ременную $1. Поскольку $1 представляет собой временную переменную, то скрипт копирует ее в переменную с именем для каждого поля.

Скрипт использует подпрограмму decode для декодирования символов из полей, ко­торые были закодированы броузером. Регулярные выражения, используемые под­программой декодирования, рассматривались в предыдущем примере.

Наконец, скрипт использует подпрограмму html , чтобы закодировать значения дан­ных для вывода их в тексте HTML . Скрипт может послать большую часть текста броузеру в виде HTML-документа без выполнения какой-либо обработки. Однако по­скольку HTML использует угловые скобки (<>) для кодирования НТМ L -входов, скрипт должен закодировать эти скобки, используя последовательности HTML & lt ; и & g t ;.

Назад | Оглавление | Далее