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', '[email protected]')");
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 = "[email protected]";
$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 = "[email protected]";
$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, '[email protected]', 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', '[email protected]', 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.