Php Makaleler

TreXiaNos
26-05-2009, 12:25   |  #1  
OP Üye
Teşekkür Sayısı: 0
85 mesaj
Kayıt Tarihi:Kayıt: May 2009

Kendi Makalelerimi ve Arşivimdekileri Bu Başlık Altında Yazıyorum.


PHP5 Exceptions-İstisnalar -Bilgi

PHP 5 ile birlikte hataları kontrol etmek için nesneye yönelik bir yaklaşım ortaya çıktı.

Hata ayıklama durumları hata oluştuğu anda işletilecek kodun normal akışını değiştirerek yönetilmesini sağlamaktadır.Buna ististan yönetimi adı verilir.

İstisna tetiklendiği anda şu aşamalar gerçekleşir;

Varolan kod durumu kaydedilir.
Kod işletimi önceden tanımladan hata ayıklama bloğuna atlayacaktır.
Duruma göre , hata ayıklama sonunda , ya en son işletilen kod bloğuna yeniden dönerek devam edecek, yada hata ayıklama bloğunda belirtilen aşamadan devam edecektir.
Şimdi farklı hata ayıklama yöntemlerini inceleyelim:

Basit istisna kullanımı
Özel istisna ayıklayıcı tasarlamak
Çoklu istisnalar
Tekrarlı istisna göndermek
Yüksek seviye istisna ayıklayıcı ayarlamak
Note: İstisnalar yanlızca hatalı oluşması durumunda kullanılmalıdır.Ayrıca kodun herhangi bir noktasına atlaması için kullanılmamalıdır.


--------------------------------------------------------------------------------

Basit Exception(İstisna)
Bir istisna fırlatıldığında , devamındaki kod çalışmaya devam etmez, PHP gönderilen parçada catch ifadesi arar. catch ifadesi throw edilen istisnayı yakalar..

Eğer istisna hedefte yakalanamazsa , fatal error(ölümcül hata) oluşur.Hata notu Uncaught Exception - Yakalanamayan istisna olarak görülür.

Şimdi yakalanmayan bir istisna tasarlayalım;

<?php
//istisna fonksiyonu tanımlayalım
function checkNum($number)
{
if($number>1)
{
throw new Exception( Değer 1 veya birden az olmalı );
}
return true;
}

//istisnayı tetikle
checkNum(2);
?>


The code above will get an error like this:

Fatal error: Uncaught exception ’Exception’
with message ’ Değer 1 veya birden az olmalı ’ in C:\\webfolder\\test.php:6
Stack trace: #0 C:\\webfolder\\test.php(12):
checkNum(28) #1 {main} thrown in C:\\webfolder\\test.php on line 6


Throw ve catch İfadeleri
Yukarıdaki gibi hatalarla uğraşmamak için ,uygun bir istisna yönetimi tasarlamamız gerekir.

Uygun bir istisna aşağıdaki ifadeleri içerir:

1. Try - istisna tanımlanan fonksiyon try bloğunda bulunur.İstisna gönderilmezse,kod çalışmaya devam etmez.İstisna tetiklenirse , try bloğundan fırlatılır ve adrese yönelir.

2. Throw -İstisnanın tetiklediği bloktur.Her throw ifadesi en az bir catch ifadesine sahip olmalıdır.

3. Catch - catch bloğu istisnanın yakalandığı ve tetiklendiği şekilde çalıştırıldığı bloktur.

Bir İstisna yi geçerli bir kod ile tetikleyelim:

<?php
//istisna fonksiyonu oluşturalım
function checkNum($number)
{
if($number>1)
{
throw new Exception( Değer 1 veya daha az olmalıdır. );
}
return true;
}

// try bloğunda istisnayı tetikleyelim
try
{
checkNum(2);
//istisna fırlatıldığında,bu kod çalışmayacaktır.
echo ’Bunu görüyorsanız,değer 1 den kucuk demektir’;
}

//İstisna yakala
catch(Exception $e)
{
echo ’Message: ’ .$e->getMessage();
}
?>


Kod aşağıdaki gibi bir hata mesajı yayınlayacaktır:

Message: Değer 1 veya daha az olmalıdır


Example explained:
Yukardaki kod, istisya fırlatır ve yakalar;

1. checkNum() fonksiyonu yaratıldı. Fonksiyon değerin 1 den büyük yada küçük olduğunu denetler.Ve istisna fırlatılır.

2. checkNum() fonksiyonu try bloğunda çağırıldı.

3. checkNum() daki istisna fırlatıldı

4. catch bloğu istisnayı ele alır ve istisna bilgilerini içeren $e nesnesini yaratır.

5. İstisna nesnesi tarafından getMessage() fonksiyonu ile hata mesajı yayınlanır.


--------------------------------------------------------------------------------

Custom Exception(İstisna) Sınıfları Oluşturmak
Özel istisna sınıfları oluşturmak son derece basittir. PHP de oluşacak hataları yönetmek için fonksiyonlar içeren sınıf oluşturuyoruz.

Özel istista sınıfımız PHP istisna yönetim sınıfından kalıtılır,ve tüm özelliklerini kullanabilir.Ayrıca kendimize göre de fonksiyon ekleyebiliriz.

İstisna sınıfı oluşturalım:

<?php
class customException extends Exception
{
public function errorMessage()
{
//Hata mesajı
$errorMsg = ’Error on line ’.$this->getLine().’ in ’.$this->getFile()
.’: <b>’.$this->getMessage().’</b>geçersiz e-mail adresi’;
return $errorMsg;
}
}
$email = trexianos@gmail.com ;
try
{
//denetle
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
{
//email adresi geçersiz ise istisna fırlat
throw new customException($email);
}
}
catch (customException $e)
{
//özel mesajı yayınla
echo $e->errorMessage();
}
?>


Örneğimizi Açıklayalım;
Yukardaki kod örneğimiz özel bir istisna sınıfı ile , istista fırlatır ve yakalar.

1. customException() sınıfı PHP öntanımlı Exception sınıfından kalıtılmış bir istisna sınıfıdır.

2. errorMessage() function oluşturulur.e-mail adresi yanlış ise bir hata mesajı döndürür.

3. $email string yapısında tanımlanan geçerli bir email adresini tutar.

4. try blogu çalıştırılı ve e-mail adresi geçersiz ise istisna gönderilir.

5. catch bloğu istista yöntemini yakalar ve hata mesajını yayınlar.


--------------------------------------------------------------------------------


Çoklu İstisnalar
Birden fazla istisnaları yönetmek ve uygulamak PHP script I için mümkündür.

Birkaç if..else bloğu ve switch kullanarak çoklu istisnaları uygulayabiliriz.Bu istisnalar, farklı istisna sınıflarını kullanabilir ve farklı hata mesajları yayınlayabilirler:

<?php
class customException extends Exception
{
public function errorMessage()
{
//hata mesajı
$errorMsg = ’Error on line ’.$this->getLine().’ in ’.$this->getFile()
.’: <b>’.$this->getMessage().’</b> geçersiz e-mail adresi’;
return $errorMsg;
}
}

$email = trexianos@gmail.com ;

try
{
//denetle
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
{
// email adresi yanlış ise istisna gönder
throw new customException($email);
}
// trexianosu mail adresinde arar
if(strpos($email, örnek ) !== FALSE)
{
throw new Exception( $email örnek bir mail adresidir );
}
}

catch (customException $e)
{
echo $e->errorMessage();
}
catch(Exception $e)
{
echo $e->getMessage();
}
?>

Örneği Açıklayalım:
Yukardaki kod iki durumda ve iki istisna fırlatma işlemini yorumlar ve denetler;

1. customException() sınıfı PHP Exception sınıfndan kalıtılır.Kalıtılan Exception sınıfın bütün methodlarını ve özelliklerini kullanabilir.(Class Konusunda daha detaylı işleyeceğiz)

2. errorMessage() oluşturuldu .Verilen email adresinin yanlış olması durumunda bu fonksiyon hata mesaını yayınlar.

3. $email değişkeni String tabanlıdır ve trexianos stringini tutar.

4. try bloğu çalıştırılır ve ilk durumda istisna fırlatılmaz.

5. İkinci koşulda trexianos Stringini gördüğü anda istisnayı tetikler.

6. catch bloğu istisnayı yakalar ve hata mesajını doğrular.

customException yakalanmaz ise , sadece basit istisna yakalanır ve catch bloğunda tutulur.


--------------------------------------------------------------------------------

Exceptions(İstisna) nın Tekrar Fırlatılması
Bazı durumlarda , bir istisna fırlatıldığında ,normal olan yoldan farklı bir şekilde istisnayı tutmanı gerekebilir. Böyle durumlarda bir catch bloğuyla ikinci tekrarda istisna fırlatabilirsiniz .

Script sistem hatalarını kullanıcıdan saklayabilir.Bu hatalar kullanıcıyı ilgilendirmez ama programcı için çok önemlidir.Bu durumu kolaylaştırmak için bir kullanıcıya tekrar istisna fırlatarak samimi bir mesajla kullanıcıya gösterebilirsiniz:

<?php
class customException extends Exception
{
public function errorMessage()
{
//hata mesajı
$errorMsg = $this->getMessage().’ is not a valid E-Mail address.’;
return $errorMsg;
}
}
$email = trexianos@gmail.com ;
try
{
try
{
// trexianosu mail adresinde denetle
if(strpos($email, example ) !== FALSE)
{
//mail geçersiz ise istisna fırlat
throw new Exception($email);
}
}
catch(Exception $e)
{
//tekrar fırlat
throw new customException($email);
}
}
catch (customException $e)
{
//özel mesajı yayınla
echo $e->errorMessage();
}
?>


Örneği Açıklayalım:
Yukardaki kod email adresinin trexianos stringini içerip içermediğini denetler ,içeriyor ise istisna tekrar gönderilir:

1. customException() sınıfı PHP Exception sınıfndan kalıtılır.Kalıtılan Exception sınıfın bütün methodlarını ve özelliklerini kullanabilir

2. errorMessage() oluşturuldu .Verilen email adresinin yanlış olması durumunda bu fonksiyon hata mesaını yayınlar.

3. $email değişkeni String tabanlıdır ve trexianos stringini tutar.

4. try bloğu içindeki birbaşka try bloğu koşulu denetler ve tekrar istisna gönderir

5. E-mail içeriğinde trexianos stringi bulunduğunda istisna tetiklenir

6. catch bloğuistisnayı yakalar ve tekrar bir customException gönderir

7. customException yakalanır ve hata mesajı yayınlar

İstisna yakalanamazsa , try bloğunun dışına çıkar ve üst blokta aramaya başlar.


--------------------------------------------------------------------------------

Üst Seviye İstisna Yakalayıcı Tasarlamak
set_error_handler() fonksiyonu ile kullanıcı tanımlı fonksiyonları kullanarak yakalanamayan istisnaları yakalar.

<?php
function myException($exception)
{
echo <b>Exception:</b> , $exception->getMessage();
}
set_exception_handler(’myException’);
throw new Exception(’Yakalanamayan İstisna oluştu);
?>


Yukarıdaki kodun çıktısı şu şekilde görülür:

Exception: Yakalanamayan İstisna oluştu

Son Düzenleme: TreXiaNos ~ 26 Mayıs 2009 12:39
TreXiaNos
26-05-2009, 12:27   |  #2  
OP Üye
Teşekkür Sayısı: 0
85 mesaj
Kayıt Tarihi:Kayıt: May 2009

PHP - Şartları ( if - switch )

PHP - Şartları ( if - switch )

if Deyimi

if karar yapısının kullanımını aşağıdaki örnekte görebilirsiniz ve yardımcı olablecek operatör ve anlamlarına bakabilirsiniz.


--------------------------------------------------------------------

<html>
<?php
$saat = date(H);
//şu anki saat (0-24)
$gunler = array("Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi");
//günler dizisi
$gun = $gunler[date(w)];
//date(w) ile hangi gün olduğunu getirip günler dizisinden görüntülüyor
if ($gun == "Cumartesi")
  {
  if ($saat == "12")
  {
  $yemek = "pasta";
  }
}
?>
<br>
<?php
if ($yemek == "pasta")
  {
  echo "yemekte pasta var";
  }
else
  {
  echo "yemekte pasta yok";
  }
?>
<br>
<?php
if (($saat <=9) && ($saat >=6))  
  {  
  echo "Günaydın";  
  }  
elseif (($saat >=10) && ($saat <=16))  
  {  
  echo "Tünaydın";  
  }  
elseif (($saat >=17) && ($saat <=20))  
  {  
  echo "İyi Akşamlar";  
  }
else  
  {  
  echo "İyi Geceler";  
  }
?>
<br>
<?php
//if deyiminin kullanılması ile ilgili diğer bir yol
if ($saat == 0):
  echo "Gece Yarısı!";
else:  
  echo "Henüz Erken!";
endif;

?>
</html>


İşlemci Örnek

Örnek $a=6, $b =5 ise-------------------------------------------------------------------------== eşitse $a == $b False!= eşit değilse $a != $b True> büyükse $a > $b True< küçükse $a < $b False>= büyükse veya eşitse $a >= $b True<= küçükse veya eşitse $a <= $b False


İşlemci Adı Örnek

Anlam $a = 12, $b = 12
  $c = 9---------------------------------------------------------------------------------&&AND $a == $b && $a > $c $a eşit $b VE $a eşit $c True&&AND $a == $b && $a < $c $a eşit $b VE $a küçük $c False ||OR $a == $b || $a < $c $a eşit $b VEYA $a küçük $ True||OR $a > $b || $a < $c $a büyük $b VEYA $a küçük $c False!NOT !$a $a mevcut değilse False


Switch

Switch-case karar yapısı, Php de C dilindeki kullanımın aynı her case blogundan sonra break komutu ile switch den çıkılır aksi halde bir sonraki case ile uyuşup uyuşmadığı kontrol edilir...

<html>
<?php
$gunler = array("Pazar","Pazartesi","Salı","Çarşamba","Perşembe","Cuma","Cumartesi");
//günler dizisi
$gun = $gunler[date(w)];
//date(w) ile hangi gün olduğunu getirip günler dizisinden görüntülüyor
// switch karar yapısını kullanalım
switch ($day)
  {
// birinci case
  case "Pazartesi":
  $merhaba = "Haftanın ilk resmi günü";
  break;
// ikinci case
  case "Salı":
  $merhaba = "Haftanın ikinci resmi günü";
  break;
  case "Çarşamba":
  $merhaba = "Haftanın üçüncü resmi günü";
  break;
  case "Perşembe":
  $merhaba = "Haftanın Dördüncü resmi günü";
  break;
  case "Cuma":
  $merhaba = "Haftanın son resmi günü";
  break;
// eğer $day hiçbir case değeriyle uyuşmuyorsa
  default:
  $merhaba = "Haftasonu tatili";
  break;
  }
?>
<?echo$merhaba?>
</html>

TreXiaNos
26-05-2009, 12:29   |  #3  
OP Üye
Teşekkür Sayısı: 0
85 mesaj
Kayıt Tarihi:Kayıt: May 2009

Program Denetimi - if, switch, while, for

PHP - Program Denetimi

if Deyimi
if ( koşullar ) {
koşullar doğru ise yapılacak işlere ilişkin komutlar
}
elseif (diğer koşullar) {
diğer koşullar doğru ise yapılacak işlere ilişkin komutlar
}
else {
diğer her durumda yapılacak işlere ilişkin komutlar
}

<?php
if ( $parola == "" ) {
echo ("Sitemize girmek için parola yazmanız gerekir.<br>");
echo ("Lütfen parolayı yazın! <br>");
}
?>

switch deyimi
switch ( değişken ) {
case KOŞUL-1 ;
Koşul-1 doğru ise yapılacak işlere ilişkin komutlar
break;
case KOŞUL-2 ;
Koşul-2 doğru ise yapılacak işlere ilişkin komutlar
break;
case KOŞUL-3 ;
Koşul-3 doğru ise yapılacak işlere ilişkin komutlar
break;
case KOŞUL-4 ;
Koşul-4 doğru ise yapılacak işlere ilişkin komutlar
break;
......................
......................
default:
diğer her durumda yapılacak işlere ilişkin komutlar
}

switch için kısa yol

<?php
$uyari = ($parola == "" ) ? "Parola yazmanız gerekir" : "Teşekkür ederiz" ;
echo ($uyari);
?>

Bu kod parçacığı, ziyaretçinin parola girip girmediğini $parola değişkeninin içinin boş olup olmadığına bakarak anlayacak ve $parola değişkenin içi boş ise (yani soru işaretinin sorguladığı durumun doğru olması halinde) iki nokta üstüskte işaretinden önceki metni $uyarı değişkenin içeriği haline getirecek; $parola değişkeninin içi dolu ise (yani koşul yerine gelmiyorsa, durum yanlış ise) iki nokta üstüste işaretinden sonraki metni $uyarı değişkeninin içeriği yapacaktır. Bir sonraki echo() komutu ise içeriği bu sınav sonucuna göre belirlennen $uyarı değişkeninin değerini Browser penceresinde görüntüleyecektir.

while döngüsü

while (koşul) {
Koşul doğru ise yapılacak işlere ilişkin komutlar
}

<?php
$sayac = 1;
while ( $sayac <= 7 ) {
print ("<font size= $sayac >");
print ("<b><p>İyileri iyilikleri ile alkışlayınız!</b></p>");
print ("</font>");
$sayac ++;
}
?>


do..while

do {
Koşul doğru ise yapılacak işlere ilişkin komutlar
}


while (koşul);

