CGI

Wstęp
 
Perl
 
Wady CGI 
 
Interfejs
 
Wysłanie danych
 
Zmienne systemowe

Przetwa-
rzanie danych z formularzy

Odnośniki

  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:

Twoje imię
Twoje nazwisko
 

     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.


Copyright (C) 1997 by Mariusz Jasiński