Örneğin :
echo “Öylesine bir çıktı”;
header(Location : “deneme.html”);


Kod parçacığı beklendiği gibi deneme.html dosyasını çağırmayacaktır. Bu kısıtlama PHP’ nin zayıflığından değil HTTP protokolünün tanımlarından kaynaklanmaktadır. Diğer bazı çok kullanılan HTTP başlıkları şu şekildedir:



Content-Encoding
Content-Language
Content-Type
Expires
Referrer
Last-Modified
User-Agent
Accept-Encoding
Accept-Language
…..



Bu başlıklar hakkında ayrıntılı bilgiye ftp://ftp.isi.edu/in-notes/rfc2626.txt adresinden ulaşabilirsiniz.



PHP ile Posta Gönderme



Elektronik posta, kuşkusuz Internet üzerindeki bir numaralı iletişim aracıdır. PHP ile posta gönderme işlemi, tek bir fonksiyon kullanımı ile halledilebilecek kadar kolaylaştırılmıştır. Yalnız uyaralım, aşağıda gördüğünüz örnek kodların UNIX / Windows 2000 ve Windows 95 / 98 sistemlerde çalışma şekilleri farklıdır. UNIX türevlerinde ve Windows 2000’nde, e-posta işlemlerinin yapılması için gerekli olan POP3 ve SMTP posta sunucuları önyüklüdürler. Windows 95 ve 98 sistemlerde ise, bu sunucular olmadığı için, bu sunucuları yüklemeden örnek kodları çalıştırmanız mümkün değildir



Mail Fonksiyonu

Mail Fonksiyonu’nun kullanım şekli aşağıdaki gibidir:



Mail (kime, konu, mesaj, [ek_başlıklar]);



Bu fonksiyon ile e-posta otomatik olarak “kime” kısmındaki kişiye veya kişilere gönderilir. Her bir virgül (,) ayrı bir kısmı göstermektedir. Örneğin:



mail(”deneme@php.org.tr”, “Deneme”, “Merhaba\nBu bir denemedir\nHoşçakalın.”);



Ek başlıkları da yazarsak örneğimiz şöyle olacaktır:



Mail (”deneme@php.org.tr”, “Deneme”, “Merhaba\nBu bir denemedir\nHoşçakalın.”, “From: webmaster@php.org.tr\nReply-To: webmaster@php.org.tr“);



Ek Başlıkların tümünün daima çift tırnak içinde olduğuna ve birbirlerinden “\n” ile ayrıldıklarına dikkat edin. Bu yazım şekli mesajı oluştururken de geçerlidir. Mesajı oluştururken bir alt satıra geçmek istediğinizde her zaman “\n” karakterini kullanmalısınız.



Posta yollarken en sık kullanılan başlıkları listeleyelim:

From (Kimden)

Reply-to (Cevabın yollanacağı adres)

Cc (Carbon Copy - Karbon kopya)

Bc (Blind Copy - Kör Kopya - gönderdiğiniz e-posta adreslerini gizler)



Tüm bunları arka arkaya kullanabilirsiniz.



E-posta için temel olarak iki şey gereklidir: Bunlardan ilki, bir formdan gerekli Anahtar= Değer (Key= Value) çiftlerini almak ve php dosyasına iletmektir. Bildiğiniz gibi Internet üzerinde tüm girdiler bu şekilde gönderilmektedir. Bunu bildiğinizi varsayarak aşağıdaki örnekleri inceleyelim.



Önce e-posta gönderilecek formumuzu hazırlayalım ve dosyamızı eposta.php olarak saklayalım:



<form name=”eposta” action=”form.php” method=”post”>

<table border=”0″ cellspacing=”2″ cellpadding=”2″ align=”left”>

   <tr>

      <td colspan=”2″>

        <div align=”center”>

          <p align=”left”>Sitemizi inşa etmede ve yenilemede görüşleriniz

          çok önemlidir. Lütfen doldurmaktan çekinmeyin.</p>

        </div>

      </td>

    </tr>

    <tr>

      <td width=”98″>

        <div align=”right”>Ad Soyad: </div>

      </td>

      <td width=”450″>

        <input type=”text” name=”adsoyad”><!– 1. Değişken “adsoyad” –>

      </td>

    </tr>

    <tr>

      <td width=”98″>

        <div align=”right”>E-Posta: </div>

      </td>

      <td width=”450″>

        <input type=”text” name=”eposta”><!– 2. Değişken “eposta” –>

      </td>

    </tr>

    <tr align=”left” valign=”top”>

      <td width=”98″>

        <div align=”right”>Yorumlarınız:</div>

      </td>

      <td width=”450″>

        <!– 3. Degisken “yorum” –>

        <textarea name=”yorum” cols=”55″ rows=”10″></textarea>

        <!– 4. Degisken “kime” –>

        <br><input type=”hidden” name=”kime” value=”deneme@php.org.tr”>

        <!– 5. Degisken “konu” –>

        <input type=”hidden” name=”konu” value=”Web Sitemden”>

                        <!– 6. Degisken “gonder” ancak bunlar sabittir.  php uzantili dosyamizda degisken atamamiza gerek yok. –>

        <input type=”submit” name=”gonder” value=”Gönder”>

        <input type=”reset” name=”Submit” value=”Sil”>

        </p>

        <p style=”font-size: 10px;”>Lütfen 20 sn. bekleyin. Tekrar Gönder butonuna basmanıza

        gerek yoktur.</p>

      </td>

   </tr>

</table>

</form>




Her zaman için öncelikle formunuzdaki Anahtar = Değer çiftlerini aklınızda tutarsanız, PHP’de değişkenleri atamanız çok kolaylaşacaktır.



<input type=”hidden” name=”kime” value=”deneme@php.org.tr”>

Dikkat ederseniz “kime” anahtarına “deneme@php.org.tr” değerini atadım.



<input type=”hidden” name=”konu” value=”Web Sitemden”>

“konu” anahtarına da “Web Sitemden” değerini atadım.



Değerleri bu şekilde atamamızın amacı, ileride sadece bu iki alanı değiştirerek farklı formlar yaratabilmenizi sağlamak. Böylece hem daha anlaşılır bir sisteminiz olacak, hem de yeni bir form yaratmanız daha az zamanınızı alacak.



Yukardaki formda yer alan değişkenleri sıralayalım:



1.adsoyad (ziyaretçi dolduracak)

2.eposta (ziyaretçi dolduracak)

3.yorum (ziyaretçi dolduracak)

4.kime (deneme@php.org.tr)

5.konu (Web sitemden)



Şimdi bu verileri kullanarak elektronik postamızı hazırlayıp yollayacak PHP kodumuzu yazalım:

<?php

            $mesaj  = “Ad Soyad: ” . $adsoyad . “\n”;

            $mesaj .= “E-Posta: ” . $eposta . “\n”;

            $mesaj .= “Yorum: ” . $yorum . “\n”;

            $extra_baslik  = “From: $kime\n”;

            $extra_baslik .= “Reply-To: $eposta\n”;

            $extra_baslik .= “Bcc:arsiv@php.org.tr\n”;

            $extra_baslik .= “Content-Type:text/plain; charset=\”iso-8859-9\”\n”;

            $extra_baslik .= “Content-Transfer-Encoding: 8bit\n”;

            mail($kime, $konu, $mesaj, $extra_baslik);

?>


Önce size yabancı gelebilecek birkaç kullanım şeklini açıklayalım.



Eğer Perl veya C tabanlı bir kullanıcı iseniz, “.=” kullanımına zaten aşinasınız demektir. Basic benzeri dillerden gelen kullanıcılar için de onlara tanıdık gelecek kullanım örneğini verelim:

$mesaj = $mesaj . “E-Posta: “ . $eposta . “\n”;
PHP’de, Basic benzeri dillerden farklı olarak, değişkenleri birbirlerine eklemek için nokta kullanılır. PHP ile her iki kullanım şekli de doğrudur. Biz bütün örneklerimizde “.=” biçimini kullanacağız.

HTML sayfalarını yayınlarken geçerli olan bütün kurallar, e-posta hazırlarken de geçerlidir: İçeriğin hangi karakter seti ile okunması gerektiğini mutlaka belirtmelisiniz, aksi takdirde e-postanız farklı e-posta istemcilerinde farklı sonuçlar verecektir! Bu sorunu çözmek için, $extra_baslik değişkenine iki yeni satır ekledik: Content-Type ve Content-Transfer-Encoding.

Dikkat ettiyseniz, postanın BCC bölümüne de bir e-posta adresi yazdık. Böylece yollanan bütün formların bir kopyasının da “arsiv@php.org.tr” adresine gitmesini sağlamış olduk.

Son olarak unutmamamız gereken bir şey daha var. Formu gönderdikten sonra, ziyaretçimize e-postanın gönderildiğine ilişkin bir mesaj vermeliyiz. Bunun için yukarıdaki kodumuza dokunmadan onu HTML kodlarıyla sarıp, gonder.php ismiyle kaydedeceğiz. Gonder.php dosyasının son hali aşağıdaki gibi olacaktır:



<?php

  $mesaj  = “Ad Soyad: ” . $adsoyad . “\n”;

  $mesaj .= “E-Posta: ” . $eposta . “\n”;

  $mesaj .= “Yorum: ” . $yorum . “\n”;

  $extra_baslik  = “From: $kime\n”;

  $extra_baslik .= “Reply-To: $eposta\n”;

  $extra_baslik .= “Bcc:arsiv@php.org.tr\n”;

  $extra_baslik .= “Content-Type:text/plain; charset=\”iso-8859-9\”\n”;

  $extra_baslik .= “Content-Transfer-Encoding: 8bit\n”;

  mail($kime, $konu, $mesaj,$extra_baslik);

