Kişisel bir web günlüğü

PHP ile yazdığım pratik bir veritabanı sınıfı

vtMySQL veritabanına sorgu gönderip sonuçlarını almak için internetten bir sürü sınıf (class) bulabiliyorsunuz. Bu yüzden kendi yazdığım bu sınıfı paylaşıp paylaşmama konusunda çok kararsız kaldım. Fakat daha sonra "belki birilerinin ihtiyacını benim sınıfım karşılar" diye düşündüm. O yüzden bir bakmanızda fayda var :)

Sınıfın en önemli özellikleri

eburhan VT class ismini verdiğim bu sınıf ile MySQL veritabanına kolaylıkla sorgular gönderebilir ve sorgu sonuçlarını alabilirsiniz. Hızlı ve basit bir sınıftır. Gereksiz hiçbir özelliği barındırmaz. İşte en önemli özellikleri:

  1. Aynı veya farklı sunucular üzerinde bulunan veritabanları arasında sorgulamalar yapabilirsiniz.
  2. Sorgudan geri dönen verilere object, array veya enumerated array şeklinde erişebilirsiniz

    veri alma modları

  3. Sorguları istediğiniz süre dahilinde önbellek (cache) dosyasından çağırabilirsiniz.
  4. Önbellek (cache) özelliğini kullanmak, diğer veritabanı sınıflarınkinden daha basittir.
  5. Sql Injection saldırılarından kaçınmanızı sağlayacak fonksiyonlar sağlar.
  6. Kaç adet sorgu yapıldığını, bir sorgunun ne kadar zamanda gerçeklekleştiğini alabilirsiniz.
  7. Bilgi alma işlemleri yaparak sorgularla ilgili çeşitli bilgileri detaylıca elde edebilirsiniz.
  8. Bir hata oluştuğunda, bunu kullanıcıya göstermeden bir dosyaya yazdırabilirsiniz.

Sınıfın kullanımı

Aşağıda sınıfın örnek bir kullanımını görebilirsiniz. Bu örnekte "uyeler" isimli tablodan yaşı 50'den küçük olan bütün üyeleri alıyoruz ve alt alta yazdırmış oluyoruz.

  1. <?php
  2.     // sınıfın dahil et
  3.     require 'eb.vt.php';
  4.  
  5.  
  6.     // bağlantı aç
  7.     $vt = new VT;
  8.     $vt->baglan('veritabanim', 'kullanici', 'parola');
  9.  
  10.     // sorgu oluştur
  11.     $vt->sql('SELECT isim,sehir,yas FROM uyeler WHERE yas<50');
  12.     $vt->sor();
  13.  
  14.     // sorgu sonucunu al
  15.     $veriler = $vt->alHepsi();
  16.     $veriSay = $vt->numRows();
  17.  
  18.     // bağlantıyı kapat
  19.     $vt->kapat();
  20.  
  21.  
  22.     print "$veriSay adet üye bulundu: <hr />";
  23.     foreach( $veriler as $veri ) {
  24.         print $veri->isim;
  25.         print $veri->sehir;
  26.         print $veri->yas;
  27.         print '<br />';
  28.     }
  29. ?>

Sonuç

eburhan VT class sınıfının özellikleri burada anlattığımla sınırlı değil tabii ki. Daha fazla bilgi almak isteseniz eBurhan Araçları sayfasından bu sınıfı indirebilirsiniz. İndireceğiniz dosya içerisinde ayrıntılı bir dökümantasyon bulunuyor. Ve ayrıca, kullanıma açık olan (public) metodları gösteren bir kopya kağıdı da mevcut ;)

