Ayyıldız2 | 2008 TR Yapısı • 1-99 Orta Emek Destan • Oto Avsız • 10 Temmuz 21:00 HEMEN TIKLA!
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
Linkleri görebilmek için Turkmmo Forumuna ÜYE olmanız gerekmektedir.
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 IDsini veriyor.
- Tüm bunların yanında deneysel ve olayları daha iyi kavrama amacıyla dizayn ettiğim bu sınıf sayesinde PDOya 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.
PDOnun Kendisi
Sınıf PDOdan extends edilmedi, fakat
Linkleri görebilmek için Turkmmo Forumuna ÜYE olmanız gerekmektedir.
sihirli metodu sayesinde sınıfa statik olarak yapılan her çağrı direkt olarak PDOda ç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 Injectiona Son
Neredeyse tüm amatör PHP ve MySQL projelerinde SQL injection açığı bulunuyor. Fakat PDOnun 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 PDOnun 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 PDOnun 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 PDOnun 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 IDyi 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
Linkleri görebilmek için Turkmmo Forumuna ÜYE olmanız gerekmektedir.
ve güncel alternatifleri olan
Linkleri görebilmek için Turkmmo Forumuna ÜYE olmanız gerekmektedir.
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
Linkleri görebilmek için Turkmmo Forumuna ÜYE olmanız gerekmektedir.
, virüs total için
Linkleri görebilmek için Turkmmo Forumuna ÜYE olmanız gerekmektedir.
tıklayın.Bir sonraki PHP serüveninde görüşmek üzere hoşça kalın.
Son düzenleme: