PDO MySQL veritabanı sınıfı

0 Replies, 12 Views

[h=2]Sınıfın özellikleri[/h]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.[h=2]PDO’nun kendisi[/h]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.[TABLE="width: 580"]
[TR]
[TD="class: gutter"]
1
2
3
4
5
6
[/TD]
[TD="class: code"]$posts = DB::query('SELECT * FROM posts');

foreach($posts as $post)
{
echo $post->title . '<br/>';
}

[/TD]
[/TR]
[/TABLE]


[h=2]SQL Injection’a son[/h]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.[TABLE="width: 585"]
[TR]
[TD="class: gutter"]
1
[/TD]
[TD="class: code"]$post = DB::query('SELECT * FROM posts WHERE id = ?', array($_GET['id']));

[/TD]
[/TR]
[/TABLE]


[h=2]Bindings (Hazır Deyimler) kullanımı[/h]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;[TABLE="width: 585"]
[TR]
[TD="class: gutter"]
1
2
3
4
[/TD]
[TD="class: code"]DB::query(
'SELECT * FROM users WHERE id = ? AND name = ? AND email = ? LIMIT 1',
array($id, $name, $email)
);

[/TD]
[/TR]
[/TABLE]


Bu yöntemi anlatacağım tüm içerik çekme metotlarında kullanabiliriz.[h=2]İçeriklerin obje tipinde dönmesi[/h]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;[TABLE="width: 580"]
[TR]
[TD="class: gutter"]
1
2
3
4
5
[/TD]
[TD="class: code"]// Obje tipi ile
echo $user->name;

// Array tipi ile
echo $user['name'];

[/TD]
[/TR]
[/TABLE]


[h=2]Tek bir değeri çekmek[/h]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.[TABLE="width: 580"]
[TR]
[TD="class: gutter"]
1
2
3
4
5
6
7
8
9
[/TD]
[TD="class: code"]// 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;

[/TD]
[/TR]
[/TABLE]


[h=2]Tek bir satırı çekmek[/h]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.[TABLE="width: 580"]
[TR]
[TD="class: gutter"]
1
2
3
4
[/TD]
[TD="class: code"]$user = DB::getRow('SELECT * FROM users WHERE id = 1 LIMIT 1');

echo 'Merhaba ' . $user->name . '!';
echo 'E-mail adresin: ' . $user->email;

[/TD]
[/TR]
[/TABLE]


[h=2]Birden fazla satır çekmek[/h]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.[TABLE="width: 580"]
[TR]
[TD="class: gutter"]
1
2
3
4
5
6
[/TD]
[TD="class: code"]$books = DB::get('SELECT * FROM books ORDER BY price DESC LIMIT 30');

foreach($books as $book)
{
echo $book->title . "n";
}

[/TD]
[/TR]
[/TABLE]


[h=2]Yeni bir satır eklemek[/h]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.[TABLE="width: 580"]
[TR]
[TD="class: gutter"]
1
2
3
4
5
6
7
8
9
10
[/TD]
[TD="class: code"]$name = 'Bill Gates';
$email = '[email protected]';
$password = md5('linux');

$id = DB::insert(
'INSERT INTO users (name, email, password) VALUES (?, ?, ?)',
array($name, $email, $password)
);

echo 'Yeni eklenen üyemizin ID'si ' . $id;

[/TD]
[/TR]
[/TABLE]


[h=2]Satırları düzenlemek veya silmek[/h]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.[TABLE="width: 580"]
[TR]
[TD="class: gutter"]
1
2
3
4
5
6
7
8
9
[/TD]
[TD="class: code"]// 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.';

[/TD]
[/TR]
[/TABLE]


[h=2]Hataları karşılamak[/h]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.[TABLE="width: 580"]
[TR]
[TD="class: gutter"]
1
2
3
4
5
6
7
8
9
10
11
12
13
[/TD]
[TD="class: code"]$id = DB::insert(
'INSERT INTO users (name, email) VALUES(?, ?)',
array('Ahmet', '[email protected]')
);

if($error = DB::getLastError())
{
echo 'Bir hata oldu, hata mesajı: ' . $error[2];
}
else
{
echo 'Başarıyla eklendi! Eklenen ID ' . $id;
}

[/TD]
[/TR]
[/TABLE]


[h=2]Sonuç[/h]Bundan önce anlattığım veritabanı sınıfı artık müfredattan kalkıyor, bu nedenle artık herkese PDOve güncel alternatifleri olan MySQLi 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 tıklayın.

Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  PHP Mysql Bağlantı kurma x3uqm4 0 3,069 30-10-2009, 17:53
Son Yorum: x3uqm4



Konuyu Okuyanlar: 1 Ziyaretçi