plazma - amatör bilgisayar kültürü

PHP : Hypertext Preprocessor - Bölüm 2 - Plazma

Emir (Skate) Akaydın

1. Giriş

Merhaba sevgili Plazma okurları.

Geçen bölümde PHP diline bir giriş yapmıştık. PHP'nin sunucu tarafında çalışan bir dil olmasına değinmiş ve PHP dilini bazı istemci tarafında çalışan dillerle mukayese etmiştik. İlk program örneklerinin ardından "Değişkenler" ve "Fonksiyonlar" gibi iki önemli başlığı işlemiş ve bu noktada yazımıza noktayı koymuştuk.

PHP yazı dizisinin ikinci bölümü olan bu bölümde sınıflar konusunu işleyeceğiz.

Şekil 1.

2. PHP Dilinde Sınıf (Class) Kullanımı

PHP 4 versiyonunda örnek bir sınıf aşağıdaki gibi tanımlanmakta ve kullanılmaktadır.

PHP 4'de Film sınıfı:

<?php
class Film
{
    var $isim;
    var $fragman;
    var $sureDakika;

    function Film($filmIsim = "", 
                  $filmFragman = "",
                  $filmSureDakika = 0)
    {
        $this->isim = $filmIsim;
        $this->fragman = $filmFragman;
        $this->sureDakika = $filmSureDakika;
    }

    function uzunluk()
    {
        if($this->sureDakika < 30)
            return "Kisa film";
        else if($this->sureDakika < 90)
            return "Normal sureli film";
        else
            return "Uzun film";
    }
}

$jackass2 = new Film("Jackass II", "jtm2.avi", 95);

echo "film ismi: ".$jackass2->isim."<br>"; 
echo "film suresi: ".$jackass2->sureDakika." dk.
      <br>"; 
echo "film uzunlugu: ".$jackass2->uzunluk();
?>

PHP 5 ile birlikte sınıflara birçok yeni özellik eklendi. Artık yukarıdaki örnek şu şekilde tanımlanmaktadır.

PHP 5'de Film sınıfı:

<?php
class Film
{
    private $isim;
    private $sureDakika;
    private $fragman;

    public function __construct($filmIsim = "", 
                                $filmFragman = "",
                                $filmSureDakika = 0)
    {
        $this->isim = $filmIsim;
        $this->fragman = $filmFragman;
        $this->sureDakika = $filmSureDakika;
    }

    public function uzunluk()
    {
        if($this->sureDakika < 30)
            return "Kisa film";
        else if($this->sureDakika < 90)
            return "Normal sureli film";
        else
            return "Uzun film";
    }

    public function okuIsim()
    {
        return $this->isim;
    }

    public function okuSureDakika()
    {
        return $this->sureDakika;
    }
}

$jackass2 = new Film("Jackass II", "jtm2.avi", 95);

echo "film ismi: ".$jackass2->okuIsim()."<br>"; 
echo "film suresi: ".$jackass2->okuSureDakika().
     " dk.<br>"; 
echo "film uzunlugu: ".$jackass2->uzunluk();
?>

PHP 4 ve PHP 5 arasındaki temel farklar şunlardır.

  • PHP 4'de sınıfların constructorları sınıf ile aynı ismi taşıyan fonksiyonlar ile tanımlanırlar. PHP 5'de ise bu iş için "__construct" isimli sabit fonksiyonlar kullanılmaktadır.

  • PHP 5'de public, private, protected gibi C++ standartlarına uygun tanımlar eklenmiştir. PHP 4'de ise bir sınıfın içersinde yer alan herşey public kabul edilmektedir.

  • PHP 4'de olmayan, C++ standartlarına uygun birçok diğer özellik de yine PHP 5'de eklenmiştir.

Şimdi PHP 5'deki sınıfların başlıca özelliklerini bir bir inceleyelim.

3. $this Kelimesi

Sınıfların içersinde tanımlanan değişkenlere sınıfların metotlarından (metot: sınıfa ait fonksiyon) ulaşmak istenildiğinde $this kelimesini kullanırız. Örnek:

