Konular

PHP Data Objects (PDO) Nedir?

PHP Data Objects (PDO) Nedir?

 

Artık “mysql_connect“, “mysql_query” fonksiyonlarının müfredattan kalkma zamanı geliyor, PHP’de kendi resmi dökümantasyonunda da bunun sinyalini vermeye başlamış; “mysql” fonksiyonlarının sayfasında aşağıdaki gibi bir öneriyle karşılaşıyoruz;

This extension is not recommended for writing new code. Instead, either the mysqli or PDO_MySQL extension should be used. See also the MySQL API Overview for further help while choosing a MySQL API.

  Özetle artık bunları kullanmanızı önermiyoruz, PDO ya da MySQLi‘ye geçin diyor. Peki nedir bunlar? Şuradaki karşılaştırmaya baktığımızda MySQLi ile PDO arasında çok fark olmadığını görebilirsiniz.

PDO’da çoğu veritabanı sürücüsü kullanılmasına olanak sağlayan, MySQLi ise sadece MySQL destekleyen ve PDO’ya göre biraz daha karmaşık ve kapsamlı bir arayüz diyebiliriz. Sonuç olarak ikisi de öneriliyor.

PDO(PHP Data Objects / PHP Veri Objeleri) özetle; hafif ve tutarlı bir şekilde veritabanına erişimi sağlayan bir arayüz. Adından da anlayacağınız üzerie “Object Oriented Programming” arayüzüne sahip, onlarca veritabanı sürücüsü destekliyor;

  • 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

İleride daha farklı bir veritabanı sürücüsüne geçmek istediğinizde sisteminizi temelli olarak değiştirmek yerine PDO ile kaldığınız yerden bir takım ufak modifikasyonlar ile bu işi gerçekleştirebilirsiniz.

Bunların haricinde PDO 5.1‘den itibaren geliyor, yani çalışabilmesi için güncel versiyonlara ihtiyacınız olacak.

PDO ile MYSQL’e Bağlanmak

$dsn = 'mysql:host=localhost;dbname=test';
$user = 'dbuser';
$password = 'mypassword';
 
try {
    $db = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

  PDO ile MSSQL’e Bağlanmak

Yukardaki söz diziminde mysql yazan kısmı mssql yazdığınızda aşağıdaki uyarıyı alacaksınız:

Fatal error: Uncaught exception 'PDOException' with message 'could not find driver' in

Bunun yerine aşağıdakini kullanın mssql bağlantısı için:

<?php
  $dsn = 'dblib:dbname=testdb;host=127.0.0.1';
  $user = 'dbuser';
  $password = 'dbpass';
  $dbh = new PDO($dsn, $user, $password);
?>

Sorgu Hatalarını Yönetmek

Query ya da exec gibi sorgu gönderdiğimiz metodlar eğer sorguyu gerçekleştirdiklerinde bir hata ile karşılaşırlarsa false dönerler. Başarısız gerçekleşen bu sorguların hata mesajlarına ulaşmak için errorInfo metodunu kullanacağız.

Bu metod bize son yaptığımız sorgudaki hatanın kodunu ve mesajını içeren bir array döndürür. 3 adet elemanı bulunan bu dizide 0. ve 1. eleman hata kodlarını, 2. eleman ise hata mesajını verir.

if($users = $db->query('SELECT * FROM users WHERE')){
    // Sorgu başarıyla çalışırsa üyeleri listeleriz
}
else {
    echo 'Sorguda bir hata meydana geldi.';
    $error = $db->errorInfo();
    echo 'Hata mesajı: ' . $error[2];
}

  Yukarıdaki örnekteki sorguda WHERE dedikten sonra herhangi bir koşul belirtmediğimiz için hata verecektir ve ekrana ilgili hatanın mesajı yazacaktır.

PDO ile Sorgu Göndermek

Eğer yapacağımız sorgudan bir sonuç almayı beklemiyorsak “exec“, bir sonuç isteniyorsa “query” metodlarını kullanmalıyız. Özetle; “DELETE/UPDATE/INSERT” gibi sorgularımız için “exec”, “SELECT” gibi sorgularımız için “query”.

try {
    $db = new PDO('mysql:host=localhost;dbname=test', $user, $password);
    $db->exec('SET NAMES `UTF-8`');
    $count = $db->exec('DELETE FROM messages WHERE old = 1');
    echo $count . ' messages deleted';
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

  Exec metodu sonuç olarak etki ettiği satır sayısını döndürür.

Değişkenleri Sorgulara Dahil Etmek

PDO’nun en önemli özelliklerinden birisi olan binding yöntemi sayesinde hazırladığımız sorgulara değişkenlerimizi güvenli ve düzgün bir şekilde yerleştirebiliyoruz.

Bunun için önce prepare metodu ile sorgumuzu hazırlayıp dışarıdan değerler vereceğimiz yerlere “?” (soru işareti) yerleştiriyoruz. Sonrasında hazırladığımızı sorguya execute metodu ile soru işareti olan yerlere gelecek değerlerimizi gönderiyoruz.

// Sorgumuzu hazırlıyoruz
$query = $db->prepare('INSERT INTO users (name, email) VALUES(?, ?)');
 
// Sorguda belirttiğimiz yerlere gelecek değerleri veriyoruz
$query->execute(array('Musa', 'email@email.com'));

  Bu ifadeyi çalıştırdığımızda çalıştırılacak sorgu aşağıdaki gibi olacaktır;

INSERT INTO users (name, email) VALUES('Musa', 'email@email.com')

PDO kullanırken tüm dışarıdan aldığımız değişkenleri sorgularımıza bu yöntem ile dahil etmemiz uygulamamızın güvenliği ve düzeni açısından çok önemlidir. Bu yöntem sayesinde SQL injection açıklarından da arınmış oluyoruz.

PDO ile Verileri Listelemek  

foreach($db->query('SELECT * FROM users') as $row) {
    echo $row['name'] . '<br/>';
}

  PDO ile bir satır veri çekmek

$row = $db->query('SELECT * FROM users WHERE id = 1')->fetch();
echo $row['name'];

  Sonuçları obje olarak çekmek için.

$Sonuc = $Mysql->query("SELECT * FROM LG_005_01_CLCARD WHERE CODE='Z-00032'")->fetch(PDO::FETCH_OBJ);
echo $Sonuc->DEFINITION_;

 Sonuç birden fazla satır içeriyorsa...

$Sorgu->setFetchMode(PDO::FETCH_OBJ);
foreach($Sorgu as $row) {
    //echo ++$i.' ' .$row['CODE'] . ' ' .$row['NAME'] . '<br/>';
    echo ++$i.' ' .$row->CODE . ' ' .$row->NAME . '<br/>';
}

Başlangıçta Fetch Modu Set Etmek

Bu sayede $Sorgu->setFetchMode(PDO::FETCH_OBJ); şeklinde yazmamıza gerek kalmayacak

$connection->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
 
 
 

  Yeni bir Kayıt Eklemek

Yeni bir kayıt eklemek için exec metodunu kullanacağız. Sonrasında eğer eklediğimiz satırın ID’sini almak istiyorsak lastInsertId metodunu çağıracağız. Eklerken bir sorun gerçekleşirse exec metodu false dönecektir. Bu nedenle öncelikle eklenip eklenmediği kontrol edip sonrasında ID’yi ekrana yazdırabiliriz.

if($db->exec('INSERT INTO users (name) VALUES ("Musa")')){
    $id = $db->lastInsertId();
    echo 'Yeni eklenen üyenin IDsi: ' . $id;
}
else{
    echo 'Yeni kayıt eklerken bir hata meydana geldi.';
}

Son Kayıt Id'si

$db->lastInsertId();

Dönen Sorgu Satır Sayısı

$Mysql->query("SELECT * FROM CLCARD WHERE CODE LIKE 'Z%'");
$Mysql->rowCount();

  Yukarıdaki komut sonucunda -1 çıkması sorgunun birden fazla sonucu olduğunu 0 çıkması ise sorgu sonucunda dönen satırsayısının 0 olduğunu gösteriyor.

 
 
 
$Satirlar = $Mysql->query("SELECT * FROM CLCARD WHERE CODE LIKE 'Z%'")->fetchAll();  
echo count($Satirlar);
 
 

$Satirlar->fetch() işlemi fetchAll() işleminden sonra boş değer verecektir.

 Sorguları Geri Alabilme

PDO’nun bir diğer önemli özelliği ise transaction denilen ifade edilen sorguları istenildiğinde geri alabilme ya da uygulayabilmesidir.

Yukarıdaki sorgu ifadelerini kullanmadan önce beginTransaction metodunu çağırarak geri alma işlemi yapabileceğimiz sorguları yazmaya başladığımızı ifade etmemiz gerekiyor.

BeginTransaction metodunu çalıştırdıktan sonra yazacağımız tüm ekleme, düzenleme ve silme sorguları normal kullandığımız şekilde çalışmaya devam eder. Eğer sorgular devam ederken tüm bu aralıktaki sorguları geri almak istersek rollBack metodunu çağırırız. Bu metodu çalıştırdığımızda beginTransaction’dan rollBack metoduna kadar yazdığımız tüm ekleme, düzenleme ve silme sorguları geri alınır.

Bu ifadeleri kullanırken bilmeniz gereken önemli bir konu; DROP TABLE ya da CREATE TABLE gibi tabloları komple silen ya da yeni tablolar ekleyen sorgular geri alınamaz. Fakat DELETE sorgusu ile sildiğiniz ya da UPDATE ile düzenlediğiniz her sorguyu geri alabilirsiniz.

// İşlemleri başlattığımızı ifade ediyoruz
$db->beginTransaction();
 
$db->exec('INSERT INTO users (name) VALUES ("Ahmet")');
$db->exec('UPDATE users SET name = "Ali"');
$db->exec('DELETE FROM users WHERE name = "Hasan"');
 
// Yaptığımız sorguları geri aldık
$db->rollBack();

  Yaptığımız sorguları geri almak yerine başarıyla sonuçlandığında gerçekten uygulamak istiyorsak commit metodunu çağırırız.

 Tablo Başlıklarını Çekmek

$db = $connection->get_connection();
$select = $db->query('SELECT * FROM contacts');

$total_column = $select->columnCount();
var_dump($total_column);

for ($counter = 0; $counter < $total_column; $counter ++) {
    $meta = $select->getColumnMeta($counter);
    $column[] = $meta['name'];
}
print_r($column);

Tabloyu Başlıklarıyla Çekmek

function TabloKolonAdlari($Tablo, $LIMIT = 10) {

        $select = $this->Msq("SELECT TOP $LIMIT * FROM $Tablo");

        $total_column = $select->columnCount();
        //var_dump($total_column);

        for ($counter = 0; $counter < $total_column; $counter ++) {
            $meta = $select->getColumnMeta($counter);
            $column[] = $meta['name'];
        }

        echo "<table border="1"><tr>";
        foreach ($column as $col) {
            echo "<td>$col</td>";
        }

        foreach ($select as $Row) {
            echo "<tr>";
            foreach ($Row as $Ro){
                echo "<td>$Ro</td>";
            }
            echo "</tr>";
        }
        echo "</tr></table>";
    }

 

PDO Bağlantısını Kapatmak

Eski MySQL bağlantısında da olduğu gibi açtığınız bağlantıyı kapatmasanız da PHP otomatik olarak işlem sonunda bağlantıyı keser. Fakat ille de ben kapatacağım diyorsanız “null” tanımlamanız yeterli.

// bağlantıyı açtık
$db = new PDO('mysql:host=localhost;dbname=test', $user, $pass);[
 
// bağlantıyı kapattık
$db = null;

 

PDO prepare() Methodu Kullanımı

prepare() Çalıştırılmak üzere bir SQL deyimini hazırlar. Metot bindparam(), execute(), bindColumn(), bindValue() metotları ile beraber çalışır. Dışarıdan SQL sorgularına dahil edilecek veriler için iki tür tanım yapmayı sağlar. Bunlardan birisi soru işaretidir. Diğeri ise önünde iki nokta üst üste olan herhangi bir isimdir.

PDO Hata Mesajlarını Yakalama errorInfo() Kullanımı

Mysql kullandığımızda sorgularımızın sonuna mysql_error(); ekleyerek hata mesajlarını yakalayabiliyoruz.

PDO kullanırken bu durum biraz değişiyor ve yerini errorInfo(); fonksiyonuna bırakıyor. Bu fonksiyon bize 3 elemanlı bir array döndürür. 0 ve 1. eleman ilgili sorgunun hata kodu, 3. elemanı ise hata mesajıdır.

Ben hata mesajlarını yakalarken empty(); fonksiyonunu kullanıyorum. Eğer hata mesajı boş ise işlem başarılıdır şeklinde. Bunu rowCount(); fonksiyonu kullanarak veya sorgu false dönüyorsa hata vardır şeklinde yapanlarda var.

PDO DELETE Sorgusu Kullanımı

			$del = $db->prepare("DELETE FROM pdotablo WHERE id = ?");
			$del->execute(array(
				'1'
			));
			$hata = $del->errorInfo();
			echo empty($hata[2]) ?  "Başarılı Bir Şekilde Çalıştı." : $hata[2];

Delete sorgumuzda ID degeri 1 olan verimizi başarılı bir şekilde sildik.

PDO UPDATE Sorgusu Kullanımı

			$guncelle = $db->prepare("UPDATE pdotablo SET baslik=? WHERE id = ?");
			$guncelle->execute(array('Mert Köseoğlu','5'));
			$hata = $guncelle->errorInfo();
			echo empty($hata[2]) ?  "Başarılı Bir Şekilde Çalıştı." : $hata[2];

Update sorgumuzda ID degeri 5 olan baslik sütunumuzda ki verimizi “Mert Köseoğlu” olarak başarılı bir şekilde güncelledik.

PDO SELECT Kullanımı TEK (Verileri Listeletmek) 

			$sql = $db->prepare("SELECT * FROM pdotablo WHERE id= ?");
			$sql->execute(array(
				'5'
			));

			$row=$sql->fetch(PDO::FETCH_ASSOC);
			echo $row['baslik'];

 			$hata = $sql->errorInfo();
			echo empty($hata[2]) ?  "Başarılı Bir Şekilde Çalıştı." : $hata[2];

PDO SELECT Kullanım Döngü (Verileri Listeletmek)

		$sql = $db->prepare("SELECT * FROM pdotablo");
			$sql->execute();

			while($row=$sql->fetch(PDO::FETCH_ASSOC)) {
				echo $row['baslik'];
			}


 			$hata = $sql->errorInfo();
			echo empty($hata[2]) ?  "Başarılı Bir Şekilde Çalıştı." : $hata[2];

PDO INSERT Sorgusu Kullanımı (Veri Eklemek)

		$baslik = "Deneme Baslik";
			$icerik = "Deneem İçerik";
			$footer = "Deneme Footer";

			$sql = $db->prepare('INSERT INTO pdotablo (baslik,icerik,footer) VALUES (?,?,?)');
			$ekle = $sql->execute(array(

				$baslik,
				$icerik,
				$footer,

				));
			
	 		$hata = $sql->errorInfo();
			echo empty($hata[2]) ?  "Başarılı Bir Şekilde Çalıştı." : $hata[2];

PDO Eklenen Verinin ID Degerini Almak

			$id = $db->lastInsertId();
			echo $id;

PDO quote() Methodu Kullanımı

$id=$db->quote($_POST["id"]);
$bag->query("SELECT * FROM okul WHERE id ='$id'");

PDO ile mysql_escape_string ve türevlerinin yerini quote() methodu aldı.

Kaynaklar

Yorumunuzu Ekleyin

Yükleniyor...