Синтаксический анализ CGI-данных на Perl
Пример 9-2. Синтаксический анализ CGI-данных на Perl
#!/usr/bin/perl -w
use CGI qw(:standard);
# Используется модуль CGI.pm. qw(:standard) импортирует
# пространство имен стандартных CGI-функций,чтобы получить
# более понятный код. Это можно делать, если в сценарии
# используется только один объект CGI.
$mycgi = new CGI; #Создать объект CGI, который будет 'шлюзом' к данным формы
@fields = $mycgi->param; # Извлечь имена всех заполненных полей формы
print header, start_html('CGI.pm test'); ft Методы 'header' и 'start_html',
# предоставляемые
# CGI.pm, упрощают получение HTML.
# 'header' выводит требуемый заголовок HTTP, a
#'start_html' выводит заголовок HTML с данным названием,
#a также тег <BODY>.
print "<р>Данные формы:<br>";
foreach (@fields) { print $_, ":",- $mycgi->param($_), "<br>"; }
# Для каждого поля вывести имя и значение, получаемое с помощью
# $mycgi->param('fieldname').
print end_html; # Сокращение для вывода завершающих тегов "</body></html>".
Обработка входных данных в С
Поскольку основные API для MySQL и mSQL написаны на С, мы не будем полностью отказываться от С в пользу Perl, но там, где это уместно, приведем несколько примеров на С. Есть три широко используемые С-библиотеки для CGI-программирования: cgic Тома Бу-телла (Tom Boutell)*; cgihtml Юджина Кима (Eugene Kim)t и libcgi от EIT*. Мы полагаем, что cgic является наиболее полной и простой в использовании. В ней, однако, недостает возможности перечисления всех переменных формы, когда они не известны вам заранее. На самом деле, ее можно добавить путем простого патча, но это выходит за рамки данной главы. Поэтому в примере 9-3 мы используем библиотеку cgihtml, чтобы повторить на С приведенный выше сценарий Perl.
Пример 9-3. Синтаксический анализ CGI-данных на С
/* cgihtmltest.c - Типовая CGI-программа для вывода ключей и их значений
из данных, полученных от формы */
#include <stdio.h>
#include "cgi-lib.h" /* Здесь содержатся все определения функций СGI */
#include "html-lib.h" /* Здесь содержатся' все определения вспомогательных функций для HTML */
void print_all(llist 1)
/* Эти функции выводят данные, переданные формой, в том же формате, что и приведенный выше сценарий Perl. Cgihtml предоставляет также встроенную функцию
print_entries(), которая делает то же самое, используя формат списка HTML. */ {
node* window;
/* Тип 'node' определен в библиотеке cgihtml и ссылается на связанный список, в котором хранятся все данные формы. */
window = I.head; /* Устанавливает указатель на начало данных формы */
while (window != NULL) { /* Пройти по связанному списку до последнего (первого пустого) элемента */
printf(" %s:%s<br>\n",window->entry. name,replace_ltgt(window->entry.value));
/* Вывести данные. Replace__ltgt() - функция, понимающая HTML-кодировку текста и обеспечивающая его правильный вывод на броузер клиента. */
window = window->next; /* Перейти к следующему элементу списка. */
} }
int main() {
llist entries; /* Указатель на проанализированные данные*/
int status; /* Целое число, представляющее статус */
html__header(); /* Вспомогательная функция HTML, выводящая заголовок HTML*/
html_begin("cgihtml test");
/* Вспомогательная функция HTML, выводящая начало страницы HTML с указанным заголовком. */
status = read_cgi_input(&entries); /* Производит ввод и синтаксический анализ данных формы*/
printf("<р>Данные формы:<br>");
print_all(entries); /* Вызывает определенную выше функцию print_all(). */
html_end(); /* Вспомогательная функция HTML, выводящая конец страницы HTML. */
list_clear(&entries); /* Освобождает память, занятую данными формы. */
return 0; }