Выбрать главу

Сценарий формы.

$ pg gifts.cgi

t!/bin/sh

# сценарий gifts.cgi …. используется POST

echo "Content‑type: text/html"

echo ""

echo "<HTML>"

echo "<BODY>"

# gifts_result.cgi используется для обработки вывода этой формы

echo "<FORM action="/cgi‑bin/gifts_result.cgi" METHOD=POST>"

echo "<P>"

echo "<HR>"

echo "<H1><CENTER>GIFTS Inc <BR>"

echo "QUARTERLY REPORT</H1></CENTER>"

echo "</P><HR>"

echo "Department: <SELECT NAME=dept>"

echo "<OPTION>GIFTS"

echo "<OPTION>STATIONERY"

echo "<OPTION>BOOKS"

echo "</SELECT>"

echo "Quarter End:<SELECT NAME=qtr>"

echo "<OPTION>1st"

echo "<OPTION>2nd"

echo "<OPTION>3rd"

echo "<OPTION>4th"

echo "</SELECT>"

echo "<BR><BR>"

echo "Report To Co To:<BR>"

echo "<INPUT TYPE="radio" NAME=stdout VALUE=Printer>Printer"

echo "<INPUT TYPE="radio" NAME=stdout VALUE=Screen CHECKED>Screen"

echo "<INPUT TYPE="radio" NAME=stdout VALUE=Both>Both"

echo "<BR><BR><HR>"

echo "<INPUT TYPE=Submit VALUE="Send it">"

echo "<INPUT TYPE=Reset VALUE="Clear">"

echo "</FORM>"

echo "</BODY>"

echo "</HTML>"

Переменной dept присваивается выбранное значение для отдела; переменной qtr присваивается номер выбранного квартала. Переменной stdout присваивается значение "printer", "screen" или "both"; в качестве значения по умолчанию выбирается screen (это значение указывается с помощью слова "CHECKED"). Ниже приведен сценарий, обрабатывающий полученную информацию.

$ pg gifts_result.cgi

#!/bin/sh

#сценарий gifts_result.cgi

#Декодирование строки URL

еcho "Content‑type: text/html"

echo ""

echo "<HTML><PRE>"

# это post ???

if [ "$REQUEST_METH0D" = "POST" ]; then

QUERY_STRING=`cat -`

fi

# декодирование

# используется sed для замены & символом табуляции

LINE=`echo $QUERY_STRING | sed 's/&/ /g'`

for LOOP in $LINE

do

NAME=`echo $LOOP | sed 's/=/ /g' | awk '{print $1}'`

TYPE='echo $LOOP | sed 's/=/ /g' | awk '{print $2}' | \

sed -e 's/%\(\)/\\\x/g' | sed 's/+/ /g'`

# используется printf при выполнении шестнадцатеричных преобразований VARS=`printf "${NAME}=\\${TYPE}\n"`

eval `printf $VARS`

done

echo "<HR>"

echo "<Hi><CENTER> GIFTS Inc</CENTER></H1>"

echo "<H2><CENTER> Quarter End Results </CENTER></H2>"

echo "<HR>"

#нужно изменить имена полей со STATIONERY на STAT

#для осуществления корректного поиска

if [ "$DEPT"="STATIONERY" ]; then

dept=STAT

fi

# считывание из файла qtr_1995.txt

TOTAL=0

while read DEPT YEAR Q P1 P2 Р3 Р4

do

if [ "$DEPT"="$DEPT" -a "$Q"="$qtr" ]; then

TOTAL=`expr $P1 + $P2 + $P3 + $P4`

fi

continue

done </home/httpd/cgi‑bin/qtr_1995.txt

echo "<H2>"

echo " TOTAL ITEMS SOLD IN THE $DEPT DEPARTMENT"

echo "is $TOTAL IN THE $qtr QUARTER"

echo "</H2><HR>"

# куда будет выведен отчет

if [ "$stdout"="Both" ]; then

echo "This report ls going to the printer and the screen"

else

echo " This report ls going to the $stdout"

fi

echo "</PRE>"

echo "</HTML>"

Первая часть сценария является общей для любой формы, обработка которой осуществляется с помощью метода post. Поскольку отсутствуют шестнадцатеричные значения для преобразования (так как поля ввода являются предопределенными опциями меню), нет нужды в использовании функции printf, но особого смысла в том, чтобы отказаться от использования этой команды, нет. Содержательная часть сценария выполняет считывание из файла qtr_1995.txt.