cemalggevenc 1
cemalggevenc
Bvural41 1
Bvural41
yarka0000 1
yarka0000
kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
Hikaye Ekle

PDO MySQL Veritabanı Sınıfı

  • Konuyu başlatan Konuyu başlatan VolkanParlak
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 0
  • Görüntüleme Görüntüleme 480

Ayyıldız2 | 2008 TR Yapısı • 1-99 Orta Emek Destan • Oto Avsız • 10 Temmuz 21:00 HEMEN TIKLA!

rd8xp.png

Bir önceki yazımda
PDO konusuna giriş yapıp temel kullanım şeklinden bahsetmiştim. Şimdi ise PDO ile MySQL bağlantısı yapıp rahat bir şekilde kullanabileceğimiz bir static PDO sınıfını sunacağım.



Kullanımı kolay ve performanslı olabilmesi için static bir sınıf hazırladım, aynı zamanda yapısında, yani sadece siz veritabanına ihtiyaç duyduğunuzda sunucuya bağlanır ve tekrarlamaz.


Yapmanız gereken veritabanı bilgilerinizi ilgili sabit değerler ile tanımlayıp bu sınıfı include edip kullanmak. Burada bu yazıdan sonra anlatacağım tüm çalışmalarda bu sınıf ile veritabanı bağlantısı yapacağız.


Sınıfın Özellikleri


PDO zaten kendi halinde tüm temel isteklere cevap verecek metodlara sahip. Bu sınıfın metodlarını hazırlarkende bir kaç satır kod kullandığımı görebilirsiniz. Artıları nedir derseniz;


  • Öncelikle her sınıfın sağladığı pratikliği sağlıyor. Herhangi PDO bağlantı terimiyle uğraşmadan dosyaları uygulamanıza ekleyip ayar dosyasındaki sabitlerden veritabanı bilgilerini girip kullanmaya başlayabilirsiniz.
  • Sınıf singleton pattern yapısına sahip ve aynı zamanda statik olduğu için uygulamanızın en başında bir değişkene atanma ya da uygulama başlar başlamaz veritabanına bağlanma ihtiyacı duymaz. Örneğin uygulamanızda içerikleri cache ile sakladınığınızda ve yanlızca belirli dakikalarla veritabanından çekmek istediğinizde diğer zamanlarda gereksiz bağlantılar yapmamış olursunuz.
  • Bir satır bir satırdır. getVar, getRow gibi metodlar sayesinde tek bir satırda ihtiyacınız olan satır ya da verilere ulaşabilirsiniz.
  • Tüm içerik çeken metodlarında ikinci parametre olarak bindings değerlerini alıyor. Bu sayede yine bir kaç metod daha kısaltıyoruz.
  • Sorgulardan dönen tüm içerikler obje tipinde dönmesini sağlıyor. Değerleri daha hızlı yazıp daha temiz görmemizi sağlıyor.
  • Get metodu ile sorgunun tüm satırlarını arraya yüklenmiş bir şekilde alıyoruz. Elde ettiğimiz sonucu direkt cache yapabilir ya da foreach ile döndürebiliriz.
  • getLastError metodu ile daha pratik hata karşılayabiliyoruz.
  • Insert metodu direkt olarak eklenen satırın ID’sini veriyor.
  • Tüm bunların yanında deneysel ve olayları daha iyi kavrama amacıyla dizayn ettiğim bu sınıf sayesinde PDO’ya daha iyi hakim olabiliyorum.

Özetle sınıf; statik, pratik ve singleton. PDO kendi haliyle yeterli bile olsa elinizin altında bu tarzda bir sınıfınızın olması mutlaka işlerinizi daha da kolaylaştıracaktır.


PDO’nun Kendisi

Sınıf PDO’dan extends edilmedi, fakat sihirli metodu sayesinde sınıfa statik olarak yapılan her çağrı direkt olarak PDO’da çalışacak. Yani bu sınıf ile bir önceki yazımda bahsettiğim ve bahsetmediğim tüm PDO metodlarını statik olarak çağırabilirsiniz.


Kod:
$posts = DB::query('SELECT * FROM posts');
 
foreach($posts as $post)
{
    echo $post->title . '<br/>';
}


SQL Injection’a Son

Neredeyse tüm amatör PHP ve MySQL projelerinde SQL injection açığı bulunuyor. Fakat PDO’nun binding özelliği sayesinde sorgu içerisindeki değişken değerler harici olarak dahil ediliyor ve kaçış karakterleri ekleniyor. Bu sayede bu basit açıktan da arınmış oluyoruz. Aşağıdaki sorguyu korkusuzca çalıştırabiliriz.

Kod:
$post = DB::query('SELECT * FROM posts WHERE id = ?', array($_GET['id']));


Bindings (Hazır Deyimler) Kullanımı

Yukarıdaki örnekteki query metodu PDO’nun binding özelliği ile birleştirdiğim bir metoddur. İlk parametresine sorguyu ikinci parametreye ise sorgu içerisinde “?” (soru işareti) ile ifade ettiğimiz yerlere gelecek değerleri vereceğimiz dizidir. Daha geniş bir binding örneği;


