PHP PDO Kullanımı ve Veritabanı İşlemleri

PHP PDO Kullanımı

PDO sınıfı ile veritabanı bağlantısını nasıl gerçekleştireceğimizi yazımızda bulabilirsiniz. Bu yazıda ise PDO sınıfını kullanarak sorgu hazırlama, çalıştırma ve sonuçları elde etmeyi çeşitli örneklerle anlatalım. bindValue metodu ile yer tutuculara değer atamayı, sorguları çalıştırmayı ve dönen sonuçları fetch, fetchAll, fetchColumn ve fetchObj metotları ile elde etmeyi açıklayacağız.

PDO ile veritabanına bağlandıktan sonra bu bağlantıyı kullanarak veritabanı üzerinde okuma veya yazma işlemlerini gerçekleştirebiliriz. Bunun için bir örnekten yola çıkarak adım adım ilerlemek yararlı olacaktır.

PHP uygulaması geliştirirken SQL sorgularını sıklıkla dinamik olarak kullanmamız gerekir.

Yukarıdaki örnekte olduğu gibi belirli bir kullanıcı için profil sayfasını göstermek isteyebiliriz. Bu durumda SQL sorgusu aşağıdaki gibi olur.

Bu sorguyu dinamik hale getirerek profil sayfasına erişmek isteyen her kullanıcı için özelleştirmeliyiz. Bu durumda basit haliyle sorgu şu hale gelir.

Bu uygulanmaması gereken kötü kodlamaya bir örnek olarak verilebilir. Yukarıdaki kodlama veritabanındaki bilgileri ele geçirmek isteyenlere davet çıkarır. Kullanıcı tarafından girilen bilgilerin SQL sorgusunda kullanmadan önce temizlenmesi gerekir. PDO eklentisi bunu hazır sorgular ile kolayca yapmaktadır.

Hazır sorgular PDOStatement sınıfının bir örneğini (instance) temsil eder. PDO ile prepare metodunu kullanarak hazır sorguları elde edebiliriz. Yukarıdaki örneği PDO kullanarak değiştirelim.

Dikkatli bir şekilde incelediğinizde email ifadesinin yer tutucu (placeholder) ile gösterildiğini görebilirsiniz. Bu durum dışarıdan kullanıcı girişi ile alınan bilgilerin güvenli bir şekilde kullanımını sağlar. email ile temsil edilen alana girilecek bilgiyi ise birden fazla yolla belirtebiliriz. bindValue metodu bunlardan bir tanesidir. Örneği buna göre genişletelim.

Yukarıdaki gibi bir kullanımda hazır sorgu ile $email değişkeni temizlenecek ve olası SQL injection saldırılarından veritabanını korumuş olacaktır. Birden fazla yer tutucuyu aynı SQL sorgusu içinde kullanabiliriz. Bu durumda her yer tutucu için bindValue metodunu kullanmamız gerekir. Bu metodu daha geniş biçimde açıklayalım.

bindValue Metodu

Hazır sorgularda belirtilen yer tutucuları bir değişken ile ilişkilendirir.

Yukarıdaki syntax genel kullanımıdır. Yer tutucu başlangıçta SQL sorgusunda belirtilir. Yukarıdaki örnekte email buna örnek olarak verilebilir. Değişken, yer tutucuya atanacak olan değerdir. Kullanıcının bir form ile veritabanına bilgi kaydettiğini düşünelim. Bu veya buna benzer kullanıcı girişi ile elde edilen bilgilerin doğrudan veritabanına kaydedilmesi güvenlik riski taşır. bindValue metodu alınan bu bilgilerin sorgu için hazır hale getirilmesini sağlar. Son olarak parametre ise girilen bilginin hangi veri türüne ait olduğunu belirtir. Bu ifade bir tam sayı, string veya başka bir değer olabilir. Eğer parametre kullanılmazsa varsayılan değer PDO::PARAM_STR olarak tanımlanır.

bindValue metodunu iki şekilde kullanabilirsiniz. İlk olarak yer tutucuyu bir isim ile ilişkilendirelim.

SQL sorgusunda iki yer tutucu kullandık. Bu sorguyu prepare ile hazır hale getirdik. Fakat yer tutuculara değerlerini atamamız gerekiyor. Bunun için bindValue metodunu kullandık. Metodu bu yöntemle kullanırsanız yer tutuculara hangi sırada değer verdiğiniz önemli değildir. Örneğin önce kullanıcı ardından email tanımlayabilirsiniz.

