PHP ile PDO Kullanımı , CRUD İşlemleri
PDO bağlantısı;
?php
try {
$db = new PDO("mysql:host=localhost;dbname=ornek", "root", "123");
} catch ( PDOException $e ){
print $e->getMessage();
}
?>
try-catch yapısı kullanarak bağlantıda oluşan hataları yakalayabiliriz.
Karakter seti ayarlama
$db = new PDO(“mysql:host=localhost;dbname=ornek”, “root”, “123”);
$db->query(“SET CHARACTER SET utf8”);
Select işlemi;
Toplu Kullanımı
$query = $db->query("SELECT * FROM kullanicilar")->fetchAll(PDO::FETCH_ASSOC);
if ( $query->rowCount() ){
foreach( $query as $row ){
echo $row['kulanici_adi']."<br>";
}
}
Tek Kullanımı
$uye_id = 1;
$query = $db->query("SELECT * FROM uyeler WHERE uye_id = {$uye_id} limit 1")->fetch(PDO::FETCH_ASSOC);
if ( $query->rowCount() ){
foreach( $query as $row ){
echo $row['kulanici_adi']."<br>";
}
}
Veri Ekleme İşlemi
$prepare = $db->prepare("INSERT INTO uyeler SET kullanici_adi = :kadi,sifre=:sifre,onay=:onay");
$veriler = [
"kadi" => $_POST['kullanici_adi'],
"sifre" => md5($_POST['sifre]),
"onay" => 0
];
// verileri çalıştır
$prepare->execute($veriler);
// eğer başarılıysa
if($prepare->rowCount()):
print 'Kayıt işlemi tamamlandı';
else:
print 'Kayıt işlemi başarısız oldu.';
endif;
Gönderilen Verileri Denetlenmesi
$prepare = $db->prepare("INSERT INTO uyeler SET kullanici_adi = :kadi,sifre=:sifre,onay=:onay");
//veri tipini string ve 12 karakterle sınırlayalım
$prepare->bindParam(':kadi',$_POST['kullanici_adi'],PDO::PARAM_STR,12);
// string ve 32 karakterle sınırlaylaım
$prepare->bindParam(':sifre',md5($_POST['sifre']),PDO::PARAM_STR,32);
// onay değeri 1 veya 0 olacağından tipini BOOLEAN alabiliriz.
$prepare->bindParam(':onay',FALSE,PDO::PARAM_BOOL);
// ve methodu execute ederek çıktıyı alırız
$prepare->execute();
// eğer başarılıysa
if($prepare->rowCount()):
print 'Kayıt işlemi tamamlandı';
else:
print 'Kayıt işlemi başarısız oldu.';
endif;
Güncelleme işlemi;
Üye idsi 1 olan kaydın üyeliğini onaylamak istersek aşağıdaki gibi yol izlememiz gerekir.
$uye_id = 1;
$prepare = $db->prepare("UPDATE uyeler SET onay = :onay WHERE uye_id = :uye_id");
// execute ederken verileri içerisinde tanımlayabiliriz.
$prepare->execute(array([
"onay" => true,
"uye_id"=>$uye_id
]));
// eğer işlem başarılıysa
if($prepare->rowCount()):
print 'Güncelleme işlemi başarılı';
else:
print 'Güncelleme işlemi başarısız.';
endif;
Silme işlemi
$uye_id = 1;
$prepare = $db->prepare("DELETE FROM uyeler WHERE uye_id = :uye_id");
$prepare->execute(array([
"uye_id"=>$uye_id
]));
// eğer silme başarılıysa
if($prepare->rowCount()):
print "{$uye_id} nolu üye silindi.";
else:
print 'Silme işlemi başarısız.';
endif;
Toplu Silme
$sonuc = $db->exec("DELETE FROM uyeler");
if($sonuc):
print 'Üyeler silindi';
else:
print 'Silme işlemi başarısız oldu.';
endif;
PDO ile Güvenlik
Peki pdo ile sql injection’ı nasıl önleyebiliriz ?
Senaryo: Üyenin profil bilgisi masterdark.net/{uye_kullanici_adi} adresine HTTP GET aldığımızı düşünelim buradaki {uye_kullanici_adi} kullanıcının tanımlamış olduğu değeri veri tabanında sorgulayalım, eğer o kayıt varsa profil bilgilerini getirelim.
Eğer kullanıcıdan aldığımız, dışarıdan gelen veriyi bu şekilde kullanırsa;
$kullanici_adi = $_GET['uye_kullanici_adi'];
$kullanici = $db->query("SELECT * FROM uyeler WHERE kullanici_adi = '{$kullanici_adi}'");
sql injection’a izin vermiş oluruz ve $kullanici_adi = ” testadi’ or 1=1 “
olarak tanımlandığında kullanıcı olsun olmasın bize kayıt döndürecektir. Bunu önlemek istediğimizde
$kullanici_adi = $_GET['uye_kullanici_adi'];
$kullanici = $db->prepare("SELECT * FROM uyeler WHERE kullanici_adi = :kullanici_adi");
$kullanici->execute(array("kullanici_adi" => $kullanici_adi));
önce prepare methoduyla sql tümleciğini hazırlıyoruz ardından parametreleri gönderiyoruz, dışarıdan veri aldığımız $_GET, $_POST, php://input, $_COOKIE gibi farklı verisetlerinden gelen bilgileri mutlaka kontrol etmemiz gerekir.
Evet bu yazımızda PDO ile veritabanına bağlanma,verileri listeleme,güncelleme ve ekleme (CRUD) işlemlerini gerçekleştirdik.