CGI (Common Gateway Interface)
 
CGI, web sayfalarının daha etkin ve etkileşimli kullanımına yönelik olarak tasarlanmış bir standarttır. 
Perl programları cgi olarak da çalışabilirler. Bu sayede  browser(netscape,explorer gibi) sayfasıyla web
server arasındaki data iletişimi gerektiğinde karşılıklı olmak üzere gerçekleşir.
 
Perl cgi programlarına erişmek ve çalıştırmak için web browser sayfasından  formlar veya link yoluyla 
(a href="www.gazi.edu.tr/cgi-bin/ornek1.pl...) veya URL adres satırından tam path(dosya yolu)  
(www.gazi.edu.tr/cgi-bin/ornek1.pl) verilerek perl programınızı çalıştırabilirsiniz.
Daha sonra işleyeceğimiz Web sayfası formları haricinde cgi kullanımını bir örnekle görelim isterseniz.
 
Programımız browser'ımızın sayfasına ;
 
                                Merhaba ben ilk cgi programınızın çıktısıyım !):
 
yazsın. Zemin rengi beyaz yazı büyük (h1) ve rengi de  mavi olsun. Ayrıca bir önceki sayfaya dönmeyi 
sağlayan Geri butonu bulunsun. 
Program adına da ornek1.pl diyelim. Program yazıldıktan sonra bir web browser -sorgulayıcı-
programdan (Netscape, i.explorer, v.b) çalıştırabilmek için web server'ın bulunduğu sistemin cgi-bin
dizinine konulmalı ve icra hakkı verilmelidir(chmod 755 ornek1.pl). 
 
Şimdi programımızı kodlayalım.
 
#!/usr/local/bin/perl
print "Content-type:text/html\n\n";
print "<html><head>\n";
print "<title>Örnek1</title>\n";
print "</head>\n";
print "<body bgcolor=\"white\" text=\"blue\">\n";
print "<center><h1>Merhaba ben ilk cgi programınızın çıktısıyım !)):</h1>\n";
 
print "<FORM>\n";
print "<FONT color=#ff9900 size=1>\n";
print "<INPUT onclick=history.go(-1) type=button value=\"Geri\">\n";
print "</FONT></FORM>\n";
print "</body></html>\n";
 
 
Programımızın satırlarını incelediğinizde 2. satır çok önemli bir özelliğe sahiptir. Bu satır da 
print "Content-type:text/html\n\n"; kodunu görmektesiniz. Cgi programlarda bu satır programın
çıktısının web(html) sayfasına olacağını bildirmektedir.  Bu satırın kodlanmasında dikkat edilecek bir
nokta da genel kabul gören bir uygulama olarak bir üst satırının boş olmasıdır.
Programımızı yazdık ve cgi-bin dizinine koyduk(icra hakkı da verdik tabii). O halde şimdi çalıştırabiliriz.
 
Burayı kliklermisiniz? 
Web browser'ınızın sayfasında 
 
Merhaba ben ilk cgi programınızın çıktısıyım !):
 
yazdığını gördünüz değil mi?. O halde ilk cgi programımızı çalıştırmış olduk. Devam edelim...Şu ana
kadar sadece sistemdeki programı çalıştırdık ve çıktısını aldık. Pekala etkileşimli olarak data kullanımını
nasıl gerçekleştiririz?  Genelde bu işlev için web sayfasında formlar kullanılır. Formlar yoluyla data girer
onu sisteme yollar dosyaya kaydeder veya işleyip çıktısını alırız ya da bir sorgulama datası gönderip
sistemden onu değerlendirip bize uygun çıktıları göndermesini sağlayabiliriz.
 
Formlar 
 
Form tanımı için ilk ifade <form> dur formun sonunu ise </form> gösterimi belirler. 
Bu iki gösterim arasında ise kullanacağımız form'a ait  özellikler kodlanır.
Formlarda formun adını tutan bir NAME alanı,çalıştırılacak .cgi (.pl) programının tam URL 'nı tutan bir
ACTION alanı ve data iletişim metodunu (get , post) tutan bir METOD alanı tanımlanmalıdır.
Formlarda amaca göre değişen daha bir çok tanım şekli sözkonusudur.
 
Örneğin,
 
CHECKED               : radyo butonu veya checkbox larda seçilmiş olma durumu,
MAXLENGTH         : form elemanına girilecek en fazla karakter sayısı,
SIZE                       : giriş yapılan alanın ölçüsü,(eğer MAXLENGTH, SIZE dan genişse scroll bar oluşur
                                 bu sayede normalde gözükmeyen alan gözükür).
TYPE                      : giriş alanının tipi(checkbox, hidden, password, radio, reset, submit, ve text). 
VALUE                   : Alan için varsayılan değer.
mesela bir form da bir text alanı tanımlayalım.
 
KODU:
<form>
<INPUT TYPE=text NAME=Soyadı VALUE=Turkmen SIZE=25 MAXLENGTH=50>
</form>
Web sayfasında görünümü:
 
Bu kod ile bir giriş alanı tanımlanır. Bu alanın html sayfasında default değeri Turkmen olarak gözükür
ve alan genişliği 25 karakterdir(Web sayfasındaki görüntü olarak).Biz bu alana,yapılan tanım gereği 50
karaktere kadar değer girebiliriz.
 
Bazı form kullanım örnekleri:
 
KODU:
<form>
<INPUT TYPE=checkbox NAME=beyaz CHECKED>Beyaz severmisiniz?
<INPUT TYPE=checkbox NAME=mavi>Mavi severmisiniz?
<INPUT TYPE=submit VALUE="Renk">
</form>
Web sayfasında görünümü:
Beyaz severmisiniz?
Mavi severmisiniz?
KODU :
<form>
Işletim Sistemi:<BR>
          <INPUT TYPE=radio NAME=os VALUE=Win95>Windows 95
          <INPUT TYPE=radio NAME=os VALUE=WinNT>Windows NT
          <INPUT TYPE=radio NAME=os VALUE=UNIX CHECKED>UNIX
           <INPUT TYPE=radio NAME=os VALUE=OS2>OS/2
 CPU Tipi:<BR>
          <INPUT TYPE=radio NAME=cpu VALUE=Pentium>Intel Pentium
          <INPUT TYPE=radio NAME=cpu VALUE=Alpha CHECKED>DEC Alpha
          <INPUT TYPE=radio NAME=cpu VALUE=Bilinmiyor>Bilinmiyor
</form>
 
Web sayfasında görünümü:
İşletim Sistemi:
          Windows 95
          Windows NT
          UNIX
          OS/2
 CPU Tipi:
          Intel Pentium
          DEC Alpha
          Bilinmiyor

Kodu:

<SELECT NAME="Mesai" Günleri>

<OPTION SELECTED>Pazartesi

<OPTION>Salı

<OPTION>Çarşamba

<OPTION>Perşembe

<OPTION>Cuma

</SELECT>

 

 Web sayfasında görünümü:

 
Bu tanımdaki alanda default(seçili) değer Pazartesi'dir.
 
Formlarda birden fazla satırı içeren bir text alanı tanımlanacaksa  bu <textarea> ile belirtilir.
Örnek:
KODU:
<form>
<TEXTAREA NAME=Notlar ROWS=3 COLS=60></TEXTAREA>
</form>
Web sayfasındaki görünümü:
 
Bu kodlama ile web sayfasında 3 satır ve 60 karakter genişliğinde bir alan tanımlanır.
 
CGI için FORM Kullanımı
 
Formlara bu şekilde kabaca bir bakmış olduk. Şimdi şu kodu inceleyelim.
 
KODU :
<form method=POST action="http://www.gazi.edu.tr/cgi-bin/konuk.pl">
<table><tr><td align=right>
<p>
  E-mail addresi.? </td><td>
<input type="text" name="email">
</td></tr><tr><td align=right>
  Adınız? </td><td>
<input type="text" name="ad"></td></tr><tr>
<td valign=top align=right>
  Notunuz. </td><td>
<textarea name="izah" rows=3 cols=50></textarea><br>
<input type=submit value="yaz"> 
<input type=reset value="sil"></td></tr>
</table>
</form>
Web sayfasında görünümü:

 

E-mail adresi..?

Adınız?

Notunuz.


 

 

 

 
Yukarda ki kodlama da <table><tr><td align=right><p><br> gibi kodlamalar tamamen sayfanın
daha iyi görünmesi için kullanılan html kodlarıdır.Bunları bir yana koyacak olursak cgi ve form 
komutlarını içeren kodlar şu biçimdedir;
 
 
<form method=POST action="http://www.gazi.edu.tr/cgi-bin/konuk.pl">
 E-mail addresi.? <input type="text" name="email">
 Adınız? <input type="text" name="ad">
 Notunuz. <textarea name="izah" rows=3 cols=50></textarea>
<input type=submit value="yaz"> <input type=reset value="sil">
</form>
 
İlk satırda form tanımı başlatılıyor ve aynı satırda cgi programına geçirilecek bilgilerin metodu ve tam
URL adresi veriliyor. Daha açıkça ifade edecek olursak formda bulunan submit buton özelliğine
kliklememiz halinde http://www.gazi.edu.tr/cgi-bin/ adresindeki konuk.pl isimli perl cgi programı
çalıştırılır ve datalar POST metoduyla gönderilir. Peki gönderilecek datalar hangileridir?  Bu datalar;
email, ad ve izah değişkenleri(alan-adları) ve içerikleridir(değerler).
 
email isimli değişkenin(alan-adının) içeriği o alana girdiğiniz değer yani e-mail adresi bilgisi,
ad isimli değişkenin içeriği Ad ve Soyad bilgisi,
izah isimli değişkenin içeriği ise yazdığınız notlardan oluşan değerdir.
Değişken ve içerdikleri değerler server'a cgi programına gönderilir ve program tarafından gerektiği gibi
değerlendirilir.
 
Şimdi konuyu biraz daha açalım. Formlarda data iletişimi için GET ve POST metotlarından yararlanılır.
Eğer GET metodu kullanılırsa, web sayfasındaki data (komut olarak eklenen veya form alanlarına
girilen değerler) browser'a alınır. ? isaretiyle URL'ye eklenir. 
Örneğin"/cgi-bin/konuk.pl?ad=Ertan%20Turkmen&mail=ertan@gazi.edu.tr&izah=basarilar"biçiminde).
Bu değer QUERY_STRING değişkeni içinde tutulur ve cgi programa geçirilir. Data 256 karakterden
uzun olamaz. GET metodu ile server'a gönderilen bilgi güvenlikten yoksundur. Üçüncü şahıslar
tarafından tespit edilebilir.
 
POST metodu kullanılmışsa forma girilen değerler ve alan-adlarından oluşan datalar standart
girişi(STDIN) kullanarak serverdaki cgi programına gönderilir. Server ne kadar data okuması gerektiğini
belirlemek için CONTENT_LENGTH çevre değişkenini kullanır, STDIN yoluyla girilen bu değerler toplu
olarak tek bir string şeklinde buffer alanına alınır.
                        Ör: read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'})). 
bu stringin uzunluğu CONTENT_LENGTH değişkenindedir. 
Programın işlenmesi sonucu çıktı olarak üretilen dataların ne tipte olacağı bilgisini ise CONTENT_TYPE
çevre değişkeniyle belirtiriz. Bu çıktı tipleri html, gif, text gibi MIME tipleridir.
GET metoduyla 256 karakterden fazla gönderilemezken POST metodu fazlasını kabul eder ve datalar
daha güvenli bir şekilde server'a aktarılır. Metotla ilgili mutlaka bilmemiz gereken bu bilgilerden sonra
tekrar formumuza dönelim ve formda bulunan alan-adları (ad,email gibi) ve içine girilen değerler
(Ertan TURKMEN,ertan@gazi.edu.tr gibi) hep birlikte nasıl server'a gönderilir inceleyelim.
Formda bulunan isimle ilgili text alanımızın adı ad idi. Biz bu alana Ertan Türkmen değerini, 
email isimli alana da ertan@gazi.edu.tr değerini girmiş olalım. 
Bu stringler alan-adı/değer  çifti olarak şu biçimde serverdaki programa gönderilirler:
                           ad=Ertan+Turkmen&email=ertan@gazi.edu.tr
& işareti alan-adı ve değer çiftlerini ayırırken = karakteri ise alan-adı ile onun içindeki değer bilgisini
ayırır + karakterine gelince bu karakter alan içindeki değerlerin boşluk kısmını temsil eder.
Ayrıca <,> gibi karakterlerde hexadesimal olarak % işaretiyle birlikte ifade edilir. 
 
Örneğin,<ertan@gazi.net> ifadesi, %3Certan%40gazi.net%3E olarak cgi programına gönderilir. 
Bu gösterime URL Kodlama(URL Encoding) işlemi denir.(Not:URL=UniformResourceLocator).
Çok kullanılan bazı karakterlerin kodları aşağıdadır.
Karakter              URL Kodu 
 
  \t                             %09  
  \n                             %0A 
  @                             %40 
  &                              %26 
  /                               %2F 
  ~                              %7E 
  ;                               %3B 
  :                               %3A 
  <                              %3C
  >                              %3E
 
