PDO: gelişmiş veri tabanı yönetimi eklentisidir. Php nin yeni versiyonları ile hayatımıza girmeye başlayan bu uygulama bir çok veritabanını destekliyor. Böylece veritabanı modeli değiştirmek zorunda kaldığımızda php kodlarımızı silbaştan tekrar değiştirmek zorunda kalmayacağız. Çünkü PDO ile hazırlanan sorgu cümlecikleri desteklenen bütün veritabanı modellerinde geçerli olacak. size sadece başlangıç bağlantı sorgusunuz düzeltmek kalıyor.

PDO’nun desteklediği veri tabanı modelleri:
Cubrid
FreeTDS / Microsoft SQL Server / Sybase
Firebird/Interbase 6
IBM DB2
IBM Informix Dynamic Server
MySQL 3.x/4.x/5.x
Oracle Call Interface
ODBC v3 (IBM DB2, unixODBC and win32 ODBC)
PostgreSQL
SQLite 3 and SQLite 2
Microsoft SQL Server / SQL Azure

Php geliştiricileri artık php ve veritabanı programcılarına PDO yapısına geçmeleri konusunda tavsiyelerde bulunuyorlar. Ciddi anlamda da ilerleyen yıllarda PDO yapısının artık eski sistemlerin yerini alacağını düşünüyorum. Her şekilde öğrenmesi zor ve hantal sorgulardan bizi kurtaran yeni PDO programı Türk gençleri tarafından da bir an önce benimsenmeli ve kullanılmaya başlanmalı.

PDO ilk başlarda size zor gelebilir ancak sonrasında öğrendikçe zevkli olduğunu ve programlamasının kolaylığı ile heycanlandığınızı göreceksiniz. 3-4 ay önce PDO sistemine geçmek istediğimde düzgün bir anlatım bulamamıştım. Henüz 2 hafta falan oldu hobi amaçlı başladığım PDO uygulamasına yönelik tecrübelerimi yeni ve bunu öğrenmek isteyen kişilerle paylaşacağım.

Tavsiye: Bu konuda dökumanlardan çok sizin konuyu ne kadar öğrenmek istediğiniz önemlidir. Bilgisayarınızda bir localhost kurarak test ortamı hazırlayın. Hataları, doğruları test ederek gördüğünüzde öğrenmek dahada kolaylaşacaktır.

PDO konusunda şuan için başlangıç ve orta seviyesindeki konulara yer vereceğim. Aşağıdaki dökumanda yer vermediğim bir çok parametrede olacaktır. bunlara zamanım olduğunda yer vereceğim. Şuan için orta derece bir bilgiye bu dökuman ile ulaşabileceksiniz. Sonrasında zaten kendiliğinden yeteneğiniz artacaktır.

Öncelikle veritabanı bağlantı kod parçacığımızı ele alıp bağlantıyı sorunsuz gerçekleştirelim.

PDO Mysql veri tabanı bağlantısı

PDO php’nin yan uygulaması olarak geliyor. bazı sunucularda aktif edilmemiş olabilir. Apacheyi derlerken pdo bölümünüde seçemniz gerekli, bunun yanında mysql ve php ilişiğini sağlayan diğer yan uygulamalarıda seçmeniz gerekli (şuan isimleri aklımda değil :=)). Ayrıca PDO phpnin 5.1.x versiyonu dahil yeni sürümlerinde desteklenmektedir. Eski versiyon php programınız varsa güncellemenizi öneririm..

PDO::QUERY Mysql Select komutu

Select komutunu 2 ayrı başlıkta inceleyeceğiz arkadaşlar. İlki tek veriyi, tabloyu çekerek işlem yapma, diğeri ise birden fazla sonucu foreach yada while ile işleme alma. Yeni başlayanların yada yanlış bilenlerin ve daha hızlı hafif sorgular oluşturabilmeniz için gerekli olan PDO parametrelerinede bildiğim kadarıyla yer vermeye çalışacağım.

1 – Tek veri işleme:

Sorgumuz aşağıdaki gibi olacaktır:

