Php PDO Kullanımı (PHP Data Objects)

php-pdo-kullanimi-banner

Php Pdo kullanımı konusunda pdo terimleri hakkında örnekler ile nasıl kullanıldığını anlatacağım. Kısaca PDO birçok veritabanı sürücüsü ile çalışabilen bir sınıftır.

Biliyorsunuz ki eskiden kullanılan mysql yerine PDO (PHP Data Objects) sınıfı geldi. Bu konu ile ilk veritabanı örneklerini vermiş olacağız. Bundan sonraki örnekleri ve konuları PDO sınıfı kullanarak anlatacağım. MySQL sınıfı artık sadece anılarda kaldığı için eski kullanım şekillerini göstermeyeceğim. 

Bu konuda döngüler ve dizilerden bahsedileceği için PHP Diziler ve Php Döngüler konularını incelemeyi unutmayın.

Php PDO Kullanımı ile Veritabanı Bağlantısı

Pdo ile veritabanı bağlantısı oldukça basittir. Birçok veritabanı sürücüne bağlanılabilir. Genelde MySQL sürücüsü kullanıldığı için ve bende MySQL sürücüsü kullandığım için örneklerde MySQL ile olacak.

Örnek kullanım:

baglanti.php oluşturalım ve aşağıdaki kodları yazalım. 

<?php 
## Bağlantı Değişkenleri ##
$hostname = "localhost";
$username = "root";
$pass = "";
$database = "deneme";

## Mysql Bağlantı ##
try {
    $db = new PDO("mysql:host=" . $hostname . "; dbname=" . $database . "; charset=utf8", "$username", "$pass");
  echo "Bağlantı başarılı";
} catch (PDOException $error) {
    print $error->getMessage();
  exit();
}
?>

Yukarıdaki örnekte daha önceden oluşturduğum deneme isimli veritabanına bağlandım. http://localhost/baglanti.php adresini tarayıcımda açtığımda ekrana bağlantı başarılı mesajının yazdırıldığını gördüm yani veritabanı bağlantımız gerçekleşmiş oldu.

Veritabanımıza başarıyla bağlandığımıza göre PDO ile ilk veriyi ekleyerek bağlantının çalıştığını doğruluyalım.

PDO ile Veritabanına Kayıt Ekleme

PDO eklentisi ile kayıt eklemekte oldukça kolay ve güvenlidir. SQL injection açıklarını önlemek için PDO kullanımı fayda sağlamaktadır.

Örnek kullanım:

uye-ekle.php oluşturalım ve aşağıdaki kodları yazalım.

<?php 
include "baglanti.php";
$uye_ekle = $db -> exec("INSERT INTO uyeler (uye_kadi, uye_sifre, uye_eposta) VALUES ('Mustafa', '123456', 'eposta@mustafaazak.com')");
echo $uye_ekle. " üye eklendi.";
?>

Yukarıdaki örnekte PDO::exec() ile deneme veritabanımdaki üyeler tablosuna bir üye kaydı yaptım. PDO::exec() bize sorguyu çalıştırır ve etkilenen satır sayısını döndürür.

Tabi php uygulamalarımızda veritabanına bu şekilde kayıt yapmak SQL injection’a sebep olabilir. Daha güvenli olan PDO::prepare() metodunu kullanmamız gerekir.

<?php
/* PDO::prepare() metodu ile tek bir ekleme */
$uye_ekle = $db -> prepare("INSERT INTO uyeler (uye_kadi, uye_sifre, uye_eposta) VALUES (?, ?, ?)");
$uye_ekle -> execute(array("Hasan", "hsn123", "hasan@eposta.com"));
echo "PDO::prepare ile ". $uye_ekle -> rowCount(). "üye eklendi.";

/* PDO::prepare() metodu ile tek birden fazla ekleme */
$uye_ekle = $db -> prepare("INSERT INTO uyeler (uye_kadi, uye_sifre, uye_eposta) VALUES (?, ?, ?)");
$uye_ekle -> execute(array("Hüseyin", "nysh", "nysh@eposta.com"));
$uye_ekle -> execute(array("Mehmet", "temhem", "temhem@eposta.com"));
$uye_ekle -> execute(array("Ali", "ramboali", "rambo_ali@eposta.com"));
?>

Yukarıdaki örnekte PDO::prepare() metodu ile bir ve birden fazla üye ekledik. PDO::prepare() metodu sadece sorguyu çalıştırır, etkilenen satır sayısını PDOStatement->rowCount ile buluruz.

PDO::prepare() metodunda dikkat etmeniz gereken önemli nokta PDO::execute() metoduna gönderdiğimiz veriler dizi olarak gönderilmelidir. Soru işaretleri (?) burada bir çeşit yer tutucu görevi görür ve her soru işareti bir sütunun verisinin yerini tutar. Yani uye_kadi = ?, uye_sifre = ?, uye_eposta = ? ,… şeklinde devam eder. 

