Google
   
  BİZİ SEÇTİGİNİZ İÇİN TEŞEKKÜRLER
  Php-de Formlar
 

PHP'de Formlar
PHP’yi dinamik sayfa hazırlama işlemlerinin bütünü olarak düşünürsek, formlar için de bu bütünün kalbi diyebiliriz. Dinamik içeriğe sahip bir site hazırlamanın ilk adımı, kullanıcı katılımını sağlamaktır. Bu bir üyelik formu olabilir, sipariş formu olabilir, veya bir ziyaretçi defterine kayıt formu olabilir. Her durumda, PHP ile bu bilgileri alıp, işleyip, istediğimiz hale getirebilmek için, önce bu bilgileri formlar aracılığı ile kullanıcıdan almamız, sonra da bu bilgileri PHP’ye göndermemiz gerekir.

Kullanıcımızdan adını ve soyadını öğrenip, ona özel bir “merhaba” mesajı yazdıracağımız bir örnekle başlayalım:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>

<head>

<title>Form Alıştırması</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>

<? if ($islem == 1): ?>

Merhaba <b><? echo ucfirst($ad) . " " . ucfirst($soyad) ?></b>,<br>

Sizinle tanıştığıma çok memnun oldum.

</body>

</html>

<? exit; ?>

<? endif; ?>

<form action="form.php" method="post">

<input type="hidden" name="islem" value="1">

Siteme hoşgeldiniz, sizi tanıyabilir miyim?

<table>

<tr>

<td>Adınız:</td>

<td><input type="text" name="ad"></td>

</tr>

<tr>

<td>Soyadınız:</td>

<td><input type="text" name="soyad"></td>

</tr>

<tr>

<td>&nbsp;</td>

<td><input type="submit" value="Tanışalım"></td>

</tr>

</table>

</form>

</body>

</html>

Bu dosyayı “form.php” adıyla kaydedin.

“If” komutunun kullanım şekline dikkat edin. PHP’nin, özellikle Perl’den ayrıldığı en önemli nokta bu, PHP kodlarıyla HTML kodlarını kolayca birbirlerinden ayırabilirsiniz. Bu kullanım biçimi en çok grup çalışmalarında faydalı olacaktır, siz sadece PHP kodu ile ilgilenirken, arkadaşınız da sadece HTML kodunu hazırlayabilir, böylece çok daha hızlı çalışabilirsiniz. İkinci komut “ucfirst();”, $ad ve $soyad değişkenlerinin ekrana yazılırken ilk harflerinin büyük yazılmasını sağlıyor.

Programın çalışma şeklini özetleyelim. Önce hazırladığınız programı tarayıcınızda http://localhost/form.php adresini yazarak çalıştırın. PHP kodu atlanacak ve karşınıza kullanıcının adını ve soyadını soran form gelecektir. PHP kodunun atlanmasının nedeni, henüz form çalıştırılmadığı için, $islem değişkeninin var olmamasıdır. $islem değişkeninin yaratılmasını, forma eklediğimiz bir “hidden” yani gizli alan aracılığıyla sağlıyoruz. Böylece kullanıcı form bilgilerini gönderirken, farkında olmadan bize $islem değişkenini de gönderecektir. Kullanıcı “Tanışalım” butonuna bastığında, form bilgileri, $islem değişkeni ile birlikte kullanıcının tarayıcısından bizim sunucumuza gönderilecek ve PHP tarafından otomatik olarak değişken haline getirilecektir. Biz de bu bilgileri kullanarak kullanıcının ekranına merhaba mesajını yazdırıyoruz. Dikkat etmeniz gereken başka bir nokta, “exit()” komutunu kullanmanız gerektiğidir, eğer bu komutu eklemezsek, kullanıcıya merhaba mesajı gönderildikten sonra, ilk ekrandaki form bu mesajın altında tekrar gösterilir.

Formda Dizi-Değişken (Array) Kullanımı
Kimi zaman kullanıcının aynı alanda birden fazla seçim yapmasını sağlamak isteyebiliriz. Örneğin, bir form aracılığı ile kullanıcımızın hangi meyveleri sevdiğini öğrenmek istiyoruz. Ziyaretçimiz tek bir meyve seçecek olsaydı, yukarıdaki örneğimiz bu iş için yeterli olurdu, ama onu daha yakından tanıyabilmemiz için kesinlikle yeterli olmazdı! Bir örnek vererek sorunumuzu daha iyi tanımlayalım:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>

<head>

<title>Form Alıştırması - 2</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>Sevdiğiniz meyveler:

<?

if (isset($islem))

{

/* $islem değişkeni varsa form bilgileri işlenir

 değişken yoksa sadece form gösterilir */

/* Dizi-değişkendeki eleman sayısını bulalım */

$eleman_sayisi = count($meyve);

/* Elemanları listeleyecek döngüyü kuralım */

for ($idx = 0; $idx < $eleman_sayisi; ++$idx)

{

echo "<b> $meyve[$idx] </b>n";

}

/* Formun geri kalanının gösterilmemesi için exit komutunu kullaniyoruz */

exit;

}

?>

<p>Lütfen aşağıdaki listeden sevdiğiniz meyveleri seçin.<br>

Bir'den fazla seçim yapmak için seçiminizi kontrol tuşuna basılı tutarak yapın.</p>

<form action="form2.php" method="post">

<input type="hidden" name="islem" value="1">

<table>

<tr>

<td valign="top">Meyveler:&nbsp;</td>

<td>

<select name="meyve[]" size="5" multiple>

<option value="Elma" SELECTED>Elma</option>

<option value="Çilek">Çilek</option>

<option value="Muz">Muz</option>

<option value="Portakal">Portakal</option>

<option value="Erik">Erik</option>

</select>

</td>

</tr>

<tr>

<td>&nbsp;</td>

<td><input type="submit" value="Seçtim Bile"></td>

</tr>

</table>

</form>

</body>

</html>

Bu örneği form2.php olarak kaydedebilirsiniz.

Formdaki bilgileri bir dizi-değişkene aktarmak için, “select” kutusunun “name” özelliğinin sonuna “[]” ekliyoruz, böylece form gönderildiğinde o alanın dizi-değişken olarak tanınmasını sağlıyoruz. Formumuz gönderildiğinde PHP otomatik olarak dizi-değişkeni oluşturuyor. Dizi-değişkenlerin kullanımı ile ilgili örnekleri ilerki örneklerde bulabilirsiniz, burada dizi-değişkenimizi döngü içine soktuk ve içindeki bütün elemanları listeledik.

Formları Ziyaretçi Defteri programımızda da sıkça kullanacağız.

PHP ve HTML’in Birbirlerinden Ayrılması
PHP’nin en önemli özelliklerinden birisinin HTML’in içine gömülebilmesi olduğunu daha önce belirtmiştik. Bu sayede PHP’yi sadece ihtiyacımız olduğu yerde kullanıyor, geri kalan bölümleri HTML olarak tamamlayabiliyoruz. Peki siz bu ayrımdan alabileceğiniz bütün verimi alabiliyor musunuz? PHP ile HTML’i ayırmaktaki en büyük amacımız, kodlamayı daha hızlı yapabilmek, ve kodlamamız sona erdiğinde elde ettiğimiz kodun daha anlaşılır kılabilmektir. Bu konuyu örneklerle açalım:

İlk örnekte, veritabanından aldığımız bilgileri ekrana yazdıracağız. Bu örnekleri anlatırken kitapçıkta anlatıldığı şekilde veritabanımızı yarattığınızı varsayıyorum. Eğer yaratmadıysanız, “Veritabanı’nın Yaratılması” bölümündeki bilgilerden faydalanabilirsiniz. Veritabanı basit bir telefon fihristinin içerdiği bilgileri içeriyor, yapı olarak da aşağıdaki alanlara sahip:

id -> INT (Primary Key, Unique, Index)

isim -> VARCHAR (50)

telefon -> VARCHAR (15)

eposta -> VARCHAR (100)

Amacımız veritabanındaki bilgileri ekrana yazdırmak olduğu için veri girişi üzerinde durmayacağız, veritabanındaki mevcut kayıtları kullanacağız. Aşağıdaki örnekte, önce veritabanına bağlanılıyor, veriler alınıyor, ve ekrana tablo halinde yazdırılıyor:

<!-— htmlayir.php dosyası -->

<?php

/* Veritabanına bağlantı kuruluyor */

$baglanti = mysql_connect("localhost");

/* SQL kodu hazırlanıyor */

$strSQL = "SELECT * FROM htmlayir";

/* Sorgulama yapılıyor */

$sonuc = mysql_db_query("kitapcik",$strSQL,$baglanti);

/* MySQL veritabanı sorgulandı ve sonuç hafızaya alındı

Elde ettiğimiz bu bilgileri daha sonra tablomuzun içinde

gerekli olan yerlere yerleştireceğiz */

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>

<head>

<title>PHP-HTML Ayırma Alıştırması</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>Listenizdeki isimler:</p>

<table>

<tr>

<td>İsim</td>

<td>Telefon</td>

<td>E-Posta</td>

</tr>

<?php

/* Verilerimizi yazdırmaya başlamadan önce tablomuzun ilk satırını

 başlık olacak biçimde yarattık. Bu satırdan sonra bir döngü

 oluşturarak elimizdeki bütün verileri ekrana yazdırmış olacağız.

 while komutunun kullanımına dikkat edin, : işareti ile sonlandırıp

 PHPnin döngü içinde olduğunu unutmamasını sağlıyoruz. */

?>

<? while ($satir = mysql_fetch_array($sonuc)): ?>

<tr>

<td><? echo $satir[isim] ?></td>

<td><? echo $satir[telefon] ?></td>

<td><? echo $satir[eposta] ?></td>

</tr>

<? endwhile ?>

</table>

</body>

</html>

“Echo” komutu ile, PHP ile HTML kodunu yaratmış olursunuz. HTML’e ait hiçbir etiketi PHP kodu içersinde kullanmak zorunda değilsiniz, PHP komutlarını ve değişkenlerini kullanacağınız zamanlar dışında her zaman HTML kullanabilirsiniz, ve kullanın da. Yukarıdaki örneği daha iyi anlamak için, tarayıcınızın yardımıyla kaynak kodlarına bakın. Bütün gördüğünüz HTML kodundan ibaret olacaktır. Demek ki, PHP ile HTML kodunu yazdırmakla, direk HTML kodunu kullanmak arasında hiçbir fark yok, o zaman neden HTML kodlarımızı “echo”ların, “print”lerin arasına sıkıştırarak kafamızı karıştıralım? PHP’de ustalaşmaya başladıkça, PHP’nin en büyük özelliklerinden biri olan Nesne-Yönelimli Programlama (Object-Oriented Programming) ile tanışacaksınız. Programlarınızı PHP ile HTML’i ayırmaya özen göstererek hazırlarsanız, ileride OOP’ye alışmanız da kolaylaşmış olur.

Yukarıdaki örnek sadece “while” komutunu içeriyor, fakat “:” ile döngülerin bölünmesi sadece “while” komutuna özgü değil, diğer döngüler için de örnekler verelim:

<?php

/* İçinde dolaşabileceğimiz bir dizi-değişken (array) yaratalım */

$ulkeler = array ("Türkiye","Fransa","İngiltere","ABD");

/* Bu dizi-değişkenin içinde değişik döngülerle dolaşalım */

?>

<h3>For döngüsü ile ülkeler listesi<hr></h3>

<table>