?>

<html>

<head>

  <meta http-equiv=”Content-Type” content=”text/html; charset=ISO-8859-9″>

  <meta http-equiv=”Content-Type” content=”text/html; charset=windows-1254″>

  <title>Sayın <?php echo($adsoyad) ?>, formunuz başarıyla alındı.</title>

</head>

<body>

<b>Sayın <font color=”Purple”><?php echo($adsoyad); ?></font>,

formunuz <b><font color=”Purple”>

<?php echo($kime); ?></font></b> adresine gönderilmiştir.

Teşekkür ederiz.</b>

</body>

</html>




Başta da belirttiğimiz gibi, bu kodları denemek için iki şansınız var, Linux veya Windows 2000 kullanıcısı iseniz, daha şanslısınız, sisteminizde zaten yüklü bir SMTP sunucu olma ihtimali çok yüksek. Eğer Windows 95 / 98 kullanıcısı iseniz, Türkiye PHP Grubu - Anasayfa adresinden, Windows 95 / 98 altında kullanabileceğiniz SMTP sunucusunun adresini ve kurulum bilgilerini gerekli bütün detaylarıyla birlikte bulabilirsiniz.



İkinci bir şansınız daha olduğunu söyledik, o da Internet’e bağlı olmak koşuluyla kullanabileceğiniz kendi ISP’nizin SMTP sunucusu, ya da Yahoo! gibi ücretsiz posta hizmeti veren ve SMTP adresi bilinen bir site. Her iki olanak için de yapmanız gereken değişikliklere bakalım. Windows altında çalışıyorsanız, C:\Windows\php.ini dosyasını açın ve [mail function] başlığı altındaki ayarlarınızı şu şekilde değiştirin:



Kullandığınız bilgisayarda kurulu bir SMTP sunucusu varsa:

SMTP = localhost ;for win32 only (Kendi serverınızın smtp ayarını yazın)

sendmail_from=deneme@php.org.tr ;for win32 only (Email adresinizi yazın)



Kullandığınız bilgisayarda kurulu bir SMTP sunucusu yoksa:

SMTP = smtp.mail.yahoo.com (Yahoo! dan bir e-posta adresiniz olduğunu varsayıyoruz)

sendmail_from=deneme@php.org.tr



Yahoo!’nun SMTP’sini kullanmak istiyorsanız, Yahoo! sitesindeki hesabınıza girin ve Options (Seçenekler) kısmından POP3 ile e-posta alacağınızı belirtin. Yukardaki satırları php.ini dosyanıza ekledikten sonra, Yahoo! nun SMTP sunucusunu kullanarak e-posta yollayabilirsiniz.



Formu istediğiniz gibi çoğaltabilirsiniz. Gerisi sizin yaratıcılığınıza kalmıştır.



COOKİE YOLLAMA



setcookie(“tanitici”,”1”,time()+600); => (tanitici adında değeri 1 olan cookie atar)



var olan cookieyi tespit etme



$cook=$HTTP_COOKIE_VARS[“tanitici”];

if ($cook!=””):

echo “siteye ilk giriş”;

end if:

 

var olan cookieyi silmek

 

Aynı isimde süresi verilemeyen cookie atılarak var olan cookie silinir.

setcookie(“tanitici”,”1”,”time());




OTURUM (SESSION)



session_name(“serdar”);

$degisken=”serdar”;

session_register(“degisken”);


Bir değişkenin register edildiğini sınamak



if(session_is_registered(“degisken”)):

echo “register edilmiş”;

endif;



Register edilmiş değişkeni öldürmek



Session_unregister(“degisken”);



Açılmış Oturumu Kapatmak



session_unset();

session_destroy();





Dosya “çıkartma”

Internet’ten hep dosya “indiririz!” Bir sunucuya, Web ziyaretçisi olarak gönderebildiğimiz tek şey ise, Formlara yazdığımız yazılardır! Oysa HTML’in INPUT INPUT etiketinin çok az kullanılan TYPE=”file” parametresi ziyaretçiye Web sunucusuna dosya gönderme (upload) imkanı sağlar. HTTP protokolü buna imkan vermekle birlikte Browser’lar bu imkanı kullanmaya ileri sürümlerinde kavuştular. PHP4, ziyaretçilerimizin sitemize dosya göndermeleri halinde, bu dosyaların yönetimine ayrıca kolaylık sağlayan değişkenlere sahiptir.



<?php

$dosya_dizin = “/inetpub/wwwroot/”;

$dosya_url = “http://server/”;