Not: Kullanıcıdan alınacak her türlü veri için PDO::prepare() metodunu kullanın. Ancak kullanıcıdan veri alamayacaksanız PDO::exec() ya da PDO::query() metodları kullanılabilir.

PDO ile Veritabanında Kayıt Güncelleme

PDO ile kayıt eklemede olduğu gibi güncelleme işlemleri oldukça basit ve güvenlidir. Kayıt eklemedeki yöntemler kayıt güncellemede de kullanılır.

Örnek kullanım:

uye_guncelle.php dosyası oluşturalım ve aşağıdaki kodları yazalım.

<?php 
include "baglanti.php";
$uye_guncelle = $db -> exec ("UPDATE uyeler SET uye_kadi = 'Gamze', uye_sifre = 'nocittab', uye_eposta = 'gamze@eposta.com' WHERE uye_id = 1");
echo $uye_guncelle . " üye güncellendi.";
?>

Yukarıda PDO::exec() metodu ile üye bilgisini güncelledik. Aynı işlemi PDO::prepare() metodu ile yapmak mümkündür.

<?php 
$uye_guncelle = $db -> prepare("UPDATE uyeler SET uye_kadi = ?, uye_sifre = ?, uye_eposta = ? WHERE uye_id = ?");
$kayit = $uye_guncelle -> execute(array("Ayşe", "ayse430", "ayse_430@eposta.com", 4));
echo $kayit. " üye güncellendi.";
?>

PDO::exec() ile PDO::prepare() güncelleme yaparken iki metotta aynıdır. Bir farkı yoktur. PDO::exec() metodunun yazımı daha kısadır. Yukarıda kırmızı ile belirttiğim nottaki gibi eğer veriler kullanıcıdan alınacaksa kesinlikle PDO::prepare() kullanmalısınız.

PDO ile Veritabanından Kayıt Silme

Pdo ile kayıt silme işlemi kayıt ekleme ve güncellemedeki metotlar kullanılarak yapılır. Yukarıdakiler gibi bununda basitçe kullanımını göstereceğim.

Örnek kullanım:

uye_sil.php dosyası oluşturalım ve aşağıdaki kodları yazalım.

<?php 
inlude "baglanti.php";
$uye_sil = $db -> exec("DELETE FROM uyeler WHERE uye_id = 3");
echo $uye_sil ." üye silindi.";
?>

Yukarıda PDO::exec ile bir kayıt sildik. PDO::prepare ile de kayıt silmek mümkün.

<?php
$uye_sil = $db -> prepare ("DELETE FROM uyeler WHERE uye_id = ?");
$uye_sil -> execute(array(2));
echo $uye_sil -> rowCount() ." üye silindi.";
?>

Genel olarak PDO’da kayıt ekleme, silme, güncelleme işlemleri yukarıdaki örneklerdeki gibidir. Sorguları geliştirmek ve uygulamalarınıza göre uyarlamak size kalmış.

Yukarıdaki örneklerde ayrıca rowCount() metodunu kullandık. Burada hatırlatmak istediğim konu ise rowCount() metodu PDOStatement nesnesi tarafından çalıştırılan sorgularda etkilenen satır sayısını döndürür. PDO::exec() metodu ile birlikte kullanılamaz. Çünkü PDO:exec() metodu PDOStatement nesnesi döndürmez.

Tekrar hatırlatmak istiyorum kullanıcıdan alacağınız verilerde PDO::prepare() metodunu kullanmayı unutmayın.

PDO ile Veritabanından Kayıt Çekme

Pdo ile  veritabanın kayıt çekme işlemi oldukça basittir ve kayıt çekmenin bir kaç modu vardır. Bu yöntemler kayıt çekme işleminde PDO’nun bize sağladığı en büyük kolaylıktır. Kayıt çekme modlarını bu başlıktan sonra başlıkta tek tek inceleyeceğiz.

Veri çekme modundan bu başlıkta kısaca bahsedeyim. Veritabanından tek bir kayıt çekmek istediğimizde PDO::fetch() ve birden fazla kayıt çekmek için PDO::fetchAll() metodunu kullanabiliriz.  Veritabanındaki tüm üyeleri çekmek istediğimizde PDO::fetchAll() metodu kullanmak daha mantıklıdır.

Örnek kullanım:

uye_getir.php dosyası oluşturalım ve aşağıdaki kodları yazalım.

<?php 
include "baglanti.php";
$uye_getir = $db -> query("SELECT * FROM uyeler WHERE uye_id = 5");
$row = $uye_getir -> fetch(PDO::FETCH_OBJ);

echo 'Üye adi :'. $row->uye_kadi . '<br/>';
echo 'Üye şifre :'. $row->uye_sifre. '<br/>';
echo 'Üye Eposta :'. $row->uye_eposta. '<br />';
?>

Yukarıdaki örnekte veritabanından sadece üye id’si 5 olan veriyi getirdik. Birden fazla veriyi çekmek için aşağıdaki kodları inceleyin. 

<?php 
$uye_getir = $db -> query("SELECT * FROM uyeler");
$uyeler = $uye_getir->fetchAll(PDO::FETCH_OBJ);

foreach($uyeler as $uye){
echo 'Üye adi :'. $uye->uye_kadi . '<br/>';
echo 'Üye şifre :'. $uye->uye_sifre. '<br/>';
echo 'Üye Eposta :'. $uye->uye_eposta. '<br />';
echo "<br />"; 
}
?>

Foreach döngüsü ile veritabanındaki tüm verileri ekrana yazdırdık. Diğer döngülerle de verilerin hepsini yazdırmak mümkündür.

While döngüsü ile tüm verileri ekrana yazdırmak için aşağıdaki kodları inceleyin.

<?php 
$uye_getir = $db -> prepare("SELECT * FROM uyeler");
$uye_getir -> execute();

while ($uye = $uye_getir -> fetch(PDO::FETCH_OBJ)){
echo 'Üye adi :'. $uye->uye_kadi . '<br/>';
echo 'Üye şifre :'. $uye->uye_sifre. '<br/>';
echo 'Üye Eposta :'. $uye->uye_eposta. '<br />';
echo "<br />"; 
}
?>

Genel olarak verileri döngüler ile listeleme yukarıdaki örnekteki gibi. Tıpkı ekleme, güncelle işlemlerindeki gibi soru işareti kullanmak veri çekme işleminde de mümkündür. Soru işareti kullanarak nasıl veri çekeceğimizi aşağıdaki kodlarda inceleyelim.

<?php 
$uye_getir = $db -> prepare("SELECT * FROM uyeler WHERE uye_id = ?");
$uye_getir -> execute(array(4));

while ($uye = $uye_getir -> fetch(PDO::FETCH_OBJ)){
echo 'Üye adi :'. $uye->uye_kadi . '<br/>';
echo 'Üye şifre :'. $uye->uye_sifre. '<br/>';
echo 'Üye Eposta :'. $uye->uye_eposta. '<br />';
echo "<br />"; 
?>

Soru işareti kullanımı yerine anahtar kelime kullanarak aynı işlemi yapmak mümkündür. Soru işareti kullanımı kısa olduğu için genelde soru işareti kullanımı tercih edilmektedir. Anahtar kelime kullanarak veri çekme işlemi için aşağıdaki kodları inceleyelim.

<?php
$uye_getir = $db -> prepare("SELECT * FROM uyeler WHERE uye_kadi = :kadi AND uye_sifre = :sifre");
$uye_getir -> execute(array(':kadi' => 'Mustafa', ':sifre' => '123456'));

while ($uye = $uye_getir -> fetch(PDO::FETCH_OBJ)){
echo 'Üye adi :'. $uye->uye_kadi . '<br/>';
echo 'Üye şifre :'. $uye->uye_sifre. '<br/>';
echo 'Üye Eposta :'. $uye->uye_eposta. '<br />';
echo "<br />"; 
}
?>

PDO ile veritabanı kullanımı yukarıdaki örneklerdeki gibidir. Pdo’da veri çekerken modlar olduğunu söylemiştik. 

Php PDO Kullanımı Veri Çekme Modları

PDO’da veri çekerken PDO::fetch() metodu ile birlikte kullanabileceğimiz modlar vardır. Her mod kendine özgü bir şekilde verileri döndürür.

PDO::FETCH_ASSOC

Veritabanından çekilen verileri sütun adına göre indislenmiş bir dizi olarak getirir.

Örnek kullanım:

<?php 
$getir = $db -> query ("SELECT* FROM uyeler WHERE uye_id = 4");
$uye = $getir -> fetch(PDO::FETCH_ASSOC);
echo "<pre>";
print_r ($uye);
echo "</pre>";
?>

Ekran görüntüsü aşağıdaki gibi olacaktır. 

Array
(
    [uye_id] => 4
    [uye_kadi] => Ayşe
    [uye_sifre] => ayse430
    [uye_eposta] => ayse_430@eposta.com
)

Burada veriye erişmek tıpkı dizi elemanına erişmek ile aynı zaten veriler bir dizi olarak çekilir.

<?php 
echo $uye["uye_kadi"]. "<br />";
echo $uye["uye_sifre"]. "<br />";
echo $uye["uye_eposta"];
?>

PDO::FETCH_OBJ

Veritabanından çekilen veriler sütun isimlerine göre isimlendirilmiş object türünde değişken olarak getirilir.

Örnek kullanım:

<?php 
$getir = $db -> query ("SELECT* FROM uyeler WHERE uye_id = 4");
$uye = $getir -> fetch(PDO::FETCH_OBJ);
echo "<pre>";
print_r ($uye);
echo "</pre>";
?>

Ekran görüntüsü aşağıdaki gibi olacaktır. 

stdClass Object
(
    [uye_id] => 4
    [uye_kadi] => Ayşe
    [uye_sifre] => ayse430
    [uye_eposta] => ayse_430@eposta.com
)

Burada veriye erişmek için aşağıdaki kodları inceleyin.

<?php 
echo $uye -> uye_kadi. "<br />";
echo $uye -> uye_sifre. "<br />";
echo $uye -> uye_eposta;
?>

PDO::FETCH_BOTH

Herhangi bir fetch() modu belirtilmemiş ise varsayılan olarak PDO::FETCH_BOTH modunda veriler çekilir. Çekilen veriler hem sütun isimlerine göre indisli hem de sütun numaralarına göre indisli bir dizi olarak çekilir.

Örnek kullanım:

<?php
$getir = $db -> query ("SELECT* FROM uyeler WHERE uye_id = 4");
$uye = $getir -> fetch(PDO::FETCH_BOTH); // $uye = $getir -> fetch(); aynı sonucu döndürür.
echo "<pre>";
print_r ($uye);
echo "</pre>";
?>

Ekran görüntüsü aşağıdaki gibi olacaktır. 

Array
(
    [uye_id] => 4
    [0] => 4
    [uye_kadi] => Ayşe
    [1] => Ayşe
    [uye_sifre] => ayse430
    [2] => ayse430
    [uye_eposta] => ayse_430@eposta.com
    [3] => ayse_430@eposta.com
)

Burada veriye erişmek PDO::FETCH_ASSOC ile aynıdır. Çekilen veriler dizi olarak geldiği için dizi verilerine eriştiğimiz gibi erişiriz.

PDO::FETCH_CLASS

Bu veri çekme modu PDO::fetchAll() metodu ile birlikte kullanılır. Veriler bir sınıf objesi olarak getirilir.

Örnek kullanım:

<?php
$getir = $db -> query ("SELECT* FROM uyeler WHERE uye_id = 4");
$uye = $getir -> fetchAll(PDO::FETCH_CLASS);
echo "<pre>";
print_r ($uye);
echo "</pre>";
?>

Ekran görüntüsü aşağıdaki gibi olacaktır. 

Array
(
    [0] => stdClass Object
        (
            [uye_id] => 4
            [uye_kadi] => Ayşe
            [uye_sifre] => ayse430
            [uye_eposta] => ayse_430@eposta.com
        )

)

PDO::FETCH_NUM

Bu veri çekme modu sütunları numaralandırılmış indisli olarak bir dizi döndürür.

Örnek kullanım:

<?php
$getir = $db -> query ("SELECT* FROM uyeler WHERE uye_id = 4");
$uye = $getir -> fetchAll(PDO::FETCH_NUM);
echo "<pre>";
print_r ($uye);
echo "</pre>";
?>

Ekran görüntüsü aşağıdaki gibi olacaktır. 

Array
(
    [0] => Array
        (
            [0] => 4
            [1] => Ayşe
            [2] => ayse430
            [3] => ayse_430@eposta.com
        )

)

PDO::FETCH_LAZY

Bu veri çekme modu PDO::FETCH_BOTH ve PDO::FETCH_OBJ modlarının birleşimidir. Sadece PDO::fetch() metodu ile kullanılır.

Örnek kullanım:

<?php
$getir = $db -> query ("SELECT* FROM uyeler WHERE uye_id = 4");
$uye = $getir -> fetch(PDO::FETCH_LAZY);
echo "<pre>";
print_r ($uye);
echo "</pre>";
?>

Ekran görüntüsü aşağıdaki gibi olacaktır. 

PDORow Object
(
    [queryString] => SELECT* FROM uyeler WHERE uye_id = 4
    [uye_id] => 4
    [uye_kadi] => Ayşe
    [uye_sifre] => ayse430
    [uye_eposta] => ayse_430@eposta.com
)

Temel olarak Php PDO kullanımı bu örneklerdeki gibidir. Daha fazla detay için PHP Resmi sayfasını ziyaret edebilirsiniz. İncelemenizi öneririm çünkü herşeyi tek konuda anlatmak mümkün değil.

Örnek dosyalarını indirmek için tıklayın.

Bir cevap yazın

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