Peki bu gösterimi cgi nasıl normale döndürür yani decode eder?. 
İşte decode fonksiyonu içeren alt program örneği:
 
  sub URL_yi_coz{
                 $_ = shift;
                 tr/+/ /;
                 s/%(..)/pack('c', hex($1))/eg;
                 return($_);
                }
 
Bu örnekle tr satırında +, lar boşluğa çevrilir ve mesela Ertan+Turkmen, Ertan Turkmen şekline
dönüşür. Bir alt satırda da % v.s. gibi özel ve hexadecimal kodlanmış karakterler atılarak string
normale döndürülür. Bu işi pack fonksiyonunun özelliği yapar. 'c' hexadecimal gösterimin normal
karakter stringine döneceğini temsil eder. $_ ise daha önceden de öğrendiğiniz gibi burada 
stringin tamamını ifade etmektedir.Bu alt program return($_); ifadesiyle normale döndürülmüş(decode
edilmiş) stringi döndürür.
 
    (Not:Biz decode işlemini alt programda değil normal program akışında yapacaksak
$deger =~ tr/+/ /;
$deger =~ s/%(..)/pack("C", hex($1))/eg;
            şeklinde kodlayabiliriz. Bu durumda stringin tamamı $deger değişkenindedir).
 
Örnek Program:
 
Bir web sayfasından girilen ad, e-mail ve not bilgilerini alıp, bunu browser'ınıza html sayfası olarak
basan bir cgi yazalım adını ornek2.pl  koyalım.
 
İşte kodu:
#!/usr/bin/perl
print "Content-type:text/html\n\n";
# ornek2.pl programının çıktısı html sayfası olacak demektir
#bir üst satırın boş olması önerilir.
#Eğer text dosya halinde çıktı istersek Content-type tanımı :
# Content-type: text/plain\n\n biçimindedir.
#sondaki 2 satır sonu karakteride çıktı düzeni için gereklidir(\n\n)
read(STDIN, $gecici_alan, $ENV{'CONTENT_LENGTH'});
# giriş (STDIN) den gelen veriler $gecici_alan adlı bir skalar değişkene 
#aktarıldı
 @alan_deger_ciftleri = split(/&/, $gecici_alan);
#her bir alan-adı/değer çifti ayrı ayrı alan_deger_ciftleri dizisine konuldu
 
foreach $alan_deger (@alan_deger_ciftleri) {
# her bir alan-adı/değer çiftinin her biri tek tek $alan_deger değişkenine alınıyor
        ($alan, $deger) = split(/=/, $alan_deger);
#alan-adı ,$alan değişkenine;değer ise $deger değişkenine atandı
        $deger =~ tr/+/ /;  # + karakteri boşluk karakterine dönüştü
        $deger =~ s/%(..)/pack("C", hex($1))/eg; 
# üst satır aşağıdaki gibi de kodlanabilir ama uzatmaya gerek yok
# $deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))
# hexadecimal karakterlerde normale dönüştürülüp tüm string decode edildi
 
        $FORM{$alan} = $deger;   #string alan-adı ve değer olarak,
                                                #FORM isimli bileşik diziyi oluşturuyor
      }
 
print "<html><head>";
print "<title>örnek2</title>";
print "</head>";
#web sayfasının başlangıç tanımları yapıldı
print "<body bgcolor=ffffff>";
#sayfanın zemin rengi beyaz olarak tanımlandı ve bastırıldı
print "<center><table border=1 bordercolor=000055 bgcolor=ff7777>
<tr><td>";
#düzgün görüntü için tablo tanımlandı.tablonun zemin rengi,kenarlık 
#kalınlığı ve rengi de tanımlandı ve bastırıldı
print "</center><center><h3><ul>Gönderilen Bilgileri Aşağıya Yazdım</ul></h2>\n";
# başlık kısmı bastırıldı
print "</center><p align=center><br>\n";
# değerlerin bastırılması için ayar yapıldı ortalı olarak bastırılacak
foreach $key (keys(%FORM)) {
# her bir alan-adı ve değeri çifti tek tek alınıyor
 print "$key = $FORM{$key}<br>",
# ve bastırılıyor
 }