kopya kağıdı
26 Haziran 2009, 10:50 Programlama Bugün 3 kez, toplamda ise 4.975 kez okundu. , , ,
40 yorum var
  1. genel olarak ezsql kullanıyordum bir dahakine bu classı da deniyeceğim. güzel olmuş

  2. teşekkürler.

  3. Harikasın en çok bu yazılarına gösterdiğin özene hayranım.

  4. Bir çok işlem için hızlı bir çözüm olmuş. Zend_Db nesnesini incelemenizi tavsiye ediyorum, bunu geliştirmenizde yardımcı olacaktır.

  5. Harikasın erhan tebrik ederim.

  6. Güzel bir çalışma elinize sağlık. Ezsql’e göre avantajı yada dezavantajları varmıdır acaba?

    Bir de bağlantıyı kapamak için $vt->kapat(); kullanın demişsiniz ya sona koyun. Bunu _destruct olarak tanımlasak böyle bir sorun kalmayacak değil mi?

  7. Çok faydalı bir paylaşım Erhan, teşekkürler..

  8. @Elvin
    Zend_DB çok detaylı bir sınıf. Ayrıca ZF sınıflarının yalnızca php 5′de çalıştığını bilmekte fayda var. Benim bı sınıfı yazmamdaki asıl amacım CRUD denilen temel sql işlemlerini yapmada pratiklik sağlamak. yorumun için teşekkürler.

  9. @S4l1h
    ezSQL konusunda pek yorum yapmak istemiyorum. WordPress için eklenti geliştirken kullanıyorum yalnızca. Onun dışında kullanmıyorum. En iyisi yakuter’in şu yazısına bakıp karşılaştırmayı kendiniz yapın.

    Eğer php 5 kullanıyorsunuz bir adet “_destruct” sınıfı tanımlayıp “kapat” metodunun yaptığı işlemleri orada tanımlayabilirsiniz. Ama php 4 kullananların “kapat” fonksiyonunu kullanmalarını tavsiye edilir, fakat çok da şart değil.

  10. Doğru tabi Erhan abi. PHP 4 nesne yapısı farklı. abi diyorum çünkü 14 yaşındayım benden büyüksünüz :)

  11. Çok güzel bir sınıf olmuş. Özellikle sql injection saldırıları için önceden yapılmış korumalarla güzel olmuş.

  12. @SNaRe
    sql injection için özel bir metot yok sınıfda sadece private _temizle() var o da php.ini deki ihtimallere göre mysql in yanlış anlayacağı tırnak slash gibi karakterleri escape edecektir.

    Ama ayrıyeten sorgu içinde geçen SELECT|INSERT|DELETE|DROP|UPDATE|UNION gibi kelimelere yönelik bişey olsaydı belki dediğin sql injectiona karşı önlem alınmış olurdu.

    Bakınız:
    http://www.kodaman.org/yazi/sql-injectiona-ufak-bir-onlem

  13. Hocam teşekkürler böyle bir class arıyordum.. En sonunda yardımıma sen yetiştin :) Bıkmıştım uzun uzun kodlar yazmaktan ..

  14. sağolasın ellerine sağlık. dizi mantığı çok işe yarıyo aslında php’de…

  15. Başarılı bir çalışma eline sağlık eburhan.

  16. Usta harikasın… Az yapıyorsun, öz yapıyorsun…

  17. Php nin native fonksiyonları sonucta daha hızlı degilmi , hangi class olursa olsun 2 ayrı loop çalıştırmak zorundasınız.
    ilk loop veriyi collect etmek için dönen veri uzerinde işlem yapmak için , native olarak kulandığınız yaptığınız tek bir döngü sorunu çözüyor. Performans açısından fikrinizi öğrenebilir miyim ?

  18. Gerçekten başarılı bir çalışma. Teşekkürler . Saygılar.

  19. Murat, hayır, fazladan döngü kurulmaz, salt fonkisyonlar tabii ki daha hızlıdır, ama bunları kullanan nesnelerin getirdiği kolaylıklarla kıyaslanamaz. Bu olay “makine dili ile web sitesi yazmak”la aşağı yukarı aynı mantığa çıkar.

  20. eline sağlık çok güzel olmuş bir sonraki projemde denemek istiyorum

  21. Kod gelistiricilerinin unuttugu bir konu olan kopya kagidi uygulamasini dusunmeniz hos olmus.

  22. Güzel ve temel ihtiyaçları karşılayan bir sınıf. Teşekkürler.

  23. yeni bir projemde bunu deniyecegim.
    Teşekkurler

  24. eburhan hocam senden Allah razı olsun yazdığın sınıflara ve çalışmalara bakıyorum gerçekten zaman alan ve daha önemlisi üzerlerinde çalışılması gereken çalışmalar Türkiye’de Türkçe sınıf adında bir çok çalışmanın öncülüğünü yapıyorsun ve işini gerçekten özenle ve temiz yapıyorsun başarılarının devamını dilerim ve hakettiğin yere gelmen dileğiyle çalışmalarında başarılar..

  25. version 1.1 yayınlandı. güncel sürümü eBurhan Araçları sayfasından indirebilirsiniz.

  26. Şu anda bir projemde bu veritabanı bağlantı sınıfını kullanıyorum ve gayet memnunum. Çok başarılı bir çalışma. Ellerinize sağlık…

    Küçük bir problemi iletmek isterim :
    Hata oluştuğunda eğer herhangi bir ayar değiştirilmediyse otomatik olarak hatayı hata dosyasına kaydetmeye çalışıyor, fakat dosya bulunamadığından dolayı okuma ve yazma işlemlerini yapamıyor, 3 adet alt alta gereksiz hata gösteriyor. Bilginize.

  27. ali güneş 19 Temmuz 2009 17:56

    merhaba,

    öncelikle yeni projemde hazırlamış olduğunuz sınıfı kullanmayı düşünüyorum, çok işime yarayacak. Teşekkürler…

    karşılaştığım bir sorunu iletmek istiyorum:

    require ‘eb.vt.php’;
    $vt = new VT;
    $vt->baglan(‘veritabanim’, ‘kullanici’, ‘parola’);
    $vt->sql(‘SELECT isim,sehir,yas FROM uyeler WHERE yassor();
    $veriler = $vt->alHepsi();
    $veriSay = $vt->numRows();
    $vt->kapat();

    $vt2 = new VT;
    $vt2->baglan(‘veritabanim’, ‘kullanici’, ‘parola’);
    $vt2->sql(‘SELECT isim,sehir,yas FROM uyeler WHERE yassor();
    $veriler2 = $vt2->alHepsi();
    $veriSay2 = $vt2->numRows();
    $vt2->kapat();

    yukarıdaki kodları aynı sayfada kullanınca vt2′deki kayıtları Türkçe karakterler patlamış halde ekrana basıyor, ayrı ayrı sayfalarda deneyince sorunsuz çalışıyor.

    Bende mi sorun oldu, yoksa böyle sorun yaşayan var mı bilmiyorum.

  28. Ben sizin sorunlarınız ve daha hızlı olması bakımından sınıfı biraz editledim. Benimkimde kullanım :

    $db = new DB(); // Kullanıcı adı, şifre ve host scriptin içinden ayarlanıyor ve otomatik olarak bağlanıyor, sınıf kapanırken de $db->kapat(); otomatik olarak yapılıyor.
    $db->sql(“select * from tablo”);
    $db->alHepsi();
    $db->numRows;

    şeklinde kullanabilirsiniz. Türkçe karakter sorunu olmayacaktır. Karakter seti utf8 e ayarlıdır.

    İndirebileceğiniz adres : http://www.oguzozcan.com/db.rar

  29. @Oğuz Özcan
    Teşekkürler. Fakat şuna dikkat çekmek isterim. baglan() metodunu sınıfın kurucu fonksiyonunda [seninkinde DB()] kullanmanı tavsiye etmem. Çünkü kopya kağıdı‘nda da göreceğin üzere sınıfın ayarlarını yapan “seçenekler” en başta gelmelidir. En iyi kullanım yöntemi, sınıf dosyasının en sonunda, sınıf bittikten sonra bağlantı yapmanızdır.

  30. Doğru diyorsun Erhan, ben de onu düşündüm. Onun için dedimki ayarları script dosyasından yapınız diye :D veritabanı, kullanıcı adı, şifre ve host ayarları ilk yapılıyor, sonra bağlan metodu çağarılıyor.

  31. güzel fakat şu select vs vs komutlarını artık yazmak çok sıkıyor şöyle bir çözüm yapabilirsin

    public function get_result($col,$table,$args='')
    {
    Foreach($col as $key)
    {
    $o[] = $key;
    }
    $query = mysql_query("SELECT ".join(', ',$o)." FROM ".$table." {$args} ", $this->connectdb);
    $q = mysql_fetch_array($query);
    return $q;
    }

    kullanımı:

    $colons= Array('isim','sehir','telefon');
    $vt = new VT;
    $o = $vt->get_result($colons,"uyeler","\nWHERE sehir ORDER BY sehir ASC");
    echo $o['isim'];
    burada ki çıktıyı sınıfa döndürme
    $o = (OBJECT) $vt->get_result($colons,"uyeler","\nWHERE sehir ORDER BY sehir ASC");
    echo $o->$isim;

    son kayıtı ekrana yazar

  32. Bir kaç örnek daha koyabilir misin?
    Diğer fonksiyonları kullanarak.

  33. ben de böyle bir sınıf hazırlamıştım, fakat pek ilgi görmeyince güncellemeleri durdurmuştum: http://www.teyt.org/php-icin-mysql-sinifi

  34. public function fetch_result($col,$table,$args=”)
    {
    global fetch_array;
    Foreach($col as $key)
    {
    $o[] = $key;
    }
    $query = mysql_query(“SELECT “.join(‘, ‘,$o).” FROM “.$table.” {$args} “, $this->connectdb);

    while($q = mysql_fetch_array($query))
    {
    foreach((array)$col as $key )
    {
    $fetch_array[$key][] = $q[$key];
    }

    }
    return $fetch_array;
    }
    bu işlemin uygulanışı şöyle;

    $colons= Array(‘isim’,’sehir’,'telefon’);
    $vt = new VT;
    $vt->fetch_result($colons,”uyeler”,”\nWHERE sehir ORDER BY sehir ASC”);
    global $fetch_array;
    foreach($fetch_array as $key => $val)
    {
    echo $key.$val.”";
    }
    burada dikkat edilinirse global i kullandım siz bu sınıfta şöyle bir değişiklik yada ekleme yaparak global kullanmayabilirsiniz ,şöyleki ;
    class vt{
    public $global = Array();


    public function fetch_result($col,$table,$args=”)
    {

    Foreach((Array)$col as $key)
    {
    $o[] = $key;
    }
    $query = mysql_query(“SELECT “.join(‘, ‘,$o).” FROM “.$table.” {$args} “, $this->connectdb);

    while($q = mysql_fetch_array($query))
    {
    foreach((array)$col as $key )
    {
    $this->global[$key][] = $q[$key];
    }

    }
    return $this->global;
    }
    burada dikkat edilinirse Foreach(Array)$col … yazdım , yani siz burada tek kolon girebilme ihtimaline karşın girilen değeri array değişkeni olarak gösteriyorum ;)

    public function insert ($table, $values)
    {
    return mysql_query(“INSERT INTO ” . $table . ” VALUES (‘” . join(“‘, ‘”, $values) . “‘)”, $this->connectdb);
    }

    $vt = new VT;
    $insert = Arrar( ‘id’=> null,’user_name’=>’deneme’,’sifre’=>’hede123′);
    $vt->insert(‘user’,$insert);
    id sizin veri tanınızda uniq olduğu için burayı null olarak (pas) geç yapılıyor.

    vs vs biraz daha kasıp uç fikirlere gidilirse bu iş delegate ve hook yöntemine kadar gider ben o kadar kastım bir sorgulama işlemi yaptıktan sonra hook yöntemiyle o alan içerisinde her yöne gönderme yapıyorum . Yazdığım MVC den Örnek:
    orion::query(‘user.result’,'user.name’);
    burada parselliyorum user table ından name çek , user ‘dan result’a gönder yada burada aynı yerden başka türde de olabilir
    orion::query(‘user.session_user’,'user.name’);
    echo orion::exec(‘user.result’);
    echo $_session['user'];
    yada
    orion::query(‘user.result’,Array(‘user.name’,'user.password’));
    gibi
    Ayrıca hook’un mantığını öğrenmek için php.net den call_user_func ve call_user_func_array yada wordpress in hook tekniği

  35. yazdığınız sınıfı kullanmayak amaçlı denemeye karar verdim ama update sorgusunu nedense çalıştıramadım. verdiğiniz örneklerde de bulamadım. örnek eklerseniz sevinirim.
    iyi çalışmalar.

  36. Büyük ihtimal SQL kodunuz yanlıştır. Yoksa bu sınıfın Update için ayrı, Insert için ayrı bir işlem uyguladığı yok.


    $vt->sql('UPDATE tablo SET isim='Erhan' WHERE uyeNo=10");

    if( $vt->sor() ) {
    echo 'Update işlemi başarılı';
    }

  37. Merhaba,
    Güzelmiş ellerine sağlık :)
    Acaba toplu mail için bir class gibi bişey varmı :)
    varsa paylaşırsanız çok büyük bir iyilik yapmış olursunuz :)
    Herşey için yinede çok teşekkür ederim :)

İçinizde kalmasın, siz de yorum yazın

Telif Hakkı © 2010 eburhan.com | Structure | XHTML