if ( isset ( $dosya_gonder )) {

            print (”<b>Yol:</b> $dosya_gonder<br>\n”);

            print (”<b>Adı:</b> $dosya_gonder_name<br>\n”);

            print (”<b>Boyut:</b> $dosya_gonder_size<br>\n”);

            print (”<b>Tür:</b> $dosya_gonder_type<br>\n”);

            copy ( $dosya_gonder, “$dosya_dizin/$dosya_gonder_name” )or die (”Dosya kopyalanamıyor!”);

                        if ( $dosya_gonder_type == “image/gif” ||$dosya_gonder_type == “image/pjpeg”  ) {

                        print (”<img src=\”$dosya_url/$dosya_gonder_name\”><p>\n\n”);

                        }

}

?>

<FORM  ENCTYPE=”multipart/form-data” ACTION=”<?php print $PHP_SELF?>” METHOD=”POST”>

<INPUT TYPE=”hidden” NAME=”MAX_FILE_SIZE” VALUE=”951200″>

<INPUT TYPE=”file” NAME=”dosya_gonder”><BR>

<INPUT TYPE=”SUBMIT” VALUE=”Dosya Yolla!”>

</FORM>


Bu programda <INPUT TYPE=”file” NAME=”dosya_gonder”> etiketinde kullandığımız NAME parametresine verdiğimiz değer, ziyaretçimizin göndereceği dosyanın sunucu tarafından kaydedileceği geçici dizinin tam yolunun yazılacağı değişkenin adı olacakdır. PHP, bu dosya ile ilgili her türlü bilgiyi bu adla kaydedektir. PHP, ziyaretçiden bir dosya başarıyla aktarıldığı anda otomatik olarak bu isimden yararlanarak şu değişkenleri oluşturur:



$dosya_gonder Geçici kayıt dizini yolu (UNIX’te /tmp/phpXXX, Windows’da Windows/TEMP0phpXXX. Burada XXX yerine ziyaretçilerin gönderdiği dosyaların sıra numarasını göreceksiniz.)

$dosya_gonder_name Ziyaretçinin gönderdiği dosyanın adı.

$dosya_gonder_size Ziyaretçinin gönderdiği dosyanın boyutu.

$dosya_gonder_type Ziyaretçinin gönderdiği dosyanın türü





PHP ayrıca bu bilgileri $HTTP_POST_FILES dizi-değişkeninde de tutar.



Yukardaki programda şu iki değişken çok önemlidir:



$dosya_dizin = “/inetpub/wwwroot/”;

$dosya_url = “http://server/”;



$dosya_dizin adıyla oluşturduğumuz değişkene vereceğimiz değer, ziyaretçinin göndereceği dosyanın kopyalanacağı klasörün adı olarak kullanlacaktır. Sözgelimi Windows ortamında buraya kişisel Web sunucunun varsayılan klasörünün adını yazabilirsiniz. Ziyaretçinin göndereceği dosya bir GIF biçiminde grafik dosyası ise bunu Browser’da görünteleyeceğimiz için, bu dizinin Web’e açık olması, başka bir deyişle bizim Web sunucumuzun erişebileceği bir dizin olması gerekir. Nitekim, $dosya_url değişkenine değer olarak bu klasörün URL adresini veriyoruz. Bu iki değişkeni gerçek Web sunucu için yazacağımız zaman, bizim sunucumuzun varnaydığı fiziksel klasör adını ve yolunu bulmamız gerekir. Bunu daha önce yazdığımız php.php veya formlar01.php programlarını sitemizde çalıştırarak bulabiliriz. (Nasıl?) Sözgelimi, http://www.mycgiserver.com/~ocal/ adresindeki sitenin fiziksel adresi ile bu adresin URL’ini dikkate alarak bu iki değişkeni yazmış olsaydık, şunu yazacaktık:



$dosya_dizin = “/wwwroot/mycgiserver.com/members/uNhM13/”;

$dosya_url = “http://www.mycgiserver.com/~ocal/”;



Bu uygulamayı kendi sunucunuzda yapmak isterseniz, mutlaka bu iki değişkeni doğru yazmanız gerekir. http://www.mycgiserver.com/~ocal/ dosya_gonder_server.php programı ile bir dosya gönderme (upload) işleminin sonucu şöyle:











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 harici bir dosyanın içindeki yazıyım.. Beni bir PHP programı alıp buraya getirdi! Kendisine teşekkür ederim”



Sonra, şu programı dosya_ekle01.php adıyla kaydedin, ve Browser’da açın:



<?php

include (”harici_dosya01.x”);

print (”\n<p> Ben zaten bu programının içinde olan bir yazıyım. Baştan beri burada olduğuma çok memnununum.. Harici dosyaya hoşgeldin diyorum!</p>”);

?>



include mu, require mı?

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.



Dosyalar hakkında bilgi

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!”);