|
Nesne yönelimli (Object-oriented)
programlama icad edildiğinde, geleneksel programlamaya aşina olanlar
önce tereddüt ettiler; sonra bunun ne harika bir teknik olduğnunu
gördüler ve nesnelerden vazgeçmez oldular. Kabaca tanımlarsak, nesne,
kendi değişkenleri ve icra edeceği komutlardan oluşan fonksiyonları ile
bir bütündür. Nesneyi bir kere tanımladıktan sonra istediğimiz kadar
örneğini oluşturabiliriz. Bir nesnenin yapacağı işten, o nesnenin metodu
diye söz ederiz. Bu açıdan bakarsanız, programlarımızda nesneler sadece
metodları için işe yararlar.
Diyelim ki programımızda bir "öğrenci"
nesnesi oluşturmak istiyoruz. Bu nesnenin içinde adı, soyadı ve notlar
gibi değişkenler, ve bu değişkenlerle yapılan bir takım işler bulunsun.
İşe nesnenin tabir yerinde ise şablonu olan class'ı oluşturmakla
başlayalım; gerisini de yaptıkça görelim.
Bir nesne oluşturmak için önce onu
tanımlamamız gerekir. Bunu PHP'nin class deyimini kullanarak
yapabiliriz. Bir nesnenin özellikleri (properties) ve metodları (methods)
vardır. Şu kodu nesneler01.php adıyla kaydedin:
<HTML>
<HEAD>
<TITLE>PHP'de Degiskenler</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>
<B>
<H2>
<?php
class ogrenci {
// özellikleri tanımlayalım
var $adi;
var $soyadi;
var $sinav1;
var $sinav2;
var $not;
// metodları tanımlayalım
function adi_belirle ($n) {
$this->adi = $n;
}
function soyadi_belirle ($n) {
$this->soyadi = $n;
}
function sinav1_belirle ($n) {
$this->sinav1 = $n;
}
function sinav2_belirle ($n) {
$this->sinav2 = $n;
}
function not_hesapla() {
$this->not = ($this->sinav1 +
$this->sinav2)/2;
print ($this->adi. " " . $this->soyadi . "
için not ortalaması: ". $this->not);
}
}
//Buraya başka kodlar girecek
$ogr1 = new ogrenci();
$ogr1 -> adi_belirle("Şahika");
$ogr1 -> soyadi_belirle("Tabak");
$ogr1 -> sinav1_belirle(7);
$ogr1 -> sinav2_belirle(10);
$ogr1 -> not_hesapla();
?>
</H2>
</B>
</BODY>
</HTML>
Bu programda ogrenci adlı bir nesne
tanımlıyoruz; ve daha sonra bir değişken adına new komutu ile bu
nesnenin bir örneğini oluşturuyoruz. Nesnelerin yeni bir örneği veya
kopyasını çıkartmak ifadeleri aslında yaptığımızı tam anlatmıyor.
Nesnenin tanımı bir adet; her new komutu ile bu nesnenin
özelliklerine ve metodlarına sahip yeni bir nesne yapmış oluyoruz.
Nitekim bu işe insanın dilini dolayan İngilizce bir kelimeyle
Instantiation (yeni bir varlığını oluşturma) deniyor. Bu örnekte,
$ogr1 adlı değişken gerçekte, ogrenci nesnesinin tam bir
örneği: içinde beş değişken ve altı metod var. Nesneyi bir kere
tanımladıktan sonra programın daha ileri aşamalarında bu istediğimiz
kadar örneğini farklı isimler vererek oluşturabiliriz. Şimdi şu satıra
dikkat edelim:
$ogr1 = new ogrenci();
$ogr1 -> adi_belirle("Şahika");
Burada $ogr1'in parametrelerine nasıl
değer yazdırdığımızı görüyorsunuz. Nesnenin metodlarından biri olan
adi_belirle fonksiyonuna bir değer veriyoruz: "Şahika"; nesne
oluşturulurken yazılmış olan bu fonksiyon ise aldığı değeri, kendi ait
olduğu nesnenin bir değişkenine kaydediyor:
function adi_belirle ($n) {
$this->adi = $n;
}
Bu ve diğer fonksiyonlarda kullandığımız
"$this->" ifadesi, kendisine ulaştırılan değeri bir parametre olarak
kullanıyor ve "$adi" değişkenine yazıyor. "this" (bu) kelimesi o anda
nesnenin o anda oluşturulmakta olan örneğine göndermede bulunur. "->"
işlemcisini kullanarak, istediğimiz nesnenin istediğimiz metoduna veya
parametresine değer gönderebiliriz. Bir nesnenin yeni bir örneğini
oluşturduğumuz zaman, bu örneğin bütün parametrelerini sağlamak veya
bütün metodlarını kullanmak zorunda değiliz.
Yukarıdaki örneğe göre yeni örnekler
oluşturarak en az dört öğrencinin not ortalamasını hesabedebilir
misiniz?
PHP ile Web programcılığı yolunda hızlı
adımlarla yol alıyoruz. Bu bölümde gördüğümüz dizi değişkenler ve
nesneler, Web sayfalarımızda bir çok işi adeta otomatik hale getirecek
unsurlar olarak kullanılacak.
PHP İşbaşında
PHP'de bir programı oluşturmaya ve
programın akışını kontrol etmeye yetecek kadar bilgi sahibi olduk. Bu
bölümde, bu bilgilerimizi uygulamaya koyacağız; ve bu arada halâ
öğrenmemiz gereken bir iki noktaya ayrıntılı olarak değineceğiz.
Özellikle metinlerin düzenlenmesi konusuna bakmamız ve ve Düzenli
İfadeler (Regular Expressions) denen kavramla tanışmak ve bunun
araçlarını öğrenmek zorundayız. PHP'nin işbaşında olması demek, PHP
bilgimizi HTML sayfalarımızı PHP ile oluşturma, Form bilgilerini
derleme, bir veritabanından veri alarak bunları sayfalarımızda kullanma
ve ziyaretçinin vereceği bilgileri veritabanına işleyebilmek demektir.
Şimdi kolları yeniden sıvayalım ve PHP'yi uygulamaya koyulalım.
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
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ü
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>
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:
<php00021.tif>
Ş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.
<php00022.tif>
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
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:
<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.
<php00023tif>
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.
//////////////////////////////KUTU/////////////////
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
/////////////////////KUTU BİTTİ////////////
Ş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
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:
<?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.
<php00024.tif>
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.
<?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");
}
}
?>
Ş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. (Bizim örneğimizde bu değişkenin değeri
nedir?)
/////////////////KUTU/////////////////
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:
<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:
<php00025.tif>
//////////////////KUTU BITTI//////////
Web programıcısı olarak ziyaretçinin bize
göndereceği bilgileri yakalamayı öğrendik. Şimdilik sadece ziyaretçinin
Browser'ına geri gönderdiğimiz bu bilgileri, sunucu tarafından çeşitli
işlemlerde kullanabiliriz. Bu işlemlerin başında dosya girdi/çıktı
işlemleri gelir. Başka bir ifade ile ziyaretçiden aldığımız bu bilgileri
sunucuda bir dosyaya yazdırabiliriz. Bu bölümde PHP ile sunucuda
yapabileceğimiz dosya işlemlerine bakacağız. Tabiî dosya işlemleri
dendiğinde sadece ziyaretçiden aldığımız bilgileri bir dosyaya
yazdırmakla yetinmeyeceğiz; PHP programlarımıza sunucuda bir dosyada
bulunan bilgileri okumasını da öğreteceğiz.
PHP programlarımızda bilmemiz gereken ilk
dosya işlemi, bir PHP programına, kendi dışındaki dosyayı, tabir yerinde
ise, okutmak ve içindekileri aynen alıp, görüntülemesini sağlamaktır.
Bunu include komutu ile yaparız. Bu komut, kendisine adı verilen
düzyazı dosyasının içeriğini aynen bu komutun bulunduğu noktaya "yazar."
Bu yolla bir PHP programına sık kullandığınız bir metni veya program
parçasını dahil edebilirsiniz. Bir güvenlik önlemi olarak bu tür
dosyaların uzantılarını, sunucu ve Browser'ların tanıdğı MIME türlerine
ait uzantılardan farklı yaparsanız, ziyaretçiler şans eseri de olsa bu
dosyaları doğruca edinme imkanı bulamazlar. Bir örnek yapalım. Önce şu
metni, harici_dosya01.x adıyla ve düzyazı biçiminde kaydedin
(Windows ortamında Notepad'i kullanıyorsanız, dosya adı uzatması olarak
.x harfinden sonra .txt harflerini eklediğine dikkat
edin!):
"Ben harici bir dosyanın içindeki
yazıyım.. Beni bir PHP programı alıp buraya getirdi! Kendisine teşekkür
ederim"
Sonra, şu programı dosya_ekle01.php
adıyla kaydedin, ve Browser'da açın:
<HTML>
<HEAD>
<TITLE>PHP'de Harici Dosya Ekleme</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
include ("harici_dosya01.x");
print ("\n<p> Ben zaten bu programının
içinde olan bir yazıyım. Baştan beri burada olduğuma çok memnununum..
Harici dosyaya hoşgeldin diyorum!</p>");
?>
</BODY>
</BODY>
</HTML>
Buradaki include komutu biraz önce
yazdığımız harici dosyayı alacak, içeriğini aynen kendi bulunduğu
noktada, PHP'nin oluşturacağı HTML dosyasına katacaktır. Bu programı
çalıştırdığınızda görüntü şöyle olacaktır:
<php00026.tif>
Bu görüntüyü aldığınız sırada
Browser'ınızda kaynağı görüntülerseniz, iki metnin adeta birleştirilmiş
olduğunu göreceksiniz. Fakat dışardan PHP programına sadece düz metin
eklemeyiz; program veya fonksiyon da ekleyebiliriz. Harici dosyada şu
değişikliği yaparak, harici_dosya02.x adıyla kaydedin.
<?php
print ("Ben de harici dosyayım.!<br>");
print ("Ama ben hesap da yaparım.. Örneğin
iki iki daha ". (2 + 2). " eder!");
?>
Haricî dosya okuyan programı da programı
içinde, okunacak dosya adını düzelttikten sonra dosya_ekle02.php
adıyla kaydedin; ve çalıştırın.
<php00027.tif>
Haricî dosyamızda yer alan ...iki iki
daha ". (2 + 2). " eder!"); şeklindeki ifadenin programa gelirken
"..iki iki daha 4 eder!" şekline gelmesinin izahı, PHP'nin dışarıdan
aldığı dosyanın içinde PHP programı olduğunu gördüğü anda, bu dosyanın
içeriğini metin olarak değil, program olarak ele almasıdır. Bu yolla,
PHP programlarımıza bir değerin dönmesini de sağlayabiliriz. Haricî
dosyamızda şu değişikliği yapalım ve harici_dosya03.x adıyla
kaydedelim:
<?php
$sonuc = ( 2 + 2 );
return $sonuc;
?>
Bu satır bakalım programa dahil olacak mı?
Sonra, program metninde şu değişlikliği
yaparak, dosya_ekle03.php adıyla kaydedin ve çalıştırın:
<?php
$donen_sonuc = include("harici_dosya03.x");
print ("\n<p> Harici dosyadan dönen sonuç:
$donen_sonuc </p>");
?>
<php00028.tif>
Haricî dosyamızın içindeki program,
return komutu ile sadece kendi içinde elde ettiği sonucu, onu
çağıran programa verdi; ve bu sonucu alan programımız, sadece kendi
içindeki bir değişkenin değerini Browser'a gönderdiği halde, bu değer
haricî dosyadan alınmış oldu.
Haricî dosyaların include yoluyla
PHP programlarımıza katılması, özellikle bir sitenin bir çok programında
sık sık kullanılan metinlerin ve hesaplamaların bir kere yazılmasını ve
tek satırla çağrılmasını sağladığı için kolaylık sağlar ve hata
ihtimalini azaltır.
//////////////KUTU//////////////
|