Facebook Twitter

Php 5.5v ile yeni Sql bağlantı Çeşitleri

Bilindigi gibi Artık “mysql_connect“, “mysql_query” fonksiyonlarının php yeni versiyonuyla birlikte desteklenmeyeceğini...




Merhaba sevgili webmasterlar ve site ziyaretcilerimiz sizlere bugün Php’nin v5.5 yeni sürümüyle birlikte artık bilindigi gibi “mysql_connect“, “mysql_query” fonksiyonlarının  desteklemiyecegini , PHP’de kendi resmi dökümantasyonunda da bunun sinyalini vermeye başlamışti; 

Simdi sizlere Php’nin v5.5 birlikte hayatımıza girecek olan sistemlerden su an için önerdigi 2 farkli veritabani baglantisi sunuluyor bunlar;

1- PDO(PHP Data Objects)
2- Mysqli

Sizlere bunlardan PDO ile veritabanına nasıl bağlanılır ve ne tür avantajları var isterseniz bir inceliyelim;

PDO ile Mysqli arasındaki farki tabloda görebilirsiniz

PDO                                                                                Mysqli
Sadece nesne yönelimli kullanılır                                  Nesne yönelimsiz de kullanılabilir
12 farklı veritabanını ile kullanılabilir                             Sadece MySQL ile kullanılır
SQL Injection korumalıdır                                              SQL Injection kontrolünü yazılımcı yapılmalıdır
İsimlendirilmiş parametreyi destekler                            İsimlendirilmiş parametreyi desteklemez
Hız konusunda Mysqli’den yavaştır                              PDO’dan %5 civarı daha performanslıdır

Ben bu yazımda sizlere                                                

PDO’yu mysql_ fonksiyonlarına eş değer olacak şekilde anlatmaya çalışacağım. Eminim daha iyi anlayacaksınız.. Hazırsanız başlayalım?

PDO da veritabanı bağlantısı;

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  PDO’nun hatalar için bir exception’ı var ve daha mantıklı hata mesajları üretiyor.

PDO da karakter setini ayarlama;

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

 

PDO da select işlemi(Secim islemi);

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

PDO da tekil select işlemi;

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

 

INSERT İşlemi

PDO da insert işlemi;
$query = $db->prepare("INSERT INTO uyeler SET
uye_kadi = ?,
uye_sifre = ?,
uye_eposta = ?");
$insert = $query->execute(array(
     "Halil", "123456", "halilkaya@gmail.com"
));
if ( $insert ){
    $last_id = $db->lastInsertId();
    print "insert işlemi başarılı!";
}

 

PDO kodları biraz uzun gibi görünsede daha güvenilirdir. örnekte SQL Injection açığı mevcuttur. Unutmamak gerek ki insert işlemlerinin %99’u kullanıcıdan aldığımız veriler doğrultusunda olmakta. Buda alınan verilerin kontrol edilmesi anlamına gelir. Bunu siz 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.

PDO‘a update işlemi;


$query = $db->prepare("UPDATE uyeler SET
uye_kadi = :yeni_kadi
WHERE uye_kadi = :eski_kadi");
$update = $query->execute(array(
     "yeni_kadi" => "kaya",
     "eski_kadi" => "renklikare"
));
if ( $update ){
     print "güncelleme başarılı!";
}

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

PDO da tek veriyi silme işlemi;
$query = $db->prepare("DELETE FROM uyeler WHERE uy_id = :id");
$delete = $query->execute(array(
   'id' => $_GET['id']
));

PDO da bağlantı sonlandırma işlemi;
$db = null;

 

Evet arkadaslar sizlere örneklerle anlatmaya calıstım fakat bir konu daha var Veritabanı işlemlerinde SQL Injection diye illet bir şey var..şimdi onu acıklayım..

Güvenlik

Veritabanı işlemlerinde SQL Injection diye illet bir şey var.. Yani SQL sorgularına müdahale etmek. Ve bu müdahale sonuçları çok kötü olabilir. Ancak korkmayın, PDO bu gibi kötü durumlar için koruyor..
Örneğin şöyle bir link yapımız olsun;
http://www.siteadi.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.siteadi.com/delete.php?id='; DELETE FROM videolar; /*
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ı ve hala mutluyuz :)
Daha fazlası için;
http://php.net/pdo