PHP PDO Kullanımı

PHP ile insert, update, delete, select vb. veritabanı işlemleri için gerekli SQL komutlarının PDO kullanımı ile ilgili bilgiler yer almaktadır.

PHP PDO Nedir? , PHP PDO Kurulumu ve PHP PDO Veritabanı Bağlantısı yazılarında PDO’nun bir OOP sınıfı olduğunu belirttim.

PDO ile veritabanı işlemleri için exec, query ve prepare metotları kullanılır.

exec

Metot parametre olarak aldığı SQL komutlarını (INSERT, DELETE, UPDATE) çalıştırır ve geri dönüş değeri olarak eklenen, silinen veya güncellenen kayıt sayısını verir.

Metodun geri dönüş değeri sayısal bir değer olduğundan sonuç döndüren veri seçme-çekme (SELECT, SHOW) işlemlerinde kullanılmaz.

<?php

try {

    $baglanti = new PDO("mysql:host=localhost;dbname=kisi", "root", "");
    $baglanti->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $kayit_sayisi = $baglanti->exec("DELETE FROM kisiler WHERE kisi_sira = 9");

    if ($kayit_sayisi > 0) {
        echo $kayit_sayisi . " kayıt silindi.";
    } else {
        echo "Herhangi bir kayıt silinemedi.";
    }

} catch (PDOException $e) {
    die($e->getMessage());
}

$baglanti = null;

?>

Metot genellikle veritabanı sistemine ait ayarların (karakter seti vb.) yapılmasında kullanılır.

query

Metot parametre olarak aldığı SQL komutları (SELECT, INSERT, UPDATE, DELETE vb.) çalıştırır ve PDOStatement sınıfı döndürür.

<?php

try {

    $baglanti = new PDO("mysql:host=localhost;dbname=kisi", "root", "");
    $baglanti->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sorgu = $baglanti->query("SELECT * FROM kisiler");

    echo "<p>Toplam kayıt sayısı: " . $sorgu->rowCount() . "</p>";

    print_r($sorgu->fetchAll());

} catch (PDOException $e) {
    die($e->getMessage());
}

$baglanti = null;

?>

SQL sorgusu değer döndürüyorsa (veri çekme varsa), PDOStatement sınıfındaki fetch, fetchAll, fetchColumn, fetchObject metotları kullanılabilir.

<?php

try {

    $baglanti = new PDO("mysql:host=localhost;dbname=kisi", "root", "");
    $baglanti->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sorgu = $baglanti->query("INSERT INTO kisiler(kisi_adi, kisi_soyadi, kisi_eposta) VALUES('Yusuf Sefa', 'SEZER', 'yusufsezer@mail.com')");

    echo "<p>Eklenen kayıt sayısı: " . $sorgu->rowCount() . "</p>";

    echo "<p>Eklenen kayıt ID: " . $baglanti->lastInsertId() . "</p>";

} catch (PDOException $e) {
    die($e->getMessage());
}

$baglanti = null;

?>

Eklenen, güncellenen ve silinen kayıt sayısı için PDOStatement sınıfındaki rowCount metodu, eklenen kayıt sırası için PDO sınıfındaki lastInsertId metodu kullanılır.

SQL sorgusu dışarıdan bir değer alıyorsa query metodu SQL Injection gibi istenmeyen durumlara neden olabilir.

Dışarıdan değer alan SQL sorguları için prepare (ön hazırlıklı sorgu) metodunun kullanılması faydalı olacaktır.

prepare

Metot parametre olarak aldığı SQL komutlarını güvenli olarak çalıştırmak için hazır hale getirir.

<?php

try {

    $baglanti = new PDO("mysql:host=localhost;dbname=kisi", "root", "");
    $baglanti->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sorgu = $baglanti->prepare("SELECT * FROM kisiler");

    $sorgu->execute();

    echo "<p>Toplam kayıt sayısı: " . $sorgu->rowCount() . "</p>";

    print_r($sorgu->fetchAll());

} catch (PDOException $e) {
    die($e->getMessage());
}

$baglanti = null;

?>

Metot parametre olarak aldığı SQL komutunu işlemek üzere PDOStatement sınıfını oluşturur.