class Film
{
    private $isim;
    
    public function okuIsim()
    {
        return $this->isim;
    }
}

4. Türetilmiş Sınıflar

Birbirleriyle birçok ortak özelliği olan sınıflar birbirlerinden türetilebilirler. Örnek olarak Sürüngen ve Kertenkele sınıflarını ele alalım. Sürüngen sınıfı herhangi bir sürüngenin yaş, boy ve sürünme hızı bilgilerini tutsun. Bu bilgiler Kertenkeleler için de geçerli olacaktır. Ancak Kertenkelelerde her süründen de bulunmayan kuyruk mevcuttur. Buna bağlı olarak Kertenkele sınıfına bir de kuyruk uzunluğu kriteri eklemek isteyebiliriz. Yapmamız gereken öncelikle Sürüngen sınıfını tanımlayıp, daha sonra Sürüngen sınıfından türetilen Kertenkele sınıfını oluşturmaktır.

Bir sınıftan yeni bir sınıf türetmek için "extends" kelimesi kullanılır. Örnek:

<?php
class Surungen
{
    // Degisken Tanimlari
    private $yas;
    private $boy;
    private $surunmeHizi;

    // Metot Tanimlari
    public function okuYas()
    {
        return $this->yas;
    }


    public function yazYas($y)
    {
        $this->yas = $y;
    }

    public function okuBoy()
    {
        return $this->boy;
    }


    public function yazBoy($b)
    {
        $this->boy = $b;
    }

    public function okuSurunmeHizi()
    {
        return $this->surunmeHizi;
    }


    public function yazSurunmeHizi($sh)
    {
        $this->surunmeHizi = $sh;
    }
}

class Kertenkele extends Surungen
{
    // Degisken Tanimlari
    private $kuyrukUzunlugu;

    // Metot Tanimlari
    public function okuKuyrukUzunlugu()
    {
        return $this->kuyrukUzunlugu;
    }


    public function yazKuyrukUzunlugu($ku)
    {
        $this->kuyrukUzunlugu = $ku;
    }
}

// Kertenkele sinifindan kertenkelemizi tanimlayalim
$kertenkelem = new Kertenkele();

// Kertenkelemizin ozelliklerini tanimlayalim
$kertenkelem->yazYas(2);
$kertenkelem->yazBoy(15);
$kertenkelem->yazSurunmeHizi(7);
$kertenkelem->yazKuyrukUzunlugu(6); 

// Kertenkelemizin ozelliklerini ekrana yazdiralim
echo "Yas: ".$kertenkelem->okuYas()."<br>";
echo "Boy: ".$kertenkelem->okuBoy()."<br>";
echo "Surunme Hizi: ".$kertenkelem->okuSurunmeHizi().
     "<br>";
echo "Kuyruk Uzunlugu: ".
     $kertenkelem->okuKuyrukUzunlugu()."<br>";
?>

Bu örnekte dikkat etmemiz gereken özellik şudur. "$kertenkelem" ismiyle tanımladığımız nesne, "Kertenkele" sınıfından oluşturulmuş bir nesnedir. Bu nesnenin yaş, boy, sürünme hızı özelliklerini kullanıyoruz ancak "Kertenkele" sınıfında böyle özellikler tanımlı değil. Bu özellikler sınıfı tanımlarken kullandığımız türetme yönteminden geliyor. "class Kertenkele extends Surungen" dediğimiz için Kertenkele sınıfı Surungen sınıfının tüm özelliklerine sahip bir şekilde yaratılıyor.

5. Yapıcı ve Yıkıcılar

Her sınıf oluşturulurken ve yok edilirken çağırılan fonksiyonlar vardır. Bunlara "yapıcı" ve "yıkıcı" (constructor / destructor) fonksiyonlar denir. PHP'de yapıcı fonksiyon "function __construct()" şeklinde tanımlanmıştır ve gerektiği taktirde parametre alabilir. Yıkıcı fonksiyon ise "function __destruct()" şeklinde tanımlanmıştır. Parametresiz kullanılması gerekmektedir.

PHP'de yıkıcı fonksiyonlar çok sık kullanılmazlar. Çünkü genellikle PHP'de bir scriptin çalışması sona erdiğinde PHP motoru otomatik olarak açılan bağlantıları keser, hafızada kullanılan alanları temizler, kısacası yaratılan birçok şeyi otomatik olarak kendiliğinden yok eder. Ancak diyelim ki scriptin çalışma süresince açılan geçici bir dosya söz konusu ise bu dosyanın silinme işlemini bir yıkıcı fonksiyona koyabiliriz. Burada dikkat edilmesi gereken nokta yıkıcı fonksiyon içersinde herhangi bir kural dışı durum oluşturmamamızın gerektiğidir. Bu durumun oluşması halinde PHP motoru "fatal error" hatası verecektir.

6. Public / Private / Protected Kelimeleri

PHP 5 ile eklenen bu kelimeler C++ dilindeki ile aynı anlamlara gelmektedirler.

6.1. Public:

"public" kelimesi ile tanımlanan değişken ve metotlara sınıf dışından doğrudan erişilebilir. Sınıftan oluşturulmuş bir nesne doğrudan bu değişkenlere ve metotlara ulaşabilir.

6.2. Private:

"private" kelimesi kullanarak tanımlanmış değişken ve metotlara yalnızca o sınıf içersinden ulaşılabilir. Sınıftan oluşturulmuş bir nesne doğrudan bu değişkenlere/metotlara ulaşamaz. Private kullanımı, ileri düzey hız gereksinimi olmayan projelerde güzel bir güvenlik tedbiridir. Bu değişkenin değerlerini değiştirme yetkisine sahip metotlara çeşitli denetimler eklemek mümkündür. Örnek olarak yalnızca 1-1000 arası değerler alabilecek bir değişkene asla almaması gereken bir değer verilememesi ilgili metotta kontrol ettirilebilir. Böylelikle bu değişkeni kullanan programın diğer kısımları hatalı değerlerden olumsuz olarak etkilenmezler.

6.3. Protected:

"protected" olarak tanımlanmış değişkenler tek bir sınıf söz konusu olduğunda aynen "private" değişkenler gibi davranırlar. Bu değişkenlere ancak sınıf içersinden ulaşılabilir ve sınıf dışından tanımlanan bir nesne üzerinden doğrudan ulaşılamaz. Ancak "protected" kelimesinin farkı türetilmiş sınıflarda ortaya çıkar. Eğer B sınıfı A sınıfından türetilmiş ise A sınıfında "protected" olarak tanımlanmış değişkenlere B sınıfından ulaşılabilir.

Tüm ihtimalleri düşünecek olursak;

6.4. Public değişkenlere:

Sınıf içersinden: Ulaşılabilir

Sınıf dışından: Ulaşılabilir

Türetilmiş bir sınıftan: Ulaşılabilir

6.5. Private değişkenlere:

Sınıf içersinden: Ulaşılabilir

Sınıf dışından: Ulaşılamaz

Türetilmiş bir sınıftan: Ulaşılamaz

6.6. Protected değişkenlere:

Sınıf içersinden: Ulaşılabilir

Sınıf dışından: Ulaşılamaz

Türetilmiş bir sınıftan: Ulaşılabilir

7. Sınıflar İle İlgili Değerlendirme

PHP 5'de sınıflar, yukarıda anlatılan özellikler haricinde ":: operatörü", "static, self, parent kelimeleri", "overloading" gibi birçok özelliğe daha sahiptir. Ancak PHP projelerinde genel olarak ihtiyaç duyulan konular yukarıda vurgulanan konulardır. İleri derece sınıf kullanım örnekleri zaman içersinde anlatılacaktır.

8. Veritabanı Uygulamaları

Bu bölüme kadar hep PHP'nin genel yapısı ile ilgili bilmemiz gerekenleri ve bunlarla ilgili çeşitli örnekler gördük. Şimdi yavaş yavaş PHP ile daha ciddi uygulamalar yazabilmek amacıyla veritabanlarıyla çalışma yöntemlerine göz atacağız.

PHP ile ODBC destekleyen herhangi bir veritabanını kolayca kullanmamız mümkündür. Ancak PHP'nin ilk yıllarından beri desteklediği yegane veritabanı MySQL'dir. PHP 4 versiyonunda genellikle PHP'nin çekirdeğinde hazır olarak gelen MySQL eklentisi PHP 5 mimarisinde yeniden dış eklenti haline getirilmiştir. Yani PHP 5'de mysql kullanabilmek için php.ini dosyasında yer alan eklentiler bölümünden (extensions) "php_mysql.dll"i aktive etmenizdir.

Bir eklenti nasıl aktif edilir? "php.ini" dosyası PHP 4'de genellikle C:\Windows ya da C:\WinNT klasöründe, PHP 5'de ise PHP'nin kurulu olduğu klasörde yer alır. Öncelikle "php.ini" dosyasının içersinde yer alan;

;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;

yazan bölümü bulmanız gerekiyor. Bu bölümde birçok;

;extension=php_*.dll

şeklinde satırlar göreceksiniz. "*" karakterinin bulunduğu bölümde eklentinin ismi yazacaktır. Örnek olarak MySQL'in eklentisi php_mysql.dll'dir. Başlarında gördüğünüz ";" ini dosyalarında yorum anlamına gelir. Yani ;'den sonra ne yazarsanız yazın hiçbir işlevi olmayacaktır, sadece açıklama satırı olarak algılanacaktır. Aktive etmek istediğiniz eklentilerin başlarında yer alan ";" karakterini silerek eklentiyi çalıştırabilirsiniz. Eğer bir şekilde hata mesajları almaya başlarsanız yine php.ini'de yer alan "extension_dir" satırını bulun. Bu satır dll'lerin bulunduğu klasörü işaret etmelidir. Örneğin eklentiler PHP 5'in kurulu olduğu klasörün içersindeki "ext" klasöründe yer alıyorsa;

extension_dir = "./ext/"

"extension_dir"ın bu şekilde tanımlanması gerekir.

"php.ini"de yapılan değişikliklerin algılanması için önemli bir husus PHP'nin kurulum biçimidir. Eğer PHP'yi CGI olarak kurmuşsanız php.ini'de yapılacak herhangi bir değişiklik bir sonraki PHP dosyası çağırıldığında otomatik olarak algılanmış olacaktır. Ancak eğer ISAPI kurulum yapmışsanız web server’ınızı durdurup başlatana kadar bu değişiklikler algılanmayacaktır.

PHP ve MySQL'in kurulumundan dolayı yaşamanız muhtemel birçok hata mesajı mevcuttur. Bu hata mesajlarını almanız halinde PHP ve MySQL forumlarında ya da daha hızlı bir şekilde Google gibi bir arama motorunda hata mesajlarını arayarak çözümlere ulaşabilirsiniz.

Şimdi MySQL veritabanına bağlanmak ve bir MySQL tablosunu listelemek ile ilgili çeşitli yöntemleri görelim.

9. 1. Yöntem - Düz, Açık Kod Tarzı

<?php
// Veritabani Baglantisi
$baglanti = mysql_connect("127.0.0.1",
                          "root",
                          "")
    or die("MySQL'e erisilemiyor");
mysql_select_db("mysql", $baglanti)
    or die("Veritabanina erisilemiyor");

// SQL Cumlesi
$sql = "SELECT * FROM db";

// SQL'i Calistir
$tablo = mysql_query($sql, $baglanti);

// Tabloyu Ac
echo "<table border='1'>";

// Tablo Basligi
echo "<tr bgcolor='#EEEEEE'>";
for($i = 0; $i < mysql_num_fields($tablo); $i++)
    echo "<td>".mysql_field_name($tablo, $i).
         "&nbsp;</td>";
echo "</tr>";

// Tablo Icerigi
while($satir = mysql_fetch_array($tablo))
{
    // Tablo Satırlari
    echo "<tr>";
    for($i = 0;
        $i < mysql_num_fields($tablo);
        $i++)
        echo "<td>".$satir[$i]."&nbsp;</td>";
    echo "</tr>";
}

// Tabloyu Kapat
echo "</table>";
?>

Bu yöntem ile ekrana MySQL Sunucusu'nda yer alan "mysql" veritabanındaki "db" tablosunun içeriğini bir HTML tablosu şeklinde ekrana dökmüş oluruz. Aslında bu örneğin başında ve sonunda <html>, <head>, <body> gibi taglerin de yer alması gerekir ancak şu aşamada bunları kullanmadan da sonucu görebiliriz.

Burada dikkat etmeniz gereken komutlar "mysql_" ile başlayan komutlardır, yani;

  • mysql_connect()

  • mysql_select_db()

  • mysql_query()

  • mysql_num_fields()

  • mysql_field_name()

  • mysql_fetch_array()

komutları tabloyu listelerken kullandığımız komutlardır. Bu komutların haricinde de birçok mysql komutu mevcuttur ancak ilk aşamada bu komutlar işimizi görecektir.

10. mysql_connect()

Bu komut MySQL serverına bağlantı yapmayı sağlar. Bu bağlantı olmaksızın MySQL sunucusuyla ile ilgili herhangi bir işlem yapmamıza olanak yoktur.

Bu komuttan dönen değer bağlantıya ait bir ID numarasıdır. Bu numara özellikle birden fazla MySQL bağlantısının aynı anda açılması durumunda önem kazanır. Eğer tek bir bağlantı söz konusu ise o kadar önemli değildir.

mysql_connect 5 parametre alır ancak tüm parametreleri de opsiyoneldir. Bu parametreleri kısaca tanıyalım.

  • MySQL sunucu ismi/IPsi: MySQL sunucusunun Host ya da IP'si

  • Kullanıcı Adı: MySQL sunucusu üzerindeki yetkili bir kullanıcı ismi

  • Şifre: Kullanıcının şifresi

  • Yeni bağlantı: Eğer daha önce mysql_connect komutu çağırılmışsa yeni bağlantı yapmadan önceki bağlantının ID'sini almaya yarar.

  • İstemci bayrakları: Bu parametre ile MYSQL_CLIENT_SSL, MYSQL_CLIENT_COMPRESS, MYSQL_CLIENT_IGNORE_SPACE veya MYSQL_CLIENT_INTERACTIVE gibi istemci tarafında önem arz eden özellikler açılıp kapanabilir.

Yukarıdaki örnekte biz yalnızca ilk 3 parametreyi kullandık. Siz kendi test ortamınıza göre MySQL sunucusunun Host ya da IP'sini, yetkili kullanıcı ismini ve şifreyi değiştirmelisiniz. Eğer MySQL, PHP ile aynı bilgisayara kurulmuş ise mysql_connect'in ilk parametresi olarak local host ya da ip'yi girebilirsiniz ("localhost" ya da "127.0.0.1"). MySQL başka bir bilgisayarda kurulu ise o bilgisayarın networkdeki ismi ya da IPsini girmeniz gerekmektedir.

Kullanıcı adı/şifre ile ilgili karşılaşabileceğiniz en temel problem, MySQL sunucusunun PHP ile aynı bilgisayarda kurulu olmaması durumunda geçerli bir kullanıcı adı/şifre bilgisiyle bağlantı kurulamamasıdır. Büyük olasılıkla problem söz konusu kullanıcının yalnızca lokal yetkisinin oluşu, uzaktan bağlantılara izin vermeyişidir. Bu durumda MySQL üzerinde yetkili bir kullanıcı yaratmanız ve bu kullanıcıya uzaktan erişim için izin vermeniz gerekir. Bu işlem için PHPMyAdmin ya da MySQL'in kendi araçlarından birini kullanmanızı öneririm.

Bir diğer önemli nokta ise PHP ve MySQL versiyonlarınızın uyumluluğudur. Eğer PHP 5 kullanıyor ve çok eski bir MySQL sürümü kullanıyorsanız PHP'nin mysql eklentisi eski veritabanlarına erişemeyebilir. Geçmişe yönelik uyumluluk açısından PHP 5 ile birlikte "mysqli" isimli bir eklenti gelmiştir. Kullanım olarak hemen hemen aynıdır. php.ini dosyasından "php_mysql" eklentisini kapatıp "php_mysqli" eklentisini açmanız ve "mysql_" şeklinde kullandığınız tüm komutları "mysqli_" şeklinde kullanmanız gerekmektedir. Fakat benim tavsiyem, çok geçerli bir nedeniniz olmadığı sürece güncel bir MySQL versiyonu kullanmanızdan yanadır.

11. mysql_select_db()

Bu komut mysql_connect komutundan sonra kullanılmalıdır. Eğer MySQL ile başarılı bir bağlantı kurulmuşsa bu durumda mysql_select_db ile MySQL üzerinde yer alan herhangi bir veritabanına erişim sağlanabilir. Bu örnekte MySQL'in içinde hazır gelen "mysql" veritabanını kullandık. Siz kendi veritabanlarınızdan biriyle de test edebilirsiniz.

mysql_select_db'den dönen sonuç boolean bir değerdir, yani true/flase şeklindedir. Ancak bu örneklerde "or die" kullandığımız için dönen değerin false olma ihtimalini kontrol etmeye gerek yok. Herhangi bir problem çıkması halinde "die" komutunda yazdığımız mesaj ekrana yazılacak ve PHP scriptinin çalışması o noktada sona erecektir.

mysql_select_db 2 parametre alır. İlk parametre mecburi, ikincisi opsiyoneldir.

  • Veritabanı ismi: MySQL üzerinde bağlanılmak istenen veritabanının ismi.

  • Bağlantı numarası: mysql_connect komutundan dönen numara.

Tek bir bağlantı olduğu taktirde ikinci parametre kullanılmadan da istenilen veritabanına bağlanılabilir.

12. mysql_query()

MySQL'e bir sorgu gönderir. Bu komutu kullanabilmek için yalnızca MySQL'e bağlı olmak yeterlidir. Henüz bir veritabanı seçmemiş bile olsanız gönderebileceğiniz sorgular mevcuttur (örnek sorgu: SHOW DATABASES).

mysql_query bir tablo döndürür. Bu tablonun kaça kaç boyutunda olacağı sorguya göre değişir. Tablo tek bir hücreden oluşabileceği gibi binlerce/milyonlarca kolon ve satırdan da oluşabilir.

mysql_query 2 parametre alır. İlk parametre mecburi, ikincisi opsiyoneldir.

  • Sorgu: MySQL sunucuna gönderilecek SQL cümlesi.

  • Bağlantı numarası: mysql_connect komutundan dönen numara.

Bu komuttan dönen tablonun hücrelerine erişmek için tablo üzerinde satır satır dolaşmak ve her satırdan dönecek kolon dizilerinden hücre değerlerini okumak gerekir.

13. mysql_num_fields()

Bu komut tabloda yer alan toplam kolon sayısını döndürür.

mysql_num_fields tek (mecburi) parametre alır.

  • Tablo: mysql_query'den dönen tablo.

14. mysql_field_name()

Tablonun kolonlarının başlıkları bu komut ile okunur. Örnek olarak veritabanında isim, soyad, şirket, telefon kolonlarından oluşan bir tablo var ise bu komut ile bu başlıkları okumamız mümkündür.

mysql_field_name komutundan text biçiminde kolon ismi döner.

mysql_field_name 2 mecburi parametre alır.

  • Tablo: mysql_query'den dönen tablo.

  • Kolon numarası: 0'dan başlayarak kaçıncı kolonun ismini döndüreceği.

Kolon numarası örnek olarak 4 kolonlu bir tablo için 0-3 aralığındadır.

15. mysql_fetch_array()

Bu komutun görevi, tablonun satırları üzerinde ilerleyerek satır içeriklerini bir dizi halinde döndürmektir. Bu komutun bir diğer özelliği bir satırı okuduktan sonra otomatik olarak bir sonraki satıra atlamasıdır. Bu komut peş peşe çağrılarak tüm satırlar okunabilir.

Dönen değer bir dizidir. Eğer tablonun sonuna gelinmiş ve okunacak satır kalmamışsa "false" değer döndürür. Bu özellik sayesinde bir döngü ile tüm tabloyu ekrana yazdırmak oldukça basit hale gelmiştir.

mysql_fetch_array 2 parametre alır. İlk parametre mecburi, ikincisi opsiyoneldir.

  • Tablo: mysql_query'den dönen tablo.

  • Sonuç türü: Diziyi kolon isimleri, numerik indeks ya da her ikisiyle birlikte kullanabilmek mümkündür. Bu parametre MYSQL_ASSOC, MYSQL_NUM ya da MYSQL_BOTH sabitlerine eşitlenebilir. Eğer parametreyi kullanmazsak varsayılan değeri MYSQL_BOTH'dur.

Peki hem kolon ismi hem de numerik indeks kullanabilmenin avantajı nedir? Aşağıdaki örneklerde bu avantajı gözlemleyeceğiz.

Örnek 1:

$sql = "SELECT isim, soyad, sirket, telefon
        FROM rehber";
$tablo = mysql_query($sql);
$satir = mysql_fetch_array($tablo);

echo $satir[3];
echo $satir["telefon"];

Örnek 2:

$sql = "SELECT telefon, isim, soyad, sirket
        FROM rehber";
$tablo = mysql_query($sql);
$satir = mysql_fetch_array($tablo);

echo $satir[3];
echo $satir["telefon"];

Tablonun ilk satırındaki değerlerin şu şekilde olduğunu varsayalım:

isim: Ali

soyad: Albayrak

sirket: Plazma Ltd. Şti.

telefon: +90 212 333 44 55

İlk örnekte tablonun ilk satırında 3 numaralı indekste yer alan değer ve "telefon" kolonuna ait değeri peş peşe yazdırmış oluyoruz. Satır indeksleri 0'dan başladığına göre 3 numaralı indeks yine telefon kolonuna denk gelir. Yani Örnek 1'in çıktısı şu şekilde olacaktır;

+90 212 333 44 55+90 212 333 44 55

İkinci örnekte ise 3 numaralı indeksteki telefon 0 numaralı indekse kaymış ve 3 numaralı indekste bu defa şirket yer almakta. Ekrana çıktı veren kod ise aynı yani 3 numaralı indeks ve "telefon" kolonunu yazdırıyor. Bu durumda çıktı;

Plazma Ltd. Şti.+90 212 333 44 55

olarak değişecektir.

Sonuç:

İndeks kullanımı özellikle kolonların ne oldukları çok önem teşkil etmediği ve bir loop ile tüm kolonların ekrana yazdırılacağı durumlarda doğru bir seçimdir. Ancak sabit bir tablo yapısından sabit kolon isimleriyle işlem yapacaksanız indeks yerine kolon isimlerini kullanarak yazacağınız programlarda kolon isimlerinin yer değiştirmesi gibi durumlar problem teşkil etmeyecektir.

16. mysql_num_rows()

Yukarıdaki örnekte kullanmamış olsak da mysql_num_rows da çok önemli bir mysql komutudur. Bu komut bize tablodaki toplam satır sayısını verir.

Dönen değer bir sayıdır. Bir problem çıkması halinde "false" değer döndürür.

mysql_num_rows tek (mecburi) parametre alır.

  • Tablo: mysql_query'den dönen tablo.

17. 2. Yöntem - Sınıf Kullanımı

<?php
// MySQL Baglanti Sinifi
class MySQLBaglantisi
{
    // Sinif Degiskenleri
    private $baglanti;
    private $sunucu;
    private $kullaniciAdi;
    private $sifre;

    // Yapici Fonksiyon
    function __construct($_sunucu, $_kullaniciAdi, $_sifre)
    {
        // Sinifi Olustururken Ilk Degerleri Oku
        $this->sunucu = $_sunucu;
        $this->kullaniciAdi = $_kullaniciAdi;
        $this->sifre = $_sifre;
    }

    // Baglan metodu
    public function Baglan($veritabani)
    {
        // MySQL'e Baglan
        $this->baglanti = mysql_connect($this->sunucu,
                                        $this->kullaniciAdi,
                                        $this->sifre)
            or die("MySQL'e erisilemiyor");
        mysql_select_db($veritabani, $this->baglanti)
            or die("Veritabanina erisilemiyor");
        return $this->baglanti;
    }
}

// Tablo Sinifi
class Tablo
{
    // Sinif Degiskenleri
    private $html;

    // Yapici Fonksiyon
    function __construct($sql, $baglanti)
    {
        // "html" Degiskenini Temizle
        $this->html = "";

        // SQL'i Calistir
        $tablo = mysql_query($sql, $baglanti);

        // Tabloyu Ac
        $this->html .= "<table border='1'>";

        // Tablo Basligi
        $this->html .= "<tr bgcolor='#EEEEEE'>";
        for($i = 0;
            $i < mysql_num_fields($tablo);
            $i++)
            $this->html .= "<td>".
                   mysql_field_name($tablo, $i).
                   "&nbsp;</td>";
        $this->html .= "</tr>";

        // Tablo Icerigi
        while($satir = mysql_fetch_array($tablo))
        {
            // Tablo Satirlari
            $this->html .= "<tr>";
            for($i = 0;
                $i < mysql_num_fields($tablo);
                $i++)
            $this->html .= "<td>".$satir[$i].
                              "&nbsp;</td>";
            $this->html .= "</tr>";
        }

        // Tabloyu Kapat
        $this->html .= "</table>";
    }

    // Goster metodu
    public function Goster()
    {
        // Tablosu Ekrana Yansit
        echo $this->html;
    }
}

// Veritabani Baglantisi
$MySQL = new MySQLBaglantisi("127.0.0.1",
                             "root",
                             "");
$baglanti = $MySQL->Baglan("mysql");

// SQLlere Ait Tablolari Olustur
$tablo1 = new Tablo("SELECT *
                     FROM db", $baglanti);
$tablo2 = new Tablo("SELECT *
                     FROM user", $baglanti); 

// Tablolari Ekranda Goster
$tablo1->Goster();
echo "<br>";
$tablo2->Goster(); 
?>

Bu örnekte daha önce öğrendiğimiz sınıflar ile ilgili öğrendiğimiz bilgileri veritabanı konusunda öğrendiklerimizle birleştirmiş olduk.

İki farklı sınıf kullandık. MySQLBaglantisi ve Tablo sınıfları.

MySQLBaglantisi sınıfı bütün MySQL bağlantı işlerini üstlenen sınıftır. Bu sınıfı yaratırken sınıfın yapıcı fonksiyonu bağlantı için gerekli parametreleri alır ve kaydeder. Baglan() metodu ise bu bilgileri kullanarak bağlantı sağlar.

Tablo sınıfı ise yine yapıcı fonksiyonundan SQL sorgusu ve veritabanı bağlantısı bilgilerini kaydeder ve tabloyu HTML kodlar halinde oluşturur. Goster() metodu ile de oluşan bu HTML kodların ekrana çıktısını vermek mümkündür.

18. Bu Bölümün Değerlendirmesi

Şekil 2.

Geçen bölümde PHP'nin temel özellikleriyle bağladığımız bu yazı dizisinde, bu bölümde sınıflar gibi önemli ve PHP dilinde gelişmekte olan bir konuyu gördük. Daha da önemlisi PHP'nin en önemli kullanım alanlarından biri olan veritabanı uygulamalarına da giriş yaptık. Elbette ki bu doküman veritabanı konusuna derin bir şekilde değinmeyecektir ya da SQL dili hakkında detaylı bilgi vermeyecektir. Ancak çok az bir veritabanı altyapısına sahip bir kişinin PHP ile kolayca veritabanı uygulaması yazabilmesi için gerekli temel bilgileri içermektedir.

Önümüzdeki sayıda daha faydalı kullanım alanları olan örneklerle görüşmek üzere.

emir (at) akaydin (nokta) com

plazma - 2008