PDA

Orijinalini görmek için tıklayınız : Gelen Veri form verileri



optimusprime
15.Aralık.2014, 22:16
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.cgiprint "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.cgiuse 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.