PDOStatement($sorgu) sınıfı içinde yer alan execute metodu ile SQL komutları çalıştırılır.

SQL sorgusu değer döndürüyorsa (veri çekme varsa), PDOStatement sınıfındaki fetch, fetchAll, fetchColumn, fetchObject metotları kullanılabilir.

Ön hazırlıklı sorgular çoğunlukla dışarıdan (formdan, değişkenlerden vb.) alınan verilerin uygun olarak SQL komutuna eklenmesi için kullanılır.

<?php

try {

    $baglanti = new PDO("mysql:host=localhost;dbname=kisi", "root", "");
    $baglanti->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sorgu = $baglanti->prepare("INSERT INTO kisiler(kisi_adi, kisi_soyadi, kisi_eposta) VALUES(?, ?, ?)");

    $adi = "Yusuf Sefa";
    $soyadi = "SEZER";
    $eposta = "yusufsezer@mail.com";
    $sorgu->execute(array($adi, $soyadi, $eposta));

    echo "<p>Eklenen kayıt sayısı: " . $sorgu->rowCount() . "</p>";

    echo "<p>Eklenen kayıt ID: " . $baglanti->lastInsertId() . "</p>";

} catch (PDOException $e) {
    die($e->getMessage());
}

$baglanti = null;

?>

Benzer şekilde özel karakter (?) yerine isimli parametrede (:isimli_parametre) kullanılabilir.

<?php

$sorgu = $baglanti->prepare("INSERT INTO kisiler(kisi_adi, kisi_soyadi, kisi_eposta) VALUES(:benim_adim, :benim_soyadim, :benim_epostam)");

$sorgu->execute(
        array(
            ':benim_adim' => $adi,
            ':benim_soyadim' => $soyadi,
            ':benim_epostam' => $eposta)
);

?>

SQL komutu içinde parametrelere (? veya :isimli_parametre) execute, bindParam veya bindValue metodu ile veriler güvenli bir biçimde yerleştirilebilir.

bindParam

Metot prepare metodu içindeki özel parametrelere (? veya :isimli_parametre) verileri güvenli biçimde yerleştirir.

Metodun ilk parametresi ön hazırlık sorguya göre değer alır, ikinci parametresi dışarıdan alınacak değerin değişkenini belirtir, üçüncü parametre ise verinin tipini belirtmek için kullanılır.

Metodun üçüncü parametresine girilen;

PDO::PARAM_INT – sayısal veri,

PDO::PARAM_STR – metinsel veri,

PDO::PARAM_LOB – binary veri,

PDO::PARAM_INPUT_OUTPUT – saklı yordam girdi/çıktı verisi,

PDO::PARAM_NULL – NULL veri tipi olduğunu belirtir.

Ayrıca çok kullanılmayan dördüncü uzunluk parametresi ve beşinci veritabanı sistemi ayar parametresi mevcuttur.

<?php

try {

    $baglanti = new PDO("mysql:host=localhost;dbname=kisi", "root", "");
    $baglanti->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sorgu = $baglanti->prepare("INSERT INTO kisiler(kisi_adi, kisi_soyadi, kisi_eposta) VALUES(?, ?, ?)");
    $sorgu->bindParam(1, $adi, PDO::PARAM_STR);
    $sorgu->bindParam(2, $soyadi, PDO::PARAM_STR);
    $sorgu->bindParam(3, $eposta, PDO::PARAM_STR);

    $adi = "Yusuf Sefa";
    $soyadi = "SEZER";
    $eposta = "yusufsezer@mail.com";
    $sorgu->execute();

    echo "<p>Eklenen kayıt sayısı: " . $sorgu->rowCount() . "</p>";

    echo "<p>Eklenen kayıt ID: " . $baglanti->lastInsertId() . "</p>";

} catch (PDOException $e) {
    die($e->getMessage());
}

$baglanti = null;

?>

Benzer şekilde özel karakter (?) yerine isimli parametrede (:isimli_parametre) kullanılabilir.

<?php

$sorgu = $baglanti->prepare("INSERT INTO kisiler(kisi_adi, kisi_soyadi, kisi_eposta) VALUES(:benim_adim, :benim_soyadim, :benim_epostam)");

