PHP Data Object - PDO

Cryptograph 19.08.201323:48 PHP & MySQL 8699    
Facebookta Paylaş

PHP de veri tabanına bağlanma ve sorgu çalıştırmayı anlatmıştım.
Klasik veri tabanı bağlantısı mysql_connect() komutu ile yapılıyor, sorgu çalıştırma mysql_query() ile yapılıyor fakat pdo yapısı biraz farklı. PDO php 5.2 den sonra gelen bir veri tabanı sorgu sınıfı, yani nesne tabanlı bir yapı.
En güzel özelliği çoklu veri tabanı desteği olması. Oracle, SQL Server, MySQL gibi farklı veritabanlarına bağlanabilme özelliği sunuyor. Ayrıca kendi içerisinde sql injection koruması olan bir sınıftır.

 
$db = new PDO('mysql:host=localhost;dbname=veritabanı adı', 'kullanıcı adı', 'sifre');
 
PDO sınıfını db değişkenine bağlı olarak oluşturduk, sorgularımızı bu sınıfa bağlı methodlar ile yapacağız.

query() methodu genel olarak tüm sorgularda kullanılır.
exec() methodu bilgi girişi, güncelleme, silme gibi veri tabanına değer göndermede kullanılır.
prepare() methodu query() methodundaki gibi tüm sorguları çalıştırmada kullanılır fakat buna ek olarak bir de execute() methodu kullanılır, prepare ile yapılan sorgunun uygulanması için.
fetch() methodu; tek bir sonuç getirmek için kullanılır, query ile çalıştırılmışsa sorgu query den sonra, prepare ile çalıştırılmışsa sorgu execute methodundan sonra kullanılır.

Veritabanından dataların sayılarını getirmek istediğimizde fetch(PDO::FETCH_NUM) kullanılır.

Örnek olarak bir sorgu çalıştırayım, sorguyu query ile yapacağım.
 
$sorgu = $db->query('select * from blog where id=1')->fetch();
 
Veritabanından id değeri 1 olan konuyu getiren sorguyu yazdık. Bu şekilde de yapabilirdik
 
$sorgu = $db->query('select * from blog where id=1'); 
$sorgu->fetch();
 
İkisi de aynı işlemi yapıyor.
echo $sorgu['blog_baslik'];

İle konu başlığını yazdırmış oluruz.

Tüm konuların toplam sayılarını yazdırmak için
 
$konusayi = $db->query('select count(*) from blog')->fetch(PDO::FETCH_NUM);
echo $konusayi[0];
 
$konusayi değişkeni dizi tipinde bir değişken olduğu için $konusayi[0] şeklinde yazdırdık.


prepare() ile yaparsak eğer sorgumuz aşağıdaki gibi olacaktır;
 
$sorgu = $db->prepare('select * from blog where id=1');
$sorgu->execute();
$sorgu->fetch();
echo $sorgu['blog_baslik'];
 

Dışarıdan alınacaksa id bilgisi bunu parametre ile vermek daha iyidir, çünkü parametreyi tanımlarken o parametrenin integer veya string olma özelliğini kontrol ettirebiliyoruz. Parametre için bindValue() methodunu kullanıyoruz.
 
$sorgu = $db->prepare('select * from blog where id=:id');
$sorgu->bindValue(':id', $id, PDO::PARAM_INT);
$sorgu->execute();
$sorgu->fetch();
echo $sorgu['blog_baslik'];
  
Sorgumuzu yazarken :id kullandım, bu parametre, bunun değerini bindValue() methodu ile aktardım.
PDO::PARAM_INT ile gelecek değerin int tipinde olacağını belirttik.

Gelecek olan değerin string olması ile ilgili bir kontrol yaptıracaksak eğer PDO::PARAM_STR yazmalıyız INT yerine.

Şimdiye kadar veritabanından hep bilgi getirdik, aynı sorgularla insert, update, delete işlemleri de yapabiliriz.

Delete, update gibi işlemler için exec kullanabiliriz, ayrıca veri tabanı karakter seti belirleyeceksek yine exec kullanmalıyız.
 
$sorgu = $db->exec('delete from blog where id=1');
 