$sayac = 1;
do {
print ("<font size= $sayac >");
print ("<b><p>İyileri iyilikleri ile alkışlayınız!</b></p>");
print ("</font>");
$sayac ++;
}
while ( $sayac <= 7 ) ;


for döngüsü

for ( $yeni_degisken atama ; koşul ; artış basaması ) {
Koşul doğru ise yapılacak işlere ilişkin komutlar
}

<?php
for ($sayac = 1; $sayac <= 7 ; $sayac++ ) {
print ("<font size= $sayac >");
print ("<b><p>İyileri iyilikleri ile alkışlayınız!</b></p>");
print ("</font>");
}
?>

Döngüyü sona erdirmek için: break

<?php
$tekrar = 10 :
for ($sayac = 1; $sayac <= $tekrar ; $sayac++ ) {
if ( $tekrar <= 0 )
break;
print ("<font size= $sayac >");
print ("<b><p>İyileri iyilikleri ile alkışlayınız!</b></p>");
print ("</font>");
}
?>

Döngüyü sürdürmek için: continue

<?php
$sayac = -5 :
for (; $sayac <= 7 ; $sayac++ ) {
if ( $sayac <= 0 )
continue;
print ("<font size= $sayac >");
print ("<b><p>İyileri iyilikleri ile alkışlayınız!</b></p>");
print ("</font>");
}
?>

Bu durumda PHP, continue komutunu gördüğü anda for döngüsünün geri kalan kısmını icra etmek yerine başa dönecek ve döngüyü yeniden icra etmeye başlayacaktır. Döngünün ilk satırınnda kod parçasını, bir sayfa kodunun içine yerleştirir ve önce bu şekliyle, danha sonra $sayac= 1 yazarak sınarsanız, continue komutunun programı sayaç değişkeninin değeri 1 oluncaya kadar durdurduğunu ama bu sırada for döngüsünün devam ettiğini göreceksiniz.

TreXiaNos
26-05-2009, 12:32   |  #4  
OP Üye
Teşekkür Sayısı: 0
85 mesaj
Kayıt Tarihi:Kayıt: May 2009

PHP - MySQL Komutları - Yönetimi

MySQL Yönetimi

Tüm SQL işlemleri için Php kullanılabileceği gibi veritabanı sunucusunda veritabanı, tablo oluşturmak, değiştirmek ya da diğer işlemler için farklı arayüzler kullanmak zaman kazandırıcı olabilir. Php kullanılarak geliştirilen PhpMyAdmin sayesinde web sunucu aracılığıyla tüm MySQL özelliklerini yönetebilmek mümkündür. Hem Unix hem de Windows ortamları için PhpMyAdmin tavsiye edilir. Windows"da da MySQL"i yönetmek için myAdmin adındaki yazılım da oldukça kullanışlıdır. MySQL"e ve Php"ye yeni başlayan kullanıcılar için veritabanını tanımak amacıyla ayrı bir yazılım kullanmaları tavsiye edilebilir.


Php"de kullanılabilecek MySQL Komutları :

mysql_affected_rows : Bir önceki işlemde etkilenen satır sayısı

mysql_close : Belirtilen MySQL bağlantısını kapatır

mysql_connect : Sunucuya veritabanı bağlantısı açar

mysql_create_db : MySQL"de veritabanı açar

mysql_data_seek : Sonuç satırında belirtilen sıraya geçer

mysql_db_query : MySQL"e sorgu gönderir

mysql_drop_db : Sunucudan veritabanı siler

mysql_errno : Bir önceki işlemdeki MySQL hata numarasını verir

mysql_error : Bir önceki işlemdeki MySQL hata mesajını verir

mysql_fetch_array : Sonuçları dizi değişkeni olarak alır

mysql_fetch_field : Sonuç tablosundaki alan adını obje olarak alır

mysql_fetch_lengths : Sonuç tablosundaki dizi değişkenin uzunluğunu alır

mysql_fetch_object : Sonuç satırını obje olarak alır

mysql_fetch_row : Sonuç tablosundan dizi değişkeni olur

mysql_field_name : Sonuç tablsundaki sonucun tablodaki alan adını verir

mysql_field_seek : Sonuç tablosunda sıra indisini belirtilen yere götürür

mysql_field_table : Alan adı verilen sonucun tablo adını verir

mysql_field_type : Sonuçtaki alanın hangi tip olduğunu belirtir

mysql_field_flags : Sonuçtaki alanın hangi tür ekstra parametrelerle tanımlandığını belirtir

mysql_field_len : Sonuçtaki alanın veritabanındaki uzunluğunu verir

mysql_free_result : Sonuçlar için atanan hafızayı boşaltır

mysql_insert_id : Bir önceki veri yerleştirmede oluşan otomatik veri değerini verir

mysql_list_fields : Sonuçtaki tüm tablo alanlarını listeler

mysql_list_dbs : Sunucudaki tüm veritabanlarını listeler

mysql_list_tables : Veritabanındaki tüm tabloları listeler

mysql_num_fields : Sonuçtaki alan sayısını verir

mysql_num_rows : Sonuçtaki satır sayısını verir

mysql_pconnect : Sunucuya kalıcı bir bağlantı tanımlar

mysql_query : Veritabanına sorgu gönderir

mysql_result : Sorgudan dönen sonuçları alır

mysql_select_db : Sunucudan veritabanı seçer

mysql_tablename : Verilen alanın ait olduğu tablo adını verir

TreXiaNos
26-05-2009, 12:33   |  #5  
OP Üye
Teşekkür Sayısı: 0
85 mesaj
Kayıt Tarihi:Kayıt: May 2009

PHP ile Mail, Imap, POP3, NNTP Uygulamala

SMTP, IMAP, POP3, NNTP birbirleriyle yakından ilişkili protokollerdir.

SMPT:

SMTP(Simple Mail Transfer Protocol) mail gönderme ve almada kullanılan protokoldür ve UNIX ortamında bu iş için en yaygın kullanılan araç sendmail"dir. PHP, UNIX ortamında kullanılacak ise mail almak için aynı makinada bir sendmail sunucusunun çalışır durumda olması gerekmektedir. Mail gönderirken sendmail otomatik olarak çalıştırıldığı için sunucunun çalışır durumda olmasına gerek yoktur.

mail fonksiyonu mail göndermek için kullanılır. Bu fonksiyonda dördüncü parametre ek SMTP header bilgisi göndermek için kullanılır. Eğer kullanılmaz ise mesajın göndereni kısmına web sunucusunun uid"i otomatik olarak konulur (Örnek: nobOdy@abc.def.com). Ek header bilgileri şunlar olabilir:
From: Reply-To: X-Mailer: ... Mail gönderme örneği - (kaynak kodu)

IMAP:

IMAP(Interet Message Access Protocol), SMTP ile mail sunucusna alınan maillere kullanıcıların uzaktan erişimini sağlayan bir protokoldür. Gelen postaların sunucu tarafında merkezi olarak tutulması, kullanıcının burada birden çok dizin açmasına izin vermesi, mesajları çok parçalı olarak işleyebilme, eşzamanlı erişim ve dizin paylaşımı gibi özellikleri ile POP3"e göre daha üstün bir protokoldür. PHP ile IMAP kullanımı kabaca şu adımları içerir:

Posta sunucu ile bağlantı kurulur:
imap_open fonksiyonu, verilen posta kutusu tanımlayıcına sahibinin (kullanıcı adı ve şifresi ile) bağlanabilmesini sağlar. Bağlantı sağlanırsa posta kutusunu ifade eden bir numara (handle) döndürülür. Burada mailbox, "{/imap:}" şeklinde bir stringdir. Örnek: {javaserver.ulakbim.gov.tr/imap:143}INBOX imap_reopen fonksiyonu, handle"ı verlien posta kutusu kapatılmış ise aynı HTTP oturumu içinde doğrulama yapılmaksızın yeniden bağlanılabilmesini sağlar.

Mesaj başlık (header) ve içerik bilgisine ulaşılabilir: IMAP, mesajları mesaj sıra numarası (sequence) ve tanımlayıcı numara (uid) olmak üzere iki tür numaralama ile ayrıştırır. Her ikisi de PHP ile mesaj bilgilerine ulaşmak için kullanılabilir. Ancak sequence kullanmak birbirinden ayrı oturumlar kullanan HTTP için çok sağlıklı değildir. Çünkü posta kutusundan bir mesaj silindiği anda sequence numaraları yeniden düzenlenir. Ancak uid değerleri değişmez.
imap_headers fonksiyonuyla, verilen posta kutusundaki mesaj başlıkları sıra numarasına göre (sequence) sıralı bir dizi olarak alınır. imap_header fonksiyonu, posta kutusundaki verilen sıra numaralı mesajın ayrıntılı çözümlenmiş (parsed) header bilgisi object olarak alınır. imap_bOdy fonksiyonu, posta kutusundaki verilen sıra numaralı mesaj içeriği alınır. Burada FT_UID flagı olarak üçüncü bir parametre ile çağrılırsa sıra numarası (sequence) yerine tanımlayıcı (uid) kullanır.

