Php PDO Kullanımı Veri Tabanı Bağlantısı

Anasayfa / Blog / PHP Dersleri / PHP Veri Tabanı / Php PDO Kullanımı Veri Tabanı Bağlantısı


Php Değişkenler , 7 Kali Linux , 3 React JS , 1 Vue.js Dersleri , 1 Grafik Tasarım , 1 VirtualBox , 3 PHP Veri Tabanı , 5 PHP Dersleri , 13 Html Dersleri , 1 4 yıl önce yayınlandı.

Php PDO Kullanımı Veri Tabanı Bağlantısı

Ben bu yazımda sizlere PDO’yu mysql_ fonksiyonlarına eş değer olacak şekilde anlatmaya çalışacağım. Hazırsanız başlayalım?

Veritabanı Bağlantısı

mysql_ li fonksiyonlara veritabanına bağlantısı;

<?php
$baglanti = mysql_connect("localhost","root","123456") or die ();
mysql_select_db("test", $baglanti) or die ( mysql_error() );
?>

PDO da veritabanı bağlantısı;

<?php
try {
     $db = new PDO("mysql:host=localhost;dbname=test", "root", "123456");
} catch ( PDOException $e ){
     print $e->getMessage();
}
?>

Elbette PDO ile bağlanırken try ~ catch yapısını kullanmak zorunda değildik ancak böyle bir kullanım çok daha kullanışlıdır. PDO’nun hatalar için bir exception’ı var ve daha mantıklı hata mesajları üretiyor olması güzel bir şey.

Not: PDO sadece mysql’i değil bir çok veritabanı yapısını destekler. Fakat bensadece mysql ile ilgili anlatımları buraya ekliyeceğim.

Karakter Setini Ayarlama

Her zaman bir charset belirlemek iyidir. Bunuda mysql_ li fonksiyonlarda ve PDO da nasıl yaptığımızı örneklerle öğrenelim;

mysql_ li fonksiyonlarda karakter setini ayarlama;

mysql_set_charset("utf8");

veya
mysql_query("SET CHARACTER SET utf8");

PDO da karakter setini ayarlama;

$db = new PDO("mysql:host=localhost;dbname=test;charset=utf8", "root", "123456");

veya

$db->query("SET CHARACTER SET utf8");

 

SELECT İşlemi (Toplu)

mysql_ li fonksiyonlarda select işlemi;

$query = mysql_query("SELECT * FROM uyeler");
if ( mysql_affected_rows() ){
     while ( $row = mysql_fetch_assoc($query) ){
           print $row['kullanici_adi']."<br>";
     }
}

 

PDO da select işlemi;

$query = $db->query("SELECT * FROM uyeler", PDO::FETCH_ASSOC);
if ( $query->rowCount() ){
     foreach( $query as $row ){
          print $row['kulanici_adi']."<br>";
     }
}

 

SELECT İşlemi (Tekli)

Sadece bir veriyi çekmek için nasıl bir işlem yapacağımızı görelim;

mysql_ li fonksiyonlarda tekil select işlemi;

 

$id = $_GET['id'];
$query = mysql_query("SELECT * FROM uyeler WHERE uye_id = '{$id}'");
if ( mysql_affected_rows() ){
    $row = mysql_fetch_assoc($query);
    print_r($row);
}

PDO da tekil select işlemi;

$id = $_GET['id']; 
$query = $db->query("SELECT * FROM uyeler WHERE uye_id = '{$id}'")->fetch(PDO::FETCH_ASSOC);
if ( $query ){
    print_r($query);
}

 

Her iki şekilde de güvenli bir select işlemi olmadı. Çünkü SQL Injectiondediğimiz bir olay var ve şuan her iki işlem içinde kolayca uygulanabilir durumda. Bunun hakkında konu sonlarında güvenlik bölümünde sizlere bahsedeceğim.

 

INSERT İşlemi

Veritabanına veri kayıt etmek için mysql_ li fonksiyonlarla PDO arasındaki farkı görelim;

mysql_ li fonksiyonlarda insert işlemi;

 

