PHP ile MySQL veritabanına PDO tekniği ile Bağlanma -1

Bu makalemizde PHP ile MySQL arasındaki bağlantı PDO tekniği ile yapılacaktır. Klasik PHP-MySQL bağlantısını PHP Sunum dosyasında bulabilirsiniz. MySQL'den başka PDO kütüphanesinde birçok veritabanına bağlantı yapmak mümkündür. PostgreSQL, IBM DB2, Oracle, SQL Server, Access, SQL Lite, SYBASE, Informix gibi veritabanlarına da bağlantı yapabilirsiniz. 

Neden PDO'ya geçmeliyim, diye sorabilirsiniz. Cevap olarak, Güvenlik ve Hızlılık cevabını verebiliriz. Ayrıca PDO tüm veritabanlarını desteklemektedir, böylece bir veritabanı ile çalışmayı bırakıp, başka bir veritabanına geçmek istediğiniz sadece ilgili Class(Sınıf) dosyalarında ufak tefek SQL değişiklikleri yaparak geçiş yapabilirsiniz. Diğer tekniklerde kodların neredeyse tamamında değişiklik yapmak zorunda kalabilirsiniz. En azından fonksiyon kullanmışsanız işiniz biraz rahat olur ama hiç fonksiyon dahi kullanmamışsanız neredeyse tüm php dosyalarının içini teker teker açıp değiştirmek tamamen cefa halini alacaktır.

Artık php.net tarafından da eski nesil mysql fonksiyonları yerine PDO ile bağlantı önerilmektedir. Bu makalede, PDO bağlantısını Class haline getirilere daha modüler kod yazma sağlanmıştır. PHP ile MySQL veritabanına Kayıt EKLEME, Kayıt SİLME, Kayıt GÜNCELLEME, Toplu Kayıt SEÇME ve Tek Kayıt SEÇME işlemleri yapılabilmektedir.




















class veriTabani{
 
