Form”dan POST Metoduyla Gelen Bilgiler

HTML
Form etiketinin METHOD parametresinin değeri GET olabildiği gibi POST
da olabilir; ve HTTP sunucusu bu yöntemle gelen bilgileri
$HTTP_POST_VARS dizi-değişkeninde tutar. Yukarıdaki çok-seçmeli Form”un
FORM etiketini şöyle değiştirerek, formlar03b.htm adıyla kaydedelim:

<FORM ACTION=”formlar03a_isle.php” METHOD=”POST”>

Aynı şekilde son Form işleme programımızda da sadece şu değişikliği yapalım:

foreach ($HTTP_POST_VARS as $anahtar=>$deger ) {

Bu
dosyayı da formlar03b_isle.php adıyla kaydedelim. HTML sayfasını açarak
formu doldurur ve gönderirseniz, sonucun metod olarak GET kullanan
Form”dan hiç farklı olmadığını göreceksiniz. Çünkü PHP programı bu
Form”un gönderdiği bilgilerin $HTTP_POST_VARS değişkenine yazıldığını
biliyordu. $HTTP_POST_VARS da PHP açısından içinde anahtar=değer
çiftleri olan bir dizi-değişkendir; bu değişkenin değerlerine de tıpkı
daha önce olduğu gibi erişiriz.

HTTP
açısından GET ile POST”un tek farkı gelen değerlerin nerede nasıl
tutuldueğundan ibaret değildir. GET yönteminde, bir Browser”ın sunucuya
gönderebileceği verinin uzunluğu, Sunucunun ayarlarına bağlı olmak
üzere, sınırlıdır. Oysa POST ile alacağımız veri miktarı, sadece
sunucunun bulunduğu bilgisayarın sabit disk alanıyla sınırlıdır. (Tabiî
bu günümüzde sınırsızdır, anlamına geliyor!) Bir başka fark, Browser”ın
GET yoluyla gönderdiği verilerin (ve bu arada ziyaretçinin parola
olarak yazdıklarında ekrana yıldız olarak çıkan metinler dahil) tümü,
sunucuya, URL-kodlanmış metin olarak, Browser”ın URL adres hanesine de
yazılmasıdır. Bir çok kullanıcı için bu bir güvensizlik belirtisi
sayılır. Bu iki unsur Formlarımızda  metod olarak GET yerine POST
kullanmanın daha yerinde olduğunu gösterir.

Tedbirli Web
programcılığı, özellikle birden fazla tasarımcı ve programcının
birlikte çalıştığı ve Formlarda hangi yöntemin tercih edildiğini
bilmenin kolay olmadığı projelerde, Form bilgisi işleyen PHP
programlarımızda Form”da hangi metod kullanılmış olursa olsun,
işlyeyici programın iki duruma da elverişli olmasını sağlamaktır.
Sözgelimi son yazdığımız Form işleme programımızı şöyle değiştirirsek,
ve Form içeren HTML sayfasını bu programı veri gönderecek şekilde
değiştirirsek (nasıl?), her iki metodla gönderilen verileri işleme
yeteneğine sahip bir program elde etmiş oluruz.

<?php
$form_bilgisi = ( isset($HTTP_POST_VARS ) )
 ?  $HTTP_POST_VARS : $HTTP_GET_VARS;
  foreach ($form_bilgisi as $anahtar=>$deger ) {
  if ( gettype ($deger ) == “array” ) {
   print (”$anahtar == <br>
“);
   foreach ( $deger as  $yeni_degerler )
    print (”.. $yeni_degerler<br>”);
    }
  else {
  print (”<b>$anahtar = $deger <br>
“);
  }
 }
?>

Form ile işlemciyi Birleştirelim

Şu
ana kadar yaptığımız bütün Form örneklerinde, Form”un bulunduğu HTML
sayfası ile bu Form”un göndereceği verileri işleyen PHP programı iki
ayrı belge halinde idi. Bu, buradaki örneklerde olduğu gibi,
ziyaretçinin verdiği bilgileri sadece Brıowser penceresine yazdıran bir
eğitim çalışması için belki uygun; ama gerçek Web sitelerimizde
ziyaretçilerimizin vereceği bilgileri çoğu zaman sadece onların Browser
pencerelerinde göstermekle kalmayız, fakat bu bilgileri ya elektronik
posta yoluyla kendimize yollarız, ya da sunucuda bir düzyazı veya
veritabası dosyasına işleriz. Bu ve diğer amaçlarla yapacağımız Form
içeren HTML sayfaları, aslında PHP programımızın bir içinde yer
alabilir; ya da başka bir deyişle, Form”umuz ziyaretçinin vereceği
bilgileri kendi bulunduğu PHP programına gönderebilir!

Bu karmaşık ifadeyi bir örnekle açalım. Yukarıda yaptığımız son HTML sayfası ile ve PHP programını şöyle birleştirelim;

if ( isset ( $HTTP_POST_VARS )) {
print (”<HTML>
“);
print (”<HEAD>
“);
print (”<TITLE>PHP”de Formlar</TITLE>
“);
print (”<meta http-equiv=”content-type” content=”text/html; charset=ISO-8859-9″>
“);
print (”<meta http-equiv=”Content-Type” content=”text/html; charset=windows-1254″>
“);
print (”</HEAD>
“);
print (”<BODY>
“);
 foreach ($HTTP_POST_VARS as $anahtar=>$deger ) {
  if ( gettype ($deger ) == “array” ) {
   print (”$anahtar == <br>
“);
   foreach ( $deger as  $yeni_degerler )
    print (”.. $yeni_degerler<br>”);
    }
  else {
  print (”<b>$anahtar = $deger <br>
“);
  }
 }
print (”</BODY>
“);
print (”</HTML>
“);
}
else {
print (”<HTML>
“);
print (”<HEAD>
“);
print (”<TITLE>PHP”de Formlar</TITLE>
“);
print (”<meta http-equiv=”content-type” content=”text/html; charset=ISO-8859-9″>
“);
print (”<meta http-equiv=”Content-Type” content=”text/html; charset=windows-1254″>
“);
print (”</HEAD>
“);
print (”<BODY>
“);
print (”<FORM ACTION=”$PHP_SELF” METHOD=”POST”>
“);
print (” Adınız, Soyadınız: <INPUT TYPE=”TEXT” NAME=”adi”>
“);
print (”<BR>
“);
print (” Elektronik Adresiniz: <INPUT TYPE=”TEXT” NAME=”adres”>
“);
print (”<BR>
“);
print (” Hangi notunuzu öğrenmek istiyorsunuz?
“);
print (”<BR>
“);
print (”<SELECT NAME=”hangi_not[]” MULTIPLE>
“);
print (”<OPTION>Sınav 1
“);
print (”<OPTION>Sınav 2
“);
print (”<OPTION>Ortalama
“);
print (”</SELECT>
“);
print (”<BR>
“);
print (”<INPUT TYPE=”SUBMIT” VALUE=”Gönder Gitsin!”>
“);
print (”<INPUT TYPE=”RESET” VALUE=”Vazgeç, Gönderme!”>
“);
print (”</FORM>
“);
print (”</BODY>
“);
print (”</HTML>
“);
}

Bu
dosyanın tümüyle PHP programı olduğuna dikkat ettiniz, tabiî? Program
açıldığında sunucunun $HTTP_POST_VARS dizi-değişkeninin bir değer
içerip içermediğini  bir if deyiminin içinden bir değişkenin içeriği
olup olmadığını anlamamıza yarayan isset () fonksiyonu ile yapıyoruz.
Bu şart doğru ise, yani $HTTP_POST_VARS dizi-değişkeni bir değer
içeriyorsa, program, foreach döngüsünün içinde bu değişkenin
içindekileri almaya ve Broüwser penceresinde görüntülemeye başlıyor. Bu
şart doğru değilse, yani $HTTP_POST_VARS dizi-değişkeni henüz bir değer
içermiyorsa, if deyiminin birinci bölümünü içindeki hiç bir kod icra
edilmiyor ve prgram else deyimine sıçrıyor. Programın else bölümü ise
daha önceki HTML kodlarımızı içeren bir dizi print() fonksiyonu yerine
getiriyor; yani Browser”a içinde Form bulunan HTML sayfasını
yazdırıyor. Burada FORM etiketine dikkat edelim:

print (”<FORM ACTION=”$PHP_SELF”METHOD=”POST”>”);

Form”un
ACTION parametresinde bir PHP programının adı yerine “$PHP_SELF”
değişken adını görüyoruz. Bu, bu bölümün başında ele aldığımız gibi,
sunucunun bu PHP programına sağladığı çevre değişkenlerinden biridir ve
o anda çalışmakta olan PHP programının dosya adını içerir. (Bizim
örneğimizde bu değişkenin değeri nedir?)