<? for ($idx = 0;$idx < count($ulkeler);$idx++): ?>

<tr>

<td><? echo $ulkeler[$idx] ?></td>

</tr>

<? endfor ?>

</table>

<h3>While döngüsü ile ülkeler listesi<hr></h3>

<table>

<? $idx = 0 ?>

<? while ($idx < count($ulkeler)): ?>

<tr>

<td><? echo $ulkeler[$idx] ?></td>

</tr>

<? $idx++ ?>

<? endwhile ?>

</table>

<h3>Rasgele bir ülke seçip If ile yazdıralım<hr></h3>

<? /* Programı her çalıştırdığınızda farklı bir ülke seçilecek! */ ?>

<? $sayi = time() % 4 ?>

Rasgele Ülke:&nbsp;

<? If ($sayi == "0"): ?>

Türkiye!

<? Elseif ($sayi == "1"): ?>

Fransa!

<? Elseif ($sayi == "2"): ?>

İngiltere!

<? Else: ?>

ABD!

<? endif ?>

PHP’nin içine HTML kodu yazarken bir kez daha düşünün, PHP ile HTML’i birbirlerinden ayırarak her zaman daha hızlı, daha anlaşılır ve daha kolay güncellenebilir programlar yaratabilirsiniz!

PHP’de Program Denetimi
Geçen ayki kitapçığımızda, PHP ile program denetiminden bahsetmiştik. Bu ayki bölümümüzde, bütün programların iskeletlerini oluşturan bu komutları daha detaylı ele alacak ve örnekler vererek açıklayacağız.

If
If, karar verme tümceleri içinde en sık kullanılanıdır. Adından da anlaşılacağı gibi bir durum olguyu karşılaştırma yapmak ve bunun sonucunda yapılacak işleme karar verilmesi için kullanılır. Kullanım düzeni şu şekildedir :

if ( ifade )
{

komut
}

Bu belirtimde eğer ifademiz gerçeklenirse, sonuç olarak "doğru" ( true ) döneceği için komut işlenir ama ifademiz gerçeklenmezse altındaki
komut atlanır ve işlenmez. Örnek :

if ( $a>$b ) {

print " a sayısı b sayısından büyüktür ";

}

Yukarıdaki örnekte eğer, a sayısı b sayısından büyükse print fonksiyonunun yanındaki yazı ekrana çıktı olarak gönderilir.  Çıktı olarak da ekranda "a sayısı b sayısından büyüktür " ifadesi görülür ( mesela a=5 ve b=3 ise ), değilse print komutu göz ardı edilir, ekrana hiç bir şey yazılmaz ve alttaki işlem bloğuna geçilir.
Genelde bir if bloğunun içerisinde bu kadar basit işlemler olduğu gibi kısmen daha karmaşık işlemler de yapılabilir. Örnek vermek gerekirse:

 

if ( $a > $b ) {
print " a sayısı b sayısından büyüktür ";
  $b = $a ;
}

Bu kod parçacığında yukari örnekten farklı olarak son satırda b değişkeninin değerinin a değişkeninin değerine eşitlenmesi söz konusudur.
Genelde karar verme cümleciklerinde tek bir durum gerçeklenmez aksine başka alternatif bir durum gerçeklenirse, programın ya da yazılan kod parçasının başka bir komut işlemesi istenir. Bu tür durumlarda if-else karar verme mekanizması tercih edilir.
If tümcesinin içindeki ifade eğer yanlış( false ) değerini döndürürse program parçacığı bunun altındaki komutu işlemek yerine derhal else tümcesinin altındaki komutu işler. Kısaca bu fonksiyon, " eğer bu doğruysa şunu yap, değilse bunu yap " şeklinde özetlenebilir.

 

if ( $a > $b ) {
print " a sayısı b sayısından büyüktür ";
} else {
print " a sayısı b sayısından büyük değildir ";
}

Else tümcesi sadece, if tümcesinin ifade kısmı yanlış( false ) değeri döndürdüğü zaman işlenir. Yukarıdaki örnekte eğer a sayısı b sayısından büyük değilse if tümcesinin ifadesi yanlış değerini döndürecek ve else tümcesinin komutu işlenerek ekrana  " a sayısı b sayısından büyük değildir " basılacaktır.

Switch
Switch tümcesi bir seri if tümcesinin yerini tutmak için kullanılır. Değişkenin tüm değerleri için durumlar kontrol edilir ve durum altındaki komutlar işlenir.
Kullanımı şu şekildedir :

switch ( değişken ) {
  durum1 komut ;
  durum2 komut;
  durum3 komut;
}

Değişkenin birinci durumu kontrol edilir ve doğru ise bu komut bloğu işlenir, dikkat edilmesi gereken, eğer her durumdan sonra işlenen komutların sonuna herhangi bir durdurucu tümce ya da atlayıcı tümce kullanılmazsa program bütün komutları işler.Örnek olarak :

switch ( $i ) {
case 0:
  print "i değişkeninin değeri 0 dır ";
break;
case 1:
  print "i değişkeninin değeri 1 dir ";
break;
case 2:
  print "i değişkeninin değeri 2 dir ";
break;
  default:
    print "i değişkeninin değeri bilinmiyor";
}

Yukarıda i değişkeninin değeri 0 , 1 ya da 2 ise ekrana değişkenin değerini belirten cümlelelerden biri basılır ve program bloğu sonlandırılır. Eğer değişken değeri, 3 ise ya da belirtilen değerlerden hiçbiri değil ise komutların hepsi göz ardı edilir ve varsayılan olan koşul (default) işlenir.

 

For
For döngüsü temelde while döngüsüne çok benzemesine rağmen içinde birden fazla ifade barındırır ve bu ifadelerin herbiri altındaki komutların işlenmesini bağlar. Kullanımı şu şekildedir :

for ( ifade1 ; ifade2 ; ifade3 ) komut

Örnek :
     for ( $i = 1 ; $i <= 10 ; $i++ ) {
print $i;
     }

Yukarıdaki örnekte ilk önce i değişkeni 1 e eşitlenir ve daha sonra 10 dan küçüklüğü test edilir eğer küçükse altındaki komut işlenir ve ekrana i değişkeninin değeri basılır ( ki ekrana ilk önce 1 basılır ). Ardından, tümcenin içindeki üçüncü ifade işlenir, i değişkeninin değeri 1 arttırılır ve
program tekrar ikinci ifadeyi kontrol eder . Döngü ikinci ifade yanlış( false ) değeri dönene kadar sürer . Böylece ekrana 1 den 11 e kadar olan sayılar basılmış olur.

 

While
Bu tümce genelde tekrarlı bir ifadenin belli bir noktaya kadar işlenmesi ve o noktaya gelindiği anda döngüden çıkılması amacı ile kullanılır. Kullanımı şu şekildedir :

 

while ( ifade ) komut;

While tümcesinin ifadesi doğru olduğu müddetce komut işlenir yanlış olduğu zaman program bir alt program bloğuna geçer.Örnek :

 

$i = 1;
while ( $i <= 10 ) {
  print $i;
  $i++;
}

Yukarıdaki program parçasında ilk önce i değişkeni 1 e eşitlenmiştir. Daha sonra i değişkeni while tümcesinin ifade kısmında 10 dan küçük olup olmadığı konusunda sorgulanmış ve eğer küçükse (ki bu durumda öyle) ekrana i değişkeninin değeri basılmış ve ( ki bu durumda 1 basılmıştır ) i değişkeninin değeri 1 arttırılmıştır. Bu aşamadan sonra program döngünün en başına dönerek ifade kısmını tekrar kontrol eder ve komut kısmını işler. i değişkeni 11 olana kadar ekrana i değişkeninin değerlerini basar , değişken 11 olduğu anda while tümcesinin
ifade kısmı yanlış( false ) döndüreceği için döngüden çıkılır ( ekrana 11 basılmaz ) .

PHP ve Include kullanımı
Include ve require fonksiyonları belirtilen dosyadan kod okumaya ve onu çalıştırmaya yarar. Özellikle kod tekrarını önlemek ve kısmen güvenlik amaçlı kullanılır.
PHP' nin yeni versiyonu olan PHP4' te require fonksiyonunun bütün işlevleri include fonksiyonuna yüklendiği için artık bu fonksiyonun kullanılmasının bir esprisi
kalmamıştır. Include fonksiyonu aynı kod parçasını bir kaç kere kullanmamız gerektiği bir durumda kullanılması mantıklı bir fonksiyondur. Örnek vermek gerekirse, bir MySQL veritabanına bağlantı gerektiren bir program düşünelim. Bu program MySQL tablolarından veri okuyacak, yazacak ve değiştirecektir. Her bir bağlantı için temelde gerekli olan kod parçacığı aşağıdaki gibidir.

veritabani_baglanti.php dosyası
-----------------------
mysql_connect("localhost","kullanici_adi","kullanici_sifresi");
$query = "select * from kullanicilar";
$result = mysql_db_query("localhost",$query);

Dikkat edildi ise veritabanına bağlantı için her seferinde kullanıcı adı ve şifrenin ilk satırda verilmesi gereklidir. Bu, güvenlik açısından bir sorun teşkil ettiği gibi kodun tekrar kullanımı ve değiştirilmesi açısından hiç de etkin bir kullanım şekli değildir. Düşünelim ki bu program için kullanılan veritabanının kullanıcı adı ve şifresi değişti. Program içersinde her bağlantı için yeni teker teker yeni şifre ve kullanıcı adını girmek hiç de pratik bir yaklaşım değildir. Aynı uygulamayı bir başka şekilde ele alalım. İki prensip arasındaki temel fark, veritabanı bağlantısı için gerekli kullanıcı adı ve şifre gibi bilgileri bir başka dosyada tutmak ve bu bilgilere ihtiyaç duyan bağlantıda ise ilgili değişkenleri kullanmak şeklindedir.

veritabani_bilgileri.php dosyasi
----------------------
<?
   $kullanici_adi = "dbuser";
   $kullanici_sifresi = "12345";
   $sunucu_adi = "localhost";
?>

veritabani_baglanti.php dosyasi
----------------------
include ("veritabani_bilgileri.php");
mysql_connect("$sunucu_adi","$kullanici_adi","$kullanici_sifresi");
$query = "select * from kullanicilar";
$result = mysql_db_query("$sunucu_adi",$query);

Koddan da rahatlıkla anlaşılabileceği gibi include ile koda dahil edilmiş olan betik sanki "include"  yapısının kullanıldığı yere kopyalanmış ve yapıştırılmış gibi bir şekilde
düşünülebilir.
Bir başka örnekle fonksiyonu pekiştirelim.
Kullanıcı adlarının ve kişisel bilgilerinin yer aldığı bir yapı düşünelim. Her kullanıcının kişisel bilgileri disk üzerinde kendi kullanıcı adı ile belirlenen bir dosya içerisinde
tutuluyor. Yani, umut adlı kullanıcının bilgileri disk üzerinde "umut.txt" adlı bir metin dosyadan okunarak belirleniyor. Bu tür bir uygulama için yapılması en mantıklı yapı
şu şekildedir.

// $kullanici_adi HTML form' dan girdi olarak alındı varsayıyoruz.
// başındaki ve sonundaki boşluk karakterlerini siliyoruz.

$kullanici_adi = trim($kullanici_adi);
if ($kullanici_adi == "") {
  echo "Hatalı girdi, tekrar deneyiniz";
  } else {
  include ("$kullanici_adi" . ".txt");
  }

