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 страницы, базируясь на записях в таблице. Накладно? Нет. Сложно? Я так не думаю. Позвольте указать простой путь на небольшой базе данных.