• Forum vBulletin altyapısından Xenforo altyapısına geçirildi, bu sebeple eski şifreleriniz ile foruma giriş yapamayacaksınız, parolamı unuttum adımından mailiniz ile şifre sıfırlayarak giriş yapabilirsiniz.

    Üyeliklerinde geçerli bir mail adresi olmadığı için sıfırlama yapamayacak kullanıcılar forum kullanıcı adlarını ve yeni şifrelerini yazarak info@maxigame.org adresine şifre sıfırlamak istediklerine dair bir mail göndersinler şifrelerini sıfırlayıp mail adreslerini güncelleyeceğiz. Şifreniz sıfırlandıktan sonra foruma giriş yapıp tekrar istediğiniz gibi değiştirebilirsiniz.

PDO Nedir ve Nasıl Kullanılır

CottonCandy

Atlas Evren
Aileden
Aktiflik
K.Tarihi
26 Tem 2009
Mesajlar
1,087
Puanı
472
Konum
M.K.ATATÜRK
maxigamelogo.png


kjmrmD.png



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

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

Not: PDO sadece mysql’i değil bir çok veritabanı yapısını destekler. Ancak ben bu makalede sadece mysql ile ilgili anlatım yapacağım.
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;>


PHP:
mysql_set_charset("utf8");

ya da Bu Şekil :

PHP:
mysql_query("SET CHARACTER SET utf8");


PDO da karakter setini ayarlama;

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

yada bu şekil :

PHP:
$db->query("SET CHARACTER SET uf8");


[h=3]SELECT İşlemi (Toplu)[/h]
PHP:
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;

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

[h=3]SELECT İşlemi (Tek)[/h] Sadece bir veriyi çekmek için nasıl bir işlem yapacağımızı görelim;


PHP:
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;

PHP:
$id = $_GET['id']; 
$query = $pdo->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 Injection dediğimiz bir olay var ve şuan her iki işlem içinde kolayca uygulanabilir durumda. Bunun hakkında makale sonlarında güvenlik bölümünde sizlere bahsedeceğim.
[h=3]INSERT İşlemi[/h] Veritabanına veri kayıt etmek için mysql_ li fonksiyonlarla PDO arasındaki farkı görelim;


mysql_ li fonksiyonlarda insert işlemi;

PHP:
$insert = mysql_query("INSERT INTO uyeler SET
uye_kadi  = 'CottonCandy',
uye_sifre = '123456',
uye_eposta = 'maxi@maxigamerz.com'");
if ( $insert ){
     $last_id = mysql_insert_id();
     print "insert işlemi başarılı!";
}

PDO da insert işlemi;

PHP:
$query = $db->prepare("INSERT INTO uyeler SET
uye_kadi = ?,
uye_sifre = ?,
uye_eposta = ?");
$insert = $query->execute(array(
     "Tayfun Erbilen", "123456", "maxi@maxigamerz.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. Çünkü bu 2 kod parçacığında mysql_ li fonksiyonlu ö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.

Ayrıca PDO örneğinde ? yerine key (anahtar) isimler belirtipte ona göre dizide değer gönderebilirdik.. Yani şu şekilde bir örnekte yapabilirdik;


PHP:
$query = $db->prepare("INSERT INTO uyeler SET
uye_kadi = :kadi,
uye_sifre = :sifre,
uye_eposta = :eposta");
$insert = $query->execute(array(
      "sifre" => "123456",
      "eposta" => "maxi@maxigamerz.com",
      "kadi" => "CottonCandy",
));
if ( $insert ){
    $last_id = $db->lastInsertId();
    print "insert işlemi başarılı!";
}

Peki bunun ne farkı var?
diye soracak olursanız bu ş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;



PHP:
$update = mysql_query("UPDATE uyeler SET
uye_kadi = 'prototürk'
WHERE uye_kadi = 'CottonCandy'");
if ( $update ){
     print "güncelleme başarılı!";
}

PDO‘a update işlemi;

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

INSERT işleminde olduğu gibi burada da PDO güvenlik konusunda gerekeni yapmış oldu.
[h=3]DELETE İşlemi (Toplu)[/h] Toplu silme işlemlerinde mysql_li fonksiyonlar ve pdo ile birer örnek yapalım;
mysql_ li fonksiyonlarla silme işlemi;

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

PHP:
$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;


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

PDO da tek veriyi silme işlemi;

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


[h=3]Veritabanı Bağlantısını Sonlandırma[/h]
mysql_ li fonksiyonlarda bağlantı sonlandırma işlemi;

PHP:
mysql_close($baglanti);


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

PHP:
$db = null;

Object Mapping Olayı

Bunun mysql_ li fonksiyonlarda olmadığına eminim. Varsa bile ben hiç denk gelmedim ama yok yok tamam PDO ‘da ise böyle bir güzellik var.. Peki bu object mapping tam olarak nedir? ne işe yarar? Bunu bir örnek ile anlatsam daha mantıklı sanırım..

PHP:
<?php

class Uye {
   
   public function adsoyad(){
      return $this->uye_ad . ' ' . $this->uye_soyad;
   }

   public function rutbe(){
      if ( $this->uye_rutbe == 1 )
         return 'Yönetici';
      else
         return 'Üye';
   }

}

$query = $db->query("SELECT * FROM uyeler");
$query->setFetchMode(PDO::FETCH_CLASS, 'Uye');

foreach ( $query as $row ){
   print $row->adsoyad() . ': ' . $row->rutbe() . '<br />';
}

işinize yaradıysa TEŞEKKÜR ETMENİZ YETERLİDİR...
 
Şu PDO olayına alışamadım halâ inanın ki. Mysql ile işim yok fakay mssql'i sıklıkla kullanıyorum.
Mssql'in herşeyi iyiyken, birden Sql_Srv geldi (inanın daha hiiiç kullanamadım).
O da geçti PDO geldi. PDO'yu kullanabilenler için kesinlikle öneriyorum. Mükemmel bir bağlantı güvenliği sağlıyor herşeyin başında.
Fakat benim gibi kullanamıyorsanız, bir an önce öğrenmenizi tavsiye ederim.
Anlatım içinde çok teşekkürler :)
 
Şu PDO olayına alışamadım halâ inanın ki. Mysql ile işim yok fakay mssql'i sıklıkla kullanıyorum.
Mssql'in herşeyi iyiyken, birden Sql_Srv geldi (inanın daha hiiiç kullanamadım).
O da geçti PDO geldi. PDO'yu kullanabilenler için kesinlikle öneriyorum. Mükemmel bir bağlantı güvenliği sağlıyor herşeyin başında.
Fakat benim gibi kullanamıyorsanız, bir an önce öğrenmenizi tavsiye ederim.
Anlatım içinde çok teşekkürler :)

MySQL Sorgu Açıkları var PHP Resmi Sitesi'de Diyor Yakında PDO Geçiyoruz diye :)
 
Geri
Üst