Декодирование форм HTML с использованием метода GET
Как вы увидели, использование подсказки ISINDEX для создания одиночного запроса достаточно просто. Но для получения от пользователя больше чем одного значения необходимо использовать формы. Следующий скрипт на языке Perl генерирует форму. Используя метод GET, скрипт дает команду броузеру послать значения запроса как часть URL, так же как при использовании ISINDEX. Разница между использованием GET и ISINDEX состоит в том, что при использовании метода GET броузер может соединить несколько величин полей в одну строку запросов, разделяя поля с помощью амперсанда (&).Для того чтобы скрипт мог определять значения полей, броузер включает имена полей в строку запроса. Например, если база данных содержит три поля (имя, возраст и день рождения) с такими значениями (Bob, 27, 11-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/</</g; $value =~ s/>/>/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 и & gt.
1 2 3 4 5
8 8 8
| |