Php dosya okuma

Ceviz Viki, özgür ansiklopedi

Git ve: kullan, ara

Dosya işlemlerinden olan dosyadan okuma işlemi,genelde iki türlü yapılmaktadır. Birincisi; metin dosyasında bulunan bilgilerin tümünü çekip basmak, ikincisi ise satır satır çekmektir. İşe yarayan şekli ikinci şekli olan satır satır çekme işlemidir. Bu konumuz olan dosyadan okuma işlemi, metin arama motorlarının çalışmasında temel safhayı teşkil etmektedir. Bundan sebep, arama motorundaki mantığın dosyayı açıp okuması ve okuduğu bilgi sayesinde aradığımız kelimenin okunan kısmında bulunup bulunmadığını tespit etmek, bu konunun özünde saklıdır diyebiliriz. Şimdi burada satır satır çekme işlemini kullanmak için, while döngüsünden yararlanacağız ve buna paralel olarak !feof komutu ile fgets komutunu kullanacağız. Bu komutlardan !feof komutu çekilen bilgiyi bir döngü yardımıyla alıp, daha sonra döngü bittiğinde komutu durdurmaya yarar. fgets ise metin dosyasından bilgileri satır satır çekmeye yarar. Şimdi daha önceden oluşturduğumuz veri.db dosyasını çekip okuyalım bakalım. Alttaki kodu okuma01.php olarak dizininize kaydedin.

<?php
 
$dizin="/Apache/htdocs";
 
$dosya="veri.db";
 
$baglan=@fopen ("$dizin/$dosya",'r');
 
if (!$baglan) {
 
echo "veritabanını açamadım";
 
exit();
 
}
 
while (!feof ($baglan) ) {
 
$oku=fgets ($baglan,1024);
 
echo "$oku\n";
 
}
 
fclose($baglan);
 
?>

Bu kodu çalıştırdığımızda karşımıza veri.db adlı veritabanının içindeki bilgileri ekrana basan bir sonuç çıkacak. Komutun while kısmına kadar olanları geçmiş konularımızdan biliyorsunuz. Ben burada while komutundan sonra ekrana basılan sonucu anlatmak istiyorum. Konunun basında söylediğim gibi !feof komutu bir döngüyle bilgileri alır ve fgets ile de satır satır çekerek ekrana $oku değişkenine depolanan bilgiyi bastırdık. Komutun işleyiş tarzı bu. Biz burada while ile döngü işlemi kullanarak istediğimiz veritabanındaki bilgileri ekrana bastırdık. Aslında bu işlemin daha kolay yolu bulunmaktadır ancak daha kolay yoluna geçmeden önce fgets komutunda bir ayrıntıya yer vermek istiyorum. Bu komut her satır için minimum 1024 baytlık veri çeker. Zaten fgets komutunun şartında bunu böyle belirttik. Bunu unutmayın, eğer satırda 1024 bayttan daha az bilgi varsa bu sefer tüm satırı çeker.(Bu ayrıntıya da dikkat etmek gerekir.)

Şimdi bu kodlamanın daha kolay yolu olarak, fread komutunu kullanıcağız. Alttaki kodu okuma02.php olarak kaydedin.

<?php
 
$dizin="/Apache/htdocs";
 
$dosya="veri.db";
 
$baglan=@fopen ("$dizin/$dosya",'r');
 
if (!$baglan) {
 
echo "bir hata oldu";
 
exit();
 
}
 
$oku=fread ($baglan,filesize("$dizin/$dosya"));
 
echo "$oku";
 
fclose($baglan);
 
?>


Bu kodda ise filesize komut ile belirttiğimiz dosyanın tümünü ekrana bastırdık. Bakın burada while komutu kullanmadık ve döngüye göre daha pratik bir yazılım. Bu yüzden hangisini kullanmak isterseniz onu kullanın, aralarında bir fark yoktur. filesize komutundan sonra baytlık cinste yazabilirdik ama biz burada dizin belirterek istediğimiz dosyanın tümünü ekrana bastırdık. Gördüğünüz gibi fread komutu biraz daha pratik bir işleme sahip ama sonuç hiç değişmiyor. While komutundan da aynı sonucu aldık, fread komutunda da aynı sonucu aldık. Metin arama işlemleri adlı konumuzda arama motorunun scriptini yazarken bu dosyadan okuma scriptini çok kullanacağımızdan bu konuyu iyice kavramanız ehemmiyet arz ediyor. Arama motorunda ise farklı olarak ereg ve eregi komutlarını göreceğiz.

Aslında daha değişik yazılım türleri de var. Bunlar da aynı işlevleri görmektedir. Bakın aşağıdaki kod da aynı işlevi görmekte.

<?php
 
$dizin="/Apache/htdocs";
 
$dosya="veri.db";
 
readfile ("$dizin/$dosya");
 
?>

Bu kod da aynı işlevi görür, diğer yazdıklarımızdan hiç bir farkı yoktur ancak bu yazılım tüm dosyayı okur. Yani bir sınırlandırma yapamazsınız bu kodda. Kolay olarak tüm veritabanını çekmek için kullanılabilir ama belli bir miktarını okumak için bu kodu kullanamayız. Tabi bundan başka değişik şekilde kullanımlar da var ancak ben daha önemli olanı vermek istiyorum ilk olarak. Örneğin, bizim istediğimiz satırlar ekrana nasıl basılır? (yani istediğimiz satırları bastıracağız, istemediklerimizi bastırmayacağız ekrana). Bu önemli bir mevzu aslında. Bunun için yine döngülerden yararlanmamız gerekecek. Şimdi farklı bir veritabanı dosyası oluşturalım ve içine bazı bilgiler girelim. Aşağıdaki kodu bilgi.php olarak dizininize kaydedin.

<?php
 
$dizin="/Apache/htdocs";
 
$dosya="yeniveri.db";
 
if (!file_exists ("$dizin/$dosya") ) {
 
touch ($dosya);
 
}
 
$baglan=@fopen ("$dizin/$dosya",'a');
 
if (!$baglan) {
 
echo "dosyayı açamadım";
 
exit();
 
}
 
if (fputs ($baglan,"php\nasp\njsp\ncfml\n") ){
 
echo "veritabanına bilgi girişi yapıldı";
 
}else {
 
echo "veritabanına bilgi girişi yapılamadı";
 
}
 
fclose($baglan);
 
?>

Bu kodla yeniveri.db adında bir dosya oluşturduk ve içine bilgileri depoladık. Şimdi bu dosyayı çalıştırın ve veritabanına bilgi girişi yapıldı yazısını görün. Tamam. Bundan sonra, örneğin ilk 3 bilgiyi (4'üncüsünü bastırmayacağız) okuma yaptıralım sunucumuza. Bunun için gerekli scriptimiz aşağıda. Bu kodu bilgi02.php olarak dizininize kaydedin.

<?php
 
$dizin="/Apache/htdocs";
 
$dosya="yeniveri.db";
 
$oku=@fopen ("$dizin/$dosya",'r');
 
$sayac=0;
 
while ($sayac<=2) {
 
$a=fgets ($oku,filesize ("$dizin/$dosya") );
 
echo "$a";
 
$sayac++;
 
}
 
fclose($oku);
 
?>

Şimdi buraya dikkat arkadaşlar, burası çok önemli. İstenilen dosyamızı okuttuktan sonra, $sayac değişkenine rakamsal olarak '0' nesnesini depoladık,ve daha sonra while döngüsüyle 0 1 2 yani ilk 3 terimi ekrana basan döngü koşulunu yazdık. (burayı açıklayacağım) Daha sonra fgets komutuyla bilgilerimizi satır satır çektik, çekilen bilgiyi ekrana bastık, bu döngüyü artırarak bitirmemizi yazdık ve komutumuzu bitirdik. Bu kodu çalıştırdığınızda ekranda veritabanına yuklediğimiz php asp jsp ve cfml terimlerinden ilk 3 terimi ekrana basılır.Çünkü burada döngülerde anlattığımdan farklı olarak veritabanının içinin okunması mevzusu var. Ne kadar satır var ise o kadar çekebiliriz. Bu komutla biz 0,1,2 'inci satırları (yani ilk 3 satır demektir bu aslında) bastırdık. $sayac değişkenine '1' nesnesini de depolayabilirdiniz fakat bu sefer while koşuluna ilk 3 terimi çekmek için 3 yazmanız gerekecekti. Yani 1 2 3 yine ilk 3 terimdir, farkeden hiç bir şey yok, biz $sayac'a 0'ı depoladık ve koşula 2 yazdık, böylelikle yine ilk 3 terimi ekrana bastırmış olduk. Bu ayrıntıya dikkat etmekte fayda var. Dediğimiz gibi istediğimiz satırı okuyup istemediğimizi okumamayı bu metodla öğrenmiş olduk.

Bu konu ile ilgili verebileceğim son bilgiler olarak, bu dosyalama şekilleri sizin bilgisayarınızda sorunsuz olarak işleyecektir. Ancak İnternet ortamına verdiğiniz zaman bazı sorunlarla karşılaşacaksınız. Bunun en önemli sebebi ise, hosting firmalarının PHP'yi Linux türevi vermeleridir. Bu dosyaların işlemesi için FTP dizininizde dosyanın chmod ayarlarında değişiklik yapmanız gerekecektir. Normal bir metin dosyasını okuyabilmemiz için FTP dizininizde chmod ayarları genelde 600'dür. Bunu 755 yaparak bu sorundan kurtulabiliriz. Bunun için FTP dizininizde, dosyanızın üzerine sağ tıklayarak chmod ayarlarını girin ve oradan manual kısmına 755 yazın. Ardından 'ok' deyin. Tamam, şimdi dosyalarınızda bir sorun yaşamazsınız artık.