ƒокументаци€
HTML CSS PHP PERL другое

ƒекодирование html-форм с помощью метода post

 

ƒекодирование html-форм с помощью метода post

—ледующий скрипт очень напоминает только что обсуждавшийс€, за исключением того, что данный скрипт использует метод POST дл€ посылки данных формы скрипу CGI . ћетод POST дает директиву броузеру послать данные формы, использу€ стандартный вход скрипта, а не строку запросов. ѕолезность метода POST заключаетс€ в том, что он может обрабатывать большие объемы данных, тогда как метод GET ограничен пространством переменной сервера, а также длиной URL броузера.

ƒл€ чтени€ данных со стандартного ввода скрипт может вызвать функцию sys - read с нужным числом байт. –азмер строки запроса в байтах содержитс€ в пере≠менной окружени€ CONTENT _ LENGTH .

ѕосле того как скрипт прочел строку запросов, дальнейша€ обработка данных оказываетс€ очень похожей на рассмотренную в предыдущем примере. ƒл€ того чтобы сделать, этот скрипт более коротким, обработка строки запросов осущест≠вл€етс€ с помощью несколько более сложного подхода:

           

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

$content_length = $ENV(CONTENT_LENGTH);

if (!definet($query) || $query eq СТ) {

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

                        print <<FORM;

Content-type: text/html

<HTML>

<HEAD><TITLE>Sample POST Form </TITLE></HEAD>

<BODY>

What is your query? <P>

<FORM METHOD=ФPOSTФ 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>POST Form Result</TITLE></HEAD>\nФ

print У<BODY>\nФ;

print УYour query values:<P>\nФ;

@fields = split(С&Т, $query);

forech (@field) {

                       /([^=](.*)/ && do {

                       local ($filed, $value) = ($1, $2);

                       $query{$field} = &decode($value);

           }

}

            print УCheck Box: $query{check}<BR>\nФ;

            print УRadio Button: $query{button}<BR>\nФ;

            print УData Field:Ф, &html($query{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 Т

                        }

           

Ётот скрипт использует одно регул€рное выражение дл€ анализа всех значений полей в строке запроса:

                        /([^=](.*)/ && do {

           local ($filed, $value) = ($1, $2);

           $query{$field} = &decode($value);

}

¬место того чтобы присваивать значени€ каждого запроса отдельной переменной. данна€ программа хранит все запросы в ассоциативном массиве. ¬ свою очередь скрипт может индексировать массив, использу€ нужные имена полей.

ќбратите внимание на сочетание [^=] в регул€рном выражении. ¬ данном контексте знак (^) не €вл€етс€ €корем, указывающим на начало строки, как это было в предыдущем примере. ¬ данном случае этот знак служит отрицанием ƒл€ знака [=]. ¬ таком качестве регул€рное выражение может быть прочитано так: Ђсоответствует одному или более символам, не включа€ знак равенства за≠тем соответствует знаку равенства и затем соответствует всем остающимс€, сим≠воламї.

Ќазад | ќглавление | ƒалее
© 2000- NIV