CODE]<?php
$metin = “Başkalarına yararlı olmanın sınırı yoktur!”;
function yazdir () {
print (”<h1>İşte metin: $metin </h1>”);
}
// Başka kodlar buraya girebilir
yazdir();
?>[/CODE]
Normal görünüşlü bir fonksiyon ve kendisinden önce tanımlanmış olan $metin adlı değişkenin tuttuğu değeri, kendisi göreve çağrıldığı anda Browser penceresinde görüntülemeye hazır görünüyor! Fonksiyonun dışarıdan argüman istemediğini, kullanacağı print() komutunun konusu olarak $metin değişkeninin değerini kullanacağını da anlıyabiliyoruz. Fakat bu programı çalıştırdığımızda karşımıza çıkan manzara çok farklı oluyor.
Fonksiyonun çalıştığını, yazdırması beklenen şeylerin ilk bölümünü yazdırmış olmasından anlayabiliriz. Fakat, $metin değişkeninin değeri nerede? Şimdi bu sorunun cevabını biliyoruz: $metin değişkeni fonksiyonun kapsama alanı (scope) dışında! Bir fonksiyon kendisine verilmeyen veya kendi içinde tanımlanmayan bir değişkeni kullanamaz; bilemez, değerinden haberi olmaz. Nitekim bu görüntüyü aldığınız sırada kaynak kodlarına bakarsanız, “<h1>..</h1>” etiketlerinin arasında sadece “İşte metin:” kelimelerinin bulunduğunu göreceksiniz.
Bir fonksiyonun dışında tanımladığımız değişkenlerimizi fonksiyona tanıtabilmek için global deyimini kullanırız; böylece değişken bütün program boyuinca küresel nitelik kazanmış olur:
function yazdir () {
global $metin;
print (”<h1>İşte metin: $metin </h1>”);
}
Bu noktada dikkat etmemiz gereken şey, global deyimi ile kendisine kullanılmak üzere verilen değişken, artık bir bakıma fonksiyonun malı olur ve fonksiyon tarafından değeri değiştirilebilir. Bütün program boyunca kullanmaya niyetli olduğunuz global değişkenlerin, kullanımına verildiği fonksiyon tarafından değiştirilip-değiştirilmediğine dikkat edin.
Bir değişkenin bütün programda gerekli olmadığı ve sadece bir fonksiyon içinde kullanılacağı durumlarda bu değişkeni fonksiyonun içinde tanımlamak daha doğru olur. Fakat daha önce belirttiğimiz gibi fonksiyonların içinde tanımlanan değişkenler fonksiyon çalışırken var olur; fonksiyon sona erdiğinde de ölür. Başka bir deyişle, bir fonksiyonun içinde oluşturduğumuz bir değişkenin fonksiyon sona erdiğinde sıfırlanmaması için bir çare olması gerekir. Bu çarenin adı, static deyimidir. Şöyle bir örnek düşünelim: Sitemizdeki bir hesaplama fonksiyonu ziyaretçilerimizin yeni alışverişlerinin toplamını eski toplama ekleyerek, yeni ana toplamı buluyor ve ziyaretçi alışveriş sepetine yeni bir mal ekledikçe, ve o andaki ana toplamın ne olduğunu öğrenmek istedikçe, fonksiyonumuzun eski ana toplamı hatırlaması gerekiyor. Şu andaki PHP bilgimizle böyle bir program yazmaya kalkmayalım;
<?php
function saydir () {
static $sayi = 0;
$sayi++;
print (”<h3>Fonksiyonun tuttuğu sayı: $sayi </h3>”);
}
// Başka kodlar buraya girebilir
print (”<h2>Fonksiyonun birinci kez çağrılması:</h2>”);
saydir();
print (”<h2>Fonksiyonun ikinci kez çağrılması:</h2>”);
saydir();
print (”<h2>Fonksiyonun üçüncü kez çağrılması:</h2>”);
saydir();
print (”<h2>Fonksiyonun dördüncü kez çağrılması:</h2>”);
saydir();
?>
Bu programı, static deyimi olmadan çalıştıracak olursak, saydir() fonksiyonu her çağrıldığında $sayı değişkeninin baştan tanımlandığını ve bir türlü 1′den ileri gidemediğini göreceğiz. static ise fonksiyon bittikten sonra $sayi değişkeninin değerinin değişmeden kalmasını sağlayacaktır.
Şimdi, bir PHP programının gerektirdiği hemen herşeyi görmüş olduk; sadece iki özel araç, dizi değişkenler ve nesneler (Objects) kaldı. Bunları da gelecek bölümde ele aldıktan sonra, PHP’yi gerçek ortamda, Web’de kullanmaya başlayabiliriz.
Browser bilgilerini çekme
<?php
foreach ($GLOBALS as $anahtar=>$deger ) {
print ($anahtar . ” = ” . $deger . “<br>”);
}
?>
Ş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
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.
<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...mtac@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.
<?php
print (”Sayın <b>$adi</b>\n\n”);
print (”<p>Elektronik adresiniz: <b>$adres </b></p>\n\n”);
?>
Ş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.
<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:
<?php
foreach ($HTTP_GET_VARS as $anahtar=>$deger ) {
print (”<b>$anahtar = $deger <br>\n”);
}
?>
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_no t=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.
Ş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.
<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.
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>\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;
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?)
PHP ile HTTP Başlıklarının Kullanımı
Bu kitapçık HTTP başlık fonksiyonlarını anlatmak amacında olmayıp bu geniş konu hakkında sadece pratikte bilgi aktarmakla yetinecektir.
Bir web tarayıcı bir web sunucuya bir döküman istediği gönderdiğinde web sunucu istenilen dökümanın yanısıra header(başlık) adı verilen bazı açıklayıcı ve yönlendirici bilgiler de gönderir. Konuyu örneklerle açıklamaya çalışalım.
header(”Pragma: no-cache”);
header(”Cache-Control: no-cache, must revalidate”);
PHP, dinamik içerikli web siteleri oluşturmak amaçlı kullanıldığı için kimi zaman bazı sayfaların web tarayıcının cache denilen ara belleğinde saklanmaması daha doğru olmaktadır. Bu, özellikle yüksek güvenlik gerektiren ve çok sık değişen siteler için gereklidir. Yukarıdaki kod parçası kullanıldığı PHP betiğinin çıktısının cache denilen ara bellekte saklanmasını engellemek amacı ile kullanılır.
header(”Location:
http://www.php.org.tr”);
Bu kod parçası ise dökümanın herhangi bir yerinde, kullanıcıdan hiç bir girdi almaya ihitiyaç duymadan aktif adresi değiştirmeye yarar. Çok sık kullanılır ve özellikle bir login ekranından sonra girilen bilgiye göre karar vererek aktif adresi değiştirmek gibi uygulamalar için faydalıdır.
Örnek vermek gerekirse… login.html adlı bir HTML dökümanımız olduğunu varsayalım. Bu HTML dökümandan alınan girdi “karar.php” adlı PHP betiğinde işlenecek ve girilen
bilgiye göre adresi değiştirecektir.
[/CODE]<html>
<head>
<title> Login Form </title>
</head>
<body>
<form action=”karar.php” method=”post”>
<input type=”text” name=”kullanici_adi”><p>
<input type=”password” name=”sifre”><p>
<input type=”submit” name=”submit” value=”Tamam”>
</form>
</body>
</html>[/CODE]
Bu sayfadan alınan girdiler kullanici_adi ve sifre seklindedir. Bu bilgileri karar.php dosyasında inceleyerek karar veriyoruz.
// başındaki ve sonundaki boşlukları yok ediyoruz.
$kullanici_adi = trim($kullanici_adi);
$sifre = trim(sifre);
if ($kullanici_adi == “umut”) {
if ($sifre = “bu_bir_sifredir”) {
header (”Location : giris_basarili.php”);
}
}
header (”Location : giris_basarisiz.php”);
Yukarıdaki kod parçasında kullanıcı adı ve şifrenin doğru olup olmadığı kontrol edildikten sonra eğer her iki bilgi de doğru ise giris_basarili.php adlı döküman çağrılıyor. Eğer bu bilgilerden herhangi birisi doğru değilse giris_basarili.php betiği çağrılmayacak ve dolayısı ile aktif adres, koşulsuz çağrılan giris_basarisiz.php dosyası olacaktır.
Yukarıdaki örnekte dikkat edilmesi gereken bir nokta vardır. header (”Location………”); kullanımı sadece kendisinden önce ekrana bir çıktı yapılmadığı durumlarda çalışacaktır.