    private $host      = DB_HOST; //Bağlanılacak Sunucu IP veya Adresi
    private $user      = DB_USER; //Kullanıcı adı, lokaldeyse root
    private $pass      = DB_PASS; //Şifre, lokaldeyse boşluk
    private $dbname= DB_NAME; // MySQL veritabanı adı
    private $dbh;
    private $error;
   private $stmt;
 
//Bu sınıftan nesne üretildiğinde çalışacak yapıcı (Contructor) fonksiyon   
function __construct()
    {
        $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname.";";
//PDO parametreleri
        $options = array(
            PDO::ATTR_PERSISTENT    => false, //true iken Mysql has gone away hatası alınıyor
            PDO::ATTR_ERRMODE       => PDO::ERRMODE_EXCEPTION
            //Hata mesajlari vermemesi icin exception yerine Silent moda geçilmelidir.
            //PDO::ATTR_ERRMODE       => PDO::ERRMODE_SILENT
        );
        // PDO Ornegi olusturma
        try{
            $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
$this->dbh->exec("SET CHARACTER SET utf8");
        }
        catch(PDOException $e){
            $this->error = "Baglanti Hatasi:".$e->getMessage();
        }
    }

// Sorgula metodu(fonksiyonu) gönderilen SQL sorgusunu hazırlar
public function sorgula($sql){
       $this->stmt = $this->dbh->prepare($sql);
}

//Çalıştır metodu ise hazırlanan sorguyu çalıştırır.
public function calistir($parametre=null){ 
        return $this->stmt->execute($parametre);
}

//tekKayitAl metodu verilen tablo adından istenen alana(kolona) göre verilen değeri sorgular.  
public function tekKayitAl($tablo, $alan,$deger )
    {
        $sql = "SELECT * FROM ".$tablo." WHERE ".$alan." = ?";
        $this->sorgula($sql);
        $this->calistir(array($deger));
        return $this->stmt->fetch(PDO::FETCH_ASSOC);
    }

//Veritabanında tek kayıt çeker
public function tekCek(){ 
    $this->calistir();
    return $this->stmt->fetch(PDO::FETCH_ASSOC );
}

//Veritabanındaki birden fazla satır çeker
public function tamCek(){ 
    $this->calistir();
    return $this->stmt->fetchAll(PDO::FETCH_BOTH );
}

//İşlemler yapıldıktan sonra bağlatı için gereklidir.
public function bind($parametre, $deger, $tip = null){
    if (is_null($tip)) {
        switch (true) {
            case is_int($deger):
                $tip = PDO::PARAM_INT;
                break;
            case is_bool($deger):
                $tip = PDO::PARAM_BOOL;
                break;
            case is_null($deger):
                $tip = PDO::PARAM_NULL;
                break;
            default:
                $tip = PDO::PARAM_STR;
        }
    }
    $this->stmt->bindValue($parametre, $deger, $tip);
}

//Verilen tablo ismine ve alanlara göre tüm kayıtları çeker
public function tumKayitAl($tablo, $alan=null, $deger=null)
    {
if ($alan!= null && $deger !=null)
$sql = "SELECT * FROM ".$tablo." WHERE ".$alan."=".$deger;
else
    $sql = "SELECT * FROM ".$tablo;
       
  //try{
$this->sorgula($sql);
$this->calistir();
return $this->stmt->fetchAll(PDO::FETCH_ASSOC);
//} catch (Exception $e) {
// die("tumKayitAl() fonksiyonunda sorgu hatası");
//}
}
 
//Kayıt Ekleme(INSERT) yapan fonksiyon, tablo ismi alır, dizi şekilde alanlar ve değerler alınır.
public function kayitEkle($tablo, $alanlar=array(), $degerler = array())
{
$sql1= implode(',', $alanlar);
$sql2= implode(',', array_fill(0, count($degerler), '?'));
 
        $sql = 'INSERT INTO '.$tablo;
        $sql .= '('.$sql1.') ';
        $sql .= 'VALUES ('.$sql2.')';
 
   try{
$this->sorgula($sql);
$this->calistir(array_values($degerler));
return $this->sonEklenenID();
}catch (Exception $e) {
die("kayitEkle() fonksiyonunda sorgu hatası");
return 0;
}
}

//Kayıt Güncelleme (UPDATE) yapar, dizi şeklinde güncellenecek alan ve değerleri alınır
// $sorgu_alan parametresi ile WHERE şartı yazılır
public function kayitGuncelle($tablo, $alanlar=array(), $degerler = array(), $sorgu_alan=NULL, $sorgu_deger=NULL)
{
$set = '';
for($i=0; $i<count($alanlar);$i++)
{
$set .= "`$alanlar[$i]` = ?";
if ($i!=count($alanlar)-1) $set.=",";
}
if ($sorgu_alan!=NULL && $sorgu_deger!=NULL)
$sql  = "UPDATE $tablo SET ".$set." WHERE $sorgu_alan=?";
else 
$sql = "UPDATE $tablo SET ".$set;
//echo $sql;
 
try{
$this->sorgula($sql);
if ($sorgu_alan!=NULL) {
$degerler[] = $sorgu_deger;
$this->calistir($degerler);
}
else $this->calistir($degerler);
 
return 1;
} catch (Exception $e) {
die("kayitGuncelle() fonksiyonunda sorgu hatasi.");
return 0;
}
 
}

//Verilen tablodan $alan isimli değişkene $deger parametresiyle gönderilen değeri siler.
public function tekKayitSil($tablo, $alan, $deger)
{
$sql = "DELETE FROM ".$tablo." WHERE ".$alan." = ?";
try{
$this->sorgula($sql);
$this->calistir(array($deger));
return 1;
} catch(Exception $e){
die("tekKayitSil() fonksiyonunda sorgu hatası");
return 0; 
}
}

//İşlem sonucunda etkilenen kayıt sayısı alınır
public function satirSay(){
return $this->stmt->rowCount();
}

//Veritabnına ekleme yapıldığında veritabanı tarafından verilen son ID değerini döndürür.
public function sonEklenenID(){
return $this->dbh->lastInsertId();
}

//TRANSACTION işlemini başlatır. Eğer birden fazla (toplu) sorgu çalıştıracaksanız 
//ve bu sorguların hep beraber işletilmesi gerekiyorsa transaction kullanırsınız.
public function islemeBasla(){
return $this->dbh->beginTransaction();
}

// Transaction işlemini onaylar(commit) eder.
public function islemiBitir(){
return $this->dbh->commit();
}

//Sorgulardan birinde hata alınan transaction işlemini sonlandırır. 
public function islemIptal(){
return $this->dbh->rollBack();
}
 
public function parametreGoster(){
return $this->stmt->debugDumpParams();
}
} //class

Oğuzhan TAŞ - 2014 

İlerleyen derslerde bu PDO kütüphanesinin kullanımı ile ilgili bol örnek yapacağız.  MySQL dışında başka veritabanlarına da bağlanacağız. MySQL artık ORACLE firmasının oldu, ne olur ne olmaz, yarın MySQL ücretli olursa en iyi alternatiflerden biri PostgreSQL veritabanıdır. SQLLite ise bugün tüm Android ve IOS(Ipad, Iphone) işletim sistemlerinde bile rahatlıkla çalışan hafif bir veritabanıdır. Bu iki veritabanına da yeri geldikçe değineceğiz ve örneklerimizde kullanacağız.

KAYNAKLAR

* Neden PDO Nesneleri kullanmalısınız? 
http://php.net/manual/tr/migration55.deprecated.php
- PHP.Net PDO Kütüphanesi
 http://php.net/manual/tr/book.pdo.php
 
Bookmark and Share
Dil Değiştir(Change Language)