PHP' nin mümkün oldukça modüler bir yapıda kullanılması gereklidir. Sınıf (class) kullanımları ve include fonksiyonları ile zenginleştirilmiş bir yazılım çok daha profesyonel
sonuçlar ortaya çıkaracaktır.

PHP Fonksiyonları ve Global Değişkenler
PHP de değişkenler sadece kendi blokları içerisinde geçerli olup C dilinde olduğu gibi global tanımlanmış bir değişken bütün fonksiyonlar tarafından global değeri alınarak
kullanılmaz , global değişkenler atandıkları değerleri ile program blokları içinde kullanılacakları zaman program bloğuna kullanılacak değişkenlerin global değişkenler olduğu
belirtilmelidir. Örnek vermek gerekirse :

$a = 1;
function test ( ) {
  print $a;
  }
test ( );

Bu şekilde bir kod parçacığı işlendiğinde herhangi bir çıktı alamazsınız zira a değişkenini global bir değişken olarak tanımlamanıza rağmen yarattığınız fonksiyon kullanacağınız değişkenin global bir değişken olduğunu bilmemektedir bununla birlikte kendi bloğu içinde bu değişken tanımlı olmadığı ve bir ilk değer atanmadığı için hiçbir çıktı vermeyecektir. Eğer bu programı şu şekilde değiştirirsek:

$a = 1;
$b = 2;
function topla ( ) {
  global $a , $b;
  $c = $a + $b;
  print $c;
}
topla ( );
print $c;

Ekranda 3 yazdığını görürüz. Bunun sebebi ise global olarak a ve b değişkenlerinin tanımlandıktan sonra ilk değerler atanması ve topla fonksiyonu içinde kullanılacak olan değişkenlerin global olarak tanımlanmış olan a ve b değişkenleri olduğunun fonkisyona bildirilmesidir. C değişkeni ise a ve b değişkenlerinin toplamı olacağı için print fonksiyonuna aktarıldığında 3 görürüz . Fakat bu program bloğu iki kez 3 sayısını basmaz. Sebebi ise c değişkeninin sadece topla fonksiyonu içinde geçerli olan bir değişken olması ve bu değişkenin global olarak bir anlam taşımamasıdır.
PHP içinde bir çok tanımlı hazır fonksiyon barındırdığı gibi kendi fonksiyonlarımızı tanımlamamıza da olanak vermektedir. Fonksiyon tanımlamak, çok miktarda ve aynı rutin işleri yapan program parçacıklarını durmadan kodumuzun içinde tekrarlamak yerine bir kere yazıp , her iş yapılacağı zaman çağırarak kodumuzun karışıklığını önlemek için idealdir. Örneğin 3 sayıyı toplayıp aritmetik ortalamasını kullanan bir programımız olsun ve bunu bir çok kere yapması gereksin:

...
...
$d = $a + $b + $c;
$artort = $d/3 ;
print $artort
........
.........
$d = $a + $b + $c  ;
$artort = $d/3 ;
print $artort
.........
..........

Burada aritmetik orta bulduran algoritma durmadan tekrarlanarak kodun çalışırlığı sağlanmıştır. Fakat aynı uygulama şu şekilde de yapılabilirdi :

function aritmetikorta ( $x , $y ,$z ) {
  $t = $x + $y + $z ;
  $artort = $d/3;
  return $artort;
}
...
...
$deneme=aritmetikorta ( $a , $b , $c );
print $deneme;
.........
.........
$degisti = aritmetikorta ( $a , $b , $c );
print $degisti;
...........
.............

Böylece tanımladığımız fonksiyon aktarılan parametreler için kendi içinde tanımlanan işlemleri yaptıktan sonra değer olarak yaptığı işlemin sonucunu dönecektir. Bunu program içinde istediğimiz kadar sadece tek satır kod yazarak çağırabiliriz.

PHP ile HTTP Başlıklarının Kullanımı
Bu kitapçık HTTP başlık fonksiyonlarını anlatmak amacında olmayıp bu geniş konu hakkında sadece pratikte bilgi aktarmakla yetinecektir.
Bir web tarayıcı bir web sunucuya bir döküman istediği gönderdiğinde web sunucu istenilen dökümanın yanısıra header(başlık) adı verilen bazı açıklayıcı ve yönlendirici bilgiler de gönderir. Konuyu örneklerle açıklamaya çalışalım.

header("Pragma: no-cache");
header("Cache-Control: no-cache, must revalidate");

PHP, dinamik içerikli web siteleri oluşturmak amaçlı kullanıldığı için kimi zaman bazı sayfaların web tarayıcının cache denilen ara belleğinde saklanmaması daha doğru olmaktadır. Bu, özellikle yüksek güvenlik gerektiren ve çok sık değişen siteler için gereklidir. Yukarıdaki kod parçası kullanıldığı PHP betiğinin çıktısının cache denilen ara bellekte saklanmasını engellemek amacı ile kullanılır.

header("Location: ");

Bu kod parçası ise dökümanın herhangi bir yerinde, kullanıcıdan hiç bir girdi almaya ihitiyaç duymadan aktif adresi değiştirmeye yarar. Çok sık kullanılır ve özellikle bir login ekranından sonra girilen bilgiye göre karar vererek aktif adresi değiştirmek gibi uygulamalar için faydalıdır.
Örnek vermek gerekirse... login.html adlı bir HTML dökümanımız olduğunu varsayalım. Bu HTML dökümandan alınan girdi "karar.php" adlı PHP betiğinde işlenecek ve girilen
bilgiye göre adresi değiştirecektir.

login.html dosyası
 -------------
<html>
<head>
   <title> Login Form </title>
</head>
<body>
   <form action="karar.php" method="post">
   <input type="text" name="kullanici_adi"><p>
   <input type="password" name="sifre"><p>
   <input type="submit" name="submit" value="Tamam">
   </form>
</body>
</html>

Bu sayfadan alınan girdiler kullanici_adi ve sifre seklindedir. Bu bilgileri karar.php dosyasında inceleyerek karar veriyoruz.

karar.php dosyası
-------------
<?
// başındaki ve sonundaki boşlukları yok ediyoruz.
$kullanici_adi = trim($kullanici_adi);

$sifre = trim(sifre);
if ($kullanici_adi == "umut") {
   if ($sifre = "bu_bir_sifredir") {
      header ("Location : giris_basarili.php");
   }
}
header ("Location : giris_basarisiz.php");
?>

Yukarıdaki kod parçasında kullanıcı adı ve şifrenin doğru olup olmadığı kontrol edildikten sonra eğer her iki bilgi de doğru ise giris_basarili.php adlı döküman çağrılıyor. Eğer bu bilgilerden herhangi birisi doğru değilse giris_basarili.php betiği çağrılmayacak ve dolayısı ile aktif adres, koşulsuz çağrılan giris_basarisiz.php dosyası olacaktır.
Yukarıdaki örnekte dikkat edilmesi gereken bir nokta vardır. header ("Location.........");  kullanımı sadece kendisinden önce ekrana bir çıktı yapılmadığı durumlarda çalışacaktır.

Ö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
.....

 

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. Bu uyarı ile ilgili daha fazla bilgi almak için,  adresindeki POP3/SMTP Sunucu Kurulumu yazısından faydalanabilirsiniz.

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", "MerhabanBu bir denemedirnHoşçakalın.");

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

Mail ("", "Deneme", "MerhabanBu bir denemedirnHoşçakalın.", "From: : ");

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:

<html>

<head>

<title>E-Posta Formu</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>

<!-Bilgiler form.php dosyasına gönderilecek -->

<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="">

      <!-- 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>

</body>

</html>

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="">

Dikkat ederseniz "kime" anahtarına " 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 ()

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: $kimen";

          $extra_baslik .= "Reply-To: $epostan";

          $extra_baslik .= "Bcc:arsiv@php.org.trn";

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

          $extra_baslik .= "Content-Transfer-Encoding: 8bitn";

          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 ” 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: $kimen";

$extra_baslik .= "Reply-To: $epostan";

$extra_baslik .= "Bcc:arsiv@php.org.trn";

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

$extra_baslik .= "Content-Transfer-Encoding: 8bitn";

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,  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:Windowsphp.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)

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

 

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.

 

MySQL ve SQL
Php'nin yaygınlaşmasındaki kuşkusuz en büyük yardımcılarından biri de MySQL oldu. Windows ve Unix versiyonları ücretsiz olarak dağıtılan MySQL'in Php'yle beraber gelişmesi sayesinde hem Php hem de MySQL karlı çıktılar. Gelişmiş veritabanı sistemlerinde olan ilişkisel veri tabanı mantığıyla geliştirilen MySQL, çoklu bağlantı desteği ve performansıyla uzunca süreden beri İnternet'te adını duyurmayı başarmıştı. Kısa bir süre önce GPL lisansıyla kaynak kodları açıklanan MySQL'in Php'yle stratejik işbirliği sayesinde Php 4 ve MySQL birlikte diğer veritabanı ve dil ikililerien karşı konulamaz performans üstünlüğü sağlıyorlar.

Php'nin, MySQL ve Apache'yle birlikte derlenerek kullanıldığı sistemlerde veritabanı ve web sunucu arasında kurulan kalıcı bağlantılar (persistent connection) sayesinde web sunucu ve veritabanı tek bir yazılımmış gibi çalışabiliyorlar. Bu sayede çalışan iki ayrı yazılıma göre %400'lere varan performans üstünlüğü de sağlanmış oluyor. Kısa bir süre önce İnternet'te dünyanın en çok kullandığı site olan Yahoo'da bazı bölümlerinde MySQL kullanmaya başladı.

MySQL Komutları
Php yaygın kullanılan her türlü veritabanı kullanıcısına veritabanına özel Php komutlarıyla kullanım imkanı sağlar. Php kullanım klavuzunda incelendiğinde veritabanları arasında en çok Php komutunun MySQL daha sonra Oracle için olduğu görülecektir. MySQL komutlarından birçoğu özel durumlarda gerekli olurken 10 kadar komut her türlü MySQL işleminde daha yaygın olarak kullanılırlar.

Bir Php dosyasında MySQL veritabanı kullanılmak istendiğinde mutlaka veritabanı sunucusuna bağlanılmalı ve bir veritabanı seçilmelidir. Genellikle bir Php dosyasında bir veritabanına bağlantı yapılacağı için veritabanı sunucusuna bağlandıktan sonra bir veritabanı ismi verilerek tüm diğer MySQL işlemleri o veritabanı sunucusu ve o veritabanı üzerinde yapılabilir. Eğer istenirse birden çok veritabanı sunucusundaki birden çok veritabanına da bağlantı yapılabilir.

Aşağıdaki komutlarda mysql_connect() komutuyla veritabanı sunucusuna ip, kullanıcı adı ve şifre verilerek bağlantı sağlanır. Daha sonraki mysql_select_db() komutuyla da dosyadaki tüm MySQL işlemlerinde kullanılacak olan veritabanı tercihi belirtilmiş olur.

mysql_connect("localhost","root","sifre") or die("Alete ulaşamadım...");

mysql_select_db("potdb") or die("Veritabanına ulaşamadım...");

Php dosyasında tüm veritabanı işlemlerinden önce veritabanı sunucusuyla bağlantı kurulmalıdır. Php'de MySQL'e sorgu göndermek için mysql_query() komutu kullanılır. Parantezler içindeki alana SQL dilinde MySQL'in anlayacağı veritabanı sorgulama komutları girilmelidir. MySQL'de oluşabilecek hataları kullanıcının Php içinde farkedebilmesi için Php'nin özel komutları vardır. Bu komutlar sayesinde veritabanı sorgulamasında oluşan sonuçlar hata numarasıyla birlikte farkedilebilir. Hata gösterge komutları kullanılmadan Php, MySQL'e dair hiçbir hata mesajı vermeden işleme devam eder. MySQL'in sorgulanmasından geriye dönen sonuç tablosundaki veriler de mysql_result() komutuyla alınır.

$isimler = mysql_query(select * from ogrenciler");

if (mysql_error()) {echo ("MySQL hatası oluştu. Hata no :"); echo mysql_error();}

$ad = mysql_result($isimler,$i,"ad");

$soyad = mysql_result($isimler,$i,"soyad");

Veritabanından dönen tablodaki ilk satırın satır numarası 0'dır. Her sonucun bir satır olduğu bu tabloda tablo alanının ismiyle satır numarası verilerek sonuçlar çağırılabilir. Öğrenci numarası, adı ve soyadının bulunduğu "ogrenciler" isimli tabloya yapılacak olan genel sorguda geriye dönen sonuç tablosunun her satırında bir öğrenci numarası, ad ve soyad bulunacaktır. Bu sonuç tablosundan sonuçların birer birer alınarak kullanılması için genellikle while döngüsü kullanılır. Sonuç tablosundaki satır sayısını öğrenmek için mysql_numrows() komutu kullanılır.

$isimler = mysql_query(select * from ogrenciler");

if (mysql_error()) {echo ("MySQL hatası oluştu. Hata no :"); echo mysql_error();}

$sayi = mysql_numrows($isimler)

$i = 0;

while ( $i < $sayi) :

$ad = mysql_result($isimler,$i,"ad");

$soyad = mysql_result($isimler,$i,"soyad");

echo ("Ad : $ad Soyad : $soyad");

$i++;

endwhile;

Sonuç tablosunun Php'de kullanılmasını sağlayan mysql_query() komutuyla tüm tablodaki değerler bir sayı kullanılarak tanımlanır. Sonuçlarsa mysql_result() kullanılarak metin değişkenine atanırlar. Eğer sonuçların bir dizi değişkeninde (array) toplanması isteniyorsa mysql_fetch_array() komutu kullanılır.

SQL Komutları
Php ile herhangi bir veritabanını kullanırken bilinmesi gereken en önemli ayrıntı SQL (Structured Query Language) adı verilen veritabanı yönetim ve sorgulama dilidir. Bu dilin detayları hakkında bilgi sahibi olunarak veritabanını performanslı ve hızlı şekilde ullanabilmek mümkün olur. Çoğu zaman orta derecede SQL kullanılan sitelerde performans kaybı ve gereksiz sorgularla karşılaşılır. Veritabanından sonucu tek sorguda çekmekle iki sorguda çekmek arasında oldukça büyük performans kaybı oluşacaktır. Ayrıca SQL kullanılarak yapılan işlemleri Php'yle yapmak güç kaybına da yol açar. Öğrenci sınav sonuçlarının bulunduğu bir tablo göz önünde bulundurulduğunda birinci, ikinci ve üçüncü sınav sonuçlarının Php'de toplanmasıyla performans ve memory kaybı vardır. SQL'de sınav sonuçlarının toplanması her zaman için daha hızlı olacaktır.

select sinav1+sinav2+sinav3 as sinavsonuc from sinavlar

Bu SQL komutuyla üç sınavın bulunduğu sınav sonuçları "sinavlar" tablosundan as komutuyla belirtilen "sinavsonuc" adında bir alanla çekilebilecektir. "select" komutu sonuç çekmek için kullanılır. "from" komutuyla sonuçların çekileceği tablo adı belirtilir. "select"'ten sonra gelen isimler sonuçların çekileceği tablodaki alan adlarıdır. Eğer tablodaki tüm alanlar çekilmek isteniyorsa select * from sinavlar kullanılmalıdır. Sınav sonuçlarında en yüksek olan kişinin bulunması istendiğinde de max() komutu kullanılabilir.

select max(sinav1+sinav2+sinav3) as sinavsonuc from sinavlar

Bu sayede sınav sonuçlarında en iyi sonuç öğrenilmiş olur. Dikkat edilmesi gereken nokta aynı sınavsonuç toplamına sahip birden fazla kişi olmasına rağmen sadece en yüksek toplamı elde eden ilk sonucun listeleneceğidir. En yüksek kişi seçilmek istendiğinde de order by komutu kullanılmalıdır.

select sinav1+sinav2+sinav3 as sinavsonuc from sinavlar order by sinavsonuc desc

Bu sayede ortaya çıkan tablodaki ilk kişi en yüksek puanı alan kişi olacaktır. Birden çok aynı yükseklikte puan alan kişiler alfabetik sırada sıralanacaklardır. "order by" komutundan hemen sonra sonuçların sıralanacağı alan adı verilmelidir. "desc" komutu sayesinde de en yüksekten en düşüğe doğru sıralama yapılır. "desc" kullanılmassa sıralama en azdan en çoğa doğru olur. Eğer sınav sonuçlarında en yüksek puanı alan 10 kişi belirlenmek isteniyorsa limit komutu kullanılabilir.

select sinav1+sinav2+sinav3 as sinavsonuc from sinavlar order by sinavsonuc desc limit 0,10

"limit" komutuyla belirtilen ilk sayı sıralamanın başlayacağı sayıdır. Yani sıfırıncı kayıttan itibaren 10 tane sonuç getirmek istendiğinde limit 0,10 kullanılır. Limit sonuç tablosunda gereksiz kayıt barındırılmak istenmediği durumlarda kullanışlı olur. Php'de kullanılacağından fazla kayıdı veritabanından çekmek hem boş hafıza miktarını azaltır hem de veritabanını gereksiz yere zorlamış olur.

Eğer sınav sonuçlarının ortalaması alınmak isteniyorsa avg() komutu kullanılır. Ortalaması alınmak istenen alan adı belirtilerek veritabanından ortalamalar kolaylıkla çekilebilir.

select avg(sinav1+sinav2+sinav3) as sinavsonuc from sinavlar

Eğer belli koşulların sağlanacağı sonuçlar tablodan çekilecekse "where" komutu kullanılır. Örneğin sınav sonuçları toplamı 150 ve üzerinde kişiler seçilecekse

select sinav1+sinav2+sinav3 as sinavsonuc from sinavlar where sinav1+sinav2+sinav3 > 150

sorgusu kullanılmalıdır. Birden çok koşul da sorgudan verilebilir. Eğer her sınavdan 50 ve üzeri almış kişiler seçilecekse

select sinav1, sinav2, sinav3 from sinavlar where sinav1 > 49 and sinav2 > 49 and sinav3 > 49

kullanılmalıdır. "and" komutuyla koşullar birbirleriyle mantıksal ve anlamında birleştirilir. Aynı şekilde "or" da kullanılarak mantıksal veya kullanılmış olur.

Sorgular daha da karmaşıklaştırılarak her sınavda sınav ortalamasını geçen kişilerin listesi gibi zor gözüken işlemler de SQL kullanılarak çekilebilir. Bu işlemlerin Php'de yapılması her ne kadar kolay olsa da SQL'le veritabanından direkt verilerin formatlanarak çekilmesi işlemlerin hem kolay hem de hızlı yapılmasını sağlar.

MySQL'e Veri Girişi
Veritabanına girilmesi gereken veriler olduğu durumlarda "select" komutuna karşı gelen "insert" komutu kullanılır. Bu komut sayesinde veritabanında belirtilen tabloya istenen sonuçlar yerleştirilebilir.

insert into sinavsonuc values('48','50','75','85')

Bu komutla tablo sıralaması öğrenci numarası, ilk sınav sonucu, ikinci sınav sonucu ve üçüncü sınav sonucu olan bir tabloya 48 numaralı öğrencinin notları 50, 75 ve 85 olarak giriliyor. İstenirse bu girilen sonuçlar daha sonradan değiştirilebiliyor. Eğer üçüncü sınav henüz gerçekleştirilmediyse bu sınavın notu "null" komutu kullanılarak boş değer girilebilir. Dikkat edilmesi gereken nokta her alanın boş değer kabul etmeyebileceğidir. Tablo oluşturulurken bazı veri alanları boş değer almayacak şekilde önceden tanımlanabilir.

Eğer sınav sonuçlarında sonradan değişiklik yapılması gerekirse "update" komutu kullanılır.

update sinavsonuc set sinav3 = 90 where ogrencino = 48

Bu komutla öğrenci numarası 48 olan öğrencinin sınav sonucu 90'a dönüştürülüyor. "set" komutuyla güncellenecek yani değiştirilecek olan alanın hangi değeri alacağı belirtilir. "where" komutu da her zamanki gibi bir koşul belirterek koşulu sağlayan öğrencilerin getirilmesini sağlar. Veritabanından sonuç silinmesi gereken durumlarda "delete" komutu kullanılır.

delete from sinavsonuc where ogrencino = 98

Bu sorguyla sinavsonuc tablosunda öğrenci numarası 98 olan öğrencinin tüm kaydı siliniyor. Silme ve güncelleme için kullanılan "delete" ve "update" komutları veritabanındaki bilgiler üzerinde değişiklik yaptıklarından geri dönüşü imkansız veri kayıplarına yol açabilirler. Bu yüzden bu komutların dikkatle kullanılması gerekir.

Birden Fazla Tablo Kullanımı
SQL'de birden fazla tablodan veri çekmekte özel bir notasyon kullanılır. Tabloların birbirine bağlanması işlemine "join" adı verilir. Birleştirmenin "left join" ve "right join" olmak üzere iki çeşidi vardır. Öğrenci sınav sonuçlarının bulunduğu bir tabloyla öğrenci ad, soyad ve diğer bilgilerinin bir arada olduğu tabloda ortak noktayı sağlayan bir alan olmalıdır. Her iki tabloda da öğrenci numarası ortak alan olarak belirtilmelidir. Bu sayede öğrenci numarası belirtilerek sınav sonuçları bulunan tablodan sınav sonuçları, diğer bilgilerin bulunduğu tablodan da isim soyad bilgileri çekilebilir.

select ad, soyad, sinav1, sinav2, sinav3 from sinavsonuc, bilgi where sinavsonuc.ogrencino = bilgi.ogrencino

Bu sorguyla bilgi tablosundan ad, soyad, sinavsonuc tablosundan sinav1, sinav2 ve sinav3 alanları çekiliyor. İki farklı tablodan bilgi çekildiği için "from" alanında her iki tablo isminin de belirtilmesi gerekiyor. Sorgudaki "where" alanında her iki tabloda eş olması gereken alanın belirtilmesi için farkı bir formatta yazılım kullanılıyor. Sınav sonuçları tablosundaki öğrenci numarası için "sinavsonuc.ogrencino", diğer bilgilerin yer aldığı bilgi tablosundaki öğrenci numarası için de bilgi.ogrencino kullanılıyor. En sonda yer alan "where" bölümü sayesinde bilgiler eşleştirilerek veritabanından çekilebiliyor.

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

phpMyAdmin Kurulumu
MySQL veritabanının yönetiminde, UNIX ve Windows sistemler altında çalışan farklı programlar mevcuttur. Bunlardan biri olan phpMyAdmin, PHP ile yazılmış olması, platformdan bağımsız çalışması, kolay kurulabilmesi ve kolay kullanılabilmesi ile öne çıkıyor. Şu anda 2.1.0 sürümü mevcut olan phpMyAdmin programını  adresinden temin edebilirsiniz.

Programı indirip ZIP dosyasını (ya da .tar.gz) açın. Apache sunucu kullanıyorsanız, phpMyAdmin’i kopyaladığınız klasörü httpd.conf dosyası içinde;

Alias /myadmin/ “/programın/olduğu/klasör/”

Biçiminde tanımlamalısınız. Burada myadmin yerine istediğiniz herhangi bir sözcük kullanabilirsiniz. PWS kullanıyorsanız, Gelişmiş bölümünden Klasör ekle seçeneğini kullanarak phpMyAdmin’in yer aldığı klasörü kolayca tanıtabilirsiniz. Klasörü tanıtırken, “Yürütme” hakkını vermiş olduğunuzdan emin olun.

2. adım, config.inc.php dosyasını inceleyeceğiz:

$cfgServers[1]['host'] = 'localhost'; // MySQL’in bulunduğu sunucu

$cfgServers[1]['port'] = '';     // MySQL port’u

$cfgServers[1]['adv_auth'] = false;

$cfgServers[1]['stduser'] = '';    

$cfgServers[1]['stdpass'] = '';    

$cfgServers[1]['user'] = '';    // MySQL kullanıcısı

$cfgServers[1]['password'] = '';// MySQL şifresi

$cfgServers[1]['only_db'] = '';   

Burada bizi ilgilendiren üç tane ayar var. Birincisi ‘host’, yani MySQL veritabanımızın bulunduğu bilgisayarın ismi. Bu bir IP numarası da olabilir. Kendi bilgisayarınızda kurduğunuz yerel MySQL’de çalışıyorsanız, buradaki ayarı ‘localhost’ olarak bırakabilirsiniz. İkinci ayar, ‘user’, phpMyAdmin’in hangi MySQL kullanıcısını kullanarak veritabanı ile bilgi alışverişi yapacağını belirler. UNIX sistemlerde bu işletim sistemi kullanıcısından farklı bir kullanıcıdır ve MySQL için ayrıca tanımlanır. Son ayar ‘password’ ile bu kullanıcı ile birlikte kullanılacak şifreyi belirler.

HTTP sunucumuzun ve MySQL’in çalışır durumda olduğundan emin olduktan sonra, tarayıcımızın adres bölümüne “http://localhost/myadmin/” yazarak phpMyAdmin’i çalıştırıyoruz. Elde ettiğimiz ekran çıktısı şu şekilde olacaktır:

// MA01.TIF – Screenshot

Burada veritabanımızın adını “php.org.tr” koyuyoruz ve “Create Database” diyerek veritabanını yaratıyoruz. Karşınıza çıkan bir sonraki ekran, veritabanını yöneteceğiniz ekrandır. Sol tarafta MySQL’e kayıtlı bütün veritabanlarının ve onların içindeki tabloların listesi bulunuyor. Biz de ilk tablomuzu yaratalım. Ekranın alt bölümündeki “Create new table on database phporgtr” bölümünden, yaratacağımız tablonun ismini ve alan sayısını belirterek “Go” diyoruz:

// MA02.TIF – Screenshot

Tablomuza test ismini verdik ve 3 alan kullanacağımızı belirledik. Bundan sonraki ekranda, tablonun alanlarının özelliklerini belirleyeceğiz. Buradan alan tipini, uzunluğunu (length), işaret alıp almayacağını (unsigned), öntanımlı değerini (default), otomatik-artan değer olup olmadığını (auto-increment), key, index ve unique özelliklerine sahip olup olmayacağını belirleyebiliriz:

// MA03.TIF – Screenshot

Böylece phpMyAdmin ile ilk tablomuzu yaratmış olduk. En önemli özelliğiyse sona sakladık: bir text dosyasının içine kaydedilmiş veritabanı yapısını ve varsa kayıtları olduğu gibi MySQL’e boca edebilmesi. Bu işlem, mysqldump komutuyla benzerdir.

Bu işleme örnek olarak, zdefteri.sql dosyamızın içindeki Ziyaretçi Defteri programımızın veritabanı yapısını MySQL’e nasıl geçireceğimize bakalım:

// MA04.TIF – Screenshot

Sol bölümden veritabanımızı seçiyoruz ve karşımıza çıkan ekranda, çalıştırmak istediğimiz SQL komutlarının bulunduğu dosyanın ismini kutucuğa yazıyoruz. PhpMyAdmin dosyayı otomatik olarak açacak ve işleyecektir.

PhpMyAdmin ile ilgili bilmeniz gereken temel işlemler bu kadar. Kullanımı oldukça kolay bu program, aynı zamanda yapılan sorgulamaları gizlemeyip ekrana SQL kodu olarak da döktüğü için, SQL bilginizin gelişmesine de katkısı olacaktır.

Ziyaretçi Defteri
PHP ile Ziyaretçi Defteri örneğimiz, şimdiye kadar her iki kitapçıkta görüp öğrendiklerimizin bir sentezi olacak, teoride öğrendiğimiz bütün bilgileri bu uygulamada harmanlayıp pratiğe geçireceğiz.

Ziyaretçi Defteri’ni çalıştırmak için PHP ve MySQL e ihtiyacımız olacak. Uygulamaya geçmeden önce, henüz kurmadıysanız, “phpMyAdmin Kurulumu” başlıklı bölüme gidin ve PHP tabanlı bir MySQL veritabanı yönetim sistemi olan bu programı kurun. O bölümde anlatılanları uygulayarak Ziyaretçi Defteri için kullanacağımız veritabanını otomatik olarak yaratabilirsiniz.

Kullanacağımız tabloları yaratmak için gerekli olan SQL kodları şöyle:

CREATE TABLE defter (

 id int(10) unsigned DEFAULT '0' NOT NULL auto_increment,

 tarih int(11) unsigned DEFAULT '0' NOT NULL,

 isim varchar(50) NOT NULL,

 posta varchar(100) NOT NULL,

 url varchar(100) NOT NULL,

 mesaj text NOT NULL,

 PRIMARY KEY (id),

 KEY id (id, tarih),

 UNIQUE id_2 (id)

);

CREATE TABLE defter_yonetim (

 id int(10) unsigned DEFAULT '0' NOT NULL auto_increment,

 sesid varchar(32) NOT NULL,

 kullanici varchar(20) NOT NULL,

 sifre varchar(20) NOT NULL,

 PRIMARY KEY (id),

 KEY id (id),

 UNIQUE id_2 (id)

);

Bu tabloları biraz açalım:

“Defter” tablosunda ziyaretçilerden gelen mesajları ve onlar hakkındaki ufak bilgileri tutacağız. Alan adlarından hangi bilgiyi nerede tutacağımızı kolayca anlamanız mümkün.

“Defter_yonetim” tablosunda, Ziyaretçi Defteri’mizin yönetimiyle ilgili bilgileri tutacağız. Geçerli kullanıcı isimleri ve şifreler burada saklanıyor ve kullanıcının sistemde olup olmadığı yine buradan takip ediliyor. PhpMyAdmin’i kullanarak bu tabloya kolaylıkla yeni kullanıcılar ekleyebilirsiniz. Kayıt eklerken “id” ve “sesid” alanlarını boş bırakmayı unutmayın.

Programımız iki bölümden oluşacak. Birinci bölümdeki dosyalar sabit diskimizde bizim yarattığımız herhangi bir klasörde, ikinci bölümdeki (yönetim) dosyalar da bu klasörde yaratacağımız “yönetim” klasöründe yer alacak. Eğer kitapçığın kodlarını bilgisayarınıza indirdiyseniz, “/kitapcik/zdefteri/” ve “kitapcik/zdefteri/yonetim” klasörlerine sahip olacaksınız. Eğer bu klasörleri kendiniz yaratmak istiyorsanız bu örneği kullanabilirsiniz. Kodumuzu yaratmaya ziyaretçilerimizin göreceği ekranlardan başlayalım. Öncelikle program çapında kullacağımız ve “style” bilgilerini saklayacağımız dosyamızı yaratalım. Sitedeki bütün dosyalar bu “style” dosyasını kullanacak:

<style type="text/css">

.etiket

{

  font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;

  font-size : 10pt;

}

.baslik

{

  font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;

  font-size : 14pt;

  font-weight : bolder;

  text-align : center;

  color : #0063CE;

}

.ufak

{

  font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;

  font-size : 8pt;

}

.liste-etiket

{

  font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;

  font-size : 8pt;

  color : Red;

}

.liste-veri

{

  font-family : Verdana, Geneva, Arial, Helvetica, sans-serif;

  font-size : 8pt;

  color : Black;

}

</style>

Bu dosyayı ana klasörde “style.php” olarak kaydedin.

Programla ilgili bütün genel değişkenleri saklayacağımız bir “ayar” dosyamız var. Bu dosyayı her PHP dosyasının başına ekliyoruz ve böylece genel bir değişkenin değerini değiştirmek istediğimizde vakit kazanmış oluyoruz:

<?

$cfgdbhost= "localhost"; // Veritabanının bulunduğu sunucu adresi

$cfgdbisim= "kitapcik"; // Veritabanının ismi

$cfgdbkul = ""; // Veritabanı kullanıcısı

$cfgdbsifre = ""; // Veritabanı kullanıcı şifresi

$cfgbaslik = "Ziyaretçi Defteri - "; // Öntanımlı Site Başlığı

$cfglimit = 3; // Sayfa başına gösterilecek kayıt sayısı

?>

Bu dosyayı ana klasörde “ayar.php” olarak kaydedin.

Her HTML sayfasının başına eklenen standart kodlar vardır, <meta> etiketleri gibi. Bunları her sayfada ayrı ayrı yazmaktansa hepsini bir seferde tek bir dosyada topluyoruz ve yine her PHP dosyamızın başına “include” komutu ile ekliyoruz.

<? /* Bu dosya bütün sayfaların başına ekleniyor */ ?>

<? header("Content-Type: text/html; windows=1254"); ?>

<? header("Content-Type: text/html; charset=iso-8859-9"); ?>

<? header("Content-Language: tr"); ?>

<? @include "ayar.php" ?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>

<head>

<title><? echo $cfgbaslik ?></title>

<? include "style.php" ?>

</head>

<body bgcolor="#FFFFFF">

Burada “@” karakterinin kullanımı size yabancı gelebilir. “@” karakterini her komuttan önce kullanabilirsiniz. Bu karakteri kullandığınızda, o komutun kullanımı sonucunda oluşan hiçbir uyarı ve hata (warning – error) tarayıcınıza yazılmayacaktır. Bu karakteri işlevinden emin olmadığınız sürece kullanmamanızı tavsiye ederim, programınızdaki hataları bulmanızı oldukça zorlaştırabilir. Yukardaki dosyayı da “baslik.php” olarak kaydedin.

Bütün sayfalara ekleyeceğimiz diğer bir dosya, her sayfanın sonuna gelecek “son.php”. İçeriği oldukça basit, siz kendinize göre bu “dipnot” dosyasını geliştirip özelleştirebilirsiniz.

</body>

</html>

Programımıza dışardan destek veren bir dosyamız daha var: “gerecler.php”

<?

function make_clickable($text)

{

  $ret = eregi_replace( "([[:alnum:]]+)://([^[:space:]]*)([[:alnum:]#?/&=])", "<a href="" target="_blank" target="_new">\1://\2\3</a>", $text);

  $ret = eregi_replace( "(([a-z0-9_]|\-|\.)+@([^[:space:]]*)([[:alnum:]-]))", "<a href=" target="_new">\1</a>", $ret);

  return($ret);

}

?>

Bu dosyadaki fonksiyon “regular expressions” kullanılarak yazılmış, e-posta ve URL’lerin tarayıcıya link olarak gönderilmesini sağlayan bir fonksiyon. Siz de bu fonksiyonu alıp kendi programlarınızda gönül rahatlığıyla kullanabilirsiniz, kod  adresinde de mevcut.

Artık index dosyamızla işe başlayabiliriz. Bu sayfa ziyaretçi sitemize geldiğinde ilk göreceği sayfa. Aşağıdaki kodu ana klasörde “index.php” olarak kaydedin:

<? include "baslik.php" ?>

<table width="75%" border="0" align="center" bgcolor="#F8F8F8">

<tr>

<td align="center"><b><font size="+2" color="Blue">Ziyaretçi Defterim </font></b></td>

</tr>

<tr>

<td>&nbsp;</td>

</tr>

<tr>

<td align="center"><a href="ekleform.php">Deftere Yeni Mesaj Yaz</a></td>

</tr>

<tr>

<td align="center"><a href="goster.php">Defterdeki Mesajları Oku</a></td>

</tr>

<tr>

<td>&nbsp;</td>

</tr>

</table>

<? include "son.php" ?>

Bu dosya üzerinde fazla durmaya gerek yok sanırım. Hemen ziyaretçimizin kendi görüşlerini yazmasına imkan sağlayan dosyaya geçelim. Bunu ana klasörde “ekleform.php” olarak kaydedin:

<? include "baslik.php" ?>

<form action="ekle.php" method="post">

<table width="75%" border="0" align="center" bgcolor="#F8F8F8">

<tr>

<td class="baslik">Bilgi ve Görüşleriniz</td>

</tr>

</table>

<table width="75%" border="0" align="center" bgcolor="#F8F8F8">

<tr>

<td>&nbsp;</td>

</tr>

<tr>

<td class="etiket">İsim ve Soyadınız:&nbsp;</td>

<td class="etiket"><input type="text" name="isim" size="35" maxlength="50"></td>

</tr>

<tr>

<td class="etiket">E-Posta Adresiniz:&nbsp;</td>

<td class="etiket"><input type="text" name="posta" size="35" maxlength="100"></td>

</tr>

<tr>

<td class="etiket">URL'niz:&nbsp;</td>

<td class="etiket"><input type="text" name="url" value="http://" size="35" maxlength="50"></td>

</tr>

<tr>

<td valign="top" class="etiket">Görüşleriniz:&nbsp;</td>

<td><textarea cols="25" rows="5" name="mesaj"></textarea></td>

</tr>

<tr>

<td>&nbsp;</td>

</tr>

<tr>

<td align="center" class="ufak"><a href="index.php">Ana Ekran</a></td>

<td><input type="submit" value="G ö n d e r">&nbsp;<input type="Reset"></td>

</tr>

</table>

</form>

<? include "son.php" ?>

// Screenshot – zd01.tif

Bu dosya ile, isim-soyad-posta-url-mesaj alanlarını form aracılığıyla alıp, form action bölümünde belirttiğimiz “ekle.php” dosyasına gönderiyoruz. Aşağıdaki “ekle.php” dosyasını ana klasöre kaydedelim ve nasıl çalıştığını inceleyelim:

<? include "ayar.php" ?>

<?

/* Veritabanına bağlantı kur */

$link = mysql_connect($cfgdbhost,$cfgdbkul,$cfgdbsifre);

/* Bugünün tarihini timestamp olarak bul */

$tarih = time();

/* SQL kodunu hazırla */

$strSQL= "INSERT INTO defter (tarih,isim,posta,url,mesaj) ";

$strSQL .= "VALUES ($tarih,'$isim','$posta','$url','$mesaj')";

/* SQL sorgulamasını yap */

$sonuc = @mysql_db_query($cfgdbisim,$strSQL);

/* Kontrol et */

?>

<? include "baslik.php" ?>

<? if ($sonuc): ?>

<p class="etiket">Değerli görüşlerinizi bizimle paylaştığınız için teşekkür ederiz.<br>

Ana sayfaya <a href="index.php">buradan</a> dönebilirsiniz.

<? else: ?>

<p class="etiket">Sistemdeki bir hata yüzünden görüşlerinizi şu anda kaydedemiyoruz, özür dileriz.<br><br>

Ana sayfaya <a href="index.php">buradan</a> dönebilirsiniz.<br>

Tekrar denemek için önceki sayfaya <a href="javascript:history.back()">buradan</a> dönebilirsiniz.

<? endif ?>

<? include "son.php" ?>

Öncelikle $cfg…. ismindeki değişkenler nereden çıktı şimdi diyebilirsiniz. Bu değişkenleri daha önce yarattığımız ayar.php dosyası içinde kullandık ve ekle.php dosyamıza include ettik. Bunu diğer dosyalarda da yapacağız, böylece veritabanımızın ismi veya kullanıcı adımız ya da şifremiz değişse bile bunu her zaman tek bir dosyadan kontrol edip değiştirebileceğiz. Veritabanına kullanıcıdan aldığımız bilgilerin yanısıra $tarih alanını da eklediğimize dikkat edin. Bu alanı veritabanında INT olarak tanımladığımız için veritabanına kaydederken $tarih değişkenini tek tırnak içine almadık. Peki tarihi neden DATE ya da DATETIME olarak tanımlamadık da INT olarak tanımladık diyebilirsiniz. Bu tamamen benim kullanım alışkanlığım, ama bu kullanım şeklinin daha avantajlı olduğunu düşünüyorum. “time()” fonksiyonu ile elde ettiğiniz değişkene timestamp adı verilir. Bu değişken 01.Ocak.1970 tarihinden bu yana geçen zamana göre sürekli değişir. Özellikle “md5()” fonksiyonu ile kullanıldığında random fonksiyonlarının kullanımından çok daha güvenilir sonuçlar verir. Bununla ilgili bir örneği yönetim bölümünde göreceğiz.

“ekle.php” ile ziyaretçilerimize kayıt yapma imkanı sağladık, şimdi de kaydettiklerini görmelerini sağlayalım.

Aşağıdaki dosyayı “goster.php” olarak kaydedin:

<? include "ayar.php" ?>

<? include "gerecler.php" ?>

<?

if (!$baslangic)

{

$baslangic = 0;

}

/* Veritabanina baglan */

$link = mysql_connect($cfgdbhost,$cfgdbkul,$cfgdbsifre);

/* SQL kodunu olustur */

$strSQL = "SELECT * FROM defter ORDER BY tarih DESC LIMIT $baslangic,$cfglimit";

/* SQL sorgulamasını yap */

$sonuc = @mysql_db_query($cfgdbisim,$strSQL);

/* Dönen satır sayısı */

$satir_sayi = mysql_num_rows($sonuc);

/* $baslangic = 0 ise Önceki sayfa yoktur, değilse Önceki sayfa linkini yarat */

if ($baslangic == 0)

{

$onceki = "Önceki";

}

else

{

$fark = $baslangic - $cfglimit;

$onceki = "<a href="goster.php?baslangic=$fark">Önceki</a>";

}

/* Sonraki linkini yarat */

if ($satir_sayi == $cfglimit)

{

$fark = $baslangic + $cfglimit;

$sonraki = "<a href="goster.php?baslangic=$fark">Sonraki</a>";

}

else

{

$sonraki = "Sonraki";

}

/* Kontrol et */

include "baslik.php";

if ($sonuc):

?>

<? while ($satir = mysql_fetch_array($sonuc)): ?>

<table width="50%" align="center" bgcolor="#F8F8F8">

<tr>

<td width="10%" class="liste-etiket">Tarih:</td>

<td width="40%" class="liste-veri"><? echo date("d-m-Y", $satir[tarih]) ?></td>

</tr>

<tr>

<td class="liste-etiket">İsim:</td>

<td class="liste-veri"><? echo htmlspecialchars($satir[isim]) ?></td>

</tr>

<tr>

<td class="liste-etiket">E-Posta:</td>

<td class="liste-veri"><? echo make_clickable($satir[posta]) ?></td>

</tr>

<tr>

<td class="liste-etiket">URL:</td>

<td class="liste-veri"><? echo make_clickable($satir//zerisenler.tr.gg/Php_de-Formlar.htm) ?></td>

</tr>

<?

/* Mesajın içindeki boşlukları HTML koduna dönüştürüyoruz */

$satir[mesaj] = str_replace("n","<br>",$satir[mesaj]);

/* Güvenlik sorunu yaratacak kodları temizliyoruz */

$satir[mesaj] = str_replace("<script","<yasak_script",$satir[mesaj]);

$satir[mesaj] = str_replace("<style","<yasak_style",$satir[mesaj]);

$satir[mesaj] = str_replace("<embed","<yasak_embed",$satir[mesaj]);

?>

<tr>

<td class="liste-etiket" valign="top">Görüşler:</td>

<td class="liste-veri"><? echo htmlspecialchars($satir[mesaj]) ?></td>

</tr>

<tr>

<td>&nbsp;</td>

<td class="ufak">* * * * * * * * * *</td>

</tr>

</table>

<? endwhile ?>

<table width="50%" align="center" bgcolor="#F8F8F8">

<tr>

<td align="right" class="ufak"><? echo $onceki ?>&nbsp;|&nbsp;<? echo $sonraki ?></td>

</tr>

</table>

<p align = "center" class="ufak">

<a href="index.php">Ana Ekran</a>&nbsp;|&nbsp;<a href="ekleform.php">Yeni Mesaj Yaz</a>

<? else: ?>

<p align = "center" class="etiket">Şu anda kayıtları gösteremiyoruz, özür dileriz.<br><br>

Ana sayfaya <a href="index.php">buradan</a> dönebilirsiniz.

<? endif ?>

<? include "son.php" ?>

// Screenshot – zd02.tif

Programın en çok üzerinde duracağımız bölümlerinden biri bu. Öncelikle en baş bölümü inceleyelim. Bu bölümde $baslangic ve $cfglimit değişkenlerimiz var. Bir de SQL kodu içerisindeki son bölümdeki “LIMIT” kullanımı. MySQL’in en önemli avantajlarından biri “LIMIT” komutunun kullanımıdır. Ziyaretçi Defteri’nizi siteye koyduğunuz ilk gün yüzlerce mesaj gelmeyecektir belki ama zamanla Ziyaretçi Defteri’niz o kadar şişebilir ki kullanıcılar yüklenmek bilmeyen sayfalardan kaçar hale gelebilirler. Bunu önlemek için “LIMIT” ile veritabanından döndürdüğümüz kayıtların sayısını sınırlıyoruz. $baslangic değişkeni, sorgulama sonucu elde edilen sonuç tablosundaki değerlerin kaçıncı sıradan itibaren dikkate alınacağını, $cfglimit değişkeni de, dikkate alınacak değerlerin kaç tane olacağını belirler. Örneğin, “LIMIT 5,10” kullanımı, beşinci kayıttan itibaren on tane kayıt oku anlamına gelmektedir. $cfglimit değişkenini “ayar.php” dosyasının içinden değiştirerek sonucun nasıl değiştiğini görebilirsiniz.

“LIMIT” ile bir başka özelliği, “Önceki / Sonraki” özelliğini sayfamıza ekleyebiliyoruz. Çalışma prensibimiz ise şu şekilde: Her sayfada $cfglimit değişkeninin değeri kadar kayıt gösteriliyor. Bu durumda, ilk sayfada $baslangic değişkeninin değeri sıfır, ikinci sayfada $cfglimit, üçüncü sayfada $cfglimit * 2 şeklinde uzayıp gidecektir. Bizim tek yapacağımız, $baslangic degiskeninin degerini linkler ile sürekli bir sayfadan bir sayfaya aktarıp, önceki tıklandığında $cfglimit değişkeninin değeri kadar çıkarma yapmak, sonraki tıklandığında $cfglimit değişkeninin değeri kadar ekleme yapmak olacaktır. Böylece her sayfada “LIMIT” komutunun kullanımına uygun bir SQL kodu elde ederiz.

Programımızın ziyaretçileri ilgilendiren kısmı bu kadar. “localhost/kitapcik/zdefteri” adresine gidip, programınızın çalışmasını inceleyebilirsiniz.

Sitemize gelen insanlar her zaman iyi niyetli olacaklar diye bir şey yok. Ziyaretçi sayfanıza yazdıklarının aynen ekrana yansıdığını görünce “Hadi bir de ufak bir javascript kodu yazayım da anlayalım bakalım ne kadar anlıyormuş bu işten” diyebilir ve mesaj yerine sizin sayfanızı bozan, ya da mesajın bulunduğu sayfayı açan diğer ziyaretçileri başka sayfalara yönlendiren bir mesaj bırakabilir. Bu saldırıları önlemek için de, “<script”,”<style”,”<embed” gibi sitemizin görünüşünü ve işlevini etkileyebilecek etiketlerin hepsini “str_replace()” fonksiyonunu kullanarak değiştiriyoruz. Son olarak da, diğer html etiketleri ile saldırı yapılmasını önlemek için mesajı ekrana yazarken “htmlspecialchars()” fonksiyonunu kullanıyoruz. Bu fonksiyon sayesinde kötü niyetli ziyaretçimiz mesajını HTML kodlarıyla bezemiş olsa da bunların sitenin çalışmasına bir etkisi olmayacaktır.

Gelelim yönetici bölümüne. Bu bölüme, “anaklasor/yonetim” URL’sinden ulaşacaksınız, ama herkes değil, sadece siz! Şimdi en basit ve işlevsel haliyle bu işi nasıl yapacağız bakalım.

Önce “index.php” dosyamızı inceleyelim. Bu daha önceki “index.php” dosyamızdan farklı bir dosya ve yine ondan farklı olarak “/anaklasor/yonetim/index.php” şeklinde kayıtlı olması gerekiyor:

<? include "..ayar.php" ?>

<? include "guvenlik.php" ?>

<? include "..baslik.php" ?>

<table width="%50" align="center">

<tr>

<td class="baslik">Yönetim Ekranı</td>

</tr>

<tr>

<td>&nbsp;</td>

</tr>

<tr>

<td align="center"><a href="liste.php">Kayıt Listesi</a></td>

</tr>

<tr>

<td align="center"><a href="ciao.php">Çıkış</a></td>

</tr>

</table>

<? include "..son.php" ?>

“ayar.php” ve “baslik.php” yi biliyoruz ama “guvenlik.php” nereden çıktı? Neden kullanmamız gerekiyor?

Yönetici bölümüne koyduğunuz dosyaların diğer klasörlerdeki dosyalardan bir farkı yok. Bu nedenle yönetim dosyalarınızın nerede olduğunu bilen herhangi biri, tarayıcısından direk bu dosyanın adresini yazarak yönetim bölümüne ulaşabilir.Peki bunu nasıl önleyebiliriz? Öyle bir dosyamız olsun ki, korumak istediğimiz bütün dosyaların başına ekleyelim, sadece bizim onay verdiğimiz kullanıcıların geçmesine izin versin. İşte o dosya aşağıda:

<?

/* Kullanıcı login olmuş mu olmamış mı kontrol et.

 Olmamışsa kullanıcı adı ve şifre sor */

if (!$HTTP_COOKIE_VARS[sesid])

{

header("Location: login.php");

}

else

{

/* Oturum numarası (sesid) veritabanında var mı kontrol et.

   Numara yoksa kullanıcı adı ve şifre sor */

$link = mysql_connect($cfgdbhost);

$strSQL = "SELECT * FROM defter_yonetim WHERE sesid='$HTTP_COOKIE_VARS[sesid]'";

$sonuc = mysql_db_query($cfgdbisim,$strSQL);

if (!mysql_num_rows($sonuc))

{

header("Location: login.php");

}

}

?>

// Screenshot – zd03.tif

Bir sonraki ekranda göreceğiniz gibi, kullanıcımızı cookie kullanarak takip ediyoruz. Kullanıcı adı ve şifreyi alacak, veritabanından kontrol edecek, bilgileri doğruysa bir cookie göndererek onun varlığından her işlemde haberdar olacağız. Peki cookie’ye vermemiz gereken değerler nedir? Eğer cookie ile kullanıcı adı ve şifreyi gönderir, her seferinde de bu ikiliyi kontrol edersek, yine amacımıza ulaşmış oluruz, ama bu hiç güvenli olmaz. Çünkü cookie’ler sonuçta text dosyalarıdır ve herhangi biri tarayıcınızın cache’indeki dosyaları kurcalayarak bu bilgilere ulaşabilir. Çözüm? Çözüm, oturum numarası (sesid) adını vereceğimiz, md5() algoritması ile boyunu uzatacağımız bir değer kullanmak. Md5() ve microtime() fonksiyonlarını bir arada kullanarak, o andaki mikrosaniyeyi temel alan 32 karakter uzunluğunda harfler ve sayılardan oluşan bir değer elde ediyoruz. Bu değerin aynı anda başka bir kullanıcı tarafından alınabilme ihtimalinin kaçta kaç olabileceğini tahmin edebiliyorsunuz (ya da edemiyorsunuz herhalde. İşte bu oluşturduğumuz değeri de cookie olarak kullanıcıya atacağız ve daha sonra aynı değeri kullanıcının veritabanındaki bölümünün “sesid” alanına yazdıracağız. Böylece, önce kullanıcıda cookie’nin olup olmadığını kontrol edecek, cookie varsa, bu cookie’nin doğruluğunu veritabanına sorup onaylatacağız.

Şimdi geri dönelim, kullanıcı giriş ekranının kodlarını inceleyelim:

<? include "../baslik.php" ?>

<form action="kontrol.php" method="post">

<table width="50%" align="center">

<tr>

<td class="etiket">Kullanıcı Adı:</td>

<td><input type="text" name="kullanici" size="20" maxlength="20"></td>

</tr>

<tr>

<td class="etiket">Şifre:</td>

<td><input type="text" name="sifre" size="20" maxlength="20"></td>

</tr>

<tr>

<td>&nbsp;</td>

<td><input type="submit" value="G ö n d e r"></td>

</tr>

</table>

</form>

<? include "../son.php" ?>

Yukarıdaki kodları yonetim klasörü içinde “login.php” olarak kaydedin. Formdaki bilgiler aşağıdaki “kontrol.php” dosyasına gönderilecek:

<? include "../ayar.php" ?>

<?

/* Kullanıcı adı ve şifreyi veritabanından kontrol et */

$link = mysql_connect($cfgdbhost);

$strSQL= "SELECT id,kullanici,sesid FROM defter_yonetim WHERE kullanici='$kullanici' ";

$strSQL .= "AND sifre='$sifre'";

$sonuc = mysql_db_query($cfgdbisim,$strSQL);

$satir = mysql_fetch_array($sonuc);

if (!mysql_num_rows($sonuc)):

include "../baslik.php";

?>

<p class="etiket">Hatalı kullanıcı adı veya şifre.

<p class="etiket">Lütfen geri dönüp <a href="login.php">tekrar deneyin.</a>

<?

include "../son.php";

else:

/* Kullanıcı takibi için kullanılacak cookie yazdırılıyor */

/* Oturum numarası belirleniyor */

$sesid = md5(microtime());

/* Zaman belirtmediğimiz için cookie tarayıcı kapanana kadar aktif kalacak */

setcookie("sesid",$sesid);

/* Sesid veritabanına yazdırılıyor */

$strSQL = "UPDATE defter_yonetim SET sesid='$sesid' WHERE id=$satir[id]";

$sonuc = mysql_db_query($cfgdbisim,$strSQL);

include "../baslik.php";

?>

<p class="etiket">Hoşgeldiniz <? echo $kullanici ?>

<p class="etiket"><a href="index.php">Yönetim ekranı</a>

<?

include "../son.php";

endif;

?>

“kontrol.php” dosyası, gelen kullanıcı adı ve şifre bilgilerini veritabanından onaylatıyor, doğruysa md5 – microtime ikilisini kullanarak yeni bir oturum numarası yaratıyor ve bunu önce kullanıcının tarayıcısına cookie olarak gönderiyor, sonra da veritabanındaki aynı kullanıcıya ait kaydın sesid alanının değerini güncelliyor. Böylece “guvenlik.php” dosyası ile kullanıcının login olup olmadığını takip edebileceğiz.

Yönetim Bölümü yapmamızın da bir nedeni var tabii, ziyaretçilerimizin ekledikleri yazıları kendi isteğimiz doğrultusunda değiştirmek. Bunu yapabilmek için üç tane ekrana ihtiyacımız olacak. Birincisi kayıtları listeleyecek, ikincisi bu kayıtlardan istediğimizi değiştirmemizi, sonuncusu da silmemizi sağlayacak. Önce “liste.php” dosyasının içeriğine bakalım:

<? include "../ayar.php" ?>

<?

/* Veritabanina baglan */

$link = mysql_connect($cfgdbhost,$cfgdbkul,$cfgdbsifre);

?>

<? include "guvenlik.php" ?>

<?

if (!$baslangic)

{

$baslangic = 0;

}

/* SQL kodunu olustur */

$strSQL = "SELECT * FROM defter ORDER BY tarih DESC LIMIT $baslangic,$cfglimit";

/* SQL sorgulamasını yap */

$sonuc = @mysql_db_query($cfgdbisim,$strSQL);

/* Dönen satır sayısı */

$satir_sayi = mysql_num_rows($sonuc);

/* $baslangic = 0 ise Önceki sayfa yoktur, değilse Önceki sayfa linkini yarat */

if ($baslangic == 0)

{

$onceki = "Önceki";

}

else

{

$fark = $baslangic - $cfglimit;

$onceki = "<a href="liste.php?baslangic=$fark">Önceki</a>";

}

/* Sonraki linkini yarat */

if ($satir_sayi == $cfglimit)

{

$fark = $baslangic + $cfglimit;

$sonraki = "<a href="liste.php?baslangic=$fark">Sonraki</a>";

}

else

{

$sonraki = "Sonraki";

}

include "../baslik.php";

if ($sonuc):

/* Kayıtları listelemeden önce tablomuzun sabit kalacak ilk satırını

 yaratıyoruz */

?>

<table width="100%" align="center" bgcolor="#F8F8F8">

<tr>

<td width="13%" class="liste-etiket">Tarih</td>

<td width="18%" class="liste-etiket">İsim</td>

<td width="19%" class="liste-etiket">E-Posta</td>

<td width="19%" class="liste-etiket">URL</td>

<td width="30%" class="liste-etiket">Görüşler</td>

<td width="5%">&nbsp;</td>

<td width="3%">&nbsp;</td>

</tr>

<? while ($satir = mysql_fetch_array($sonuc)): ?>

<tr>

<td class="liste-veri"><? echo date("d-m-Y", $satir[tarih]) ?></td>

<td class="liste-veri"><? echo $satir[isim] ?></td>

<td class="liste-veri"><? echo $satir[posta] ?></td>

<td class="liste-veri"><? echo $satir//zerisenler.tr.gg/Php_de-Formlar.htm ?></td>

<td class="liste-veri">

<?

/* Güvenlik sorunu yaratacak kodları temizliyoruz */

$satir[mesaj] = str_replace("<script","<yasak_script",$satir[mesaj]);

$satir[mesaj] = str_replace("<style","<yasak_style",$satir[mesaj]);

$satir[mesaj] = str_replace("<embed","<yasak_embed",$satir[mesaj]);

/* Mesaj 30 karakterden uzun ise devam ettiğini üç nokta ile belirtelim */

  if (strlen($satir[mesaj]) <= 30)

  {

    echo htmlspecialchars($satir[mesaj]);

  }

  else

  {

    echo substr($satir[mesaj],0,30) . "...";

  }

?>

</td>

<? /* Her kayıt için Değiştir ve Sil linkleri ekleyelim */ ?>

<td class="liste-veri"><a href="degistir.php?id=<? echo $satir[id] ?>&baslangic=<? echo $baslangic ?>">Değiştir</a></td>

<td class="liste-veri"><a href="sil.php?id=<? echo $satir[id] ?>&baslangic=<? echo $baslangic ?>">Sil</a></td>

</tr>

<? endwhile ?>

</table>

<table width="100%" align="center" bgcolor="#F8F8F8">

<tr>

<td>&nbsp;</td>

</tr>

<tr>

<td class="liste-veri" align="left"><a href="index.php">Yönetim Ekranı</a></td>

<td class="liste-veri" align="right"><? echo $onceki ?>&nbsp;|&nbsp;<? echo $sonraki ?></td>

</tr>

</table>

<? else: ?>

<p align = "center" class="etiket">Şu anda kayıtları gösteremiyoruz, özür dileriz.<br><br>

Ana sayfaya <a href="index.php">buradan</a> dönebilirsiniz.

<? endif ?>

<? include "../son.php" ?>

// Screenshot – zd04.tif

“liste.php” dosyası, ilk bölümdeki “goster.php” dosyasından pek de farklı değil. Bu sefer kayıtların her biri için ayrı Değiştir ve Sil linkleri koymak istediğimiz için, kayıtları birden fazla satıra yaymak yerine her kayıdı tek bir satırda topladık. Böylece kayıtların yönetimini de daha kolaylaştırmış olduk. Tabii ki uzun mesajların hepsini okumaktan da feragat etmiş olduk ama bu önemli değil, istediğimiz mesajın Değiştir linkine tıkladığımızda yazılan mesajı bütünüyle görebileceğiz.

Veritabanından verileri çekip ekrana tablo halinde yazarken, tablonun başlık kısmını oluşturacak satırı döngünün içine sokmamış olduğunuza dikkat edin. Verileri listelerken kullandığımız en önemli komut “mysql_fetch_array” komutu. Bu komut, tablodaki alan isimleriyle aynı olacak şekilde, bir dizi-değişken yaratıyor ve tablodaki değerleri bu dizi-değişkene atıyor. Bu kullanımı daha iyi kavramak için, $satir değişkenini nasıl oluşturduğumuza, nasıl döngüye soktuğumuza ve verileri ekrana yazdırırken nasıl kullandığımız üzerinde yoğunlaşın. Mysql_fetch_array fonksiyonunun kullanımını tam olarak öğrendiğinizde, veritabanlarına çok daha iyi hakim olmaya başlayacaksınız.

İkinci adım, sırasıyla “değiştir.php” ve “guncelle.php” dosyalarına bakalım:

// Screenshot – zd05.tif

<? include "../ayar.php" ?>

<? $link = mysql_connect($cfgdbhost,$cfgdbkul,$cfgdbsifre); ?>

<? include "guvenlik.php" ?>

<?

/* Veritabanından bilgileri al */

$strSQL = "SELECT * FROM defter WHERE id=$id";

$sonuc = @mysql_db_query($cfgdbisim,$strSQL);

$satir = mysql_fetch_array($sonuc);

?>

<? include "../baslik.php" ?>

<form action="guncelle.php" method="post">

<? /* Hangi kaydı değiştireceğimizi unutmamak için 'id' değişkenini

    formun 'hidden' özelliği ile guncelle.php dosyasına aktarıyoruz */

?>

<input type="hidden" name="id" value="<? echo $id ?>">

<input type="hidden" name="baslangic" value="<? echo $baslangic ?>">

<table width="75%" border="0" align="center" bgcolor="#F8F8F8">

<tr>

<td class="baslik">Kayıt Yönetim Ekranı</td>

</tr>

</table>

<table width="75%" border="0" align="center" bgcolor="#F8F8F8">

<tr>

<td>&nbsp;</td>

</tr>

<tr>

<td class="etiket">İsim ve Soyadı:&nbsp;</td>

<td class="etiket"><input type="text" name="isim" size="35" maxlength="50" value="<? echo $satir[isim] ?>"></td>

</tr>

<tr>

<td class="etiket">E-Posta Adresiniz:&nbsp;</td>

<td class="etiket"><input type="text" name="posta" size="35" maxlength="100" value="<? echo $satir[posta] ?>"></td>

</tr>

<tr>

<td class="etiket">URL'niz:&nbsp;</td>

<td class="etiket"><input type="text" name="url" size="35" maxlength="50" value="<? echo $satir//zerisenler.tr.gg/Php_de-Formlar.htm ?>"></td>

</tr>

<tr>

<td valign="top" class="etiket">Görüşleriniz:&nbsp;</td>

<td><textarea cols="25" rows="5" name="mesaj"><? echo $satir[mesaj] ?></textarea></td>

<td class="etiket"></td>

</tr>

<tr>

<td>&nbsp;</td>

</tr>

<tr>

<td align="center" class="ufak"><a href="index.php">Ana Ekran</a>&nbsp;|&nbsp;<a href="liste.php?baslangic=<? echo $baslangic ?>">Liste</a></td>

<td><input type="submit" value="G ü n c e l l e">&nbsp;<input type="Reset"></td>

</tr>

</table>

</form>

<? include "../son.php" ?>

Yukardaki dosyayı “değiştir.php” olarak kaydedin. Kayıt değiştirirken, bütün kayıtları listelemekten farklı olarak, tek bir kaydı arayıp bulmamız lazım. Veritabanını yaratırken, tablomuzda otomatik_artan (auto_increment) bir alan tanımladık: id. Her kayıdın kendine özgü bir “id”I var, ve auto_increment özelliği de bu özgünlüğün devamını sağlıyor. “liste.php” dosyasında, Değiştir ve Sil linklerini oluştururken yaptıklarımıza dikkat edin: id=sayı değerlerini ekledik. Ve yine dikkat ederseniz, her kayıt için bu id numarası farklıdır. Tarayıcınızdaki linkte yazan id=sayı ikilisindeki sayı, tablonuzdaki id alanının o kayda ait değerinden başka bir şey değildir.

“degistir.php” dosyasında da, bu “id” değişkenini kullanarak, istediğimiz tek kayıda ait bilgileri veritabanından çekip çıkarıyoruz ve aldığımız bilgileri yeni bir forma yazıyoruz. Bundan sonraki aşama, bu formdaki değişiklikler bittikten sonra “guncelle.php” ile bu bilgilerin güncellenmesi:

<? include "../ayar.php" ?>

<? $link = mysql_connect($cfgdbhost,$cfgdbkul,$cfgdbsifre); ?>

<? include "guvenlik.php" ?>

<?

$strSQL= "UPDATE defter SET isim='$isim',posta='$posta',url='$url',";

$strSQL .= "mesaj='$mesaj' WHERE id=$id";

$sonuc = @mysql_db_query($cfgdbisim,$strSQL);

/* Listeleme ekranına dön */

header ("Location: liste.php?baslangic=$baslangic");

?>

Yukardaki kodlar “guncelle.php” dosyasına ait. Veritabanında güncelleme yapmak için “UPDATE” komutunu kullanıyoruz. “degistir.php” dosyasındaki formda “hidden” olarak tanımlayarak, değişiklik yapmak istediğimiz kaydın veritabanındaki “id” ini “guncelle.php” dosyasına da geçirdik. Bunu yapmayı sakın unutmayın, yoksa MySQL hangi kaydı güncellemek istediğinizi asla bilemez. $baslangic değişkenini de “hidden” alan olarak taşımıştık, buradaki amacımız, 3.sayfadaki bir kaydı değiştirdiğinizde, yeni baştan “liste.php” yü çağırırken listelemenin 1.sayfadan başlaması yerine 3.sayfadan başlamasını sağlamak.

Son adım, kayıt silme. Aşağıdaki dosyayı “sil.php” olarak kaydedin:

<? include "../ayar.php" ?>

<? $link = mysql_connect($cfgdbhost,$cfgdbkul,$cfgdbsifre); ?>

<? include "guvenlik.php" ?>

<?

$strSQL= "DELETE FROM defter WHERE id=$id";

$sonuc = @mysql_db_query($cfgdbisim,$strSQL);

/* Listeleme ekranına dön */

header ("Location: liste.php?baslangic=$baslangic");

?>

Kaydı tek seferde sildiğimize dikkat edin, geri dönüşü yok. Kullanıcının silmeden önce onaylamasını istiyorsanız, ya javascript kullanacaksınız, ya da Değiştir’de yaptığımız gibi, önce araya kullanıcının emin olup olmadığını soran bir form koyacaksınız.

Unutmadan, yöneticinin programla işi bittiğinde güvenlik açısından çıkarken cookie’yi yok etmesi önemlidir. Bizim kullanım şeklimizle cookie, yöneticinin tarayıcısında tarayıcı ekranını kapatıncaya kadar aktif olacaktır. Bu “setcookie” ile cookie’ye belli bir ömür biçilerek değiştirilebilir. Her iki kullanımda da, işimizi şansa bırakmamak için programdan çıkmalıyız. Bunun için “ciao.php” dosyasını kullanacağız:

<? include "../ayar.php" ?>

<? include "guvenlik.php" ?>

<? setcookie("sesid") ?>

<? include "../baslik.php" ?>

<p>Yönetim Bölümü'nden çıktınız.<br>

Ziyaretçi Defteri'ne dönmek için <a href="../index.php">tıklayın.</a>

<? include "../son.php" ?>

Ziyaretçi Defteri’nin kodları ve açıklaması bu kadar. Sitenize kullanıcı girişi yapılmasına izin verdiğinizde bunun kötü niyetlilere (ya da bilinçsiz kullanıcılara) davetiye çıkartmak olduğunu unutmayın. Örneğin birçok kullanıcı, e-posta adreslerini ve URL’lerini hatalı yazacaktır. Bunları kontrol eden bir mekanizma oluşturmalısınız.

                                                                 Alıntı

 
  Toplam 3 ziyaretçi (9 klik) sitemizi ziyaret etmiş PageRank Creative Commons License
This work is licensed under a Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License.
 
 
zerisenler.tr.gg Bu web sitesi ücretsiz olarak Bedava-Sitem.com ile oluşturulmuştur. Siz de kendi web sitenizi kurmak ister misiniz?
Ücretsiz kaydol