Arama ve sıralama işlemleri yapılabilir:
imap_sort fonksiyonu, posta kutusundaki mesajların verilen kritere göre sıralanmış listesi dizi olarak alınır. Burada options kısmında SE_UID kullanılırsa dizi elemanları uid değerlerinden oluşur aksi taktirde sequence numaraları döndürülür. imap_search fonksiyonu, posta kutusundaki mesajlar üzerinde verilen kritere göre arama yapılır. Burada da flags kısmında SE_UID kullanılırsa sequence numaraları yerine uid değerleri alınır. IMAP posta kutusu istemcisi örneği - sequence numaraları kullanıldığı durum - (kaynak kodu) IMAP posta kutusu istemcisi örneği - uid tanımlayıcıları kullanıldığı durum - (kaynak kodu) IMAP posta kutusu istemcisi örneği - uid sıralama - (kaynak kodu)

POP3:

POP3(Post Office Protocol) protokolü de IMAP gibi, SMTP ile mail sunucusuna alınan maillere kullanıcıların uzaktan erişimini sağlayan bir protokoldür. Ancak mesajların kullanıcılar tarafından bütün olarak download edilmesini gerektirmesi, merkezi olarak tutulmadığı için hareket halindeki kullanıcılar (roaming users) için senkronizasyon sorunları oluşturması ve eşzamanlı erişime izin vermemesi nedeniyle IMAP"ın gerisinde kalır.

PHP ile POP3 kullanımı IMAP"dan çok farklı değildir. Fakat, IMAP"ın izin verdiği bazı fonksiyonlar POP3 erişiminde kullanılamaz.

Bağlantı kurarken ilgili protokol adını ve kullanılan portu örneğin şu şekilde değiştirmek yeterli olur: {javaserver.ulakbim.gov.tr/pop3:110}INBOX
POP3 posta kutusu istemcisi örneği - (kaynak kodu)

NNTP:

NNTP (Network News Transfer Protocol) protokolü, Internet üzerinde haber mesajlarının merkezi olarak sunucular üzrinde tutulup tutulup, istemcilerin bu kaynaklar üztünde sorgulama yapması, mesajları okuması ve mesaj atabilmesini sağlayan bir protokoldür.

Bağlantı kurarken ilgili protokol adını ve kullanılan portu örneğin şu şekilde değiştirmek yeterli olur: {javaserver.ulakbim.gov.tr/nntp:119}INBOX

TreXiaNos
26-05-2009, 12:34   |  #6  
OP Üye
Teşekkür Sayısı: 0
85 mesaj
Kayıt Tarihi:Kayıt: May 2009

PHP Kodlama Standardlari

PHP Kodlama Standardlari ( Birinci Bolum )


Giris:
Standardizasyon Onemlidir.


Bu standardin herkesi belli bir sekilde sinir etmesi beklenen bir etkidir. Son halini bu sayfada gormus oldugunuz dokuman bir cok proje, bir cok sirket ve konu uzerinde tartisarak gecirilen cok sayida saat sonucunda bu halini almistir. Herhangi bir kisi veya kurumun sahsi tarzi degildir ve lokal olarak yapilabilecek degisikliklere aciktir.

Iyi Yonler:

Bir proje ortak bir standarda uydugunda bazi guzel seyler olur:

* Programcilar koda bakip neler olup bittigini kolaylikla anlayabilir.
* Yeni baslayanlarin konuya hakimiyet kazanmasi hizlanir ve kolaylasir.
* PHP’ye yeni baslayan insanlar kendi tarzlarini gelistirmek ve onu olumune savunmak zorunlulugundan kurtulur.
* PHP’ye yeni baslayan kisilerin ayni hatalari defalarca tekrarlamasi engellenmis olur.
* Tutarli ortamlarda hata yapma ihtimali azalir.
* Programcilarin ortak bir dusmani olur. :-)


Kotu Yonler:

Bir de kotu yonlere goz atalim:

* Standard genellikle aptalcadir cunku PHP ’den anlamayan birisi tarafindan yapilmistir.
* Standard genellikle aptalcadir cunku benim yaptigimin aksini soylemektedir.
* Standardlar yaraticiligi azaltir.
* Insanlar tutarli olduklari surece standardlar gereksizdir.
* Standardlard cok fazla yapilanmaya sebep olur.
* Insanlar zaten standardlari kaale almazlar.

Tartisma:

Bir cok proje yoneticisinin tecrubeleri, standarlarin projelerin daha sorunsuz ilerlemesini sagladigi sonucuna ulasmaktadir. Peki basari icin standardlar gerekli midir? Tabii ki hayir. Fakat standardlarin olmasi bize projelerimizde yardimci olacaktir, ve bulabilecegimiz butun yardima ihtiyacimiz vardir. Durust olun, herhangi bir standarda karsi olan fikirlerinizin cogu sizin egonuzdan kaynaklanmaktadir. Standardlarda karsilastigimiz kararlarin pek azi teknik acidan yetersiz denebilecek seviyededir. Bu farkli kararlar olsa olsa sahsi bir tercihin sonucudur. Bu yuzden esnek olun ve butun projelerin temelinde takim oyunu oldugunu ve projelerin butun takimin cabasiyla basariya ulasacagini unutmayin.

Standardlarin Uygulamasi:

Oncelikle, bir standard konusundaki supheler ve sorunlar grup icerisinde tartisilip bir sonuca baglanmalidir. Kimbilir belki de elinizdeki standard icinde bulundugunuz duruma uygun olmayabilir. Bu standard bazi onemli unsurlari goz ardi ediyor olabilir. Hatta belki de yonetimde buyuk nufuzu olan kisiler standarddaki bazi unsurlara karsi olabilir.

Ilk tartisma asamasindan sonra varilan sonucun kabul edilebilir oldugunu, diger bircok programci tarafindan kabul edilebilir bulundugunu ve bu yuzden takip edip uygulamaya deger oldugunu ve gerekirse bu konuda sahsi tavizler verilebilecegini benimsemek gerekir.

Eger proje grubu bu standarda gonullu olarak katilmiyorsa yonetim bu standardi kodun kalite kontrolunden gecmesi icin uyulmasi gereken zorunlu sartlar olarak da niteleyebilir.

Bir Fikri Kabul Etmek:


1. Mumkun degil.
2. Mumkun olabilir, ama zayif ve hic ilginc degil.
3. Dogru ve ben dogru oldugunu zaten soylemistim.
4. Oyle oldugunu ilk ben dusundum.
5. Kim daha farkli oldugunu dusunebilir ki?


Yeni bir fikri kabul etme yolunda eger negatif bir onyargi ile ilerliyorsaniz, lutfen acik fikirli ve yeniliklere acik olmaya calisin. Boyle yaptiginiz halde bile hala sonucla ayni fikirde olmayacaginiz durumlar soz konusu olabilir, fakat yine de farkli bir yolu/yontemi kabul edebilmek icin takip etmeniz gereken bir yol vardir. O yolda ilerlemekten kendinizi mahrum etmeyin.


ISIMLER:

Konuya Uyan Isimler Secin

Isimler programciligin kalbidir. Eskiden bir insanin gercek adini bilmenin o kisi uzerinde sihirli guclere sahip olmayi sagladigina inanilirdi. Eger birsey icin dogru ismin ne olmasi gerektigini biliyorsaniz, kendinize ve sizden sonra gelecek programcilara kod uzerinde kullanibilecekleri buyuk bir guc veriyorsunuz demektir.

Bir isim, icinde bulundugu cevre hakkinda uzun ve derin bir dusunme surecinin urunudur. Sadece bir sistemin butun olarak calisma prensibini tam olarak anlayan bir programci sisteme tam anlamiyla uyan isimler bulabilir. Eger isim uygunsa geri kalan hersey dogal bir sekilde uyacaktir. Bu sayede iliskiler acik, anlamlar ulasilabilir, ve insancil beklentilerden yola cikarak ulasilan sonuclar anlamli olacaktir.

Eger kodunuza baktiginizda isimleri ’sey’, ’birsey’, ’bunu_yap’,’suraya_git’, ’onu_calistir’ gibi isimlerle degistirdiginizde birsey farketmeyecek gibi geliyorsa, o kodun dizaynina bir daha goz atsaniz iyi olur.


Sinif Isimleri


