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.
Harici Dosya (include)
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 metin harici dosya içerisinde bulunuyor"
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> Bu metin zaten program içerisinde tanımlıdır.</p>";
?>
</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.
Brower’da görüntüyü aldığınız sırada 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.
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;
?>
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>");
?>
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.
PHP4.0 ile, include komutu gibi işleyen ancak
ondan farklı olarak kendisini çağıran programa değer veremeyen require komutu da
kullanılabilir hale geldi. İçinde bir hesaplama bulunmayan veya kendisini
çağıran dosyaya bir return komutu ile bir değer dönmesini sağlaması beklenmeyen
dosyaları require komutu ile de ana programımıza dahil edebiliriz.
include ile alacağımız dosyaların adını PHP
programının oluşturmasını sağlayarak kimi zaman pogramlarımıza dinamizm
sağlamamız mümkündür. Sözgelimi bir menü maddesinin tıklanmasıyla harekete geçen
bir Javascript fonksiyonunun, ziyaretçinin gideceği sayfaya göndereceği değeri
include komutuna dosya adı oluşturmakta kullanabiliriz. Bazen include komutuna
dosya adı oluşturmakta program içindeki döngülerden yararlanınız. Örnek:
for ( $i = 1 ; $i <= 3 ; ++$i)
{
include ("dosya0" . $i . ".x");
}
Haricî dosyalarımızın adlarının dosya01.x, dosya02.x ve
dosya03.x olmalı halinde, bu döngü sırasıyla her üç dosyayı da çağıracak ve
altalta ana programa dahil edecektir.
PHP'de yukarıda ele aldığımız include ve require
komutları ve biraz sonra değineceğimiz dosya okutma ve yazdırma işlemleri
dolayısıyla bir dosyanın varlığı veya yokluğu, ya da bir dosyaya ait sandığımız
ismin bid klasöre ait olması, programımızın sağlıklı işleyebilmesi açısından
büyük önem taşır. PHP bu amaçla bize bir kaç kullanıma hazır fonksiyon sağlıyor.
Burada kısaca bu fonksiyonlara ve nasıl kullanıldıklarına değinelim:
Dosya var mı? file_exits()
Bir dosyanın var olup olmadığını denetleyen bu
fonksiyon, dosya varsa true/doğru, yoksa false/yanlış sonucunu verir. Örnek:
if ( file_exits ( "bir_dosya.txt" ) )
print ("Dosya var!");
Dosya yoksa, program "Dosya var!" yazmadan yoluna
devam edecektir.
Dosya mı, dizin mi? is_file() ve is_dir()
Kimi zaman klasörler de tıpkı dosyalar gibi
adlandırılabilir. Bir dizinde gördüğümüz ismin gerçekten bir dosyaya ait olup
olmadığını bu fonksiyonla sınarız. Sınama doğru, yani isim bir dosyaya ait ise
fonksiyon true/doğru, değilse false/yanlış sonuç verir. Örnek:
if ( is_file ( "bir_dosya.txt" ) )
print ("Bu bir dosyadır!");
İsim bir dosyaya ait değilse program "Bu bir
dosyadır!" yazmadan yoluna devam edecektir. Sınamayı ismin bir klasöre ait ait
olup olmadığına bakrarak da yaparız. Bu durumda is_dir() fonksiyonunu
kullanırız. isim bir dizine aitse fonksiyon true/doğru, değilse false/yanlış
sonuç verir. Örnek:
if ( is_dir ( "/bir_isim" ) )
print ("Bu bir dizindir!");
İsim bir dizine ait değilse program "Bu bir
dizindir!" yazmadan yoluna devam edecektir.
Dosya okunabilir mi? is_readable()
Programda kullanmaya karar vermeden önce bir
dosyanın erişilebilir ve PHP tarafından okunabilir olup olmadığını sınayan bu
fonksiyon, dosya okunabilir ise true/doğru, değilse false/yanlış sonuç verir.
Örnek:
if ( is_readable ( "bir_dosya.txt" ) )
print ("Bu dosya okunabilir!");
Dosya okunabilir değilse program "Bu dosya
okunabilir!" yazmadan yoluna devam edecektir. (Unix ortamında varlığını
görebildiğimiz her dosyanın okuma izni bulunmayabilir.)
Dosya yazılabilir mi? is_writable()
Programda kullanmaya karar vermeden önce bir
dosyanın yazılabilir olup olmadığını sınayan bu fonksiyon, dosya yazılabilir ise
true/doğru, değilse false/yanlış sonuç verir. Örnek:
if ( is_writable ( "bir_dosya.txt" ) )
print ("Bu dosyaya yazılabilir!");
Dosya yazılabilir değilse program "Bu dosyaya
yazılabilir!" yazmadan yoluna devam edecektir. (Unix ortamında varlığını
görebildiğimiz hatta okuyabildiğimiz her dosyanın yazma izni bulunmayabilir.)
Dosya çalıştırılabilir mi? is_executable()
PHP programında kimi zaman sunucunun kullanmamıza
izin verdiği haricî programları çalıştırız; PHP programımızın düzgün işlemesi bu
harici programa bağlı olabilir. Böyle bir programı çalıştırmaya karar vermeden
önce bir dosyanın çalıştırılabilir olup olmadığını sınayan bu fonksiyon, dosya
çalıştırılabilir ise true/doğru, değilse false/yanlış sonuç verir. Örnek:
if ( is_executable ( "bir_dosya" ) )
print ("Bu dosya çalıştırılabilir!");
Dosya çalıştırılabilir bir program değilse PHP
programı "Bu dosya çalıştırılabilir!" yazmadan yoluna devam edecektir. (Unix
ortamında varlığını görebildiğimiz her pprogram dosyasının çalıştırma izni
bulunmayabilir.)
Dosya boyutu : filesize()
Adını verdiğimiz dosyanın boyutunu byte olarak
bildirir: Örnek:
print ("Dosyanın boyutu:");
print filesize( "bir_dosya.txt" );
6.19.4.8. Dosyaya son erişim tarihi: fileadate(),
filemtime() ve filectime()
Adını verdiğimiz dosyaya son erişim tarihini
bildirir. ne var ki bu bilgi Unix'in "epoch" biçimindedir: Örnek:
print ("Dosyanın son erişim tarihi:");
$dosya_tarihi = fileadate( "bir_dosya.txt" );
print ( " $dosya_tarihi " );
Eğer bu dosyanın son erişim tarihi 28 Temmuz 2000,
Cuma 24:00:00 ise, PHP, Browser penceresine 964731600 yazacaktır. Bu komutun
ürettiği bilgiyi, date() fonksiyonu ile anlaşılabilir hale getirebiliriz:
print ("Dosyanın son erişim tarihi:");
$dosya_tarihi = fileadate( "bir_dosya.txt" );
print date("D d M Y G:i:s H", $dosya_tarihi );
Bu kez PHP Browser penceresine 28 Jul 2000
242:00:00 00 yazdıracaktır. Tarih verilerinin date() fonksiyonu ile
biçimlendirilmesini daha sonra ayrıntılı ele alacağız.
filemtime(), bir dosyanın son değiştirildiği
tarihi; filectime(), ise oluşturulduğu tarihi, yine Unix Epoch biçiminde
bildirir; bu verinin anlaşılır biçimde görüntülenmesi için PHP'nin date()
fonksiyonu kullanılır.
Dosyalar oluşturma ve silme
PHP ile yapabileceğimiz önemli dosya işlemlerinin
başında olmayan bir dosyayı oluşturmak ve olan bir dosyayı silmek gelir. PHP'nin
dosya oluşturma komutu touch() fonksiyonudur. Bu fonksiyona oluşturulmasıın
istediğimiz dosyanın adını vermemiz gerekir. Örnek:
<?php
$dosya_dizin = "/inetpub/wwwroot/";
touch ("$dosya_dizin/yeni_belge.txt");
print ("yeni_belge adlı bir dosya oluşturuldu!");
?>
Bu programı
kişisel Web sunucuda denerken yeni dosyanın oluşturulacağı dizin olarak "/"
işaretiyle sadece kökdizini belirtirseniz, dosya C: diskinde kökdizinde
oluşturulur. Bu programı gerçek sunucuda çalıştırabilmek için yazma/okuma izni
bulunan ve Web sunucunun erişebileceği bir dizinin adını vermeniz gerekir.
Örneğin:
<?php
$dosya_dizin = "/wwwroot/members/uNhM13Qnm/";
touch ("$dosya_dizin/yeni_belge.txt");
print ("yeni_belge adlı bir dosya oluşturuldu!");
?>
Bu komutla oluşturacağınız dosya içi boş bir metin
dosyası olacaktır. Eğer belirttiğiniz dizinde bu adı taşıyan bir dosya varsa,
PHP dosyanın içeriğine dokunmayacak, fakat dosyanın erişim ve değişim
tarihlerini değiştirecektir.
PHP ile mevcut bir dosyayı silmek için unlink()
fonksiyonunu kullanırız. Bu fonksiyon da silinecek dosyanın adı ile birlikte
yolunu ister. Örnek:
<?php
$dosya_dizin = "/wwwroot/members/uNhM13Qnm/";
unlink ("$dosya_dizin/yeni_belge.txt");
print ("yeni_belge adlı dosya silindi!");
?>
Bu komut Windows sistemlerinde işlemeyebilir.
Dosya açma
PHP'de bir dosyanın içeriğini alarak
sayfalarımızda kullanma veya bir dosyanın içeriğini değiştirmek gibi işlemler
için önce dosyanın açılmış olması gerekir. Bunu gerçekleştiren fopen()
fonksiyonudur. Bu fonksiyonla bir dosyayı okumak ('r'), yazdırmak ('w') veya ek
yapmak ('a') için açabiliriz. Bu fonksiyon dosyanın başarıyla açılması halinde
bir tamsayı verecektir. PHP programlarımızda, açılan dosyanın mutlata ona işaret
eden bir değişkene (file pointer) bağlı olması gerekir; daha sonra bu dosya ile
ilgili bütün işlemleri bu işaret değişkeni ile yaparız. Örnek:
$dosya = fopen( "bir_dosya.txt" , 'r' );
PHP, bu dosyayı sadece okumak amacıyla açacak ve
fonksiyondan dönen değeri $dosya değişkenine atayacaktır. Olmayan bir dosyayı
açmak istediğimiz zaman PHP hata mesajı verir. Bir dosyayı yazmak amacıyla
açacağımız zaman, bu kodu şöyle yazarız:
$dosya = fopen( "bir_dosya.txt" , 'w' );
Olmayan bir dosyayı yazmak amacıyla açmak istediğimizde PHP
önce bu dosyayı oluşturur. Bir dosyaya ek yapmak istediğimiz zaman ise kodumuz
şu şekilde yazılır:
$dosya = fopen( "bir_dosya.txt" , 'a' );
Olmayan bir dosyayı ek yapmak amacıyla açmak
istediğimizde PHP hata mesajı verir.
Bir fonksiyonu durdurmak
Bir PHP fonksiyonunun kendisinden beklenen işi
yapamaması halinde oracıkta durdurulmasını die() komutu sağlar. "Öl!" anlamına
gelen bu fonksiyona ekranda görüntülenmesini istediğimiz bir metni parametre
olarak verebiliriz. Bu bölümdeki örnekler bu komutla birlikte şöyle yazılabilir:
$dosya = fopen( "bir_dosya.txt" , 'a' ) or die ("Dosya açılamıyor!") ;
Bu komutu kişisel Web sunucusunda denerken,
dosyanın açılacağı dizinin yolunu belirtmemiz gerekir. Örneğin:
<?php
$dosya_dizin = "/inetpub/wwwroot/";
if ($dosya = (fopen ("$dosya_dizin/bir_dosya.txt" , 'r') ) )
{
print ("Dosya açıldı!");
}
else
{
print ("Dosya açılamadı!");
}
?>
PHP, bu dosyayı açtığında Browser penceresinde
dosyanın açıldığını belirten mesajı görüntülecektir. Bu işlemi Internet'teki bir
Web sunucuda uygulayabilmek için yazma/okuma izni bulunan ve Web sunucunun
erişebileceği bir dizinin adını vermeniz gerekir. Örneğin:
<?php
$dosya_dizin = "/wwwroot/members/uNhM13Qnm/";
if ($dosya = (fopen ("$dosya_dizin/bir_dosya.txt" , 'r') ) )
{
print ("Dosya açıldı!");
}
else
{
print ("Dosya açılamadı!");
}
?>
Açtığımız bir dosya ile yaptığımız bütün işlemler
bittikten sonra, dosyanın kapatılması gerekir. Dosya kapatma işlemini fclose()
fonksiyonu yapar. Bu fonksiyona parametre olarak dosya adını değil, dosyanın
işaretçisi olan değişkenin adını veririz. Örnek:
fclose ( $dosya );
Dosya okuma: fgets(), fread() ve fgetc()
Açtığımız bir dosyanın içindeki yazıları çoğu
zaman programımıza satır satır okuturuz. PHP'de bir dosyanın içeriğini satır
satır okutmamızı fgets() fonksiyonu sağlar. Bu fonksiyona daha önce açılmış olan
dosyanın işaret değişkenin adını ve okunmasını istediğimiz asgari byte ölçüsünü
parametre olarak veririz. fgets() fonksiyonu verdiğimiz uzunluk ölçüsüne
ulaşmadan önce dosyada bir yeni satır işareti görürse, veya dosyanın sonuna
ulaşırsa, okumaya son verir. Bu fonksiyonu çoğu zaman bir döngünün içinde
kullanırız. Ancak döngünün hata vermemesi için, PHP'nin dosyanın sonuna
ulaştığında döngüyü durdurmamız gerekir. fgets() fonksiyonunun okuyacağı satırı
bir fonksiyona değer olarak verebilir ve daha sonra bu değeri programlarımızda
kullanabiliriz. Örnek:
<?php
$dosya_dizin = "/inetpub/wwwroot/";
if ($dosya = (fopen ("$dosya_dizin/bir_dosya.txt" , 'r') ) )
{
print ("Dosya açıldı!<br>");
}
else
{
print ("Dosya açılamadı!");
}
while ( ! feof ($dosya ) )
{
$satir = fgets ( $dosya, 1024 ) ;
print ("$satir<br>");
}
fclose ($dosya);
?>
Bu program kişisel Web sunucuda önce varolan bir
dosyayı açıyor; ve bu dosyanın işaretçisi olarak $dosya değişkenini kullanıyor.
Daha sonra bir while() döngüsü içinde bu değişkeni ve 1 KB (1024 byte) ölçüsünü
parametre olarak vererek fgets() fonksiyonu ile dosyadan bir satır okutuyoruz.
fgets() fonksiyonundan dönen bir satırlık metni, burada $satir değişkenine
atıyoruz; ve daha sonra print() fonksiyonu ile bu satırı Browser penceresine
gönderiyoruz. Bu işlemi Internet'teki bir Web sunucuda uygulayabilmek için
yazma/okuma izni bulunan ve Web sunucunun erişebileceği bir dizinin adını
vermeniz gerekir. Bu işlemin içinde yapıldığı while() döngüsünün devam şartı
olarak kullandığımız ifadede yer alan feof() fonksiyonu bir dosyanın dosya-sonu
(end-of-file) durumuna ulaşıp ulaşmadığını sınar. PHP, her dosyanın sonunda yer
alan eof (Ctrl-z, ^z) işaretine eriştiği anda feof() fonksiyonu doğru/true
değerini verir. while() döngüsü, feof() doğru değilken devam etmek üzere
kurulmuş olduğu için, dosya sonuna ulaştığımızda döngü duracaktır. Okuma
işlemini durabilen bir döngüye bağlamazsak, fgets() PHP'nin bir programın sona
ermesi için verilmiş varsayılan süresi doluncaya kadar dosyayı okumak
isteyecektir.
Kimi zaman dosyalarımızın içeriğini satır-satır
okutmak yerine, kendi tayin edeceğimiz uzunlakta parçalar halinde okutmak
isteriz. Bunu, fread() fonksiyonu ile sağlarız. Örnek:
<?php
$dosya_dizin = "/inetpub/wwwroot/";
if ($dosya = (fopen ("$dosya_dizin/bir_dosya.txt" , 'r') ) )
{
print ("Dosya açıldı!<br>");
}
else
{
print ("Dosya açılamadı!");
}
while ( ! feof ($dosya) )
{
$paragraf = fread ( $dosya, 1024 ) ;
print ("$paragraf<br>");
}
fclose ($dosya);
?>
fread() fonksiyonu da daha önce açılmış olan
dosyanın işaret değişkenin adını ve okunmasını istediğimiz asgari byte ölçüsünü
parametre olarak alır. fread() fonksiyonu verdiğimiz uzunluk ölçüsüne ulaşmadan
önce dosyada bir yeni satır işareti görürse, veya dosyanın sonuna ulaşırsa,
okumaya son verir. Bu fonksiyondan yararlanırken, verdiğiniz uzunluk ölçüsünün,
almak istediğiniz metin parçasına uygun olduğunu sınamalısınız. fread(), bu
ölçüye ulaştığında okumayı keser. Buradaki örneği 1024 byte ölçüsünü
değiştirerek ve mesela 1, 2, 3 yaparak deneyebilir ve böylece vereceğiniz
ölçünün okunan metnin uzunluğunu nasıl tayin ettiğini görebilirsiniz.
fseek() ile ölçü belirleme
PHP'nin dosya işleminde kullabileceğiniz bir diğer
fonksiyonu fseek() adını taşır. Daha önce açılmış olan dosyanın işaret
değişkenin adını ve ve programın bu metin içinde zıplamasını istediğiniz
noktanın dosyanın başından itibaren byte değerini parametre olarak alan bu
fonksiyon ile, bir dosyanın içinnde istediğimiz yere gitme imkanı vardır. Örnek:
<?php
$dosya_adi = "/inetpub/wwwroot/bir_dosya.txt";
if ($dosya = (fopen ($dosya_adi , 'r') ) )
{
print ("Dosya açıldı!<br>");
}
else
{
print ("Dosya açılamadı!");
}
$dosya_boyut = filesize($dosya_adi);
$olcu = (int) ($dosya_boyut / 2 );
while ( ! feof ($dosya) )
{
$paragraf = fread ( $dosya, $olcu) ;
print ("$paragraf<br>");
}
fclose ($dosya);
?>
Burada, okutulacak dosyanın boyutunun yarısını
atadığımız $olcu değişkenini, okutulacak metnin ölçüsü olarak kullanıyoruz. Bu
durumda PHP, dosyayı iki paragraf halinde görüntüleyecektir.
Dosyalarımızın içeriğini satırlar veya belirli
ölçüde parçalar halinde değil de, tek-tek karakter olarak okutmak için fgetc()
fonksiyonundan yararlanırız. Bu fonksiyon, daima 1 byte ölçüsünde (bir karakter)
metin okuyabileceği için, parametre olarak sadece daha önce açılmış olan
dosyanın işaret değişkenin adını alır. Örnek:
<?php
$dosya_adi = "/inetpub/wwwroot/bir_dosya.txt";
if ($dosya = (fopen ($dosya_adi , 'r') ) )
{
print ("Dosya açıldı!<br>");
}
else
{
print ("Dosya açılamadı!");
}
while ( ! feof ($dosya) )
{
$karakter = fgetc ( $dosya ) ;
print ("$karakter<br>");
}
fclose ($dosya);
?>
Burada fgetc() fonksiyonundan dönen değeri (yani
dosyadan okunan bir karakteri), $karakter değişkenine atıyoruz ve daha sonra
print() fonksiyonu ba karakteri ve HTML'in satır bölme kodu olan <br> işaretini
Browser penceresine gönderiyor. Programı bu şekliyle sınarsanız, dosyadaki
metnin tek karakter olarak Browser penceresinin soluna dizildiğini göreceksiniz.
Programı <br> kodunu silerek çalıştırırsanız, bu kez dosyadaki metinde var olan
satır sonu işaretlerinin de kaldırıldığını ve metnin bir paragraf oülarak
görüntülendiğıini görebilirsiniz.
Dosyaya yazma ve ek yapma: fwrite() ve fputs()
Bir dosyaya yazma veya ek yapma, PHP açısından
aynı işlemdir; sadece dosyaların açılışında fark vardır. Hatırlayacaksınız, bir
dosyayı yazmak amacıyla açmak için:
$dosya = fopen( "bir_dosya.txt" , 'w' ) or die ("Dosya açılamıyor!") ;
ek amacıyla açmak için ise
$dosya = fopen( "bir_dosya.txt" , 'a' ) or die ("Dosya açılamıyor!") ;
kodunu yazmamız gerekir. Dana sonra yapılacak
yazma ve ekleme işlemlerinin farkı, 'w' parametresi ile açılan dosyaya yazma
işlemi en başından başlar ve devam eder; 'a' parametresi ile açaılan dosyaya
yazma işlemi ise en sondan başlar ve devam eder.
PHP'nin bir dosyaya metin yazdırma fonksiyonları
olan fwrite() ve fputs() aynı biçimde yazılır ve aynı işlevi yerine getirirler;
aralarında kesinlikle fark yoktur. Örnek:
<?php
$dosya_adi = "/inetpub/wwwroot/bir_dosya.txt";
$dosya = fopen ($dosya_adi , 'w') or die ("Dosya açılamadı!");
$metin = "Bu satır dosyaya yazılacak: Merhaba Dünya!\n";
fwrite ( $dosya , $metin ) ;
fputs ( $dosya , "Bu satır ise sonradan eklenecek\n" ) ;
fclose ($dosya);
?>
Bu programı çalıştırdığınızda, bir_dosya.txt adlı
dosyada mevcut bütün içerik silenecek ve yerini $metin değişkeninin içerdiği "Bu
satır dosyaya yazılacak: Merhaba Dünya!" yazısı ile "Bu satır ise sonradan
eklenecek" cümlesi alacaktır. Her iki metnin sonunda da yeni satır işareti
bulunduğuna dikkat edin. Bu programda dosya açma kıomutundaki 'w' parametresini
siler, yerine 'a' yazarsanız, bu metinlerin dosyanın içeriğine eklendiğini
görebilirsiniz.
Kullanımdaki dosyayı kilitleme
Web sunucusundaki dosyalarımızla sadece bir kişi
işlem yapıyor olsa idi, bir sorun olmazdı; ne var ki, bir Web sitesine aynı anda
birden fazla kişi eriyebilir ve dosyalarla işlem yapan programları çalıştırıyor
olabilir. Bu, PHP'nin dosya işlemlerine engel olabilir. Bu sebeple, işlem için
açacağımız bir dosyayı, önce kilitlemek yerinde bir önlem sayılır. Bunu, flock()
fonsiyonu ile yaparız; bu fonksiyona kilitlemek istediğimiz dosyanın işaret
değişkeninin adını ve kilit türünü belirten endeks sayısını parametre olarak
yazarız. Örnek:
<?php
$dosya_adi = "/inetpub/wwwroot/bir_dosya.txt";
$dosya = fopen ($dosya_adi , 'w') or die ("Dosya açılamadı!");
flock ( $dosya , 2); // dosyayı kilitle
$metin = "Bu satır dosyaya yazılacak: Merhaba Dünya!\n";
fwrite ( $dosya , $metin ) ;
fputs ( $dosya , "Bu satır ise sonradan eklenecek\n" ) ;
flock ( $dosya , 3); //dosyayı kilidini aç
fclose ($dosya);
?>
Bu fonksiyon ile kullanabileceğimiz
indeks
parametreleri şunlardır:
| 1 |
Paylaşım |
Diğer proseslerin dosyayı paylaşmalarına imkan verir |
| 2 |
Tam |
Diğer proseslerin dosyaile işlem yapmasına engel olur |
| 3 |
Serbest |
Dosyanın 1 veya 2 olan kilidini kaldırır |
Bir dosya, herhangi bir PHP programı tarafından
kilitlendiği anda, aynı dsyayı daha sonra kilitlemeye kalkan diğer programlar
kendilerinden önce konulmuş kilide saygı gösterirler.
Dizinlerle işlemler
PHP ile sunucuda, Web dizini olarak kullandığımız
alanda yeni dizinler oluşturabiliriz, silebiliriz, ve bunlar hakkında bilgi
edinebiliriz. Bu işlemleri Web sunucuda yapabilmek için Web dizininde okuma ve
yazma izni bulunması gerekir.
Dizin içeriğini listeleme: opendir() ve readdir()
Belirttiğiniz bir dizindeki tüm dosya ve alt-dizin
adlarını bir liste, hatta ilişkilendirilmiş hypertext (köprü, link) listesi
olarak sunabilmek için önce dizini içeriğini okuyabilmek için opendir()
fonksiyonu ile açmak, sonra da içindeki bilgileri readdir() fonksiyonu ile
edinmek gerekir. readdir() fonksiyonu dizinin içindeki alt-dizin ve dosyaların
adlarını sırayla, tek-tek okur. Bu fonksiyondan gelen bilgileri bir değişkene
atayarak ve bir döngü içinde yazdırarak, dizin listesi çıkartabiliriz. Örnek
<?php
$dizin_adi = "./";
$dizin = opendir ($dizin_adi);
while ( gettype ( $bilgi = readdir( $dizin ) ) != boolean )
{
if ( is_dir( "$dizin_adi/$bilgi" ) ) print " [Dizin] " ;
print ("<A HREF=\"$dizin_adi/$bilgi\">$bilgi</A><br>\n");
}
closedir ($dizin);
?>
Kişisel Web sunucuda sınama amacıyla
çalıştırabilmek için dizin adı olarak bu dosyanın içinde bulunduğu dizini
verebiliriz. opendir() fonksiyonu da okunmak amacıyla açacağı dizine işaret eden
bilgiyi bir değişkene yazmak zorundadır; bu işaret değişkenine burada $dizin
adını veriyoruz. $dizin değişkeninin işaret ettiği dizini okuyan readdir()
fonksiyonundan dönen bilgileri ise $bilgi değişkenine yazıyoruz. readdir()
fonksiyonu dizin bilgisini okumanının sonuna vardığında, bir dosya ve dizin adı
yerine doğru veya yanlış şeklinde bir mantıksal (boolean) değer verecektir;
buradaki while döngüsü $bilgi değişkeninin türünü gettype() fonksiyonu ile
sürekli sınayarak, henüz dizin ve dosya adı edinildiği sırada bu bilgileri
print() fonksiyonuna verecektir. Bu bilginin bir dizine ait olup olmadığını
is_dir() fonksiyonu ile sınayan if döngüsü ise bilgi bir dizine aitse, bu
bilgnin baştarafına "[Dizin]" kelimesini yazdıracaktır. (Bu programı
geliştirerek, önce dizinleri, sonra dosyaları yazabilen biçime getirmek
mümkündür)
Dizin oluşturma: mkdir()
PHP programlarımız gerektiğinde sunucunun yazma
yetkisi verdiği Web'e açık kök ve alt-dizinlerde yeni dizinler oluşturabilir.
Bunu, mkdir() fonksiyonu ile yaparız. Bu fonksiyona oluşturulacak dizinin adı ve
8 tabanlı (octal) sayı cinsinden ve önüne bir sıfır konarak dizinin
okuma/yazma/çalıştırma izinlerini belirten parametre verilir. Örnek:
mkdir ("deneme", 0777);
Burada yer alan 0777, bu dizinin herkes için okuma
ve yazma izni olduğunu gösterir. Bu parametre sadece Unix işletim sisteminde
çalışan sunucular için geçerlidir.
Dizin silme: rmdir()
PHP programlarımızda gerektiğinde sunucunun yazma
yetkisi verdiği Web'e açık kök ve alt-dizinlerde mevcut dizinleri silebiliriz.
Bunu, rmdir() fonksiyonu ile yaparız. Bu fonksiyona oluşturulacak dizinin adı
parametre verilir. Örnek:
rmdir ("deneme");
Bir dosya işlemi örneği: Konuk defteri
Böylece PHP ile "iş yapmak" için gerekli
araçlarımıza bir yenisini ekledik. Artık PHP programlarımızdan sabit diskteki
dosyalara ulaşmayı ve dosyalarla çalışmayı biliyoruz. Buraya kadar
öğrendiklerimizi bir PHP programı üzerinde uygulayabiliriz. Bunun için birlikte
bir konuk defteri yapalım.
Diyelim ki konuk defterimize sadece ziyaretçimizin
adını, elektronik posta adresini ve kısa bir mesajını isteyeceğiz. Öyle bir
sayfa yapalım ki; ziyaretçi bu sayfayı ilk kez açtığında, yani henüz Form'dan
sunucuya bir veri gelmemiş dolayısıyla $HTTP_POST_VARS dizi değişkenin içinde
değer bulunmadığı sırada, programımız bu durumu belirleyerek ziyaretçiye konuk
defteri Form'nu sunmalı; ziyaretçi formu doldurup gönder düğmesini tıkladığı
zaman programımız bir yandan ziyaretçinin gönderdiği bilgileri kendisine
gösterir ve teşekkürlerimizi aktarırken, diğer yandan da bu bilgileri bir
düzyazı programı girmeli. Bu sırada ziyaretçimize isterse defterimizdeki diğer
mesajları okuma imkanı da sunabilmeliyiz. Biraz uzunca olan şu programı
kd_01.php adıyla kaydedelim :
<?php
if ( isset ( $HTTP_POST_VARS ))
{
// Form dolduruldmuş ise
echo ("
<HTML>
<HEAD>
<TITLE>PHP'de Misafir Defteri</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>
<P><font SIZE='3' CLASS='s4' FACE='Arial, Helvetica'>
");
Programımızın buraya kadar olan bölümü, if ile
$HTTP_POST_VARS dizi değişkeninde değer bulunup bulunmadığına ilişkin sınamanın
olumlu sonuç vermesi halinde uygulanan bölümüne dahil. Burada dikkatini echo()
fonksiyonu ile birden fazla satır yazdırdığımız çekmiş olmalı. echo(),
fonksiyonuna Browser penceresine göndereceğimiz değerleri çift-tırnak içinde
yazacağımız için, HTML etiketlerinin çift-tırnak gerektiren etiketlerinde tek
tırnak kullandığımıza dikkat edin. if sınavının olumlu sonucuna ilişkin bölümü
yazmaya devam edelim:
$dosya_adi = "mesajlar.txt";
if (file_exists("$dosya_adi"))
{
$yazilacak_dosya = fopen($dosya_adi,'a');
}
else
{
$yazilacak_dosya = fopen($dosya_adi,'w');
}
foreach ($HTTP_POST_VARS as $anahtar=>$deger )
{
$yeni_anahtar = strtoupper($anahtar);
print ("$yeni_anahtar: $deger<br>");
$metin = "$yeni_anahtar: $deger<br>";
fputs($yazilacak_dosya, $metin);
}
fputs($yazilacak_dosya, date("D d M Y h:i:s"));
fputs($yazilacak_dosya, "<br>\n");
fputs($yazilacak_dosya, "<CENTER>
<img src='nokta.gif' WIDTH=100% HEIGHT=1 BORDER=0></center>\n");
fclose($yazilacak_dosya);
Konuk defteri programımız HTML için gerekli temel
etiketleri ürettikten sonra bu bölümde veritabanı dosyası olarak kullandığımız
mesajlar.txt isimli dosyanın bulunup bulunmadığını sınıyor; dosya varsa ek
yapmak için ('a'),dosya yoksa yazmak için ('w'), dosyayı açıyoruz. Sonra,
$HTTP_POST_VARS dizi-değişkenine Form'dan gelmiş olan anahtar=değer çiftlerinin
her birini (yani, Browser'dan gelen örneğin "adi" değişkeni ve bunun değeri olan
ismi) önce print() ile ziyaretçinin Browser'ına, sonra da fputs() ile biraz önce
açtığımız veritabanı dosyasına yazdırıyoruz. Fakat burada bundan önce Form'dan
küçük harf olarak gelen değişken adlarını (anahtarları) strtoupper() fonksiyonu
ile büyük harfe çeviriyoruz.Şimdilik bu fonksiyonun üzerinde durmayın; biraz
sonra metin düzenleme ve düzenli ifadeler konusuna geleceğiz. Ancak bu sırada
ziyaretçilerin mesajlarını daha sonra güzel görüntelemek için aralarına çizgi
olarak kullanmak üzere bir resim dosyasını IMG etiketi ile yerleştirdiğimize de
dikkat edin. Bu grafik dısyasının eni-boyu 1 piksel olduğu halde burada
ziyaretçinin Browser penceresinin eni kadar genişleterek çizgi üretmiş oluyoruz
:
echo ("
<HTML>
<HEAD>
<TITLE>PHP'de Misafir defteri</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>
<P><font SIZE='3' CLASS='s4' FACE='Arial, Helvetica'>
<CENTER><img src='nokta.gif' WIDTH=100% HEIGHT=1 BORDER=0></center>
Sayın: $adi<br>
Defterimi imzaladığınız için teşekkür ederim</P>
<p>Ana Sayfaya Dönmek için <A HREF=\"index.htm\"> tıklayın</A><BR>
Mesajları okumak için<A HREF=\"mesajlar.php\"> tıklayın</A>
</BODY>
</HTML>
");
}
Programımızın bu bölümünde, ziyaretçiye teşekkür
ediyoruz; ve isterse diğer mesajları okumak üzere tıkllayacağı köprüyü
sağlıyoruz. Mesajların çok uzaması halinde bu köprüyü bir sayfanın üstünde, bir
de altında vermekte yarar var. Şimdi, programımızın Form doldurulduktan sonra
işleyen bölümünü yazmış olduk. Taa en başta yaptığımız $HTTP_POST_VARS
dizi-değişkeninin değer içerip içermediğine ilişkin sınamanın olumsuz olması
halinde, prıogramımız, işe buradan başlayacaktır:
else {
echo ("
<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=\"$PHP_SELF\" METHOD=\"POST\">
<P><font SIZE='3' FACE='verdana, Arial, Helvetica'>
Defteri imzalamadan okumak için <A HREF='mesajlar.php'>
burayı tıklayın</a></FONT></P>
<P><font SIZE='3' FACE='Arial, Helvetica'>
Adınız, Soyadınız: <br><INPUT TYPE=\"TEXT\" NAME=\"adi\"><BR>
Elektronik Adresiniz: <br><INPUT TYPE=\"TEXT\" NAME=\"adres\"><BR>
Mesajınız:<BR>
<TEXTAREA NAME=\"mesaj\" ROWS=10 COLS=30 WRAP=virtual></TEXTAREA>
<BR><BR><BR>
<INPUT TYPE=\"SUBMIT\" VALUE=\"Defteri imzala!\">
<INPUT TYPE=\"RESET\" VALUE=\"Tümünü sil!\">
</FORM>
</BODY>
</HTML>
");
}
?>
Bu bölümde çift-tırnak işaretlerini değiştirmek
yerine, bunları ESC karakteri ile özel işaret değil, metin olarak ele alınacak
hale getirdik. Programımız burada yine echo() ile düz ve basit bir HTML Formu
oluşturuyor. Programın akış planını anlamış olmalısınız: ziyaretçi önce Form'u
dolduracak ve gönder düğmesini tıklayacak.
Bu ACTION, Form'da INPUT alanlarındaki değerleri
POST yöntemiyle yine kendisine gönderecek; böylece PHP, programı yeniden
çalıştırırken, bu kez en baştaki şartın yerine geldiğini (yani $HTTP_POST_VARS
dizi-değişkeninin değer içerip içermediğine ilişkin sınamanın olumlu sonuç
verdiğini) görerek, işe baştan baştan başlayacaktır. Bu, INPUT etiketinin
alanlarından oluşturulan değişkenlerden yararlanarak, ziyaretçiye bize
ulaştırdığı bilgileri ve bizim teşekkür mesajımızı yollamaktan ibarettir.
Program bu şekliyle ne güvenlik önlemlerine sahip,
yani kötüniyetli kişilerin INPUT alanlarına kötü niyetli kodlar yazmaları
halinde bunları ayıklıyor; ne de ziyaretçinin boş Form gönderip göndermediğini
sınıyor. Bu gibi işleri, PHP ile metin düzenlemeyi öğrendikten ve Düzenli
İfadeler denen kavramı ile tanıştıktan sonra yapacağız.