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.

One Comment

Add a Comment

E-posta hesabınız yayımlanmayacak.