* Sinifin ismini, sinifin ne olduguna bakarak verin. Eger ismi bulmak konusunda cok ugrasiyorsaniz bu sisteminizin dizaynina yeteri kadar zaman harcamadiginizin bir belirtisidir.
* Uc kelimeden fazla birlesik isimler sistem dizayninizin bazi seyleri bir birine karistiriyor olabileceginin bir habercisidir. Dizayninizi tekrar gozden gecirin. Bir CRC karti oturumuyla objelerinizin gereginden fazla sorumluluklarla yuklenmis olup olmadigini kontrol edin.
* Bir siniftan kalitim/miras yoluyla (inheritance) baska bir sinif olusturdugunuzda ana sinifin ismini alt sinifin ismi icinde kullanmaktan kacinin. Eger bir sinifiniz varsa o sinif kendi ayaklari uzerinde durabilmelidir. Hangi baska siniftan olusturulmus oldugu onemli olmamalidir.
* Eger siniflariniz bir ortak baslik altinda toplanabilir nitelikte ise, yani benzer bir amaca hizmet ediyorlarsa bu siniflari belli bir baslik altinda toplamak da mumkundur. Ornegin birkac ’motor’ sinifiniz oldugunu dusunursek, SorguMotoru, AramaMotoru gibi sinif isimleri kullanilabilir.

Metod ve Fonksiyon Isimleri:


* Genellikle butun metod ve fonksiyonlar bir aktivite gerceklestirirler, bu yuzden isimleri de gerceklestirdikleri aktiviteyi belirtir nitelikte olmalidir. Ornegin, HataKontrol() yerine HataKontroluYap(), VeriDosyasi() yerine VeriDosyasinaCiktiYap() kullanilmalidir. Bu kullanim sekli degisken objelerinin ve fonksiyonlarin birbirine karismasini da engelleyecektir.
* Bazen sona eklenen kisaltmalardan yararlanilabilir.
- MAX : Bir degiskenin alabilecegi Maximum degerden bahsederken.
- Cnt : Bir sayac degiskeninin o anki degeriniden bahsederken ( Sayac = Counter )
- Key : Bir anahtar deger ( Anahtar = Key )


Ornegin: TekrarMax - Maksimum tekrar sayisi, TekrarCnt - Su anki tekrar sayisi gibi kullanilabilir.

* Bazen basa eklenen kisaltmalardan da yararlanilabilir.
(Bu bolumun aciklamasi yukari bolumle ayni. Ornek yanlizca ingilizce oldugunda basa eklenen bir ornek oluyor. Basa ek eklemek Turkce’ye uygun olmadigi icin burayi yok farzediyoruz)

Tamami Buyuk Harf Olan Kisaltmalar Kullanmayin:

* Normalde tamami buyuk harften olusan kisaltmalari bir isimde kullanmaniz gerektiginde bu kisaltmanin sadece ilk harfini buyuk yapip gerisini kucuk harfler devam edin.
Ornegin: ’YeniHTMLSayfasi’ yerine ’YeniHtmlSayfasi’ kullanin.


Aciklama:

* Tamami buyuk harflerden olusan kisaltmalari isim olarak kullanirken herkes farkli bir tarz izlemektedir. Isimlerin ne anlama geldigini tahmin edebilmek acisindan sadece bir tarzi kullanmak gereklidir.


Ornegin NetworkABCKey isminde ABC’den gelen C ile Key’den gelen K karismis durumdadir. Bazi programcilari rahatsiz etmeyen bu durum digerlerini sinir edebilmektedir. Bu yuzden degisik kisiler tarafindan yazilmis kod orneklerinde bu konuya degisik yaklasimlar goreceksiniz.

TreXiaNos
26-05-2009, 12:35   |  #7  
OP Üye
Teşekkür Sayısı: 0
85 mesaj
Kayıt Tarihi:Kayıt: May 2009

PHP de dosya işlemleri bilgi

Dosya varmı? Yokmu? (file_exists)

Bir dosyanın var olup olmadığını bu fonksiyonla denetleyebiliyoruz..
Eğer dosya mevcut ise true / 1 yoksa false / 0 sonucunu alırız.

Örneğin:

if ( file_exists ( deneme.php ) ) {
     print Dosya mevcut ;
} else {
     print Dosya mevcut değil.! ;
}

Burda deneme.php dosyası mevcutsa Dosya Mevcut yazılacaktır.
Aksi takdirde Dosya Mevcut Değil mesajını alırız..


Dosya mı? Dizin mi? (if_file, is_dir)

Bilindiği gibi klasörler dosyalar gibi adlandırılabilir. Bir dizinde
içerisindeki ismin gerçekte bir dosya olup olmadığını is_file fonksiyonuyla
öğreniriz. Eğer dosya ise true / 1 değilse false / 0 cevabını alırız.

Örneğin:

if ( is_file ( deneme.php ) ) {
     print Bu bir dosyadır! ;
} else {
     print Bu bir dosya değildir.! ;
}

İsim bir dosyaya aitse php Bu bir dosyadır! yazacaktır. Aksi Takdirde
Bu bir dosya değildir.! cevabını alırız.


Sorgulamayı ismin bir klasöre ait olup olmadığına bağlı olarakta yapabiliriz.
Bunun için is_dir fonksiyonunu kullanmamız gerekecektir. Eğer doğru ise True / 1
cevabını değilse False / 0 değerini alırız.

Örneğin:

if ( is_dir ( /cw ) ) {
     print Bu bir dizindir.! ;
} else {
     print Bu bir dizin değildir.! ;
}

İsim bir dizine aitse php Bu bir dizindir.! yazacaktır. Aksi Takdirde
Bu bir dizin değildir.! cevabını alırız.

Dosyanın Okuma yetkisi varmı? (is_readable)

Bir dosyayı kullanmadan önce o dosyanın okunabilir, php tarafından erişilebilir
olduğunu anlamalıyız. Dosyaya okuma yetkisi verilmiş ise True / 1 aksi takdirde
False / 0 cevabını alırız.

Örneğin:

if ( is_readable ( deneme.php ) ) {
     print Bu dosya okunabilir! ;
} else {
     print Bu dosya için okuma yetkisi verilmemiş.! ;
}

Dosyanın Yazma yetkisi varmı? (is_writable)

Kullanımı is_readable ile aynıdır. Bir dosyanın yazma yetkisi olup olmadığını
öğreniriz. Dosyaya yazma yetkisi verilmiş ise True / 1 aksi takdirde
False / 0 cevabını alırız.

if ( is_writable ( deneme.php ) ) {
     print Bu dosya yazılabilir.! ;
} else {
     print Bu dosya için yazma yetkisi verilmemiş.! ;
}

Dosyayı çalıştırabilirmiyiz? (is_executable)

PHP de çoğu zaman harici programları çalıştırırız. PHP programımızın doğru bir
şekilde çalışması bu harici programa bağlı olabilir. Bu tür durumlarda dosyayı
çalıştırmadan önce dosyanın çalıştırılabilir olup olmadığını sorgulamalıyız.
Eğer dosya çalıştırılabilir ise PHP true / 1 cevabını değilse False / 0 cevabını
verecektir.

Örneğin:

if ( is_executable ( deneme.php ) ) {
     print Bu dosya çalıştırmaya uygun.! ;
} else {
     print Bu dosya çalıştırılamaz.! ;
}

TreXiaNos
26-05-2009, 12:36   |  #8  
OP Üye
Teşekkür Sayısı: 0
85 mesaj
Kayıt Tarihi:Kayıt: May 2009

PHP - Basitçe Fonsiyonlar

Fonksiyonlar

Programlamanın temelini fonksiyonlar oluşturur. Ayrıca ana programın kendiside bir fonksiyondur denilebilir. En çok kullanılanlar print() ve echo() fonksiyonlarıdır. Bunun yanında kendimizde fonksiyon yazabiliriz ve istediğimiz an kullanabiliriz.


---------------------------------------------------------------------

<html>
<?php
$a = 1;
$b = 2;
//global $a ve $b değişkenlerimiz ve değerleri
function toplam() {
  global $a, $b;
  /* global $a,$b; demekle ana programdaki  
  $a ve $b değişkenlerin değerlerini kullan*/
  $c = $a + $b;
  echo $c;
  //ekrana $c nin değerini 3 yazar  
}
toplam();
//üsteki toplam fonksiyonunu kullanıyoruz
?>
<br>
<?
/*fonksiyonlara paremetre gönderip  
geri değer döndürmesini isteyebiliriz*/
function paremetre ($id1, $id2) {
$id3=$id1 + $id2;
return $id3;
//$id3 değişkeninin değerini geri döndürür
}
echo paremetre(15,34);
/*15"i $id1, 34"ü $id2 ye atar ve dönen return  
değerini echo ile ekrana yazar*/  
?>
<br>
<%
function statik() {
  static $a = 0;
  /*$a değişkenini static tanımlamakla fonksiyonu  
  her çağırdığımızda $a nın son değerini alır*/
  echo $a;
  $a++;
}
statik();
//ekrana 0 yazar
statik();
//ikinci çağrışımızda ekrana 1 yazar ve takip eder
%>
<br>
<?php
function islem ($a =5){/*fonksiyon paremetresiz çağrılırsa
$a değişkeninin değeri varsayılan olarak 5 alınır*/
return ($a+1);
}
echo islem();
//ekrana 6 yazar
print "<br>";
echo islem(10);
//ekrana 11 yazar
?>
</html>


---------------------------------------------------------------------

Nesne Tabanlı Programlama (Object-Oriented Programming)

Programlama dilleri nesneye dayalı olmakla birlikte kullanım açısından bir çok avantajlar getirdi. PHP de istediğimiz kadar sınıf oluşturup bunların içinde yine istediğimiz kadar fonksiyonlar kullanabiliriz.

---------------------------------------------------------------------

<?
class stil
{
  //özellikleri tanımlayalım
  var $font;
  var $renk;
  var $boyut;
  var $metin;
  //fonksiyonları tanımlayalım
  function arayuz($c,$d,$e,$f){
  $this->font = $c;
  $this->boyut = $d;
  $this->renk = $e;
  $this->metin = $f;
  }
  function yazdir(){
  echo "<font face=\\"".$this->font." size=".$this->fontsize.
  "\\" color=".$this->renk.">".$this->metin."</font>";
  }
}

?>
<html>
<?
$sinif = new stil;
//stil nesnesini kullanıma açıyoruz (önyükleme)
$sinif->arayuz("Trebuchet MS",2,"black", "Enigma");
//arayuz fonksiyonuna font ile ilgili paremetreler gönderilir
$sinif->yazdir();
//nesnemizin yazdır fonksiyonu (metodu) çalışır
echo "<br>";
$sinif->renk ="blue";
$sinif->metin ="Parçalarını";
$sinif->yazdir();
echo "<br>";
$film = new stil;
$film->arayuz("Times New Roman",3,"red", "Mutlaka Dinleyin");
$film->yazdir();
?>
</html>

TreXiaNos
26-05-2009, 12:40   |  #9  
OP Üye
Teşekkür Sayısı: 0
85 mesaj
Kayıt Tarihi:Kayıt: May 2009

PHP - Dosya ve Dizin

Giris :

Butun bilgisayar programcilari yeri geldiginde dosyalarla ugrasmak zorunda kalir.Bu bazen gecici verileri dosyalarda saklama isteginden , uygulamanin setup bilgilerini saklamaya kadar genis bir yelpazede yer alir.

"Dosya" aslinda hardisk,floopy,cdrom gibi medyalarda saklanan sirali bytelardan baska bir sey degildir."Dizin" ise ozel bir dosya tipidir ve icinde diger dosyalarin ve dizinlerin isimleri saklanabilir.

Linux ve Windows

Unix tabanli isletim sistemleri(Linux gibi) dosyalara ulasmak icin tanimlanan "yol"larda,"/" isaretini kullanirken windows isletim sistemleri "\\" ters slash tabir edilen isareti kullanmaktadir.

Unix icin dosya yolu ornegi,

/home/serkan/www/turkphp

Windows icin dosya yolu ornegi,

C:\\belgelerim\\www\\turkphp\\serkan

Bu olayin yazdigimiz kodlarda problem yaratacagini dusunebiliriz.Ancak windows uzerinde calisan PHP bu tip durumlarda kodlari otomatik olarak cevirerek kendi kullanabilcegi hale getirmektedir.Mesela ,

$fp = fopen ("/data/data.txt","r");

seklinde yazilan bir kod windows altinda da sorunsuz caliscaktir.Cok spesifik olmayan durumlar icin bu kural gecerlidir ve basinizi pek agritmaz.Yazinin ilerleyen kisimlarinda bir kac aciklama bu konu icin yapilacaktir.

Dosyalarla Calismak

Tipik olarak dosyalarla calisirken asagidaki adimlar izlenir.

Calismak istediginiz dosyayi yolu ile belirterek acin.

Dosyayi okuyun , dosyaya yazin vb...

Dosyayi kapatin.

fopen ()

Ilk gorecegimiz dosya fonksiyonu fopen (),dosyalari acmak icin kullanilir.Alabileegi 3 tane argument vardir :

dosyaadi
mode
use_include_path (opsiyonel olarak kullanabilirsiniz)

Dosyalari acmak icin kullanilan bu fonksiyon ayni zamanda dosyalarin acilip acilamayacagini (yani izinleriniz tamam,dosya yerinde mi? gibi) kontrol icinde kullanilabilir.

Ornek vermek istersek,

$fp = fopen ("./data.txt","r");
if (!$fp) die ("Dosya Acilamiyor");

veya alternetif olarak tek satirda yazmak istersek,

if (!($fp = fopen ("./data.txt","r"))) die ("Dosya Acilamiyor");

Burada lutfen kafaniz karismasin.$fp degiskenine dosyanin yolunu veya fopen fonksiyonu kullanmamizin sonucundaki degeri esitlemiyoruz.Eger boyle yapmak isteseydik "==" kulllanirdik.Dikkat ederseniz burada bir test islemi gerceklesiyor.Yani aslinda biz belkide daha sonra kullanacagimiz bir dosyanin yerinde olup olmadigina bakiyoruz.Onun icin fopen fonksiyonu kullanarak dosyayi acmak istiyoruz.Donen degere gore if yapisi ile test islemini gerceklestiriyoruz.

Bu komut kullanilarak yapilan yukaridaki gibi testlerde uzak host"lardaki dosyalarda kontrol edilebilir.Ornek vermek istersek,

if (!($fp = fopen("http://www.turk-php.com/dosya.html","r"))) die ("Dosya Acilamiyor);

if (!($fp = fopen("ftp://ftp.turk-php.com/dosya.html","r"))) die ("Dosya Acilamiyor);

uzak host "taki dosya "yanlizca okunabilir" olarak acilabilir.

Eger daha once Unix tabanli bir isletim sistemi kulllandyisaniz bundan sonra yazacaklarimiza zaten asinasinizdir.Biz yine de bilmeyen insanlar icin bir tekrar yapmak istiyoruz.Cogu zaman gordugunuz ../data.txt veya ./data.txt gibi ifadeler ne anlama geliyor veya bu noktalar neden koyuluyor gibi?

./data.txt : scriptimiz ile ayni klasorde yer alan data.txt isimli dosya.
../data.txt : scriptimizin yer aldigi klasorun bir ustundeki klasorde data.txt isimli dosya.
../../../data.txt : scriptimizin yer aldigi klasorden uc level yukaridaki klasorde data.txt isimli dosya.

Olayi anladiniz herhalde daha fazla ornek vermeye gerek duymuyorum.

Simdi de dosyalari acarken kullandigimiz "mode" argumentine bakalim.

r: Dosyayi yanliz okunabilir olarak ac.Kursor dosyanin basinda yer alir.
r+: Dosyayi okunabilir ve yazilabilir olarak ac.Kursor dosyanin basinda yer alir.
w: Dosyayi yanliz yazilabilir olarak ac.Kursor dosyanin basinda yer alir.Daha onceden var olan hersey yok olur.Eger boyle bir dosya yoksa PHP yaratmaya calisir.
w+: Dosyayi okunabilir ve yazilabilir olarak ac.Kursor dosyanin basinda yer alir.Eger boyle bir dosya yoksa PHP yaratmak icin tessebuste bulunur.Dosya icinde daha onceden var olan hersey yok olur.
a : Yanlizca dosyanin sonuna veri eklemek icin dosya acilir.Eger boyle bir dosya yoksa PHP yaratmaya calisir.Eklenen veriler dosyanin sonuna yazilir.
a+ : Dosyanin sonuna veri eklemek ve dosya okunmak icin acilir.Eger boyle bir dosya yoksa PHP yaratmaya calisir.Eklenen veriler dosyanin sonuna yazilir.

Mode argumenti ayni zamanda "b" degerini de almaktadir.Bu deger verildiginde dosya "binary" modunda islenir.Windows icin kullanislidir.Linux icin bu degerin bir anlami yoktur.

"include_path" argumenti eger buyuk bir site uzerinde calisiyorsaniz ve "inc" dosyalari belirli bir klasor uzerindeyse php.ini dosyasinda "include_path" yolunu belirterek dosya acma islemlerinde bir kolaylik saglayabilirsiniz.ornek vermek istersek,

php.ini dosyasinda "include_path" olarak /home/apache/inc verdiyseniz ve,

fopen ("data.txt","r",1);

yadiginiz zaman once data.txt dosyasi scriptin bulundugu klasorde aranacak eger bulunamaz ise /home/apache/inc klasorune bakilacaktir.

fclose

Dosya ile calismayi bitirdiginizde ,dosyanin kapatilmasi gereklidir.Bu islemi fclose () komutu ile yapabilirsiniz.Script calismayi bitirdiginde otomaik olarak butun acik dosyalar PHP tarafindan kapatilir.Size tavsiyemiz dosya ile calismayi bitirdiginiz anda bu komutu kullanarak dosyayi kaptmaniz.anck bu sekilde ayni scripti kullanan diger kullanicilar hizli bir sekilde servis alabilir.

fclose ($fp);

seklinde kullanilir.

Dosyalardan okumak ve dosyalara yazmak

Smdiye kadar dosya acma ve kapama islemlerini gorduk.Artik onlarin icinden verileri okuyabilir ve yazabiliriz.Ilk olarak cok basit iki komutu gorecegiz.Cogu islemde bu iki komut isinizi gorecektir.

fread ()

Bu komut dosyadan string karakterleri okumak icin kullanilir.Alabilcegi iki argument vardir.Ilki dosyanin ne oldugu,ikincisi integer yani sayisal olarak "length"(uzunluk) degeri.Ornek vermek gerekirse,

$fp = fopen ("data.txt","r") ile dosyayi basarili sekilde actigimizi varsayalim.

$data = fread($fp,10);

burada $data degiskeni icine,actigim "data.txt" dosyasindan ilk 10 byte veriyi okuyup atamis oldum.

Bu konu ile ilgili bilmeniz gereken bir kac onemli nokta bulunmaktadir.

Ilk 10 byte veriyi okuduk ve ayni islemi tekrar etmek istedik.Artik kursor ilk 10 byte"in bittigi yerdedir ve biz artik 10-20 bytelari arasindaki veriyi okuyabiliriz.

Eger dosya 10 byte"tan kucukse PHP dosyanin basindan sonuna kadar okur ve degeri dondurur,bir problem olmaz.

fwrite ()

Bu komut dosyaya veri yazmak icin kullanilir.Iki argument bu komutun kullanilmasi icin gereklidir .Birincisi dosyanin ne oldugu,ikincisi ise dosyanin icine ne yazilacagi. Eger islem basarili olursa degisken icin ,kac byte veri yazilmissa onun sayisal degeri doner,basarisiz olursa "-1".Ornek verecek olursak,

$fp = fopen ("data.txt","w") ile dosyayi basarili sekilde actigimizi varsayalim.


fwrite ($fp,"ABCDSerKanCeyLAnI");

Bu komut "data.txt" dosyasinin basina "ABCDSerKanCeyLAnI" karekterlerini yazar.Daha onceden dosya icerisinde yazilmis tum veriler tamamen silinir.Yanlizca elinizde bu karaketerlerin yazili oldugu bir dosya kalir.Tekrar ediyoruz kursor bu karekter dizisinin sonuna gidip bekler.Bu komutu kullanirken aklinizda olsun, bilgisyara normal olarak klavyeden yaziliyor gibi karekterler yazilir ve kursor yazdiginiz yazi grubunun sonuna gidip bekler.

Eger ozel bir uzunluk belirtmek isteseydik,bunu ucuncu argument olarak komuta su sekilde ekleyebilirdik,
fwrite ($fp,"ABCDSerKanCeyLAnI",4);

Bu komutla verdigimiz string ifadenin(ki bu "ABCDSerKanCeyLAnI" dir.) ilk 4 byte"i (ki bu "ABCD" dir.) $fp degiskeni ile belirttigimiz dosya icerisine yazilacaktir.Eger belirtilen uzunluk byte"i yazilacak ifadeden buyukse ifade"nin hepsi yazilir,bir problem olmaz.

Artik bu kadar konusma yeterli uygulama yapmanin zamani geldi.

Basit Bir Hit Sayaci

<?php
//hit_sayac1.php
$sayac_dosyasi = "./sayac.dat";
if (!($fp = fopen ($sayac_dosyasi,"r"))) die ("Dosya Acilamiyor");
$sayac = (int) fread($fp,20);
fclose ($fp)
$sayac++;
echo "Ziyaret Sayisi : $sayac";
$fp = fopen ($sayac_dosyasi,"w");
fwrite ($fp,$sayac);
fclose ($fp);
?>

Ne zaman sayfayi refresh yapsaniz sayfanin uzerindeki sayacin bir arttigini gorursunuz.

Not : Bu kucuk programda "sayac.dat" isimli dosyanin zaten klasorun icinde oldugu kabul edilmektedir.Eger boyle bir dosya bulunamaz ise program hata verecektir.Bu nedenle Unix/Linux kullanicilari "touch" komutunu kullanarak dizin icinde bir dosya yaratbilirler.

bash 2.0.4>touch sayac.dat

veya bir text dosyasi acip "save as" ile bos olarak kaydedin.Kaydederken de "sayac.dat" ismini verin isiniz gorulur.

Program nasil calisiyor?

Ilk once "sayac.dat" dosyamiz scriptin bulundugu klasor icinde bulundu ve "yanlizca okunabilir" olarak acildi.

$sayac_dosyasi = "./sayac.dat";
if (!($fp = fopen ($sayac_dosyasi,"r"))) die ("Dosya Acilamiyor");


ikinci satirda "if" komutuyla dosyanin acilmasi sirasinda bir problem oldu mu diye test yapiyoruz.Eger islem basarili olarak gerceklesirse parantezin disina "dogru" olarak cikacaktir.Ama dikkat ederseniz bir unlem isaretimiz var.Bu unlem isareti o "dogru" ifadasini "yanlis" a cevirecek ve boylece program bir alt taki satiri okuyacaktir.Her turlu problemde script "die" komutuyla , "echo" ile verigimiz ifadeyi ekrana basarak sonlanacaktir.

TreXiaNos
26-05-2009, 12:41   |  #10  
OP Üye
Teşekkür Sayısı: 0
85 mesaj
Kayıt Tarihi:Kayıt: May 2009

PHP - Basit Template Uygulaması


PHP - Basit Template Uygulaması

Site basitce iki bolumden olusuyor. Ilk bolum sitenin genel gorunusunu belirleyen sablon sayfasi. Diger bolum ise sitenin icerik bolumlerini olusturacak olan eklenti dosyalarindan olusuyor.

Sablonu hazirlarken yapilmasi gereken, dinamik icerik sayfalarina yer birakacak sekilde sitenin genel duzenini hazirlamak. FreeLinuxCD.org sitesinin sablonunda bu is icin buyuk bir ana tablonun sol tarafindaki buyuk bir tablo hucresi icerik alani olarak ayrilmis bulunuyor. Bu alan haric sitenin sablon kullanan her sayfasi ayni gorunume sahip.

Bu sablon dosyasina index.php adini vermek en kolay yontem. Dosyanin en basinda icerik dosyalarinin uzantisinin ne oldugunu belirtiyoruz.

# extension : uzanti
$extension = "php";
if(!$page) $page = "index.$extension"; else $page = "$page.$extension";


Yukarida gordugumuz gibi su anki sitemizde icerik dosyalarinin php uzantili olmasi bekleniyor.Eger sizin web sunucunuz kontrolunuz altinda degil ve php taninan uzantilardan biri degilse yukaridaki $extension degiskeninin degerini phtml, php4, php3 gibi degistirerek kullanmak da mumkun. Tabi ki bunu yaptiginizda icerik dosyalarinin uzantilarini da ayni sekilde yaratmaniz gerekiyor.
Yukaridaki kisa kodu yaptigi bir baska sey ise eger hic bir sayfa adi verilmemis ise index.php sayfasini cagirmak.

Sitenin her sayfasi bu sablon dosyasi araciligiyla olusturuluyor. Yani butun sayfalarin url"sinde index.php var. Gidilen sayfanin icerigini $page degiskeni belirliyor.


// ana sayfa (index.php)

//ana sayfa (index.php) alternatif yontem

// getcd sayfasi. Icerik hucresi getcd.php sayfasindan


Sitemizde kolaylik olsun diye icerik sayfalarini index.php"nin oldugu dizinin altindaki "pages" dizininde tutuyorum. Boylece icerik degistirilmesi gerektiginde pages dizinine gidip gerekli dosyayi degistirmek yeterli oluyor.

Simdi icerik alani olarak ayirdigimiz tablo hucresinin icine yazilacak ve icerik sayfasini cagirmaya yarayacak koda bir goz atalim.

<?
if(file_exists("pages/$page"))
{
include ("pages/$page");
}
else
{
include ("pages/error_document.php");
}
?>


Ilk once $pages degiskeni ile gecirilen sayfa adinin icerik sayfalarini sakladigimiz pages dizininde olup olmadigina bakiyoruz. Eger bu dosya mevcut ise icerik alaninda onu "include" ediyoruz. Eger sayfa mevcut degil ise icerik alanina ozel olarak hazirladigimiz hata mesaji sayfasi (error_document.php) "nin icerigi yaziliyor. Bu sayfada ne diyeceginiz size kalmis. Aradiginiz sayfaya ulasilamadi gibi bir mesaj yeterli olacaktir. Dikkat ettiginiz uzere aldigimiz bu tedbirlerle mevcut olmayan bir sayfa adi verilmesi halinde dogabilecek sorunlari engellemis oluyoruz. En kotu ihtimalle kendi dizayn ettigimiz bir hata sayfasina ulasilacak. Hata halinde index.php dosyasina da yonlendirme yapabilirdik ama bunun kullanicinin kafasini karistirma tehlikesi var.

Bir de bu icerik dosyalarinin nasil dizayn edilmesi gerektigi konusuna deginelim. Bu sistemin guzelligi, icerik dosyalarinin bir ozelligi olmasinin gerekmedigidir. Ornegin;

<!-- error_document.php icerigi-->
Yanlis bir sayfa adi girdiniz. Lutfen yaraticiliginizi bir yana birakip linkleri kullaniniz.

seklindeki bir error_document.php sayfanin icerik alaninda istediginiz uyari mesajini gosterecektir. Bu icerik sayfasinda ne html, ne de php kullanmak gerekmedigine dikkat ediniz. Tabi ki <? ?> tag"leri icerisine koyacagimiz bir php kodu, veya html taglerini kullanarak dizayn edecegimiz bir alt sayfa da bu icerik sayfalarinda yer alabilir. Hatta bu icerik sayfalari kendileri de baska sayfalari icerebilir (boyle cok derine inen "include" lar tavsiye edilmez)

Eger ilgileniyorsaniz FreeLinuxCD.org"u olusturan kodun tamamini https://sourceforge.net/projects/freelinuxcd/ adresindeki proje sayfasinda bulabilirsiniz.

Not: Bu makale baslangic seviyesindeki kullanicilarimiz icin hazirlanmistir. Web"de bulabileceginiz cok daha karmasik bir cok site sistemi bu ana prensip ile calisir. Bu cok basit sablonla site yonetimi ornegini gelistirerek cok daha iyi siteler hazirlamak mumkundur.

TreXiaNos
26-05-2009, 12:43   |  #11  
OP Üye
Teşekkür Sayısı: 0
85 mesaj
Kayıt Tarihi:Kayıt: May 2009

PHP İçinde C ile Yazılmış Fonksiyon Eklemek

Problem : Kendi hazirladiginiz C fonksiyonlarini, PHP betikleri icinden kullanmak istiyorsunuz.

Cozum : Ornek bir "C Programi" hazirlayip, PHP icerisine yerlestirelim.Ardindan PHP"yi bu yeni ekledigimiz fonksiyon ile derleyip sisteme tekrar yukleyelim...


PHP_FUNCTION(sample_function)
{
char *ret = NULL,
*fmtstr;
zval **arg1, **arg2, **arg3;
if (ZEND_NUM_ARGS() != 3 ||
zend_get_parameters_ex (3, &arg1, &arg2, &arg3) == FAILURE) {
WRONG_PARAM_COUNT;
}

/* arg1 is an int */
convert_to_long_ex (arg1);
/* arg2 is a double */
convert_to_double_ex (arg2);
/* arg3 is a string */
convert_to_string_ex (arg3);

fmtstr = "arg1 is %d, arg2 is %f and arg3 is %s, arg3 has a length of %d";


/* Not the best allocation for integer values
* but sufficient for the needs of this simple program.
*/


ret = emalloc(strlen(fmtstr) + 10 + 20 + Z_STRLEN_PP(arg3));
sprintf(ret, fmtstr, Z_LVAL_PP(arg1), Z_DVAL_PP(arg2),Z_STRVAL_PP(arg3), Z_STRLEN_PP(arg3));
RETURN_STRING(ret, 0);
}


Tartisma :

Bu ornek fonksyion PHP betikleri icerisinden asagidaki sekilde cagrilabilir :

echo sample_function (23, 23.34003, "Hello World");

Bunun sonucunda asagidaki gibi bir ifade donecektir :

arg1 is 23, arg2 is 23.34003 and arg3 is Hello World, arg3 has a length of 11

Program nasil calisiyor?

Satir 1 - PHP foksiyonu olarak deklare ediyoruz.
Satir 4 - arg1,arg2 ve arg3"u zval degiskenleri olarak deklare ediyoruz.zval asagidaki yapiya sahiptir :

typedef _zval_struct zval;

/* Notice that is a union, meaning only one of the entries exists at a single time */
typedef union _zval_value {
long lval; /*the long value */
double dval; /*The double value */
struct {
char *val; /* The value of the string */
int len; /* The length of the string */
} str;
char chval;
HashTable *ht; /* If it is an array */
struct {
zend_class_entry *ce;
HashTable *properties;
} obj; /* Object properties */
} zvalue_value;

/* The actual zval struct itself, aliased by the typedef above */

struct _zval_struct {

zvalue_value value; /* Value of argument */
zend_uchar type; /* Type of the argument */
zend_uchar is_ref; /* Whether or not the argument is a reference */
zend_ushort refcount; /* The reference count on the argument */
};

Satir 5 - Fonksiyonumuza 3 tane argumentin gecirildigine emin oluyoruz.ZEND_NUM_ARGS () fonksiyona gecirilen argument sayisini dondurur.

Satir 6 - zend_get_parameters_ex () fonksiyonu ile yazdigimiz fonksiyona gecirilen degiskenlerin icindeki degerler "zval" degerleri olarak deklare ediliyor.

Satir 7 - Bu islem basarisiz olursa, hatayi rapor et.
Satir 11 - arg1"i long"a cevir.
Satir 13 - arg2"yi double"a cevir.
Satir 15 - arg3"u string"e cevir.
Satir 18 - String formatini olustur.
Satir 19 - Hafizaya yerlestir.
Satir 20 - Donecek degeri olustur.
Satir 21 - Donecek degeri dondur.

Ek Aciklama :

Bilmeyenler icin kisa bir tekrar yapalim.Integer,Double ve String ne demektir?

1.Integer (Ondalik kisimi olmayan sayi veri tipi)
2.Double (Tam ve ondalik olmak uzere iki kisimdan olusan sayi veri tipi)
3.String ( Genel olarak bilinen karekter (yazi) veri formati.PHP icerisindeki betiklerde mutlaka " veya " icerisine yazilmalidir.)

Eger PHP"nin kaynak kodunu incelerseniz gozunuze asagidaki gibi satirlar carpacaktir :

pval **argument;

aslinda :

zval **argument;

olmasi gereklidir.PHP 3 icerisinde butun argumentler zval"ler yerine pval"ler seklindeydi.PHP 3 kaynak kodunu PHP 4 kaynak koduna aktarabilmek icin , zval ve pval"leri ayni sey yapmak gerekli idi.Bu olay basitce "typedef" ile saglanmistir.

Ek Bilgi :

Bir degiskenin icine, fonksiyona gecirilen argument sayisini gidip getirmesini soylemek icin :

PHP_FUNCTION(birfonksiyon)
{
zval **arg1, **arg2;
int argcount = ZEND_NUM_ARGS();

if (argcount > 2 || argcount < 0 || zend_get_parameters_ex(argcount,&arg1, &arg2) == FAILURE) {
WRONG_PARAM_COUNT;
}

if (argcount > 0) {
convert_to_long_ex(arg1);
/* php_printf prints out to STDOUT */
php_printf("%dn", Z_LVAL_PP(arg1));
}

if (argcount > 1) {
convert_to_string_ex(arg2);
php_printf("%sn", Z_STRVAL_PP(arg2));
}

php_printf("Above are %d printed out arguments", argcount);
}


zend_get_parameters_ex () fonksyionu, yanlizca ilk argument ile verilen sayi kadar argumentle eslesir.Bu sebeple yanlizca sizin istediginiz sayidaki degisken fonksiyona argument olarak gecer.


PHP"ye bu yeni fonksiyonu eklemek :

1.Fonksiyonun kaynak kodunu dogru dosyanin icine yerlestirin; sample_function () fonksiyonu icin basic_functions.c PHP dosyasinin icine yerlestirme yapabiliriz.

2.Bu dosyanin icinde yukarilarda bir yerde asagidaki gibi satirlarin gectigi yeri bulunuz. (Eger bu fonksiyonu ext/standard icine yerlestiriyorsaniz, basic_functions.c dosyasinin icinde en yukarilarda bir yere bakmalisiniz.)

function_entry MODULENAME_functions[] = {
PHP_FE(somefunction, NULL)
...
}

Kendi yazdiginiz fonksiyon icin asagidaki gibi bir satir ekleyebilirsiniz :

PHP_FE(sample_function, NULL)

Simdi asagidaki gibi bir goruntu olmali :

function_entry MODULENAME_functions[] = {
PHP_FE(somefunction, NULL)
PHP_FE(sample_function, NULL)
...
}

3.Bu dosya icin var olan "header" dosyasina gidin."header" dosyalari genelde php_MODULENAME.h olarak isimlendirilen dosyalardir.

Bu dosyanin icinde bir cok deklarasyon goreceksiniz :

PHP_FUNCTION(somefunction);

Siz asagidaki gibi bir satiri eklemelisiniz :

PHP_FUNCTION(sample_function);


4.PHP"yi tekrar derleyin ve sisteme yukleyin.Betikleriniz isinden artik yeni fonksiyonunuzu cagirebilirsiniz.