alexa  Menu
phpkonf

PHP PDO Transaction kullanımı

  15.04.2020 ,   yorum yapılmadı ,   6.414 kez okundu.

PHP PDO ile bir takım işlemlerden bahsettim. Şimdi diğer programlama dillerinde de mevcut olan ve veritabanı işlemlerinde olmazsa olmaz bir yöntem olan Transaction kullanımından bahsedeceğim. Öncelikle Transaction nedir kabaca buna bir değinelim. Transaction belirli bir grup işlemin ard-arda yapılması işlemidir.

Şöyle ki, diyelim bir veritabanımız var ve bu veritabanından önce bir veri çekip sonra o veriyi düzenleyip sonra yeniden başka bir işlem yapmaya çalışıyorsunuz. Bu işlemlerden herhangi birinin gerçekleşmemesi işleminizin başarısız olması demek ve bir işlem başarısız olduysa hepsinin iptal edilmesi gerekiyor. İşte bu durumda transaction işimizi kolaylaştırıyor.

Transaction işleminde temel olarak 3 adım mevcut. Transaction başlatılması ( beginTransaction() ), transaction başladıktan sonra yapılan işlemler başarılı ise onları işlemek ( commit() ) , eğer başarılı değilse işlemleri geri almak (rollBack () ).

Örnek olarak aşağıdaki kodumuzu inceleyelim:

<?php

    $host = "localhost";
    $username = "root";
    $password = "123456";
    $dbname = "myPdoDatabase";


    //Yukarıda belirtilen veritabanına bağlan. Her iki halde veritabanı olacak. Ya önceden vardı ya da yeni oluşturuldu.
    $conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    //Transaction başlatıyoruz
    $conn->beginTransaction();

    $isim='Anar';
    $soyisim='Samadov';
    $eposta='[email protected]';

    //prepare methodu ile insert sorgumuzu yazıyoruz fakat değerler yerine gerçek değerleri yazmıyoruz
    $stmt=$conn->prepare("INSERT INTO isimler (isim, soyisim, email) VALUES (:isim, :soyisim, :email)");

    //değerleri bind etmenin bir diğer yöntemi

    $resultInsert=$stmt->execute([
        ":isim" => $isim,
        ":soyisim" => $soyisim,
        ":email" => $eposta,
    ]); //eğer başarılı bir insert işlemi olduysa sonuç true döner.


    $stmt = $conn->prepare("UPDATE isimler set isim=:isim WHERE id=:id");
    $resultUpdate = $stmt->execute([
        ":isim" => "Murat",
        ":id"   => "90"
    ]);

    //Tüm işlemler başarılı ise
    if($resultInsert && $resultUpdate){
        //Başlattığımız transaction-nın commit edilmesini sağlıyoruz
        $conn->commit();
        echo "<br>"."Tüm işlemler başarıyla gerçekleşti";
    }else {
        //Başlattığımız transaction-ı herhangi bir hata yüzünden geri çekiyoruz
        $conn->rollBack();
        echo "<br>"."Hata oluştu. İşlemler iptal edildi.";
    }

    //veritabanından veri çekiyoruz
    $query = $conn->prepare("SELECT * FROM isimler");
    $query->execute(); //Bir hazır deyimi çalıştırır
    $result=$query->fetchAll(PDO::FETCH_ASSOC); //Sütun isimlerine göre indisli bir dizi döner
    echo "<br>".json_encode($result, JSON_PRETTY_PRINT);

?>

Gördüğünüz gibi önce veritabanı bağlantısı yapılıyor. Daha sonra $conn->beginTransaction(); metodu çağırılıyor. Bundan sonra insert ve ardından update işlemi yapılıyor. Eğer bu işlemler başarılı ise $conn->commit(); eğer değilse $conn->rollBack(); metodu çağırılıyor. Aslında işlem bu kadar basit. Eğer herhangi bir sorgumuzda hatalı bir veri kullanıp denerseniz işlemlerden biri başarılı olsa dahi veritabanına yansımayacağını göreceksiniz.

Tabiki transaction kullanımının daha gelişmiş işlemleri de var ama şuan konuyu anlamak adına bu kadarı yeterli.

Yorum yapın..

isim yerine gerçek isim ve soyisim yazılmadan yapılan yorumlar kesinlikle onaylanmıyor bilginiz olsun.


The reCAPTCHA verification period has expired. Please reload the page.