Kod:
DB::query(
    'SELECT * FROM users WHERE id = ? AND name = ? AND email = ? LIMIT 1',
    array($id, $name, $email)
);

Bu yöntemi anlatacağım tüm içerik çekme metotlarında kullanabiliriz.


İçeriklerin Obje Tipinde Dönmesi

Sınıfta PDO’nun veri çekme metodunu obje olarak belirledim. Yani çektiğimiz sonuçları bize varsayılan array tipinde değil obje olarak döndürecek.


Obje tipi ile yazması daha hızlı ve görüntüsü daha hoş. Örneğin;


Kod:
// Obje tipi ile
echo $user->name;
 
// Array tipi ile
echo $user['name'];


Tek Bir Değeri Çekmek

Sınıfın asıl esprilerine gelelim, “getVar” metodu ile yazdığınız sorgunun döndüreceği tek değeri alıyoruz. Örneğin sadece bir üyenin adını ya da toplam üye sayısını almak istiyorum.


Kod:
// Bir kullanıcının adı
$name = DB::getVar('SELECT name FROM users WHERE id = 1 LIMIT 1');
 
echo 'Selam ' . $name;
 
// Ya da toplam kullanıcı sayısı
$count = DB::getVar('SELECT COUNT(id) FROM users');
 
echo 'Toplam üye sayımız ' . $count;

Tek Bir Satırı Çekmek

getRow metodu ile yazdığımız sorgunun döndüreceği bir satırı alabiliyoruz. Bir üyenin ya da bir içeriğin değerlerine ulaşmak için ideal.


Kod:
$user = DB::getRow('SELECT * FROM users WHERE id = 1 LIMIT 1');
 
echo 'Merhaba ' . $user->name . '!';
echo 'E-mail adresin: ' . $user->email;


Birden Fazla Satır Çekmek

Tablodaki içerikleri listelemek için iki farklı yöntem mevcut. Ya varsayılan olarak PDO’nun query metodu ile ya da sınıftaki get metodu ile tüm sonucu arraya çevirip bir değişkene atayabilirsiniz.


Kod:
$books = DB::get('SELECT * FROM books ORDER BY price DESC LIMIT 30');
 
foreach($books as $book)
{
    echo $book->title . "\n";
}


Yeni Bir Satır Eklemek

Yukarıda bahsettiğimiz binding yöntemi ve insert metodu ile satır ekleme sorgumuzu hazırlıyoruz. Bu metot sonuç olarak son eklenen ID’yi döndürüyor.


Kod:
$name = 'Vokan Parlak';
$email = 'volkanparlak@turkmmo.com';
$password = md5('linux');
 
$id = DB::insert(
    'INSERT INTO users (name, email, password) VALUES (?, ?, ?)',
    array($name, $email, $password)
);
 
echo 'Yeni eklenen üyemizin ID'si ' . $id;


Satırları Düzenlemek veya Silmek

Yukarıdaki insert metodu ile aynı şekilde çalışan exec metodu ile düzenleme ve silme sorgularımızı çalıştırabiliriz. Tek farkı bu sefer etkilenen satır sayısını alırız.


Kod:
// Düzenlemek
$affected = DB::exec('UPDATE users SET scores = 10 WHERE id > 30');
 
echo $affected . ' adet üye düzenlendi.';
 
// Silmek
$affected = DB::exec('DELETE FROM users WHERE id < 30');
 
echo $affected . ' adet üye silindi.';


Hataları Karşılamak

Eğer hata kontrolleri de yapmak istiyorsanız getLastError metodunu kullanabilirsiniz, eğer son yapılan sorguda bir hata meydana geldiyse hata kodu ve mesajını içeren bir array döndürür, eğer bir sorun çıkmadıysa false döner.


Kod:
$id = DB::insert(
    'INSERT INTO users (name, email) VALUES(?, ?)',
    array('Volkan', 'volkanparlak@turkmmo.com')
);
 
if($error = DB::getLastError())
{
    echo 'Bir hata oldu, hata mesajı: ' . $error[2];
}
else
{
    echo 'Başarıyla eklendi! Eklenen ID ' . $id;
}


Sonuç

Bundan önce anlattığım veritabanı sınıfı artık müfredattan kalkıyor, bu nedenle artık herkese ve güncel alternatifleri olan i gibi sınıfları öneriyorum. Ayrıca önermekle kalmayıp temel ihtiyaçları rahatlıkla karşılayan ve rahat bir şekilde kullanılabilecek olan bu statik ve singleton yapıya sahip sınıfı sunuyorum.

Sırayla gitmeyi seven birisi olarak (en temel derslerden bu konulara gelmemden anlayacağınız üzere) yine yukarıda belirttiğim gibi bundan sonraki örnek çalışmalarda bu sınıfı kullanarak bir şeyler anlatmaya çalışacağım.

PDO MySQL veritabanı sınıfının dosyalarını indirmek için , virüs total için tıklayın.

Bir sonraki PHP serüveninde görüşmek üzere hoşça kalın.
 
Son düzenleme:

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst