MYSQLPHP

PDO MySQL veritabanı sınıfı

Kullanımı kolay ve performanslı olabilmesi için static bir sınıf hazırladım. Aynı zamanda singleton pattern 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. getVargetRow 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 __callStatic 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.

1
2
3
4
5
6
$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.

1
$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;

1
2
3
4
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;

1
2
3
4
5
// 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.

1
2
3
4
5
6
7
8
9
// 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.

1
2
3
4
$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 querymetodu ile ya da sınıftaki get metodu ile tüm sonucu arraya çevirip bir değişkene atayabilirsiniz.

1
2
3
4
5
6
$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.

1
2
3
4
5
6
7
8
9
10
$name = 'Bill Gates';
$email = 'bill@microsoft.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.

1
2
3
4
5
6
7
8
9
// 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.

1
2
3
4
5
6
7
8
9
10
11
12
13
$id = DB::insert(
    'INSERT INTO users (name, email) VALUES(?, ?)',
    array('Ahmet', 'ahm@hotmail.com')
);
if($error = DB::getLastError())
{
    echo 'Bir hata oldu, hata mesajı: ' . $error[2];
}
else
{
    echo 'Başarıyla eklendi! Eklenen ID ' . $id;
}

Related Articles

Leave a Reply

Close

Reklam Engelleme

Please consider supporting us by disabling your ad blocker