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

 var

   RequestMethod: TRequestMethod = Unknown;

 initialization

   P := GetEnvironmentStrings;

   while P^ <> #0 do

   begin

     Str := StrPas(P);

     if Pos('REQUEST_METHOD=',Str) > 0 then

     begin

       Delete(Str,1,Pos('=',Str));

       if Str = 'POST' then RequestMethod := Post

       else

         if Str = 'GET' then RequestMethod := Get

     end;

     if Pos('CONTENT_LENGTH=',Str) = 1 then

     begin

       Delete(Str,1,Pos('=',Str));

       ContentLength := StrToInt(Str)

     end;

     if Pos('QUERY_STRING=',Str) > 0 then

     begin

       Delete(Str,1,Pos('=',Str));

       SetLength(Data,Length(Str)+1);

       Data := Str

     end;

     Inc(P, StrLen(P)+1)

   end;

   if RequestMethod = Post then

   begin

     SetLength(Data,ContentLength+1);

     for i:=1 to ContentLength do read(Data[i]);

     Data[ContentLength+1] := '&';

   { if IOResult <> 0 then { skip }

   end;

   i := 0;

   while i < Length(Data) do

   begin

     Inc(i);

     if Data[i] = '+' then Data[i] := ' ';

     if (Data[i] = '%') then { special code }

     begin

       Str := '$00';

       Str[2] := Data[i+1];

       Str[3] := Data[i+2];

       Delete(Data,i+1,2);

       Data[i] := Chr(StrToInt(Str))

     end

   end;

   if i > 0 then Data[i+1] := '&'

            else Data := '&'

 finalization

   Data := ''

 end.

Я написал кучу CGI приложений за последний год и все они используют модуль DrBobCGI. Теперь реальное пример: стандартное CGI приложение – гостевая книга (guestbook), в которой запрашивается ваше имя и небольшой комментарий, написанное с помощью всего нескольких строк на Дельфи.

Вначале CGI форма:

<HTML>

<BODY>

<H2>Dr.Bob's Guestbook</H2>

<FORM ACTION=http://www.drbob42.com/cgi-bin/guest.exe

  METHOD=POST>

  Name: <INPUT TYPE=text NAME=name><BR>

  Comments: <TEXTAREA COLS=42 LINES=4 NAME=comments>

  <P>

  <INPUT TYPE=SUBMIT VALUE="Send Comments to Dr.Bob">

  </FORM>

  </BODY>

  </HTML>

Теперь консольное приложение:

 program CGI;

 {$I-}

 {$APPTYPE CONSOLE}

 uses

   DrBobCGI;

 var

   guest: Text;

   Str: String;

 begin

   Assign(guest,'book.htm'); // assuming that's the guestbook

   Append(guest);

   if IOResult <> 0 then // open new guestbook

   begin

     Rewrite(guest);

     writeln(guest,'<HTML>');

     writeln(guest,'<BODY>')

   end;

   writeln(guest,'Date: ',DateTimeToStr(Now),'<BR>');

   writeln(guest,'Name: ',Value('name'),'<BR>');

   writeln(guest,'Comments: ',Value('comments'),'<HR>');

   reset(guest);

   while not eof(guest) do // now output guestbook itself

   begin

     readln(guest,Str);

     writeln(Str)

   end;

   close(guest);

   writeln('</BODY>');

   writeln('</HTML>')

Вопрос:

У меня на форме две "submit" клавиши, одна на переход на предыдущую страницу, другая переход на следующую страницу. Как определить какая из них была нажата, чтобы я мог выполнить соответствующее действие.

Доктор Боб отвечает:

Вы должны назначить уникальное значение для каждой кнопки "type=submit", ниже приведен соответствующий код:

<HTML>

<BODY>

Edit the information and press the SAVE button<BR>

To Delete information, press the DELETE button<BR>

<P>

<FORM METHOD=POST ACTION=http://www.drbob42.com/cgi-bin/debug.exe>

<HR>

<input type=text name=name>

<P>

<input type=reset  value="RESET">

<input type=submit name=action value="SAVE">

<input type=submit name=action value="DELETE">

</FORM>

</BODY>

</HTML>

Вы должны получить "Action=SAVE" или "Action=DELETE" после нажатия одной из этих кнопок.

2. html и CGI/WinCGI "трудный путь"

В данной главе показывается, как опубликовать вашу базу данных в Интернете путем (1) генерации статических страниц из таблиц базы данных, (2) написания CGI/WinCGI приложений для выполнения запросов к базе данных без использования Delphi Web Modules.

2.1. HTML– страницы

Допустим, вы имеете базу данных с продуктами. Бумажная реклама очень накладна. Но реклама в web это что-то новое и за приемлемую цену. Хорошо было бы иметь вашу базу опубликованной в Интернете, не так ли? Но организация своего собственного сайта на NT Web Server, работающего с инструментом типа IntraBuilder или WebHub стоит больших денег, включая время ни эксперименты и настройку. В данной главе мы покажем быстрый путь и простой путь публикации вашей базы данных на web: просто генерируя статические HTML страницы, базируясь на записях в таблице. Накладно? Нет. Сложно? Я так не думаю. Позвольте указать простой путь на небольшой базе данных.