Php Formlar
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:
Kod:
<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 programı kişisel bilgisayarınızda, kişisel Web sunucuda çalıştırıyorsanız, aynı
programın gerçek bir Unix-tabanlı Web sunucuda (Apache) nasıl sonuç verdiğini
http://www.mycgiserver.com/~ocal/formlar01.php adresinde görebilirsiniz. Sunucu'nun
oluşturduğu diğer değişkenleri ise
http://www.mycgiserver.com/~ocal/php.php adresinde
inceleyebilirsiniz.)
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:
Kod:
<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> Elektronik 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. Bu sayfa, Browser'da
şöyle bir görüntü verecektir:
Ş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:
Kod:
<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:
Kod:
<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 Gitsin!">
<INPUT TYPE="RESET" VALUE="Vazgeç, Gönderme!">
</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:
Kod:
<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:
Kod:
<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 Gitsin!">
<INPUT TYPE="RESET" VALUE="Vazgeç, Gönderme!">
</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 (bunu nasıl
yapabilirsiniz?), "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:
Kod:
<?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 (nasıl?), her
iki metodla gönderilen verileri işleme yeteneğine sahip bir program elde etmiş oluruz.
Kod:
<?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:
Kod:
<?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=ISO8859-9\">\n");
print ("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows1254\">\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=ISO8859-9\">\n");
print ("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=windows1254\">\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. (Bizim örneğimizde bu değişkenin değeri nedir?)
Dosya "çıkartma"
Internet'ten hep dosya "indiririz!" Bir sunucuya, Web ziyaretçisi olarak
gönderebildiğimiz tek şey ise, Formlara yazdığımız yazılardır! Oysa HTML'in INPUT 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:
Kod:
<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 Yolla!"> </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. (Nasıl?) Sözgelimi,
http://www.mycgiserver.com/~ocal/ adresindeki sitenin fiziksel adresi ile bu adresin URL'ini dikkate alarak bu iki değişkeni
yazmış olsaydık, şunu yazacaktık: $dosya_dizin = "/wwwroot/mycgiserver.com/members/uNhM13/"; $dosya_url = "http://www.mycgiserver.com/~ocal/"; Bu uygulamayı kendi sunucunuzda yapmak isterseniz, mutlaka bu iki değişkeni
doğru yazmanız gerekir.
http://www.mycgiserver.com/~ocal/ dosya_gonder_server.php
programı ile bir dosya gönderme (upload) işleminin sonucu şöyle:
Düzenle Kullanıcı Tarafından 13 Aralık 2016 Salı 10:35:59(UTC)
| Sebep: Sebep Bildirilmesi