print "</p><br></td></tr></table></body></html>";
# sayfa sonu tanımları tamamlandı..Kodlama tamamlandı!
 
Şimdi bu perl cgi programını çalıştıracak web sayfasını da kodlayalım.
KODU :
<html><head><title>ornek2</title></head>
<body>
<table border=1 bordercolor=dc6000 bgcolor=337733><tr><td>
<form action="http://www.gazi.edu.tr/cgi-bin/ornek2.pl" method="POST">
<pre>
  Adınız : <input type="text" name="ad">
  E-mail : <input type="text" name="email">
  Notunuz: <input type="text" name="not">
</pre>
<input type="submit" value="Yolla">
<input type="reset" value="Sil">
</form>
</td></tr></table>
</body>
</html>
 
Bu sayfa Browserınızda şöyle gözükecektir.
 
Adınız :  
E-mail :  
Notunuz:  

 
Yukarıdakiforma ait, email alanına : ertan@gazi.edu.tr, not alanına : Basarilar, ad alanına ise
 Ertan Turkmen  girelim ve Yolla tuşunu klikleyelim.
 
Browser ekranında aşağıdaki görüntü varsa cgi programınız doğru çalışmış demektir.
 

 

      Gönderilen Bilgileri Aşağıya Yazdım

email = ertan@gazi.edu.tr
not = Basarilar
ad = Ertan Turkmen

 

 
Siz bu örnekle sadece 3 değer girdiniz ama çok fazla sayıda da alan-adı tanımlar ve onlara değerler
girebilirdiniz. Program yine başarıyla çalışırdı.
 
Çevre Değişkenleri (Environment Variables):
 
cgi programlarıyla çevre değişken ve değerlerine erişmek mümkündür. Bir kısmı aşağıdadır.
 
SERVER_SOFTWARE           : Kullanılan Web server versionu.
REMOTE_ADDR                    : client (Browser'dan çalıştıranın) IP adresi.
REMOTE_HOST                    : client tam domain adı. 
QUERY_STRING                  : Eğer GET metodu kullanılmışsa URL encoded string.
                                               (Aranacak kelime veya alanadı/alandeğeri çifti içerir)
HTTP_USER_AGENT            : Kullanıcının Browser'ı.(netscape,explorer v.s.)
CONTENT_LENGTH              : String uzunluğu(byte).
CONTENT_TYPE                   : MIME tipi (text,html,gif)
DOCUMENT_ROOT              : Server dökümanları için ana dizin (/...httpd/htdocs)
REQUEST_METHOD             : client tarafından gonderilen istek metodu (GET veya POST). 
SCRIPT_NAME                     : CGI scriptin URL'si ve adı
SERVER_NAME                    : Server adı (DNS host adı) 
 
Çevre değişkenleri bilgilerini elde eden bir test programı yazalım.
Adı text2.pl olan programın çıktısı  web sayfasına olup  kodu ise aşağıdadır.
 
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print <<"bas";                      
<html>                   
<BODY> <TITLE>  HTML ÇIKTISI </TITLE>                      
<p>                     
<H1> CEVRE DEGISKENLERI </H1>                                               
<UL>                   
<LI>DOCUMENT_ROOT = <B> $ENV{'DOCUMENT_ROOT'}</B>                   
<LI>GATEWAY_INTERFACE = <B> $ENV{'GATEWAY_INTERFACE'}</B>                  
<LI>HTTP_ACCEPT = <B> $ENV{'HTTP_ACCEPT'}</B>   
<LI>PATH = <B> $ENV{'PATH'}                       
<LI>QUERY_STRING = <B> $ENV{'QUERY_STRING'}</B>             
<LI>REMOTE_ADDR = <B> $ENV{'REMOTE_ADDR'}</B>            
<LI>REQUEST_METHOD = <B> $ENV{'REQUEST_METHOD'}</B>          
<LI>SCRIPT_NAME = <B> $ENV{'SCRIPT_NAME'}</B>                
<LI>SERVER_NAME = <B> $ENV{'SERVER_NAME'}</B>             
<LI>SERVER_SOFTWARE = <B> $ENV{'SERVER_SOFTWARE'}</B>        
<LI>SERVER_PORT = <B> $ENV{'SERVER_PORT'}</B>           
<LI>SERVER_PROTOCOL = <B> $ENV{'SERVER_PROTOCOL'}</B>              
</UL>
</BODY>
</HTML>
bas
 
 
programın çıktısı ise aşağıdadır.

ÇEVRE DEĞİŞKENLERİ

·  DOCUMENT_ROOT = /home/httpd/htdocs 
·  GATEWAY_INTERFACE = CGI/1.1 
·  HTTP_ACCEPT = image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-comet, 
    application/vnd.ms-powerpoint,application/vnd.ms-excel, application/msword, application/pdf, */* 
·  PATH = /sbin:/usr/sbin:/bin:/usr/bin 
·  REMOTE_ADDR = 192.168.100.9 
·  REQUEST_METHOD = GET 
·  SCRIPT_NAME = /cgi-bin/test2.pl 
·  SERVER_NAME = www.gazi.edu.tr 
·  SERVER_SOFTWARE = Apache/1.3.3 (Unix) (Red Hat/Linux) 
·  SERVER_PORT = 80 
·  SERVER_PROTOCOL = HTTP/1.1 
 
FORM MAIL KULLANIMI
 
ornek2.pl programıyla bazı bilgileri server'a göndermiştik. Şimdi aynı bilgileri mail yoluyla
ertan@gazi.edu.tr isimli kullanıcıya (kendimize) mail ile gönderme programını inceleyelim. 
Bu internette çok yaygın kullanılır. Form mail olarak bilinir. Amaç genelde sayfa veya server ile ilgili
ziyaretçi önerilerini almaktır.
 
Web sayfamızdaki form hatırlarsanız aşağıdaki gibiydi.
 
Adınız : 
E-mail : 
Notunuz: 


Bu sayfaya girilen değerleri işleyecek olan programımızın adı fmail.pl olsun.
Yani form tanımındaki İlgili satır tanımı şöyle olacak: 
<form action="http://www.gazi.edu.tr/cgi-bin/fmail.pl" method="POST"> 
Program ayrıca Notunuz:(not) kısmına bilgi girilmez ise bu alana mutlaka bilgi girilmesi için uyarsın.
Şimdi bu perl cgi programını (fmail.pl) kodlayalım.
 
#!/usr/bin/perl
$sysmailprg = '/usr/sbin/sendmail -t';
$alan = 'ertan@gazi.edu.tr';
 
print "Content-type: text/html\n\n";
print "<HTML>\n<HEAD>\n<TITLE>Teşekkürler</TITLE>\n</HEAD>";
print "\n\n<BODY BGCOLOR=\"#FFFFFF\" LINK=\"#CC0000\">\n";
    
read(STDIN, $gecici_alan, $ENV{'CONTENT_LENGTH'});
    
if ( $gecici_alan eq '\0')
        { exit(0) };
 
@ciftler = split(/&/, $gecici_alan);
foreach $cift (@ciftler)
{
    ($isim, $deger) = split(/=/, $cift);
    $deger =~ tr/+/ /;
    $deger =~ s/%(..)/pack("C", hex($1))/eg;
    $FORM{$isim} = $deger;
}
 
&bos_cevap unless $FORM{'not'}; # not alanına bir şey girilmemişse 
                                                    #devreye girecek altprogram
 
# mail alanın (burada ertan@gazi.edu.tr) alacağı mesajlar
open (MAIL, "|$sysmailprg $alan") || ("$sysmailprg bulunamadı.!\n");
print MAIL "From: $FORM{'email'} ($FORM{'ad'})\n";
print MAIL "Subject: Önerileri içeren Notlar\n\n";
print MAIL "\n\n-----------------------------------------------------------$
print MAIL " $FORM{'not'}\n\n";
 
print MAIL "\n\n-----------------------------------------------------------$
print MAIL "Browser: $ENV{'HTTP_USER_AGENT'}\n";
print MAIL "Geldiği makina: $ENV{'REMOTE_HOST'}\n";
close (MAIL);
 
# mail gönderenin browser'ına çıkan mesaj
print "<p><br><center><H3>Notunuzu aldım ve değerlendireceğim</H3><p><br>";
print "<B>İlginize teşekkürler.<PALIGN=\"CENTER\">\n\n";
print "<A HREF=\"mailto:ertan\@sirius.gazi.edu.tr\">Ertan
Turkmen</A></P>\n\n";
    print "<FORM>\n";
    print "<INPUT onclick=history.go(-1) type=button value=Geri>\n";
   print "</FONT></FORM></center><p><br>\n";
print "</center></BODY>\n</HTML>\n";
 
#not alanı boş geçilirse devreye girecek olan alt program kodu
sub bos_cevap {
    print "<center><p><br><b>Hic bir not yazmadiniz ... ";
    print "Yeniden Deneyiniz !</b>\n";
    print "<FORM>\n";
    print "<INPUT onclick=history.go(-1) type=button value=Geri>\n";
    print "</FONT></FORM></center><p><br>\n";
    exit;
}
 
Şimdi de yukardaki forma verileri girip Yolla tuşuna basalım. Program çalışacak ve  e-mail 
olarak kullanıcıya (ertan@gazi.edu.tr) gidecek.E-mail mesajı  alıcı tarafından şu şekilde 
okunacaktır.
 
Date: Tue, 1 Jan 1999 16:25:55 +0200
From: Atilla Usenmez <atilla_usenmez@yahoo.com>
Subject: Önerileri içeren Notlar
 
------------------------------------------------------------
 Başarılı Çalışmalarınızın devamını dilerim. Kolay Gelsin.
 
 
------------------------------------------------------------
Browser         :   Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)
Geldiği makina:
 
            ve gönderenin browser sayfasına çıkan mesaj ise aşağıdaki gibi olacaktır.

Notunuzu aldım ve değerlendireceğim

İlginize teşekkürler.

 
 
Anket Formları
 
İnternette bolca rastladığımız örneklerden biri de anket formudur.Bu konuyu da görelim.
 Formumuz aşağıdaki görünümde olsun.
Adınız:

Bu sene kim şampiyon olacak  ? 
 Beşiktaş
 Trabzonspor
 Galatasaray
 Fenerbahçe
ve KODU :
<form action="http://www.gazi.edu.tr/cgi-bin/ornek8.pl" method="POST">
Adınız:<input type="text" name="ad" size=25><br>
Bu sene kim şampiyon olacak  ? <br>
<input type="radio" name="secim" value=1> Beşiktaş
<input type="radio" name="secim" value=2> Trabzonspor
<input type="radio" name="secim" value=3> Galatasaray
<input type="radio" name="secim" value=4> Fenerbahçe
<br><input type="submit" value="Seçimini Gönder">
</form>
 
Bu formu işleyecek programımızın (ornek8.pl) kodu ise :
 
#!/usr/bin/perl
        
print "Content-type:text/html\n\n";
 
read(STDIN, $gecici_alan, $ENV{'CONTENT_LENGTH'});
@alan_deger_ciftleri = split(/&/, $gecici_alan);
 
foreach $alan_deger (@alan_deger_ciftleri) {
        ($alan, $deger) = split(/=/, $alan_deger);
        $deger =~ tr/+/ /;
        $deger =~ s/%(..)/pack("C", hex($1))/eg;
        $FORM{$alan} = $deger;
      } 
print "<HTML>\n<HEAD>\n<TITLE>Teşekkürler</TITLE>\n</HEAD>";
print "\n\n<BODY BGCOLOR=\"#FFFFFF\" LINK=\"#CC0000\">\n";
print "<p><br><center><H3>Değerlendirme Sonucu !!!</H3><p><br>";
print "<PALIGN=\"CENTER\">\n\n";
print "SAYIN $FORM{'ad'}<br>";
%kim = (
1 => "Beşiktaş",
2 => "Trabzonspor",
3 => "Galatasaray",
4 => "Fenerbahçe"
);
print "$FORM{'secim'}.Seçeneği işaretleyerek,<br>";
print "$kim{$FORM{'secim'}} Futbol Takımını seçtiniz<br>";
print "Anketimize katıldığınız için teşekkürler..<br>";
 
print "<FORM>\n";  
print "<INPUT onclick=history.go(-1) type=button value=Geri>\n";
print "</FONT></FORM></center><p><br>\n";
print "</center></BODY>\n</HTML>\n";
 
Formu doldurup Seçimini Gönder butonuna klikleyiniz ve daha sonra nasıl 
çalıştığını inceleyiniz.
 
 
Daha kapsamlı bir anket formu.
 
Web sayfasında görünümü:

Adınız:

 

Bu sene kim şampiyon olacak ?

Beşiktaş Trabzonspor

Galatasaray Fenerbahçe


Şu ana kadar hangi şehirleri gördünüz ?

Ankara
İstanbul
İzmir
Trabzon

Bursa
Adana
Van


En sevdiğiniz sanatçı ?     


 
FORMUN KODU:
 
<table bgcolor=ff3300><tr><td bgcolor=ffffcc>
<form action="http://www.gazi.edu.tr/cgi-bin/ornek11.pl" method="POST">
Adınız:<input type="text" name="ad" size=50><br>
<p>
Bu sene kim şampiyon olacak  ? <br><table><tr>
<td>
<input type="radio" name="secim" value=1> Beşiktaş
<input type="radio" name="secim" value=2> Trabzonspor</td>
<td>
<input type="radio" name="secim" value=3> Galatasaray
<input type="radio" name="secim" value=4> Fenerbahçe</td>
</tr></table><hr size=1 color=#000055>
 
Şu ana kadar hangi şehirleri gördünüz ? <br><table><tr><td>
<input type="checkbox" name="ank" value=1> Ankara<br>
<input type="checkbox" name="ist" value=1> İstanbul<br>
<input type="checkbox" name="izm" value=1> İzmir<br>
<input type="checkbox" name="tra" value=1> Trabzon<br></td><td>
<input type="checkbox" name="bur" value=1> Bursa<br>
<input type="checkbox" name="ada" value=1> Adana<br>  
<input type="checkbox" name="van" value=1> Van<br> </td></tr></table>
<hr size=1 color=#000055>
En sevdiğiniz sanatçı ? 
<select name="sanat">
<option value=0 selected>Sanatçı Listesi
<option value=1>Barış MANÇO
<option value=2>Cem KARACA
<option value=3>Müslüm GÜRSES
<option value=4>Nadide SULTAN
<option value=5>Murat KEKİLLİ
<option value=6>Küçük İBO
</select>
<hr size=1 color=#000055>
<br><input type="submit" value="Seçimini Gönder">
</form>
 
Bu formu değerlendiren programın kodu ise aşağıdadır.Formu doldurup yollayınız ve 
çalısmasını inceleyiniz.
 
ornek11.pl
 
#!/usr/bin/perl
 
print "Content-type:text/html\n\n";
        
read(STDIN, $gecici_alan, $ENV{'CONTENT_LENGTH'});
@alan_deger_ciftleri = split(/&/, $gecici_alan);
foreach $alan_deger (@alan_deger_ciftleri) {
        ($alan, $deger) = split(/=/, $alan_deger);
        $deger =~ tr/+/ /;
        $deger =~ s/%(..)/pack("C", hex($1))/eg;
        $FORM{$alan} = $deger;
      }
 
print "<HTML>\n<HEAD>\n<TITLE>Teşekkürler</TITLE>\n</HEAD>";
print "\n\n\n";
print "<p><br><center><H3>Değerlendirme Sonucu !!!</H3><p><br>";
print "<PALIGN=\"CENTER\">\n\n";
print "SAYIN $FORM{'ad'}<br>";
%takim = (
1 => "Beşiktaş",
2 => "Trabzonspor",
3 => "Galatasaray",
4 => "Fenerbahçe"
);
 
print "$FORM{'secim'}.Seçeneği işaretleyerek,<br>";
print "$takim{$FORM{'secim'}} Futbol Takımını seçtiniz<br>";
 
%kim=(
   "ank" => "Ankara",
   "ist" => "İstanbul",
   "izm" => "İzmir",
   "tra" => "Trabzon",
   "bur" => "Bursa",
   "ada" => "Adana",
   "van" => "Van");
 
print "Gördüğünüz Şehirler<br>\n";
       foreach $key (keys %kim) {
           if ($FORM{$key} == 1) { # 1 seçtikleriniz 0 seçmediklerinizdir
              print "$kim{$key}<br>\n";
           }
        }
%sanatci = (
 1 => "Baris MANCO", 
 2 => "Cem KARACA",
 3 => "Muslum GURSES",
 4 => "Nadide SULTAN",
 5 => "Murat KEKiLLi",
 6 => "Kucuk iBO"
);  
print "Seçtiğiniz Sanatçı: $sanatci{$FORM{'sanat'}}<br>";
print "Anketimize katıldığınız için teşekkürler..<br>";
print "<FORM>\n";
print "<INPUT onclick=history.go(-1) type=button value=Geri>\n";
print "</FONT></FORM></center><p><br>\n";
print "</center></BODY>\n</HTML>\n";