İkinci yöntemde ise yer tutucular “?” (soru işareti) ile gösterilir. Burada bir sıralama söz konusu olur.

Örnekte soru işareti ile gösterilen yer tutuculara sırayla değer atanır. email ifadesi birinci sırada olduğu için ona atanacak değerin başında bu belirtilir. Aynı durum diğer yer tutucular için de geçerli olur. Parametre olarak kullanılabilecek örnekler:

  • PDO::PARAM_BOOL
  • PDO::PARAM::NULL
  • PDO::PARAM_INT
  • PDO::PARAM_STR

olarak verilebilir. Şu ana kadar sorguları hazırladık ve artık çalıştırmaya hazırız.

Sorgu Sonuçlarını Elde Etme

Veritabanına CRUD işlemlerini (Create, Read, Update, Delete) yaptırmak için hazırlanan sorguları çalıştırmamız gerekiyor. Bunun için execute metodunu kullanacağız. Örneğin SQL ile SELECT işlemini yaptığımızda dönen kayıtları alabiliriz. Bunun için fetch, fetchAll, fetchColumn ve fetchObject metotlarını kullanıyoruz.

fetch

fetch metodu sonuçlar içerisinde bir sonraki satırı döndürür. Genellikle çok fazla kaydın bulunduğu durumlarda kullanılır. Bir örnekle açıklayalım.

İlk dört satırdaki işlemlerin ne anlama geldiğini biliyoruz. execute metodu hazırlanan sorguların çalıştırılmasını sağladı. Bu sayede veritabanı üzerinde SQL sorgusuna göre bir sonuç elde ettik. Elde ettiğimiz sonuçları ise fetch metodunu kullanarak aldık ve ekrana yazdırdık. Metodun içerisinde kullandığımız PDO::FETCH_ASSOC sonuçların nasıl yakalanacağını belirtir. Burada ilişkili diziyi kullandık fakat başka yöntemler de bulunuyor.

  • FETCH_ASSOC ilişkili dizi döndürür. Dizi anahtarları veritabanındaki sütun isimlerine eşittir.
  • FETCH_NUM nümerik dizi döndürür. Dizi anahtarları veritabanındaki sütun isimlerinin sayısal olarak sıralanmış halidir.
  • FETCH_BOTH hem ilişkili hem nümerik dizi döndürür. Yukarıdaki iki kullanımın birleşimidir.
  • FETCH_OBJ veritabanı sütunlarını bir nesne olarak döndürür.

fetchAll

Görüldüğü üzere dönen kayıtları elde etmek için kullanılabilecek birçok yöntem bulunuyor. Eğer dönen tüm sonuçları elde etmek istiyorsanız fetchAll metodunu kullanmalısınız. Fakat bu yöntemin sadece az kaydın döndürüldüğü sorgularda kullanılması gerektiğini hatırlatalım.

Yukarıdaki örnekte fetchAll metodu ile elde edilen kayıtlar dizi olarak sonuçlar ifadesine atandı. Diziler için kullandığımız foreach döngüsü ile her bir kaydı ekrana yazdırmış olduk.

fetchColumn

Eğer sadece bir sütundan veri almak istiyorsanız fetchColumn metodunu kullanmalısınız. Bu metot seçilen sütunun index değerini alarak çalışmaktadır. Örnekle açıklayalım.

Index sırası “1” olan sütundan dönen değerleri while döngüsünü kullanarak ekrana yazdırmış olduk. Sütunların index değeri sıfırdan başlamaktadır. Örnekte email sütununun veritabanında ikinci sırada olduğu düşünülmeli.

fetchObject

Son olarak fetchObject metodunu açıklayalım. Bu metot ile dönen sonuçların sütun isimlerine göre nesne olarak kullanabileceğimiz söylemiştik.

fetchObject ile edilen sonuçlar, sütun isimlerine göre bir nesne olarak kullanılabilir. Örnekte veritabanından elde edilen sonuçlarda isim sütununa ait bilgiler ekrana yazdırıldı.

 

 

 

 

 

Etiketler:, ,

3 Yorum

  1. ahmet
  2. Önder
  3. fatih yasin söndüren

Yorum Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

error: