PHP Veri Nesneleri (PDO) eklentisi, veritabanı işlemlerini gerçekleştirmek için sunulan bir arayüzdür. Php’nin v5.5 sürümünden itibaren mysql_ şeklinde tanımladığımız fonksiyonlara destek vermemesi nedeniyle, veritabanı işlemlerini PDO veya Mysqli ile yapmak zorundayız. Bizlere sunulan bu iki alternatifin birbirine göre avantajları olduğu durumlar bulunmaktadır. Bunlar;
PDO | Mysqli |
Sadece nesne yönelimli kullanılır | Nesne yönelimsiz de kullanılabilir |
12 farklı veritabanını ile kullanılabilir | Sadece MySQL ile kullanılır |
SQL Injection korumalıdır | SQL Injection kontrolünü yazılımcı yapılmalıdır |
İsimlendirilmiş parametreyi destekler | İsimlendirilmiş parametreyi desteklemez |
Hız konusunda Mysqli’den yavaştır | PDO’dan %5 civarı daha performanslıdır |
temel olarak yukarıdaki şekildedir diyebiliriz. Ben daha önce “Nesne Yönelimli Programla (OOP)” ile anlatım yapmayı tercih edeceğimi söylediğim için, buna ek olarak da uygulamalarımda PDO’yu tercih ettiğimden (MsSQL için de kullanıyorum ve SQL Injection kontrolünü yapmama gerek kalmıyor), bu yazım sadece PDO’nun temel kullanımı ile ilgili olacaktır. Eğer Mysqli kullanmayı seçecekler varsa, kullanımında mysql_ fonksiyonlarından pek bir fark bulunmuyor. Bu arada, Php sürümünüz v5 altındaysa bu eklentileri kullanamazsınız. Bu önemli notu da ekledikten sonra artık PDO’nun temel fonksiyonlarının kullanımını anlatmaya geçebiliriz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
<?php class baglan{ //veritabanı bilgileri const host = 'localhost'; const user = 'root'; const pass = ''; const db = 'pdo'; public $conn; public function __construct(){ //açılışta çalıştır $this->dbBaglantiKur(); } public function dbBaglantiKur(){ //veritabanı bağlantısı kurma try{ $this->conn = new PDO("mysql:dbname=".self::db.";host=".self::host, self::user, self::pass); $this->conn->query("SET NAMES 'utf8'"); $this->conn->query('set character set utf8'); }catch(PDOException $e){ die($e->getMessage()); } } public function dbOlustur(){ //pdo adlı veritabanında yazilar adlı tablo açma $sql = "CREATE TABLE IF NOT EXISTS `yazilar`( `id` INT AUTO_INCREMENT NOT NULL, `baslik` varchar(100) NOT NULL, `icerik` varchar(400), PRIMARY KEY (`id`) )"; $olustur = $this->conn->prepare($sql); return $olustur->execute(); } public function dbVerileriEkle(){ //yazılar tablosuna kayıt ekleme (siralı parametre) $yazilar = array('1. yazının başlığı','1. içerik', '2. başlık','2. içerik', '3. başlık','3. içerik'); $ekle = $this->conn->prepare('INSERT INTO yazilar (baslik,icerik) VALUES (?,?),(?,?),(?,?)'); return $ekle->execute($yazilar); } public function dbSonKayitIdAl(){ //son kayıt id değeri !(bu bağlantıda ekleme işlemi yapılmışsa) return $this->conn->lastInsertId(); } public function dbVerileriSay(){ //kayıt sayısını bulma $say = $this->conn->prepare('SELECT id FROM yazilar'); $say->execute(); return $say->fetchColumn(); } public function dbVerileriCek(){ //bütün verileri alma $veriler = $this->conn->prepare('SELECT id,baslik,icerik FROM yazilar'); $veriler->execute(); return $veriler->fetchAll(PDO::FETCH_ASSOC); } public function dbVeriyiCek($id){ //sadece bir kayıtı (parametredeki) alma $veri = $this->conn->prepare('SELECT id,baslik,icerik FROM yazilar WHERE id=?'); $veri->execute(array($id)); return $veri->fetch(PDO::FETCH_ASSOC); } public function dbVerilerdeAra($aranan){ //kayıtlarda arama yapma $bul = $this->conn->prepare('SELECT id,baslik,icerik FROM yazilar WHERE baslik LIKE ?'); $bul->execute(array('%'.$aranan.'%')); return $bul->fetchAll(PDO::FETCH_ASSOC); } public function dbVeriyiGuncelle($id){ //parametredeki veriyi güncelleme (isimlendirilmiş parametre) $guncelle = $this->conn->prepare('UPDATE yazilar SET baslik = :baslik WHERE id = :id'); return $guncelle->execute(array('baslik' => 'bu başlığı değiştirdim', 'id' => $id)); } public function dbVeriyiSil($id){ //parametredeki kayıtı silme $sil = $this->conn->prepare('DELETE FROM yazilar WHERE id=?'); return $sil->execute(array($id)); } public function __destruct(){ //bağlantıyı sonlandırma $this->conn = null; } } //örnek kullanım $baglanti = new baglan; $baglanti->dbVerileriEkle(); echo $baglanti->dbSonKayitIdAl(); ?> |
Yukarıda PDO’nun temel kullanımını gösterdim. PDO’nın başka bir çok methodu bulunmakta, eğer bunları incelemek isterseniz Php.net adresini önerebilirim. SQL Injection sorunundan korunmak için mutlaka prapared statements kullanın. Ayrıca, aldığınız parametrelerde bulunabilme ihtimali olan Html etiketlerini (<script></script>) temizlemeyi unutmayın, çünkü prapared statements XSS açığını önlemez.