$sorgu->bindParam(':benim_adim', $adi, PDO::PARAM_STR);
$sorgu->bindParam(':benim_soyadim', $soyadi, PDO::PARAM_STR);
$sorgu->bindParam(':benim_epostam', $eposta, PDO::PARAM_STR);

?>

bindValue

Metot bindParam ile aynı işleve sahiptir. Ancak bindParam metodunda çok kullanılmayan dördüncü ve beşinci parametreler yoktur.

Metot bindParam metodunda olmayan doğrudan değer atama yapmaya imkan verir.

<?php

try {

    $baglanti = new PDO("mysql:host=localhost;dbname=kisi", "root", "");
    $baglanti->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sorgu = $baglanti->prepare("INSERT INTO kisiler(kisi_adi, kisi_soyadi, kisi_eposta) VALUES(?, ?, ?)");
    $sorgu->bindValue(1, 'Yusuf Sefa', PDO::PARAM_STR);
    $sorgu->bindValue(2, 'SEZER', PDO::PARAM_STR);
    $sorgu->bindValue(3, 'yusufsezer@mail.com', PDO::PARAM_STR);

    $sorgu->execute();

    echo "<p>Eklenen kayıt sayısı: " . $sorgu->rowCount() . "</p>";

    echo "<p>Eklenen kayıt ID: " . $baglanti->lastInsertId() . "</p>";

} catch (PDOException $e) {
    die($e->getMessage());
}

$baglanti = null;

?>

Benzer şekilde özel karakter (?) yerine isimli parametrede (:isimli_parametre) kullanılabilir.

<?php

$sorgu = $baglanti->prepare("INSERT INTO kisiler(kisi_adi, kisi_soyadi, kisi_eposta) VALUES(:benim_adim, :benim_soyadim, :benim_epostam)");

$sorgu->bindValue(':benim_adim', 'Yusuf Sefa', PDO::PARAM_STR);
$sorgu->bindValue(':benim_soyadim', 'SEZER', PDO::PARAM_STR);
$sorgu->bindValue(':benim_epostam', 'yusufsezer@mail.com', PDO::PARAM_STR);

?>

PDO sınıfı içinde hata yönetimi için errorCode, errorInfo ve SQL Injection gibi istenmeyen durumlardan korunmak quote metotları kullanılabilir.

errorCode ve errorInfo

PDO ayarları ile SQL hatalarının try-catch bloğuna yönlendirilmediği durumlarda errorCode ve errorInfo metotları ile hata yönetimi yapılabilir.

<?php

$baglanti = new PDO("mysql:host=localhost;dbname=kisi", "root", "");

$baglanti->exec("SELECT *");

if ($baglanti->errorCode() != null) {

    $hata = $baglanti->errorInfo();

    die("Hata Kodu: " . $hata[0] .
            "<br /> Hata No: " . $hata[1] .
            "<br /> Hata açıklama: " . $hata[2]);
}

?>

Genellikle try-catch ile hata yönetimi kullanıldığından bu metotlar hataları kayıt altına alma (loglama) işlemlerinde kullanılabilir.

quote

PDO sınıfındaki exec ve query metotları SQL Injection gibi istemeyen durumlara karşı savunmasızdır.

exec ve query metotları SQL komutlarına dışarıdan değer alıyorsa quote metodu ile istenmeyen durumlara karşı koruma sağlanır.

<?php

try {

    $id = "40asdasd'<";

    $baglanti = new PDO("mysql:host=localhost;dbname=kisi", "root", "");
    $baglanti->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $id = $baglanti->quote($id, PDO::PARAM_INT);

    $kayit_sayisi = $baglanti->exec("DELETE FROM kisiler WHERE kisi_sira = $id");

    if ($kayit_sayisi != 0) {
        echo $kayit_sayisi . " kayıt silindi.";
    } else {
        echo "Herhangi bir kayıt silinemedi.";
    }

} catch (PDOException $e) {
    die($e->getMessage());
}

$baglanti = null;

?>

PHP PDO Derslerine buradan ulaşabilirsiniz…

Hayırlı günler dilerim.

Yusuf SEZER

Yusuf SEZER

Computer Engineer who interested about web technologies, algorithms, artificial intelligence and embedded systems; constantly exploring new technologies.


Bunlara'da bakmalısın!