CGI-PERL
Webserver Kurulumu
Çalışması
için Gerekli Kodlar
Perl ile Yazı Yazdırma
Perl'de Değişkenler
İlişkili Dizi (hash)
değişkenler
Formları Kullanma
Çevre Değişkenleri
Perl'de Mantıksal Sınama
|
CGI/Perl Dersleri Formları
Kullanma
Form
verilerinin kullanılması :
Giriş yazısında belirttiğim gibi CGI ile interaktif sayfalar
oluşturabilir, formdan gelen verileri kullanarak ziyaretcilerden bilgi ya
da görüş ababilirsiniz. Peki html içindeki formdan gelen verileri nasıl
kullanacağız? Bir html sayfasındaki form içine birşeyler yazılıp "submit"
butonuna tıklanınca formun "action" hanesinde yazılı olan dosyaya içine
yazılan bilgileri teslim eder. Bu bilgileri alan dosya da programlaması
nasıl yapılmışsa ona göre bu bilgileri kullanır, kaydeder, mail ile
gönderir ya da ekrana yazar.
HTML bildiğinizi varsayarak form etiketinin unsurları ve içeriği
konularına girmiyorum. Form ile html üzerinden 2 türlü veri
gönderilebilir: GET ve POST. Get metodu ile daha çok kısa veriler
gönderilir ve programın yönlendirilmesinde kullanılır. Uzun bilgiler de
gönderilebilse de veri kaybı riski yüzünden güvensizdir. Get metodunda
veriler $ENV{QUERY_STRING}; çevre değişkeninde saklanır ve programa
teslim edilir. Ayrıca Post metodu ile gönderilen veriler browser adres
çubuğunda görüntülenir. POST metodu ise veriyi bir paket halinde
$ENV{CONTENT_LENGTH}; çevre değişkeninde depolar ve programa teslim eder.
Browser adres hanesinde görüntülenemez, veri kaybı riski yoktur ve büyük
veriler için kullanılabilir. Ayrıca formdan gelen verinin hangi metodla
yollandığı $ENV{REQUEST_METHOD}; çevre değişkeninde saklanır.
İsim ve soyisim bölümlerinden oluşan bir form içeriği programa şu şekilde
gönderilir:
isim=formiçeriği&soyisim=formiçeriği
Program gelen veriyi önce "&" işaretinden bölerek dizi değişkene, daha
sonra da "=" işaretinden bölerek dizi değişkene atar.
Formdan gönderilen veriler 2 türlü değişkene atanıp kullanılabilir.
Klasik
Yöntem :
Bu yöntemde herhangi bir modül kullanılmadan gelen veri değişkene atanır.
Bu yöntemle verileri atarken verinin gönderildiği metodu bilmek
gereklidir. GET ve POST metodu ile gönderilen veriler ayrı ayrı çevre
değişkenlerinde tutulduklarından farklı kodlarla ayrıştırılır. Ayrıca
gelen veri değişkene atanırken bazı düzenlemeler de yapılması gerekir.
1) Post metodu ile gönderilen veriler:
Post metodu ile gönderilen veriler $ENV{'CONTENT_LENGTH'} çevre değişkeni
içinde depolanıp programa teslim edilirler. Bu veriler şu şekilde bir kod
kullanılarak açılır:
read(STDIN, $depo, $ENV{'CONTENT_LENGTH'});
@dizidegisken = split(/&/, $depo);
foreach $duzenle (@dizidegisken) {
($isim , $deger) = split(/=/, $duzenle);
$deger =~ tr/+/ /;
$deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$deger =~s///g;
$form{$isim} = $deger;
}
Bu işlemlerden sonra mesela <input type=text name=isim> şeklinde
gönderilen bir veri $form{isim] şeklinde kullanılabilir.
2) Get metodu ile gönderilen veriler :
GET metodu ile gönderin veriler $ENV{'QUERY_STRING'} çevre değişkeni
içinde depolanıp programa teslim edilir. Bu veriler şu şekilde değişkene
atanabilirler :
@girdi=split(/\&/,$ENV{'QUERY_STRING'});
foreach $depo (@girdi) {
($isim,$deger) = split(/=/,$depo);
$deger =~ tr/+/ /;
$deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$form{$isim} = $deger;
}
Bu işlemlerden sonra az önceki örnekteki gibi "name" bölümü "isim" olan
inputdan gelen veri $form{isim} şeklinde kullanılabilir.
Eğer bir program içerisinde hem POST hem de GET metodunda veriler
gönderilmişse şöyle bir kod kullanılabilir:
@dizidegisken = split (/&/, $ENV{'QUERY_STRING'});
foreach $get(@dizidegisken) {
($isim, $deger) = split (/=/, $get);
$deger =~ tr/+/ /;
$deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$deger =~ tr/ //s;
$form{$isim} = $deger;
}
read(STDIN, $depo, $ENV{'CONTENT_LENGTH'});
@dizidegisken = split(/&/, $depo);
foreach $post (@dizidegisken) {
($isim , $deger) = split(/=/, $post);
$deger =~ tr/+/ /;
$deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$form{$isim} = $deger;
}
Bu kodlardan sonra formdan gelen her iki metoddaki veriler de $form{isim}
şeklinde değişkene atanıp kullanılabilirler.
Bu bilgiler doğrultusunda bir örnek program yapalım. Program iki veri
türüyle de aynı bilgileri gönderecek (böylece iki metod arasındaki farkı
ve benzerlikleri görebileceğiz) formlardan oluşacak, bu formlar kendi
kendine veri gönderecek ve bu verileri açıp ekrana yazdıracak:
#!/usr/bin/perl
# parse1.cgi
print "Content-type:text/html\n\n";
@dizidegisken = split (/&/, $ENV{'QUERY_STRING'});
foreach $get(@dizidegisken) {
($isim, $deger) = split (/=/, $get);
$deger =~ tr/+/ /;
$deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$deger =~ tr/ //s;
$form{$isim} = $deger;
}
read(STDIN, $depo, $ENV{'CONTENT_LENGTH'});
@dizidegisken = split(/&/, $depo);
foreach $post (@dizidegisken) {
($isim , $deger) = split(/=/, $post);
$deger =~ tr/+/ /;
$deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$form{$isim} = $deger;
}
$isim = $form{isim};
$soyad = $form{soyad};
$sanatci = $form{sanatci};
$sarki = $form{sarki};
print "<h3>Gönderdiğiniz veriler: </h3><br><br>";
print "<b>İsim : </b>$isim<br>";
print "<b>Soyad : </b>$soyad<br>";
print "<b>Şarkıcı : </b>$sanatci<br>";
print "<b>Şarkı : </b>$sarki<br><br><br>";
print "<h3>Formlar :</h3><hr>";
print "<b>GET metoduyla :</b><br>";
print "<form action=parse1.cgi method=get>";
print "İsminiz : <input type=text name=isim><br>";
print "Soyad : <input type=text name=soyad><br>";
print "Sevdiğiniz Sanatcı : <input type=text name=sanatci><br>";
print "Sevdiğiniz şarkı : <input type=text name=sarki><br>";
print "<input type=submit value=Gönder></form>";
print "<hr><b> POST metoduyla :</b><br>";
print "<form action=parse1.cgi method=post>";
print "İsminiz : <input type=text name=isim><br>";
print "Soyad : <input type=text name=soyad><br>";
print "Sevdiğiniz Sanatcı : <input type=text name=sanatci><br>";
print "Sevdiğiniz şarkı : <input type=text name=sarki><br>";
print "<input type=submit value=Gönder>";
print "</form></body></html>";
Klasik metod iyidir, herhangi bir modüle ihtiyaç duymaz, her ortamda
çalışır. Ama modül kullanarak yukarıdaki işlemi daha basit ve kolay hale
getirebiliriz.
CGI.pm modülü kullanarak form verilerini değişkene atama :
Modüller perl'de bazı işleri daha kolay ve kısa kodlarla yapmamıza olanak
veren paketlerdir. Modüller konusuna ilerde değinileceği için bu derste
sadece CGI.pm modülünün kullanımını açıklamaya çalışacağım. CGI.pm modülü
kullanarak gelen verileri açıp değişkene atamak için öncelikle dosyanın
başına (shebang'dan sonra) şu kodu eklememiz gerekiyor:
use CGI qw(:standard);
Bu kodu ekleyerek CGI.pm modülünün bize verdiği kolaylıkları
kullanabiliriz. Daha sonra formdan gelen veriyi kullanabilmek için yeni
bir CGI nesnesi oluşturmalıyız :
$query = new CGI;
CGI.pm modülünü kullanarak mesela "name" bölümü "isim" olan bir form
verisini açmak için şöyle bir kod kullanmamız yeterlidir:
$isim = $query -> param('isim');
CGI.pm modülü kullanıldığında formdan gelen verinin POST ya da GET metodu
ile gönderilmesinin bir önemi yoktur. İki türde aynı şekilde açılıp
değişkene atanabilir.
Buna göre az önceki örneği CGI.pm modülü kullanarak şu şekilde
yapabiliriz:
#!/usr/bin/perl
# parse2.cgi
use CGI qw(:standard);
print "Content-type:text/html\n\n";
$query = new CGI;
$isim = $query -> param('isim');
$soyad = $query -> param('soyad');
$sanatci = $query -> param('sanatci');
$sarki = $query -> param('sarki');
print "<html><body>";
print "<h3>Gönderdiğiniz veriler: </h3><br><br>";
print "<b>İsim : </b>$isim<br>";
print "<b>Soyad : </b>$soyad<br>";
print "<b>Şarkıcı : </b>$sanatci<br>";
print "<b>Şarkı : </b>$sarki<br><br><br>";
print "<h3>Formlar :</h3><hr>";
print "<b>GET metoduyla :</b><br>";
print "<form action=parse2.cgi method=get>";
print "İsminiz : <input type=text name=isim><br>";
print "Soyad : <input type=text name=soyad><br>";
print "Sevdiğiniz Sanatcı : <input type=text name=sanatci><br>";
print "Sevdiğiniz şarkı : <input type=text name=sarki><br>";
print "<input type=submit value=Gönder></form>";
print "<hr><b> POST metoduyla :</b><br>";
print "<form action=parse2.cgi method=post>";
print "İsminiz : <input type=text name=isim><br>";
print "Soyad : <input type=text name=soyad><br>";
print "Sevdiğiniz Sanatcı : <input type=text name=sanatci><br>";
print "Sevdiğiniz şarkı : <input type=text name=sarki><br>";
print "<input type=submit value=Gönder>";
print "</form></body></html>";
Gördüğünüz gibi yukarıda yaklaşık 20 satır kodun yaptığı işi modül
kullanarak 7 satırda hallettik. Günümüzde CGI.pm modülü CGI desteği olan
hemen hemen her server'da desteklenir ve gelişmiş perl programları da
form verilerini bu yolla açarak kullanırlar. Bundan sonraki
örneklerimizde de basitliği ve anlaşılabilirliği açısından CGI.pm modülü
kullanılarak yapılacak.
Bu konu Seçkin Yastıkçılar
tarafından yazılmıştır, alıntıdır. |