• 11-08-2019, 00:52:24
    #1
    PDO - PHP Database Objects

    PHP ile bir veritabanına bağlanmak istediğinizde kullanmanız gereken bir çok fonksiyon ve sınıf ile karşılaşırsınız. Bunların bazıları halen desteklenirken, bazıları ise yeni PHP versiyonlarında kaldırılmıştır. Forumda da sıklıkla gördüğümüz mysql_connect, mysql_query, mysql_fetch_assoc gibi fonksiyonlar PHP 5.5 versiyonu itibarı ile DEPRECATED olarak işaretlenmiştir. Yani 5.5 ve sonrasındaki 5.X versiyonlarında bu fonksiyonları kullanabilmeniz için özel bir takım ayarlara ihtiyacınız vardır. Ancak PHP bunu tavsiye etmez. PHP 7 versiyonu ile birlikte mysql_* fonksiyonları tamamen kaldırılmıştır. Yani bir ayar yaparak da bu fonksiyonları kullanamazsınız.

    Forumda gördüğümüz bir çok konu başlığında maalesef halen bu fonksiyonların kullanıldığını görüyoruz. Ancak unutulmamalıdır ki, güvenlik, sürdürülebilirlik, nesnellik gibi bir çok sebepten ötürü kaldırılan herhangi bir fonksiyonu kullanmamanız sizin yararınızadır.

    mysql_query, mysql_connect, mysql_* vb. kullanmayın.

    Peki ne kullanacağız: PDO

    Aşağıda PDO kullanımı ile ilgili çok basit bir kaç örnek paylaşacağım. Bu örnekleri kullanarak PHP ile veritabanı işlemleri yapabilir, daha kullanışlı ve daha güvenli kod yazmış olabilirsiniz.

    Veritabanına bağlantı için kullanmanız gereken kod aşağıdaki kadar basit:

    <?php
    try {
         $db = new PDO("mysql:host=localhost;dbname=test;charset=utf8", "DBUSER", "DBPASS");
    } catch ( PDOException $e ){
         die($e->getMessage());
    }
    ?>
    Burada $db isimli bir değişken oluşturup bir PDO nesnesi örnekliyoruz. Bu işlem sonucunda eğer bağlantı yapılırsa artık veritabanı işlemlerimizi $db değişkeni üzerinden yapabiliriz. Burada kullandığımız try-catch bloğu, PDO nesnesinin olası bir hata ile karşılaşması durumunda fırlattığı hata bilgilerini yakalamamızı sağlıyor. (Dosya, satır sayısı, hata mesajı, trace gibi bilgilere bu sayede erişebilirsiniz. (Bkz: Exceptions)

    Veritabanına bağlandık, peki verileri nasıl çekeceğiz? Uyeler isimli bir tabloya bağlanıp, 1453 id numarasına sahip bir üyeyi çekmek istiyorsak, PDO nesnesinin prepare metodunu kullanarak SQL sorgumuzu yazarız. SQL Injection tehlikesinden korunarak dışarıdan gelen verimizi SQL cümleciğimizin içerisine yerleştiririz. Execute ile kodu çalıştırır, rowCount ile satır sayısını kontrol eder, fetch ile veriyi veritabanından alır, PHP ile kullanılacak hale (dizi ya da nesne) getiririz.
    <?php
    $sth = $db->prepare("SELECT * FROM uyeler WHERE id = ?");
    $sth->execute(array(1453));
    
    if($sth->rowCount() > 0) {
    $uye = $sth->fetch(PDO::FETCH_OBJ);
         echo $uye->adi . ' ' . $uye->soyadi;
    } else {
         echo 'Kayıt bulunamadı.';
    }
    ?>
    Yukarıdaki örnekte fetch işlemi yapılırken veriyi nesne olarak almak istiyorsanız PDO::FETCH_OBJ sabitini, dizi (array) olarak almak istiyorsanız PDO::FETCH_ASSOC sabitini kullanabilirsiniz.

    Kontrolleri bir tık yükseltmek ve SQL cümleciğine dışarıdan gelecek olan verileri eklerken tip kontrolü de yapmak isterseniz (ben çok gerek duymadım) bindParam isimli metodu kullanabilirsiniz, örneğin:
    <?php
    $id = 1453;
    $sth = $db->prepare("SELECT * FROM uyeler WHERE id = :id");
    $sth->bindParam(':id', $id, PDO::PARAM_INT);
    $sth->execute(array(1453));
    Yalnızca yukarıdaki metotları bilmeniz, PDO kullanarak tüm işlemlerinizi yapabileceğiniz anlamına gelir. PDO içerisinde kullanabileceğiniz bir çok metot bulunur. Örneğin Transaction başlatıp, işlemlerinizi yapar, herhangi bir hata almanız durumunda rollback yaparak tüm yaptığınız değişiklikleri geri alabilirsiniz.

    Aşağıdaki örnekte, birden fazla verinin nasıl çekildiğini görebilirisiniz. Yukarıdaki işlemden tek farkı, fetch yerine fetchAll kullanılması ve foreach döngüsü.

    <?php
    $sth = $db->prepare("SELECT * FROM uyeler ORDER BY id DESC");
    $sth->execute();
    
    if( $sth->rowCount() > 0 ) {
        foreach($sth->fetchAll(PDO::FETCH_OBJ) as $uye)
        {
            echo $uye->adi . ' ' . $uye->soyadi;
        }
    } else {
        echo 'Kayıt bulunamadı.';
    }
    ?>
    Basit bir insert örneği yapalım. Tabloya veri eklemek istediğimizde aşağıdaki örneği kullanabiliriz.
    <?php
    $sth = $db->prepare("INSERT INTO uyeler (adi, soyadi) VALUES (:adi, :soyadi)");
    $sth->execute(array(
        ':adi' => 'Reşat Nuri',
        ':soyadi' => 'Güntekin'
    ));
    echo $db->lastInsertId();
    ?>
    Yukarıdaki örnekte uyeler tablosuna bir satır ekledik. lastInsertId() metodu ile eklediğimiz bu satırın id değerini aldık.

    Update ve Delete işlemi ile ilgili örneklerde de mantık aynıdır. Burada önemli husus, update ve delete sorgularını çalıştırdığınız zaman execute işlemi size etkilenen satır sayısını döner (eskiden mysql_affected_rows)

    Bunları da şöyle basitçe örneklendirelim:
    <?php
    $sth = $db->prepare('UPDATE uyeler SET adi = ? WHERE id = ?');
    // Etkilenen satır sayısını ekrana yazabiliriz.
    echo $sth->execute(array(
         'Nuri', 1453
    ));
    
    $sth = $db->prepare('DELETE FROM uyeler WHERE id = ?');
    // Etkilenen satır sayısını ekrana yazdırdık.
    echo $sth->execute(array(1453));
    Eskiden veritabanı bağlantısını kesmek için yapmamız gereken mysql_close isimli fonksiyonu kullanmaktı. Ancak PDO kullanırken buna ihtiyacınız yok. $db isimli PDO örneğini null değere eşitlemeniz yeterli. Şöyle ki:
    $db = null; // Bağlantı sıfırlandı.
    Gördüğünüz gibi PDO işlemleri bu kadar basit. Lütfen artık çalışmalarınızda MYSQL_QUERY, MYSQL_CONNECT gibi eskimiş, eskide kalmış, çöpe atılmış, emekliye ayrılmış fonksiyonlar kullanmayın.

    Yaşadığınız her türlü PDO soru ve sorunlarınızda bu başlık altından sizlere cevap verebiliriz.

    Teşekkürler.
  • 11-08-2019, 01:23:18
    #2
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Anlatım için teşekkürler