Bölüm 5: İleri Seviye Formlar
Bir önceki bölümde form bilgilerinin kodlarının nasıl çözülecegini ve mail olarak gönderileceğini gördük. Fakat yazdığımız scriptte bir eksiklik vardı: Hata kontrolü. Eğer boş formlar almak istemiyorsanız ya da belli alanların mutlaka doldurulmasını istiyorsanız, hatta bir anket yapıyor ve verilen cevaba göre scriptinizin farklı işler yapmasını istiyorsanız şimdi yazacaklarımı dikkatlice okuyun.
Belli bir şartın doğru olup olmadığını kontrol etmek için if blokunu kullanırız.
if ($degiskenadi eq "birseyler") {
# koşul doğruysa işletilecek komutlar
}
elsif ($degiskenadi eq "baskaseyler") {
# bu koşul doğruysa işletilecek komutlar
}
else {
# yukarıdaki koşulların hiçbiri doğru değilse işletilecek komutlar
}
elsif ve else bloklarının konulması şart değildir. Sadece tek bir şartın doğruluğunu kontrol edecekseniz şu şekilde kullanabilirsiniz:
if ($varname > 23) {
# $sayi 23'ten büyükse işletilecek komutlar
}
Perl'de değişkenin sayı ya da yazı oluşuna göre değişik karşılaştırma operatörleri vardır.
Karşılaştırma İfadesi Sayı İçin Yazı İçin
$x eşittir $y $x == $y $x eq $y
$x eşit değildir $y $x != $y $x ne $y
$x büyüktür $y $x > $y $x gt $y
$x büyük eşittir $y $x >= $y $x ge $y
$x küçüktür $y $x < $y $x lt $y
$x küçük eşittir $y $x <= $y $x le $y
Farkettiğiniz gibi, yazıların karşılaştırılmasında karakter operatörler (eq, ne, vs.), sayıların karşılaştırılmasında işaret operatörler (==, !=, vs.) kullanılır.
Şimdi "mail.cgi" isimli scriptimizi açıp sendmail programını açan satırın (open (MAIL, "|$mailprog -t") or &hata("$mailprog bulunamadı!\n") hemen öncesine şu kodları yerleştirin ve scripti "mail2.cgi" adıyla kaydedin.
if ($FORM{'isim'} eq "") {
&hata("Lütfen isminizi yazın");
}
Hata mesajının yazdırılmasında hata alt programından faydalanılıyor. Scriptimize bu kodu eklemekle formunuzdaki isim alanının doldurulmasını zorunlu kılmış olduk. Aşağıdaki gibi birden fazla alanı da kontrol edebilirdik.
if ($FORM{'isim'} eq "" or $FORM{'email'} eq "" or $FORM{'yas'} eq "") {
&hata("Lütfen isminizi, e-mail adresinizi ve yaşınızı yazın");
}
Yukarıdaki kod "isim", "email" ya da "yas" isimli alanların herhangi biri boş bırakıldığı takdirde hata mesajının yazdırılmasını sağlayacaktır. Koşullar or operatörü ile ayrılmışlardır. (or yerine || da kullanılabilir.)
Onay Kutuları
Formdaki onay kutularının nasıl yazdırıldığını bir örnekle açıklayalım. İlk önce aşağıdaki kodlarla bir sayfa oluşturun ve "renk.html" adıyla kaydedin.
<html><head><title>Sevdiğiniz Renkler</title></head><body>
<form action="http://hammer.prohosting.com/~sinan/cgi-bin/ornek/renk.cgi" method="POST">
<h3>Sevdiğiniz renkleri işaretleyin</h3>
<input type="checkbox" name="kirmizi" value=1> Kırmızı<br>
<input type="checkbox" name="sari" value=1> Sarı<br>
<input type="checkbox" name="yesil" value=1> Yeşil<br>
<input type="checkbox" name="mavi" value=1> Mavi<p>
<input type="submit" value="Gönder">
</form>
</body></html>
Burada value sıfatına istediğiniz değeri verebilirsiniz. Yukarıda CGI programında daha kısa kod yazabilmek için "1" değeri verilmiştir.
Şimdi de bu formun kodunu çözecek CGI programını yazalım.
#!/usr/bin/perl
print "Content-type:text/html\n\n";
read(STDIN, $tampon, $ENV{'CONTENT_LENGTH'});
@ciftler = split(/&/, $tampon);
foreach $cift (@ciftler) {
($isim, $deger) = split(/=/, $cift);
$deger =~ tr/+/ /;
$deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$FORM{$isim} = $deger;
}
print "<html><head><title>Sonuçlar</title></head>\n";
print "<body>\n";
print "<h2>Sonuçlar</h2>\n";
@renkler = ("kirmizi","sari","yesil","mavi");
foreach $renk (@renkler) {
if ($FORM{$renk} == 1) {
print "$renk rengini işaretlediniz<br>\n";
}
}
print "</body></html>\n";
Radyo Düğmeleri
Radyo düğmeleri onay kutularından biraz farklıdır. Form hazırlarken radyo düğmelerinin hepsinin name sıfatına aynı değer atandığı için yazdırılması daha kolaydır. Bir örnek vererek bunu açıklayalım.
Aşağıdaki kodlarla bir sayfa hazırlayın ve "renk2.html" adıyla kaydedin.
<html><head>
<title>En Sevdiğiniz Renk</title>
</head>
<body>
<form action="http://hammer.prohosting.com/~sinan/cgi-bin/ornek/renk2.cgi" method="POST">
<h3>İçlerinde en sevdiğiniz renk hangisi?</h3>
<input type="radio" name="renk" value="kirmizi"> Kırmızı<br>
<input type="radio" name="renk" value="sari"> Sarı<br>
<input type="radio" name="renk" value="yesil"> Yeşil<br>
<input type="radio" name="renk" value="mavi"> Mavi<p>
<input type="submit" value="Gönder">
</form>
</body>
</html>
Şimdi de aşağıdaki kodları yazın ve "renk2.cgi" adıyla kaydedin. ("renk.cgi"den tek farkının foreach döngüsünün yerine konan print "En sevdiğiniz renk: $FORM{'renk'}\n"; satırı olduğuna dikkat edin.)
#!/usr/bin/perl
print "Content-type:text/html\n\n";
read(STDIN, $tampon, $ENV{'CONTENT_LENGTH'});
@ciftler = split(/&/, $tampon);
foreach $cift (@ciftler) {
($isim, $deger) = split(/=/, $cift);
$deger =~ tr/+/ /;
$deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$FORM{$isim} = $deger;
}
print "<html><head><title>Sonuçlar</title></head>\n";
print "<body>\n";
print "<h2>Sonuçlar</h2>\n";
print "En sevdiğiniz renk: $FORM{'renk'}\n";
print "</body></html>\n";
Scriptimizi bir adım daha geliştirerek ziyaretçiye sadece seçtiği rengi söylemekle kalmayıp aynı zamanda fon rengini seçilen renk yapacak şekilde değiştirelim.
#!/usr/bin/perl
print "Content-type:text/html\n\n";
read(STDIN, $tampon, $ENV{'CONTENT_LENGTH'});
@ciftler = split(/&/, $tampon);
foreach $cift (@ciftler) {
($isim, $deger) = split(/=/, $cift);
$deger =~ tr/+/ /;
$deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$FORM{$isim} = $deger;
}
%renkler = ("kirmizi" => "red",
"sari" => "yellow",
"yesil" => "green",
"mavi" => "blue");
print "<html><head><title>En Sevdiğiniz Renk</title></head>\n";
print "<body bgcolor=$renkler{$FORM{'renk'}}>\n";
print "<h2>En sevdiğiniz renk: $FORM{'renk'}</h2><br>\n";
print "</body></html>";
Seçim Kutuları
Seçim kutularının kodunun çözülmesi hemen hemen radyo butonları gibidir. Yine konunun daha iyi anlaşılması bakımından bir örnek verelim.
Aşağıdaki kod ile formu oluşturun ve sayfayı "renk3.html" adıyla kaydedin.
<form action="http://hammer.prohosting.com/~sinan/cgi-bin/ornek/renk2a.cgi" method="POST">
<select name="renk">
<option value="kirmizi"> Kırmızı
<option value="sari"> Sarı
<option value="yesil"> Yeşil
<option value="mavi"> Mavi
</select><p>
<input type="submit" value="Gönder">
</form>
Seçim kutularının değerlendirilmesi radyo botonları ile aynı olduğundan yeni bir script yazmamıza gerek yok. Formumuzu "renk2a.cgi" scriptine gönderebiliriz.
Şu ana kadar öğrendiğimiz bilgilerle onay kutuları, radyo düğmeleri ve seçim kutuları içeren form bilgilerini web sayfasına yazan bir CGI scripti hazırlayabiliriz. Aşağıdaki kodlarla yeni bir HTML dosyası oluşturun ve "form.html" adıyla kaydedin.
<html><head><title>Form</title></head>
<body>
<form action="http://hammer.prohosting.com/~sinan/cgi-bin/ornek/form.cgi" method="POST">
İsminiz: <input type="text" name="isim" size=30><p>
E-mail adresiniz: <input type="text" name="email" size=30><p>
Bu siteye nasıl ulaştınız?
<select name="nasilulasti">
<option value=0 selected>Seçim yapın...
<option value=1>Direk adresini yazdım
<option value=2>Siteyi bookmark etmiştim
<option value=3>Arama motorundan buldum
<option value=4>Başka bir siteden
<option value=5>Adresi bir kitaptan aldım
<option value=6>Diğer
</select><p>
Siteye 5 üzerinden kaç verirsiniz?<br>
<input type="radio" name="puan" value=1> 1
<input type="radio" name="puan" value=2> 2
<input type="radio" name="puan" value=3> 3
<input type="radio" name="puan" value=4> 4
<input type="radio" name="puan" value=5> 5<p>
Aşağıdakilerden hangileriyle ilgilenirsiniz?<br>
<input type="checkbox" name="wds" value=1> Web Design<br>
<input type="checkbox" name="wsy" value=1> Web Server Yöneticiliği<br>
<input type="checkbox" name="tic" value=1> Elektronik Ticaret<br>
<input type="checkbox" name="als" value=1> İnternetten Alışveriş<br>
<input type="checkbox" name="egt" value=1> İnternet Aracılığıyla Eğitim<br>
<p>
Sayfa hakkında yorumlarınız:<br>
<textarea name="yorum" rows=5 cols=70 wrap="virtual">
</textarea>
<p>
<input type="submit" value="Gönder">
<input type="reset" value="Tümünü Sil">
</form>
</body></html>
Şimdi de "form.cgi" programını yazalım.
#!/usr/bin/perl
print "Content-type:text/html\n\n";
read(STDIN, $tampon, $ENV{'CONTENT_LENGTH'});
@ciftler = split(/&/, $tampon);
foreach $cift (@ciftler) {
($isim, $deger) = split(/=/, $cift);
$deger =~ tr/+/ /;
$deger =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$FORM{$isim} = $deger;
}
# "Bu siteye nasıl ulaştınız?" sorusunun cevabı
# numara olarak gönderildiği için bunu çevirebilmek
# için bir hash değişkene ihtiyacımız var
%nasilulasti = ( 0 => "",
1 => "Direk adresini yazdım",
2 => "Siteyi bookmark etmiştim",
3 => "Arama motorundan buldum",
4 => "Başka bir siteden",
5 => "Adresi bir kitaptan aldım",
6 => "Diğer" );
print <<HTMLBas;
<html><head><title>Sonuçlar</title></head>
<body>
<h2>Sonuçlar</h2>
Formla gönderdiğiniz bilgiler aşağıdaki şekildedir:<p>
İsminiz: $FORM{'isim'}<p>
E-mail adresiniz: $FORM{'email'}<p>
Siteye nasıl ulaştığınız: $nasilulasti{$FORM{'nasilulasti'}}<p>
Siteye verdiğiniz puan: $FORM{'puan'}<p>
HTMLBas
;
%secim = ("wds" => "Web Design",
"wsy" => "Web Server Yöneticiliği",
"tic" => "Elektronik Ticaret",
"als" => "İnternetten Alışveriş",
"egt" => "İnternet Aracılığıyla Eğitim" );
print "Aşağıdaki konularla ilgileniyorsunuz:<br>\n";
foreach $anahtar (keys %secim) {
if ($FORM{$anahtar} == 1) {
print "$secim{$anahtar}<br>\n";
}
}
print <<HTMLSon;
<p>
Sayfa hakkında yorumlarınız:<br>
$FORM{'yorum'}
<p>
</body></html>
HTMLSon
;
Eğer form bilgilerinin mail adresinize gönderilmesini istiyorsanız geçen bölümde öğrendiğiniz bilgilerle bunu yapabilirsiniz.