Blog id değeri 1 olan konuyu sildik. Fakat bu tarz işlemleri prepare ile yaparsak daha iyi olur.

Veya karakter seti ayarlayacaksak eğer
 
$db->exec("set names 'utf8'");
bu sorguyu kullanmalıyız.

Okuyucu Yorumları (7 Yorum)

Ömer

çoklu veritabanı desteğinden bahsetmişsiniz fakat mysql haricinde diğerlerine nasıl bağlanabileceğimizi anlatmamışsınız, diğer veritabanlarında nasıl sorgu çalıştırabiliriz?

Ömer | 13:33 - 24.08.2013

Cryptograph

Diğer veritabanlarında sorgu çalıştırma yine aynı komutlarla yapılıyor fakat veritabanı bağlantısı yapmak için connection stringi değiştirmemiz gerekiyor. Mesela PostgreSQL için

$db = new PDO("pqsql:host=localhost dbname=veritabanıadı ,'kullanıcı adı','sifre');

şeklinde yapabiliriz. Diğer veritabanları için olan connection stringleri bilmiyorum MySQL harici bir veritabanıyla çalışmadım hiç. Ayrıca bağlantı yaptığımızda bu bağlantının açılıp açılmadığını try - catch komutlarıyla kontrol ettirebiliriz. Bu sayede ekrana bizim istediğimiz hata mesajı yazdırılmış olur.

try{
$sorgu = $db->query('select * from blog where id=1')->fetch();
}
catch (PDOException $e){
echo 'Bağlantı hatası, hata kodu: '.$e->getMessage();
}

PDO ile ilgili ayrıntılı bilgi için buraya bakabilirsiniz.

Cryptograph | 14:11 - 24.08.2013

Kadir Malakcıoğlu

Merhaba sormak istediğim 2 şey var

1. prepare kullanırken bindValue metodu kullanılıyor diyelim ki göndereceğimiz 2 tane değişken var biri integer diğeri ise string içeriyor . ne yazpmalıyız

Kadir Malakcıoğlu | 00:52 - 23.10.2013

Kadir Malakcıoğlu

karakter sınırlandırması olduğundan 2 mesajı tekrar gönderiyorum. prepare metodu ile birden fazla veri çekmek istiyorum nasıl yaparım

Kadir Malakcıoğlu | 00:54 - 23.10.2013

Cryptograph

Göndereceğiniz her değer için tekrardan bindValue() kullanmanız gerekiyor

$sorgu->bindValue(":string", $string, PDO::PARAM_STR);
$sorgu->bindValue(":int", $int, PDO::PARAM_INT);

Şeklinde bir kullanımla birden fazla değeri gönderebilirsiniz.

prepare() ile birden fazla tablodan veri çekecekseniz eğer o tablolar arasında ilişki kurup almanız gerekecek yani inner join sorgusu çalıştırmanız gerekecek. İki tablo arasında bir ilişki bulunmuyorsa eğer ayrı ayrı sorgu çalıştırmanız gerekecek.

Cryptograph | 10:49 - 23.10.2013

Kadir Malakcıoğlu

hocam yanlış anlaşıldı maalesef siz demişsiniz ki "fetch() methodu; tek bir sonuç getirmek için kullanılır, " ben de diyorum ki 1den fazla sütün getiriyorum foreach yardımı ile acaba yanlış bir yol mu izliyorum ayrıca gelen veriyi nesne şeklinde nasıl alabiliriz kullanabiliriz şimdiden teşekkürler

Kadir Malakcıoğlu | 22:18 - 23.10.2013

Cryptograph

Evet döngü kullanırsanız döngü boyunca birden fazla değer getirebilirsiniz. Döngünün amacı budur zaten :)
Kullanımızda yanlış bir şey yoktur.

Cryptograph | 22:45 - 23.10.2013

Söz Sırası Sizde

Benzer Konular

Benzer KonularPaylaşmanın asaletini hiçbir zaman bencilliğin çirkinliğine bırakmayın!

​​​​​​​​​​​​​​​​​​​​​​​​​

MERAK EDİLENLER

İLETİŞİM

  • alpay[at]cryptograph.gen.tr
  • İstanbul ikametgah