| HTML FORMLARI VE DEĞİŞKEN AKTARMA |  |  |  |
Web sunucusu ve istemcisi (Browser) arasındaki
etkileşme ve alışverişin nasıl işlediğine ilişkin bilgilerimiz olduğunu
varsayarak, sadece Internet'te Form, bir Web sayfasının ziyaretçiden veri
alabildiği ve bunları Web sunucusuna ulaştırabildiği başlıca araç olduğunu
hatırlayalım. Form, ziyaretçinin bizim istediğimiz bilgilerin yanı sıra
ziyaretçinin bilgisayarından Web sunucusu bilgisayara, daha bir çok bilgiyi de
beraberinde getirir. Web programcısı ve Web tasarımcısı olarak bu bilgileri
bilmeye daima ihtiyacımız var. Söz gelimi, ziyaretçimizin Browser türünü ve
sürümü belirleyerek, onu, uygun sayfaya yönlendirmekten tutun, ziyaretçiden
istediğimiz bilgilerin Sunucu'ya ulaştığında nerede ve hangi değişkende
tutulduğuna kadar, gerekli bir çok bilgi Sunucu çievre değişkenleri ve Sunucu
değişkenleri dediğimiz dizilerde bulunur. Form tasarımına ve bir Form'un
bilgilerini PHP ile yakalamaya ve işlemeye geçmeden önce Web Server'ı ve bize
verdiği bilgileri daha yakından tanınamız yararlı olur. Bunun için önce şu programı formlar01.php adıyla
kaydedin ve çalıştırın:
<HTML>
<HEAD>
<TITLE>PHP'de Nesneler</TITLE>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<?php
foreach ($GLOBALS as $anahtar=>$deger )
{
print ($anahtar . " = " . $deger . "<br>");
}
?>
</BODY>
</HTML> Şimdi Browser penceresinde gördüğünüz bilgileri
irdeleyelim; çünkü biraz sonra ziyaretçiden Form ile gelen verileri yakalarken
ve işlerken bu bilgilerden yararlanacağız. Bu programla PHP'nin daima varolan $GLOBALS
dizisinin üyelerini görüntülüyoruz. $GLOBALS bir ilişkili-dizi-değişken, yani
değişken değerlerinin endeks adı (anahtarı) bulunan bir dizi olduğu için,
içerdiği değerlere adları ile ulaşabiliriz. Bu programda, $GLOBALS'ın
anahtarlarını $anahtar, değerlerini ise $değer değişkenine yazdırıyoruz ve bir
foreach döngüsü ile Brnowser penceresine gönderiyoruz. Programı çalıştırdığımız
sisteme ve Web sunucu programına bağlı olmak üzere, ekranımızda bir çok değişken
görebiliriz. Bunlar arasında bütün HTTP Server programları için ortak ve Web
programcısı için önemli değişkenler şunlardır:
- HTTP_ENV_VARS : HTTP Sunucu programın çalışmakta olan
PHP dosyası için oluşturduğu çevre değişkenlerinin yazılı olduğu dizi değişken.
Bu değişkenin içinde şu unsurlar bulunur:
| HOSTNAME |
Sunucunun IP adresi |
| SHELL |
Unix sisteminde kullanılan Shell programı |
| HOSTTYPE |
Sunucunun adı ve sürünü |
| OSTYPE |
Sunucu'nun işletim sistemi |
| HOME |
Çalışan programın kök dizini |
| PATH |
Çalışan programın Sunucu'daki yolu |
-
HTTP_SERVER_VARS Sunucu programın çalışmakta olan PHP
dosyasına sunduğu bazı bilgilerin bulunduğu dizi değişken. Bu değişkenin içinde
şu unsurlar bulunur:
| PHP_SELF |
Çalışan PHP programının bulunduğu dizin ve adı |
| PATH_TRANSLATED |
Çalışan PHP programının fiziksel yolu |
- HTTP_GET_VARS Bir Form'dan GET metoduyla alınan
bilgilerin anahtar=değer çiftleri olarak kaydedildiği dizi değişken
- HTTP_POST_VARS Bir Form'dan POST metoduyla alınan
bilgilerin anahtar=değer çiftleri olarak kaydedildiği dizi değişken
- HTTP_USER_AGENT Ziyaretçinin bilgisayarında kurulu
Internet Browser programı
- QUERY_STRING Form ile bilgi alırken GET metodunu
kullandığımız takdirde, Browser'ın göndereceği bilgilerin tutulduğu değişken
- REMOTE_ADDR Ziyaretçinin bilgisayarına ISS
tarafından atanmış IP adresi
- REQUEST_METHOD Form ile gelen bilgilerin gönderildiği
metod: GET veya POST
- REQUEST_URI O anda çalışmakta olan PHP dosyasının adı ve
varsa bu ada eklenmiş Query_String
- SCRIPT_FILENAME O anda çalışmakta olan PHP
programının dosya adı
- SCRIPT_URI O anda çalışmakta olan PHP
programının tam URL adresi
- SERVER_ADDR Sunucunun IP adresi
- SERVER_PROTOCOL Sunucunun HTTP protokolünün sürümü
Form'dan GET metoduyla gelen bilgiler
Ziyaretçilerimizin ne tür Browser kullandıklarını
HTTP_USER_AGENT değişkeninin değerini alarak ve bu değerin içinde belirli
anahtar kelimeleri aratarak bulabiliriz. Form ile gelen bilgiler, GET metodu ile
alınıyorsa, hem QUERY_STRING, hem de HTTP_GET_VARS dizisine kaydolur. POST
metoduyla aldığımız bilgileri HTTP_POST_VARS değişkenin değerleri arasında
buluruz. Bunları öğrendiğimize göre, şimdi gerçekten bir HTML Form'u yapabil ve
bununla ziyaretçimizden bilgi alabiliriz. Basit bir HTML Form'u tasarlayalım. Aşağıdaki
kodları formlar02.htm adılyla kaydedin:
<HTML>
<HEAD>
<TITLE>PHP'de Formlar</TITLE>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<FORM ACTION="formlar02_isle.php" METHOD="GET">
Adınız, Soyadınız: <INPUT TYPE="TEXT" NAME="adi">
<br>
E-Mail Adresiniz: <INPUT TYPE=TEXT" NAME="adres">
<br>
<INPUT TYPE="SUBMIT" VALUE="Gönder Gitsin!">
<INPUT TYPE="RESET" VALUE="Vazgeç, Gönderme!">
</FORM>
</BODY>
</HTML>
Bu Form'la Web tasarım yarışmasına
katılmayacağımıza göre, şimdilik sadece Web Sunucuya bilgi göndermekte
kullanabiliriz. Form'un ACTION parametresine dikkat ederseniz,
formlar02_isle.php adlı bir dosyanın adını göreceksiniz. Bu, ziyaretçinin Gönder
düğmesini tıklamasıyla birlikte Form'un içerdiği bilgilerin METHOD
parametresinde pazılı olan GET yöntemiyle Sunucu'da gönderileceği programın
adıdır. Şimdi bir an için ne olacağını düşünmeden, formu
doldurun ve Gönder düğmesini tıklayın; ve Browser'ınızdaki hata mesajına
aldırmadan, URL adres kutusunda ne yazdığını okuyun:
http://server/formlar02_isle.php?adi=Muharrem+Ta%E7&adres=muharremtac@mynet.com
Bu, HTTP protokolüne göre GET yoluyla bilgi
göndermekte kullanılan yöntemin tam bir örneğidir: Browser, GET yoluyla bilgi
göndereceği zaman, Form'daki bütün bilgileri URL-Encoding denen sistemle kodlar;
Form'un alan adlarına o alanlara ziyaretçinin yazdığı bilgileri bir eşittir
işaretiyle ekler; bu tür alan=girdi çiftlerinin arasına & (ve işareti) koyar ve
gönderir. Web sunucu, bu bilgileri alınca, önce kendi oluşturduğu bazı
değişkenlere (hem QUERY_STRING, hem de HTTP_GET_VARS dizisine) yazar ve sonra
URL hanesinde adı yazılı olan programa (sayfaya) verir. Şimdi bizim bu
bilgilerin gönderildiği PHP programını kendisine verilecek bu bilgileri işlemeye
hazır şekilde yazmamız gerekir. Şu aşağıdaki kodları formlar02_isle.php adıyla
kaydedin:
<HTML>
<HEAD>
<TITLE>PHP'de Formlar</TITLE>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<?php
print ("Sayın <b>$adi</b>\n\n");
print ("<p>Elektronik adresiniz: <b>$adres </b></p>\n\n");
?>
</BODY>
</HTML> Şimdi, Browser'ınızda formlar02.htm sayfasını
yeniden açın, Form'u doldurun ve gönderin. Açılacak sayfa, Form'un gönderecğii
bilgileri alacak ve kendi görünteleyecektir. Fakat burada gördüğünüz gibi Sunucu'nun
ziyaretçiden gelen bilgileri depoladığı dizileri kullanmadık. Bunu yaparken, GET
ile gelen bilgiler kendisinde verildiğinde PHP programının alan adlarını
değişken adı, bunların karşısında yazılı olan verileri de bu değişkenin değeri
saymasından yararlandık. Fakat isteseydik, bu değişkenleri, Sunucu'nun
oluşturduğu dizilerden de alabilirdik. Şimdi hem Form'umuzu geliştirelim; hem de
bu kez okuma işini Sunucu dizisinden yapalım. Önce Form'umuzu değiştirelim ve formlar03.htm adıyla
kaydedelim:
<FORM ACTION="formlar03_isle.php" METHOD="GET">
Adınız, Soyadınız: <INPUT TYPE="TEXT" NAME="adi">
<BR>Elektronik Adresiniz: <INPUT TYPE=TEXT" NAME="adres">
<BR>Hangi notunuzu öğrenmek istiyorsunuz?
<BR>
<SELECT NAME="hangi_not">
<OPTION>--Lütfen seçiniz--
<OPTION>Sınav 1
<OPTION>Sınav 2
<OPTION>Ortalama
</SELECT>
<BR>
<INPUT TYPE="SUBMIT" VALUE="Gönder!">
<INPUT TYPE="RESET" VALUE="Vazgeç">
</FORM>
Yeni Form'da yeni bir HTML unsuruna yer
verdiğimizi ve SELECT..OPTION etiketi ile ziyaretçiye bir seçim imkanı
verdiğimizi görüyorsunuz. Şimdi, bu Form'un göndereceği bilgileri işleyecek PHP
programını yazalım. Aşağıdaki kodları formlar03_isle.php adıyla kaydedelim:
<HTML>
<HEAD>
<TITLE>PHP'de Formlar</TITLE>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-9">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1254">
</HEAD>
<BODY>
<?php
foreach ($HTTP_GET_VARS as $anahtar=>$deger )
{
print ("<b>$anahtar = $deger <br>\n");
}
?>
</BODY>
</HTML> Demiştik ki, Web sunucu, bir istemci Browser'dan
kendisine GET yöntemiyle yollanan Form bilgilerini $HTTP_GET_VARS adlı dizi
değişkende tutar. Yine daha önce görmüştük ki dizi değişkenlerin içinde ya sayı
ya da isim olarak bir anahtar ve bu anahtarın temsil ettiği bir değer vardır.
Burada, $HTTP_GET_VARS değişkeninin anahtar ve değerlerini $anahtar ve $deger
değişkenlerine => operatörünün yardımıyla, bir foreach döngüsü içinde atıyoruz.
Döngü kullanmamızın sebebi, dizi değişkenin içinde birden fazla anahtar=değer
çifti bulunması ihtimali bulunması; döngü olarak da foreach kullanmamızın sebebi
dizide kaç adet anahtar=değer çifti bulunduğunu bilmememizdir. Form sayfasının gönderdiği bilgilerin nasıl
derlenip toplanıp URL-koduyla Sunucuya gönderildiğini, Form'un Gönder düğmesini
tıkladığımızda Browser'ın URL adres hanesinde ilen bilgilerin görülecektir.
Buradaki örnekte bu bilgi (HTTP bölümünü ve URL kodlarını kaldırarak):
adi=Şahika+Tabak&adres=stabak@somenet.com&hangi_not=Sınav+1
şeklindedir. Bu bilgi, sunucu tarafından
$HTTP_GET_VARS dizi değişkeninin içine yazıldığına göre, daha önce gördüğümüz
gibi dizi değişkenlerin anahtarlarını ve bu anahtarların temsil ettiği değerleri
bir döngü içinde $anahtar ve $deger değişkenlerine atarsak, daha sonra bu
değişkenlerin değerlerini Browser penceresine göndermemiz mümkün olur.
URL Kodları
HTTP protokolüne göre, temel ASCII listesi içinde
yer almayan karakterler, ve tabiî bu arada sadece Türkçe'de bazı diğer
alfabelerde bulunan harfler, bir Form'da yer aldığı taktirde, Browser tarafından
URL şemasına göre kodlanarak gönderilir. Gerçi bir çok HTTP sunucu programıbu
karakterlere tanıyabilir ve bir dosyaya yazarken doğru şekilde yazabilirler; ama
bu çevirme işleminin bazen program yardımıyla yapılması gerekebilir. Bizim için
önemli karakterler ve URL kodları şöyle:
| ü |
%FC |
Ü |
%DC |
ö |
%F6 |
Ö |
%D6 |
ı |
%FD |
| İ |
%DD |
ğ |
%F0 |
Ğ |
%D0 |
ş |
%FE |
Ş |
%DE |
| ç |
%E7 |
Ç |
%C7 |
% |
%25 |
& |
%26 |
[ |
+%5B |
| ] |
%5D |
{ |
%7B |
} |
%7D |
? |
%3F |
= |
%3D |
Şimdi biraz dizi-değişken içine dizi-değişken
koyalım! Yani ziyaretçinin göndereceği bilgiler, buradaki gibi SELECT..OPTION
etiketinde yapacağı sadece bir unsur seçimi olmasın da çoklu-seçim olsun. HTML
bilgilerinizi yoklarsanız, bunu SELECT etiketini MULTIPLE parametresi ile
yapabildiğimizi hatırlayacaksınız. Biraz önceki kaydettiğimiz dosyanın sadece
Form bölümünü aşağıdaki gibi geliştirerek, formlar03a.htm adıyla kaydedelim:
<FORM ACTION="formlar03a_isle.php" METHOD="GET">
Adınız, Soyadınız: <INPUT TYPE="TEXT" NAME="adi">
<BR>Elektronik Adresiniz: <INPUT TYPE=TEXT" NAME="adres">
<BR>Hangi notunuzu öğrenmek istiyorsunuz?
<BR>
<SELECT NAME="hangi_not[]" MULTIPLE>
<OPTION>Sınav 1
<OPTION>Sınav 2
<OPTION>Ortalama
</SELECT>
<BR>
<INPUT TYPE="SUBMIT" VALUE="Gönder">
<INPUT TYPE="RESET" VALUE="Vazgeç">
</FORM>
Burada, HTML'in SELECT.. OPTION etiketlerini
kullanarak, ziyaretçimizden hangi sınav notunu öğrenmek istediğini bize
bildirmesini istiyoruz. Dikkat ettiğiniz gibi, bu kez Form, elde edeceği
verileri formlar03a_isle.php programına yollamak istiyor. Form'daki <SELECT
NAME="hangi_not[]" MULTIPLE> satırına da dikkat ettiniz mi? Bu satırın özelliği,
daha önceki SELECT..OPTION etiketinden farklı olarak ziyaretçinin çoklu seçme
yapmasına imkan veriyor; ve elde edilecek değeri "hangi_not[]" alanının değeri
olarak bildiriyor. HTTP iletişim ilkelerine göre çoklu-seçim halinde seçilen
OPTION değerleri Sunucu'ya aynı alan adının karşısına yazılarak gönderilir.
Formumuzun göndereceği bilgi yumağını satırlar haline getirirsek (HTTP bölümünü
atar ve URL kodlarını çözersek) bunu görebiliriz:
adi=Şahika Tabak
adres=stabak@somenet.com
hangi_not[]=Sınav 1
hangi_not[]=Sınav 2
hangi_not[]=Ortalama Kendisine böyle bir bilgi yumağı gelen Server,
bunun tümünü $HTTP_GET_VARS dizi değişkeninin içine yazacaktır. Başka bir
deyişle, bu dizi değişken çıok-boyutlu çok-elemanlı ilişkili-dizi olduğu için,
içinde rahatça aynı isimde değişkenlere farklı endeks sayısı verecektir. Fakat
sorun PHP'nin, bu dizinin içinden değişkenleri almasında ortaya çıkacak ve
endeks ismi aynı olan değişkenler sorun olacaktır. Bunu değişkenin endeks adı
olarak kullanılacak kelimenin yanına köşeli parantez koyarak çözüyoruz. PHP bu
adı görünce, bunun çok-elemanlı bir dizi değişken olacağını anlayacaktır. Eğer bu formu, formlar03_isle.php programına
gönderseniz "hangi_not" değişkeninin değeri olarak Browser penceresinde "array"
kelimesinin belirdiğini görebilirsiniz. Çünkü PHP açısından bu değişken bir
dizidir ve içinde anahtar=değer çiftleri vardır. Daha önce anahtar=değer
çiftlerini geçici değişkenlere atayıp bir döngü ile yazdırmıştık. Şimdi, PHP
kodumuzu bu duruma uygun hale getirelim. Biraz önce yazdığımız Form işleme
programının sadece PHP bölümünü şöyle değiştirerek, formlar03a_isle.php adıyla
kaydedelim:
<?php
foreach ($HTTP_GET_VARS as $anahtar=>$deger )
{
if ( gettype ($deger ) == "array" )
{
print ("$anahtar == <br>\n");
foreach ( $deger as $yeni_degerler )
print (".. $yeni_degerler<br>");
}
else
{
print ("<b>$anahtar = $deger <br>\n");
}
}
?> PHP'nin gettype() fonksiyonunu daha önce görmüş ve
bir değişkenin türünü anlamaya yaradığını öğrenmiştik. Burada $HTTP_GET_VARS
değişkeninden aldığımız değerlerden herhangi birinin gerçekten bir değişken
değeri mi, yoksa bir dizi (array) mi olduğunu gettype() ile anlayabiliriz. Eğer
değer olarak karşımıza "array" kelimesi çıkarsa, bunu kendi içinde anahtar ve
değer olarak bölebilir ve herbirini ayrı ayrı görüntüleyebiliriz. Eğer
$HTTP_GET_VARS değişkeninden aldığımız değer, dizi değil de gerçekten bir
değişken ise (else) doğruca bu değeri ve anahtarını yazdıracaktır. Sonuç ise
dizi-değişken içindeki dizi-değişkenin değerlerinin tek tek görüntülenmesi
olacaktır.
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ştirir ve formlar03c_isle.php adıyla
kaydedersek, ve Form içeren HTML sayfasını bu programı veri gönderecek şekilde
değiştirirsek, 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>\n");
foreach ( $deger as $yeni_degerler )
print (".. $yeni_degerler<br>");
}
else
{
print ("<b>$anahtar = $deger <br>\n");
}
}
?>
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; ve bunu
formlar04.php adıyla kaydedelim:
<?php
if ( isset ( $HTTP_POST_VARS ))
{
print ("<HTML>\n");
print ("<HEAD>\n");
print ("<TITLE>PHP'de Formlar</TITLE>\n");
print ("<meta http-equiv=\"content-type\" content=\"text/html; charset=ISO-8859-9\">\n");
print ("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1254\">\n");
print ("</HEAD>\n");
print ("<BODY>\n");
foreach ($HTTP_POST_VARS as $anahtar=>$deger )
{
if ( gettype ($deger ) == "array" )
{
print ("$anahtar == <br>\n");
foreach ( $deger as $yeni_degerler )
print (".. $yeni_degerler<br>");
}
else
{
print ("<b>$anahtar = $deger <br>\n");
}
}
print ("</BODY>\n");
print ("</HTML>\n");
}
else
{
print ("<HTML>\n");
print ("<HEAD>\n");
print ("<TITLE>PHP'de Formlar</TITLE>\n");
print ("<meta http-equiv=\"content-type\" content=\"text/html; charset=ISO-8859-9\">\n");
print ("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1254\">\n");
print ("</HEAD>\n");
print ("<BODY>\n");
print ("<FORM ACTION=\"$PHP_SELF\" METHOD=\"POST\">\n");
print (" Adınız, Soyadınız: <INPUT TYPE=\"TEXT\" NAME=\"adi\">\n");
print ("<BR>\n");
print (" Elektronik Adresiniz: <INPUT TYPE=\"TEXT\" NAME=\"adres\">\n");
print ("<BR>\n");
print (" Hangi notunuzu öğrenmek istiyorsunuz? \n");
print ("<BR>\n");
print ("<SELECT NAME=\"hangi_not[]\" MULTIPLE>\n");
print ("<OPTION>Sınav 1 \n");
print ("<OPTION>Sınav 2 \n");
print ("<OPTION>Ortalama \n");
print ("</SELECT>\n");
print ("<BR>\n");
print ("<INPUT TYPE=\"SUBMIT\" VALUE=\"Gönder Gitsin!\">\n");
print ("<INPUT TYPE=\"RESET\" VALUE=\"Vazgeç, Gönderme!\">\n");
print ("</FORM>\n");
print ("</BODY>\n");
print ("</HTML>\n");
}
?> 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.
Dosya "çıkartma"
Bir sunucuya, Web ziyaretçisi olarak
gönderebildiğimiz tek şey ise, Formlara yazdığımız yazılardır! Oysa HTML'in
INPUT etiketinin çok az kullanılan TYPE="file" parametresi ziyaretçiye Web
sunucusuna dosya gönderme (upload) imkanı sağlar. HTTP protokolü buna imkan
vermekle birlikte Browser'lar bu imkanı kullanmaya ileri sürümlerinde
kavuştular. PHP4, ziyaretçilerimizin sitemize dosya göndermeleri halinde, bu
dosyaların yönetimine ayrıca kolaylık sağlayan değişkenlere sahiptir. Önce şu
dosyayı, dosya_gonder.php adıyla kaydedin:
<HTML>
<HEAD>
<TITLE>PHP'de Dosya Gönderme</TITLE>
<meta http-equiv=\"content-type\" content=\"text/html; charset=ISO-8859-9\">
<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows-1254\">
</HEAD>
<?php
$dosya_dizin = "/inetpub/wwwroot/";
$dosya_url = "http://server/";
if ( isset ( $dosya_gonder ))
{
print ("<b>Yol:</b> $dosya_gonder<br>\n");
print ("<b>Adı:</b> $dosya_gonder_name<br>\n");
print ("<b>Boyut:</b> $dosya_gonder_size<br>\n");
print ("<b>Tür:</b> $dosya_gonder_type<br>\n");
copy ( $dosya_gonder, "$dosya_dizin/$dosya_gonder_name" )
or die ("Dosya kopyalanamıyor!");
if ( $dosya_gonder_type == "image/gif" ||$dosya_gonder_type == "image/pjpeg" )
{
print ("<img src=\"$dosya_url/$dosya_gonder_name\"><p>\n\n");
}
}
?>
</BODY>
<FORM ENCTYPE="multipart/form-data" ACTION="<?php print $PHP_SELF?>" METHOD="POST">
<INPUT TYPE="hidden" NAME="MAX_FILE_SIZE" VALUE="951200">
<INPUT TYPE="file" NAME="dosya_gonder"><BR>
<INPUT TYPE="SUBMIT" VALUE="Dosya Gönder!">
</FORM>
</BODY>
</HTML> Bu programda <INPUT TYPE="file"
NAME="dosya_gonder"> etiketinde kullandığımız NAME parametresine verdiğimiz
değer, ziyaretçimizin göndereceği dosyanın sunucu tarafından kaydedileceği
geçici dizinin tam yolunun yazılacağı değişkenin adı olacakdır. PHP, bu dosya
ile ilgili her türlü bilgiyi bu adla kaydedektir. PHP, ziyaretçiden bir dosya
başarıyla aktarıldığı anda otomatik olarak bu isimden yararlanarak şu
değişkenleri oluşturur:$dosya_gonder:Geçici kayıt dizini yolu (UNIX'te
/tmp/phpXXX, Windows'da Windows/TEMP0phpXXX. Burada XXX yerine ziyaretçilerin
gönderdiği dosyaların sıra numarasını göreceksiniz.)
- $dosya_gonder_name - Ziyaretçinin gönderdiği dosyanın
adı.
- $dosya_gonder_size - Ziyaretçinin gönderdiği dosyanın
boyutu.
- $dosya_gonder_type - Ziyaretçinin gönderdiği dosyanın türü
PHP ayrıca bu bilgileri $HTTP_POST_FILES
dizi-değişkeninde de tutar.Yukardaki programda şu iki değişken çok önemlidir:
$dosya_dizin = "/inetpub/wwwroot/";
$dosya_url = "http://server/";
$dosya_dizin adıyla oluşturduğumuz değişkene
vereceğimiz değer, ziyaretçinin göndereceği dosyanın kopyalanacağı klasörün adı
olarak kullanlacaktır. Sözgelimi Windows ortamında buraya kişisel Web sunucunun
varsayılan klasörünün adını yazabilirsiniz. Ziyaretçinin göndereceği dosya bir
GIF biçiminde grafik dosyası ise bunu Browser'da görünteleyeceğimiz için, bu
dizinin Web'e açık olması, başka bir deyişle bizim Web sunucumuzun erişebileceği
bir dizin olması gerekir. Nitekim, $dosya_url değişkenine değer olarak bu
klasörün URL adresini veriyoruz. Bu iki değişkeni gerçek Web sunucu için
yazacağımız zaman, bizim sunucumuzun varnaydığı fiziksel klasör adını ve yolunu
bulmamız gerekir. Bunu daha önce yazdığımız php.php veya formlar01.php
programlarını sitemizde çalıştırarak bulabiliriz.