$insert = mysql_query("INSERT INTO uyeler SET
uye_kadi  = 'Muhammed Günaydın',
uye_sifre = '123456',
uye_eposta = 'info@mgunaydin.com'");
if ( $insert ){
     $last_id = mysql_insert_id();
     print "insert işlemi başarılı!";
}

PDO da insert işlemi;

$query = $db->prepare("INSERT INTO uyeler SET
uye_kadi = ?,
uye_sifre = ?,
uye_eposta = ?");
$insert = $query->execute(array(
     "Muhammed Günaydın", "123456", "info@mgunaydin.com"
));
if ( $insert ){
    $last_id = $db->lastInsertId();
    print "insert işlemi başarılı!";
}

 

Her iki şekilde de veritabanına yeni bir veri kaydı yapılır. PDO kodları biraz uzun gibi görünsede daha güvenilirdir. Bu yol 2 kod parçacığında mysql_ li fonksiyonlu örnekte SQL Injection açığı mevcuttur. Insert işlemlerinin %100’u kullanıcıdan aldığımız veriler doğrultusunda olmakta. Tabi buda alınan verilerin kontrol edilmesi anlamına geliyor. Bunu yapmaktansa kullandığınız veritabanı sınıfının yapması çok daha kullanışlı olacaktır. PDO’da bunu sizin için yapıyor ve kullanıcıdan aldığınız bilgileri bu kullanım ile daha güvenilir hale getiriyor. Böylece SQL Injection açıklarından korunmuş oluyoruz.

Bir diğer yöntemde ise PDO örneğinde ? yerine key (anahtar) isimler belirtipte ona göre dizide değer gönderebilirdik.. Onuda şu şekilde bir örnekte yapabilirdik;

 

$query = $db->prepare("INSERT INTO uyeler SET
uye_kadi = :mami,
uye_sifre = :sifre,
uye_eposta = :eposta");
$insert = $query->execute(array(
      "sifre" => "123456",
      "eposta" => "info@mgunaydin.com",
      "kadi" => "Muhammed Günaydın",
));
if ( $insert ){
    $last_id = $db->lastInsertId();
    print "insert işlemi başarılı bir şekilde gerçekleşti!";

 

Bunun ne farkı var derseniz ?
Şu şekilde execute metodunda belirttiğimiz dizideki sıranın bir önemi kalmaz. İstediğiniz key değerini istediğiniz sırada yazabilirsiniz. Ayrıca key değerlerini mantıklı şekilde belirtirseniz anlama kolaylığıda sağlar.

UPDATE İşlemi

Update (güncelleme) işleminin insert’ten bir farkı yoktur aslında. Sadece insert into yerine update yazmalı ve bir where koşulu koymamız gerekiyor o kadar ???? Yinede biz ikisininde bir örneğini yapalım..

mysql_ li fonksiyonlarda update işlemi;

$update = mysql_query("UPDATE uyeler SET
uye_kadi = 'mami'
WHERE uye_adi = 'Muhammed Günaydın'");
if ( $update ){
     print "güncelleme başarılı!";
}

PDO‘a update işlemi;

$query = $db->prepare("UPDATE uyeler SET
uye_adi = :yeni_adi
WHERE uye_adi = :eski_adi");
$update = $query->execute(array(
     "yeni_adi" => "mami",
     "eski_adi" => "Muhammed Günaydın"
));
if ( $update ){
     print "Güncelleme işlemi başarılı!";
}

 

INSERT işleminde olduğu gibi burada da PDO güvenlik konusunda gerekeni yapmış oldu.

DELETE İşlemi (Toplu)

Toplu silme işlemlerinde mysql_li fonksiyonlar ve pdo ile birer örnek yapalım;

mysql_ li fonksiyonlarla silme işlemi;

$delete = mysql_query("DELETE FROM uyeler");

PDO da silme işlemi;

$delete = $db->exec("DELETE FROM uyeler");
print 'Toplam '.$delete.' üye silindi!';

 

DELETE İşlemi (Tek)

Sadece bir veriyi silmek için mysql_ li ve pdo’lu örneği yapalım. Elbette işin içine yine kullanıcıdan veri almak girince pdo daha güvenli bir işlem haline geliyor.

mysql_ li fonksiyonlarda tek veriyi silme işlemi;

$delete = mysql_query("DELETE FROM uyeler WHERE uye_id = {$_GET['id']}");

PDO da tek veriyi silme işlemi;

$query = $db->prepare("DELETE FROM uyeler WHERE uy_id = :id");
$delete = $query->execute(array(
   'id' => $_GET['id']
));

 

Veritabanı Bağlantısını Sonlandırma

İşimiz bitince mevcut bağlantıyı sonlandırmamız gerekir. Bunuda mysql_ li fonksiyonlarda ve pdo da nasıl yapabiliriz hemen görelim;

mysql_ li fonksiyonlarda bağlantı sonlandırma işlemi;

mysql_close($baglanti);

PDO da bağlantı sonlandırma işlemi;

$db = null;

 

Güvenlik

Veritabanı işlemlerinde SQL Injection diye kötü bir şey var.. BU ne demek SQL sorgularına müdahale etmek demek. Ve bu müdahale sonuçları çok kötü olabilir. Ancak PDO bu gibi kötü durumlar için koruyor..

 

Örneğin böyle link yapımız olsun;
http://www.website.com/delete.php?id=4

burada id parametresini kullanıcıdan alıyoruz.. Dolayısı ile bu değeri istediği gibi değiştirebilir. Şimdi bu id değerini alıp bir silme işlemi yapalım pdo ile.

$query = $db->prepare("DELETE FROM uyeler WHERE uye_id = :id");
$delete = $query->execute(array(
     "id" => $_GET['id']
));

 

Evet şuan silme işlemi yapıyor. Örneğin sql sorgusuna müdahale etmeyi deneyelim.. Mesela tüm üyeleri silmeye çalışalım;
http://www.website.com/delete.php?id=’; DELETE FROM uyeler; /*

Eğer bu şekilde bir işlem yapılsaydı ve pdo yerine mysql_ li fonksiyonlar kullanılmış olsaydık çoktan sql injection yemiş ve bütün üyelerimizi kaybetmiş olacaktır. Ancak pdo yukarıdaki kodlarda bunun kontrolünü yaptığı için hiçbir şey olmadı. Buda güvenlik önlemlerini koruduğu anlamına geliyor.

 

Etiketler


Paylaş


Bağlantı Linki


Yorumlar
İlk yorumu siz yazın!

Bu konu için hiç yorum yazılmamış, ilk yorumu siz yazarak destek verin!


Yorum Yaz
E-posta adresiniz yorumlar listelenirken gizli kalacaktır.
Benimle iletişime geç

Çalışmalarımı beğendiyseniz iletişim bölümünden bana ulaşabilirsiniz. Daha fazla soru için info@mgunaydin.com adresini kullanın.