Bazı arkadaşlar direk fetch() diğer kullanıyor ancak bu yanlıştır. parantezler arasına PDO parametlerini koyarak size en uygun veri biçimini çekerseniz gereksiz gelecek verilerden ve harcanacak zamandan kurtulursunuz. Bu alanda kullanabileceğiniz PDO parametlerine kısa bir göz atalım:

PDO::FETCH_ASSOC: veriyi stun ismi ile çeker. Örnek:

PDO::FETCH_BOTH: Veriyi karşık çeker, yani hem stun ismiyle hemde sayısal değeri ile karışık iki bölüm işler. Eğer boş bırakırsanız bu kısım default olarak işleme alınacaktır. Eğer sadece stun ismiyle iş yapacaksanız yukarıdaki parametreyi kullanız, aksi taktirde fazladan veri ile belleği şişirmiş oluruz. bu veri her ne kadar küçük olsada çok büyüyecek bir sitede ilerde kendini hissetirmeye başlayacaktır. bu parametre sonucunda oluşacak array diziside bu şekilde:

Sonraki parametreleri tam olarak bilmiyorum ama üzerinden geçmekte fayda var.

PDO::FETCH_LAZY: Sonuçları array yerine PDORow Object yöntemi ile listeliyor, sorgu parametresinide queryString ismine atıyor. php.netdeki açıkmalası: Her özelliğin bir sütun ismine denk düştüğü bir anonim nesne olarak. Örnek çıktı aşağıdaki gibidir:

PDO::FETCH_OBJ: Sonuçları stdClass Object şeklinde listeliyor, php.net deki açıklaması: Her özelliğin bir sütun ismine denk düştüğü bir anonim nesne olarak. Örnek çıktı aşağıdaki gibidir:

Ben genelde sorgularımı stun ismine göre çekiyorum. Böylece kafam karışmıyor ama uygulamanıza hangisi uygunsa ona görede diğer parametreleri kullanabilirsiniz. Yeni başlayanlar ve basit işlemler için kullanacak arkadaşlar için ilk parametreyi yani PDO:FETCH_ASSOC‘u öneririm.

PDO::FETCH_COLUMN: Select kısmında belirlenen sütunda bulunan bütün veriyi sayı dizgesi ile listeler. Eğer select kısmında ön tanımlı bir değer yoksa (*), birden fazla varsa ilk kolonu ele alarak listeleme yapar. Örnek dönen sonuç aşağıdaki gibidir:

PDO::FETCH_GROUP: Verileri belirlenen ilk sütuna göre gruplandırarak işlem yapar. Tek başına kullanıldığında ikinci tablonun isminin altına birde sayısal değeri ile ikinci veriyi ekler. sadece isim değerini alması için aynı parametreyi PDO::FETCH_ASSOC ile kullanmanızı öneriyorum yanı bu şekilde: PDO::FETCH_ASSOC|PDO::FETCH_GROUP

Bu parametreninde sonuçları örnekteki gibi olur:

PDO::FETCH_UNIQUE – Select alanındaki ilk tabloyu baz alarak benzersiz içerikleri listeler. Eski mysql de distintc ile aynı verileri eleyip sadece birini alıyorduk. PDO uygulamasında da işimizi kolaylaştıracak FETCH_UNIQUE parametresini kullanacağız. Yanlış hatırlamıyorsam PDO daki benzersiz kayıt parametresinin eskisine nazaran çok daha kullanışlı oluyor. Çünkü distinct de sadece belirtilen benzersiz kayıtları çekeceğimiz sütununa ait verileri alabiliyorduk. PDO daki bu parametre ile benzersiz kayıtları alacağımız sütun haricinde diğer sütunlarıda kolaylıkla çekebiliyoruz. Bu parametrenin yanında yine PDO::FETCH_ASSOC parametresiyle beraber kullanımı önereceğim, böylece sadece sayısal dizgeleri çekmeden hafif sonuçlar elde edebiliriz. Bu parametre örneğide aşağıdaki gibi olur:

PDO::FETCH_ASSOC|PDO::FETCH_UNIQUE parametrelerinin sonuçları:

2 – Birden fazla veriyi çekme:
Yukarıdaki işlemleri anladıysanız bu kısmı çok kolayca kavrayacaksınız diye düşünüyorum, çünkü fazla bir ayrıntı yok. yukarıdaki sorgu kodumuzdan sadece fetch() kısmını fetchAll() olarak değiştirerek çoklu veri çekimleri için kullanacağız. Sonrasında çektiğimiz veriyi foreach yada while ile işleyebiliriz.

Bu işlem sonunda ekrana tahmin edebileceğiniz gibi galeriler tablosundaki bütün veriler çekilecektir. Bunları foreach ile kolayca işleyebiliriz:

Basit query ile select yöntemini işledik arkadaşlar. Daha profesyonel kullanım için PDO da bir çok fonksiyon bulunmakta. Şimdi size PDO da en çok sevdiğim ve bence eski mysql sorgularını bir daha kullanmamanıza neden olacak parametre: prepare

Detaylı prepare konusuna geçmeden önce hızlı şekilde silme,ekleme,güncelleme kodumuzu yazmak istiyorum. fonksiyonun adı exec(). Extra tanımlamalara gerek kalmadan hızlıaca işlemlerinizi yapmaya olanak veriyor. Bir kaç örnek vererek sizi bilgilendirip sonrada bunların daha detaylısı ve profesyonel yapıda olanı prepare kullanımına geçeceğim:

PDO::EXEC – Hızlı Veri silme

PDO::EXEC – Hızlı Veri güncelleme

PDO::EXEC – Hızlı Veri ekleme

PDO::prepare:

Standart açıklama yerine kendi tecrübelerimi ve test sonuçlarımı paylaşacağım arkadaşlar. Büyük bir projeniz varsa yada aynı sorgunu sadece where alanındaki parametresi değişiyor diye 5-6 kere kullanmak zorunda kalıyorsanız, prepare komutu işlerinizi çok kolaylaştıracak hemde iş yükü zamanınızı çok düşürecek. Fazla kafa karıştırmadan bir kaç örnekle prepare kullanımını daha iyi anlamanıza vesile olayım.

PDO::PREPARE parametresini açıkmak için size bir örnek kod hazırladım:

Yukarıdaki göreceğiniz gibi sadece bir sorgu cümlesi hazırladık ve alt tarafta 3 ayrı birbirinden farklı sonuç listeledik. Kafanız karışmasın arkadaşlar. alt alta yazdığınız her yeni kural üstdeki yani bir önceki kural ile alakası yoktur. Yaptığınız her execute() bir üstünde belirttiğiniz bindValue() parametresindeki kuralı işler. Böylece tek sorgu ile bir tablodaki 3 üyenin galerilerini ister birini, istersenizde hepsini ayrı ayrı çekmiş olduk.

Bunun bize getireceği kolaylıklar neler derseniz: Aynı anda tek bir sorgu cümlesini kullanarak güncelleme, silme, yada veri çekme yapabilirsiniz birdenf azla. Bu mantık işi, kullanabileceğiniz alanlar tamimiyle hayal gücünüze bağlı..

PDO::PREPARE komutu ile sadece veri çekme işi değil, silme, ekleme, güncelleme işlemleride yapabiliriz. PDO daki en iyi alanlardan birisi güvenlik uygulamalarınıda beraberinde kullanarak sistemimizi güven altına alabiliriz.

PDO::PREPARE ile veri ekleme:

Birden fazla yönetmi bulunmakla beraber kullanım alanınıza göre özelleştirebilirsiniz arkadaşlar.. İlk göstereceğim kullanım uygulamanın en kolayı olacak.

Yukarıdaki sorguyu çalıştırdığınızda veritabanına yeni veri ekleyecektir ve geri olarak rowCount() parametresi ilede etkilenen yada eklenen veri sayısını verecektir bize.

Yukarıdaki veri ekleme yönetminin biraz farklı olanı ise sorguda soru işareti kullanabileceğimiz ve array kısmınıda sırakı değişkenler olarak atayabileceğimiz yöntem. Burda değişkenlerin sırasına dikkat edin, sırayla soru işaretlerinin olduğu yerlere atanmaktadır..

İşi biraz daha büyütüp eklenecek veri güvenliğini en ideal şekilde kontrol edecek aşağıdaki gibi bir işlem yapabilirsiniz:

Ekleyeceğiniz her veriyi sorguya ekledikten sonra bindValue() paremetresi ilede eklenecek veriyi hazırlıyoruz. Son olarak execute() fonksiyonunu çalıştırdığımızda işlem çalışmaya başlauacak ve altda etkilenen satır sayısını verecektir..

PDO – Eklenen son verinin ID2sini alma:
INSERT işleminden sonra eklenen veriye ait ID’yi almak zorunda olabilirsiniz. Bu gibi durumlarda Aşağıdaki değişken bize eklenen son verinin ID’sini verecektir..

PDO::PREPARE fonksiyonu ile silme, ekleme, güncelleme gibi işlemleride yukarıdaki gibi yapabiliyornuz. Konuyu anladığınızı düşünüyorum prepare kısmında fazla detaya girmeden kısa kısa örneklerle bilgilerimizi pekiştirelim.

PDO::PREPARE – Tablodaki verileri Güncelleme:

PDO da farkeden tek şey mysql standart fonksiyonları yerine PDO class yapısını ve ek olarak ekleyeceğimiz verileri ayrı bir alanda işleyerek yapmamızdır. Bunun güvenilirliği konusunda tecrübem yok ancak yapı itibari ile bunun hazırlanmış olduğunu düşünüyorum. Örnek bir veri güncelleme yapısı:

Bu alandaki veri güncelleme yöntemlerini aşağıda sırasıyla veriyorum:

2. Farklı yöntem:

3. Farklı yöntem:

4. Farklı yöntem: Standart değişkenleri sorgu içinde belirtmek, ancak kullanışlı değil, yukarıdaki yöntemlerden birini tercih etmenizi öneririm:

PDO::PREPARE – Tablo silmek

Tablo silmek prepare ile çok kolay, ayrıca bu fonksiyonun ilk başlarda anlattığım özelliği ile aynı anda birden fazla farklı tabloyu silebiliyoruz. bunu yaparken sorguğu defalarca değiştirmemize gerek kalmıyor. Küçük bir mantık yürütmek gerekirse toplu olarak silmek istediğiniz yada sitenizde bu özelliği eklemek istediğiniz alana gelen veriyi sadece foreach alanında execute kullanarak kodlama kalabalığı yapmadan halledebiliriz. Ben küçük bir mantık yürüttüm, ihtiyaçlara göre hayal gücümüz dahada farklı yorumlar bulacaktır.

ÖRnek bir tablo silme kodu:

id si 240 olan tablo tarih oldu şuanda… Kodlamada bir kaç ekleme yaparak aynı anda bir kaç tabloyu silebiliriz. sorgu cümlesini değiştirmeden:

Bir başka veri silme kodu. değişkenleri direk execute() parametresine ekleriz:

Buda diğer bir basit veri silme kodumuz:

Sormak istediklerinizi yada önerilerinizi konu altından yorum atabilirsiniz. Bu konuda yeni dökumanları zaman içerisinde tekrar yazacağım. Türk geliştiricilerinin PDO sistemine geçmesini şiddetle öneriyorum. Gelecek herzaman yeni teknolojilere çabuk atapde olabilenlerin olacaktır.

Sağlıcakla kalın..

14 YORUMLAR

  1. Gerçekten çok hoşuma gitti makaleniz. Temel bilgilere sahiptim. Sayenizde bunu ileriye taşıdım. Özellikle PREPARE’yi ayrıntılı örneklendirmeniz çok iyi oldu. Diğer makalelerinizede göz atacağım. Çok teşekkürler ellerinize sağlık.

  2. hocam ben normal php kullanmaya alıştım Pdo’ya geçmek zorundamyım çünkü bana çok zor geliyor ayrıca diğer db sistemlerini kullanmıcam sonucta bir zaman sonra eski sistem php ortadan kalkacakmı ???

    • Phpyi guncellemediginiz surece eski versiyonlari kullanabilirsiniz, ancak yeni sistemlere ayak uydurmanizi oneririm, aksi durumda cok geri kalir ve zorlanirsiniz. Yeni uygulamalari, teknolojileri kullanamazsiniz.

Bir Cevap Yazın