| Przetwarzanie
danych z formularzy Formularze
służą do wprowadzania danych przez użytkownika
przeglądarki. W łatwy sposób tworzymy interakcję
z użytkownikiem. Wprowadzone dane, po naciśnięciu
przez użytkownika przycisku, przekazywane są do serwera
lub wysyłane listem e-mail pod wskazany adres. Rodzaj
akcji podejmowanej po naciśnięciu przycisku typu
?submit? ustalamy za pomocą parametru ACTION w
znaczniku FORM. Może to wyglądać np. tak:
<FORM METHOD="post" ACTION ="mailto:jasinski@ci-1.ci.pwr.wroc.pl"
enctype="text/plain">
A oto formularz, który wysyła dane pod mój adres
e-mail:
Użytkownik, który korzysta z takiego
formularza, musi spełniać następujące warunki:
- powinien mieć poprawnie skonfigurowany czytnik
poczty sprzęgnięty z przeglądarką;
- nie powinien używać przeglądarki Microsoft
Internet Explorer (dotyczy wszystkich dostępnych
wersji), która przysyła puste formularze.
Użycie programu CGI rozwiąże nam te
problemy. Pod adresem
http://www.cybernet.com.pl/delphi/kontakt/formularz.htm
znajduje się mój formularz, który korzysta z programu
CGI. Linia ze znacznikiem FORM w tym formularzu jest
następująca:
<form
action="http://www.cybernet.com.pl/scipts/droga.cgi"
method="POST">
Po naciśnięciu przycisku OK (typu
"submit") zostaje wykonany podany program,
którego zadaniem jest:
- generowanie informacyjnej strony WWW
- zapisanie danych z formularza na dysk serwera
- wysłania listu e-mail do mnie zawierającego
wybrane dane
W protokole HTTP istnieją dwie metody
przesyłania danych do serwera. Metoda GET przekazuje
dane poprzez zmienną systemową QUERY_STRING. Metoda
POST powoduje, że dane są podawane na standardowe
wejście. W podanym formularzu użyłem metody POST.
W obu metodach dane są przekazywane w postaci:
nazwa_pola1_formularza=wartość?nazwa_pola2_formularza=wartość?...
W przypadku metody POST w zmiennej
CONTENT_LENGTH znajduje się liczba bajtów, jaką
zajmują te dane. Do przetworzenia danych z tej dość
nieprzyjemnej postaci do tablicy asocjacyjnej można
użyć funkcji ReadParse z popularnej biblioteki cgi-lib. Skrypt
delphi.cgi jest następujący:
Kod źródłowy (delphi.cgi): |
#!/usr/bin/perl
# Plik z danymi z formularza
$pliklog =
"/export/home/cieslak/public_html/cgi-bin/delphi.log";
# Sciezka biblioteki cgi-lib.pl
$biblioteka =
"/export/home/cieslak/public_html/cgi-bin";
# Sciezka programu e-mail
$mailprog = '/usr/lib/sendmail';
# Deklaracja biblioteki cgi-lib.pl
require "$biblioteka/cgi-lib.pl";
# wywolanie funkcji z cgi-lib.pl do dekodowania
danych z formularza
&ReadParse;
# Wypisanie na wyjscie kodu HTML, czyli strony
www
print "Content-type: text/html\n\n";
print <<HTML_kod;
<!DOCTYPE HTML PUBLIC "-//IETF//DTD
HTML//EN">
<html>
<head>
<META http-equiv="content-type"
content="text/html;
charset=ISO-8859-2">
<title>Droga do Delphi - Formularz
OK!</title>
</head>
<body
background="http://www.ci.pwr.wroc.pl/~cieslak/Delphi/tlo.jpg"
link="#FFFF00"
vlink="#C0C0C0"
alink="#0000FF">
<p align="center"><font
size="5" face="Arial
CE">Dziękujemy,
$in{'Imie'}, za wypełnienie
formularza</font></p>
<p align="center">Powrót do
<a
href="http://www.cybernet.com.pl/delphi/Glowna/glowna.htm">stony
głównej</a>.</p>
<hr width="80%">
<p align="center"><font
color="#400040" size="1"
face="Arial CE">Copyright
1996-1997 by Marzena Cie?lak i Mariusz
Jasiński</font></a></p>
</body>
</html>
HTML_kod
# Zapis danych z formularza do pliku
open(PLIK, ">>$pliklog") || die
"Nie moge otworzyc pliku: $pliklog\n";
print PLIK `date`;
print PLIK " ";
print PLIK `time`;
print PLIK "$ENV{'REMOTE_USER'}
$ENV{'REMOTE_HOST'} $ENV{'REMOTE_ADDR'}\n";
print PLIK "$ENV{'HTTP_USER_AGENT'}\n";
print PLIK "Imie : $in{'Imie'}\n";
print PLIK "Nazwisko :
$in{'Nazwisko'}\n";
if ( $in{'E_Mail'} ne "" )
{
print PLIK "E-Mail :
$in{'E_Mail'}\n";
}
if ( $in{'Wiek'} ne "" )
{
print PLIK "Wiek :
$in{'Wiek'}\n";
}
print PLIK "Zajecia :
$in{'Zajecia'}\n";
print PLIK "Uwagi : $in{'Uwagi'}\n";
if ( $in{'Droga_URL'} ne "" )
{
print PLIK "Droga_URL :
$in{'Droga_URL'}\n";
}
if ( $in{'Droga_URL2'} ne "" )
{
print PLIK "Droga_URL :
$in{'Droga_URL2'}\n";
}
if ( $in{'Dotarles'} ne "" )
{
print PLIK "Dotarles :
$in{'Dotarles'}\n";
}
if ( $in{'Informacja'} ne "" )
{
print PLIK "Informacja :
$in{'Informacja'}\n";
}
if ( $in{'Reklamowka'} ne "" )
{
print PLIK "Reklamowka :
$in{'Reklamowka'}\n";
}
if ( $in{'Pomoc'} ne "" )
{
print PLIK "Pomoc :
$in{'Pomoc'}\n";
}
print PLIK "\n";
close(PLIK);
# Wyslanie listu do mnie
open(MAIL, "| $mailprog -t") || die
"Nie moge uruchomic $mailprog\n";
print MAIL "To: Mariusz Jasinski
<jasinski\@ci-1.ci.pwr.wroc.pl>\n";
print MAIL "From: $in{'Imie'}
$in{'Nazwisko'}
<jasinski\@sun10.ci.pwr.wroc.pl>\n";
print MAIL "Subject: Droga do Delphi
(Form)\n";
print MAIL "Dane z Formularza\n\n";
print MAIL "$ENV{'REMOTE_USER'}
$ENV{'REMOTE_HOST'} $ENV{'REMOTE_ADDR'}\n";
print MAIL
"$ENV{'HTTP_USER_AGENT'}\n\n";
print MAIL "Imie : $in{'Imie'}\n";
print MAIL "Nazwisko :
$in{'Nazwisko'}\n";
print MAIL "E-Mail : $in{'E_Mail'}\n";
print MAIL "Zajecia :
$in{'Zajecia'}\n";
print MAIL "Uwagi : $in{'Uwagi'}\n";
print MAIL "Droga_URL :
$in{'Droga_URL'}\n";
print MAIL "Droga_URL :
$in{'Droga_URL2'}\n";
print MAIL "Dotarles :
$in{'Dotarles'}\n";
print MAIL "\n";
close(MAIL); |
Funkcja ReadParse
przetwarza dane z wejścia standardowego do tablic
asocjacyjnej "in". Odwołanie w postaci:
$in{"<nazwa_pola_folrmularza>"}
podaje wartość, jaką użytkownik wpisał w tym polu.
Dodatkowo w formularzu zastosowałem język
JavaScript do kontroli wprowadzania danych przez
użytkownika. Po kliknięciu przycisku OK
zostaje wywołana funkcja, która sprawdza czy w polach
oznaczonych kropką zostały coś wpisane oraz czy adres
e-mail został podany poprawnie. Jeśli wszystko jest OK,
to może zostać uruchomiony na serwerze program CGI.
|