Tag Archives: oop

PHP: Singleton Pattern

Amaç:

Bir classtan sadece bir instance(obje) oluşturulması.

Gerçek hayattan örnekler:

  • Bir bilgisayarda bir tane mouse cursor’ı olmalı.
  • Her bilgisayar ağ üzerinde bir tane internet bağlantısına ihtiyaç duyar. (Diğer bilgisayarlar aynı bağlantıyı kullanır, yeni bağlantı oluşturulmaz)

Nasıl yapacağız:

Öncelikle dışarıdan yeni obje üretimi engellememiz gerekiyor. Bunun için class’ın constructor’ını  private yapıyoruz. Kullanıcıların(programcı veya kendiniz) class’a ulaşmaları için static method belirliyoruz. Static method objeye ait değildir class’a aittir. Bu yüzden adı üstünde statiktir.

Örnek (veritabanı bağlantısı):

Bir web sayfamız olduğunu düşünelim, 4 kere require_once çağırıyor. ve çağırdığı her dosya veritabanı bağlantısı kuruyor. Gereksiz yere 4 tane veritabanı bağlantısı kurmuş oluyoruz bu durumda. 1 tane kurarak hepsini onun üzerinden yapmamız gerekiyor. Aşağıdaki örnekte sadece 1 tane PDO objesi yaratılıyor.

class SingletonDB {
    private static $instance;
    private function __constructor() {}
    public static function getInstance() {
        if (!isset(self::$instance)) {
            self::$instance = new PDO('mysql:host=localhost;dbname=test',"root","şifre");
        }
        return self::$instance;
    }
}

Çağırılış şekli: Static fonksiyonlar objeye ait olmadıkları için obje ismiyle değil class ismiyle çağırılırlar.

$db = SingletonDB::getInstance();
$stmt = $db->prepare("SELECT * FROM liste WHERE id = ?");
$stmt->execute(array(1));
$sonuc = $stmt->fetchAll();
print_r($sonuc);

gibi 🙂  

PHP: Prepared Statements: PDO Class

Bu anlatımımda php’de PDO classını kullanarak Prepared Statements hazırlayacağız. Öncelikle prepared statements’ın ne olduğuyla başlayalım. Prepared statement: Direk türkçe karşılığı gibi olacak ama daha önceden hazırlanmış ve ileride çalıştırılacak bir durum. Ne faydası var ?

mysql_query("SELECT * FROM liste WHERE id = 1");
mysql_query("SELECT * FROM liste WHERE id = 2");
mysql_query("SELECT * FROM liste WHERE id = 3");

gibi 3 tane sorgumuz olduğunu varsayalım. Her 3 sorguda da veritabanı kendini hazırlıyor ve queriyi çalıştırıyor. Prepared Statements’ta sorgumuzu bir kere hazırlıyoruz ve ardından id değerlerini değiştirip çalıştırıyoruz. Yani sorgumuzu 3 kez hazırlamadık 1 kez hazırladık ve 3 kez çalıştırdık. Bu da performans artışı demek oluyor :). Prepared Statements bizi SQL Injectionlardan da koruyor aynı zamanda. Şuraya da bir göz atabilirsiniz: 
http://www.cangelis.com/neden-pdo-veya-mysqli-kullanmaliyiz/

Şimdi gelelim PDO’yu nasıl kullanıyoruz. İlk olarak constructor:

PDO::__construct() ( string $dsn [, string $username [, string $password [, array $driver_options ]]] ) 

$dsn: Data source name, genelde PDO Driver ismidir. İşimiz veritabanları olduğu için şöyle örnekler vereyim: mysql için: mysql:host=hostname;dbname=ssldb SQLite: sqlite:/tmp/foo.db gibi örnekler verebiliriz.

$username, $password: kullanıcı adı şifre.

$driver_options: driver ile ilgili seçenekler. http://tr2.php.net/pdo PDO Drivers altında veritabanları var, içlerinde seçenekler konusunda bilgiler var.

$db = new PDO("mysql:host=localhost;dbname=test","root","şifre");

işte mysql bağlantımızı kurduk 🙂 Şimdi ise en üstteki örneğimizi PDO classını kullanarak, çalıştıralım.

prepare (hazırla):

PDOStatement PDO::prepare ( string $statement [, array $driver_options = array() ] ) 

ilk parametremiz $statement queryimiz oluyor 2. si ise $driver_options yukarıda anlattığım gibi.

yukarıda oluşturduğumuz bağlantı üzerinden;

$stmt = $db->prepare("SELECT * FROM liste WHERE id = ?");

prepare fonksiyonu PDOStatement objesi döndürür. Bunuda $stmt (statement’ın kısaltılmışı) değişkenine kaydediyoruz. Ve statement’ımızı çalıştırıyoruz:

bool PDOStatement::execute ([ array $input_parameters ] ) 

Çalıştırmak için execute() kullanıyoruz. Parametre olarak sorguya gönderilecek değerleri array olarak alıyor. Sonucunda başarı durumuna göre true veya false döndürüyor.

$stmt->execute(array(1));
$stmt->execute(array(2));
$stmt->execute(array(3));

Şimdi ise farklı bir yöntem kullanarak sorgumuza değişken bağlayacağız. Nasıl ? Sorgumuzu şöyle prepare ettiğimizi varsayalım (parametreler her zaman : ile başlar)

$stmt = $db->prepare("SELECT * FROM liste WHERE id = :id");

:id diye bir parametre ekledik. Daha sonra bu parametreye bir değişken bağlayacağız.

bool PDOStatement::bindParam ( mixed $parameter , mixed &$variable [, int $data_type = PDO::PARAM_STR [, int $length [, mixed $driver_options ]]] )

bindParam fonksiyonu ile. Parametrelerini inceleyelim,

$parameter: parametre (örneğimizde “:id”)

$variable: buraya hangi değişkene bağlıyacağımızı belirliyoruz dikkat ederseniz $variable’ın başında “&” işareti var bu değişkenin değeri değil değişkenin referansının gönderildiği anlamına geliyor. Örnekte daha iyi anlayacaksınız.

$data_type: veri tipimiz (integer,string vs.) zorunlu değildir.

$length: uzunluk, zorunlu değildir.

$driver_options: daha önce anlatmıştım, zorunlu değildir.

bir yukarda sorgumuzu hazırladık şimdi değişkenimizi bağlayalım.

$stmt->bindParam(":id",&$id);

$id değişkenini bağladık. Şimdi nasıl execute() edeceğiz görelim.

$id = 1;
$stmt->execute();
$id = 2;
$stmt->execute();
$id = 3;
$stmt->execute();

bu kadar basit. Değer değiştikçe execute edilecek sorguda değişiyor. Çünkü $id değişkeninin referansını gönderdik, değerini değil. Şimdi sorgumuzun sonucunu alalım.

array PDOStatement::fetchAll ([ int $fetch_style [, mixed $fetch_argument [, array $ctor_args = array() ]]] ) 

parametrelerin ne anlama geldiğini http://tr2.php.net/manual/en/pdostatement.fetchall.php adresinden öğrenebilirsiniz. Çok fazla detaya girmek istemiyorum. Fonksiyon sonuç olarak bir sonuç arrayi döndürüyor.

$sonuc = $stmt->fetchAll();
print_r($sonuc);

işte bu kadar sonuçlarımızda aldık. Dilerseniz bir foreach döngüsüyle $sonuc‘u işleyebilirsiniz. PDO’nun daha birçok fonksiyonu var ama en temel olanlar bunlar. İstek olursa hepsini farklı bir anlatımda anlatabilirim. Kolay gelsin. Son kodumuzuda yazayım:

$db = new PDO("mysql:host=localhost;dbname=test","root","şifre");
$stmt = $db->prepare("SELECT * FROM liste WHERE id = :id");
$stmt->bindParam(":id",&$id);
$id = 1;
$stmt->execute();
$sonuc = $stmt->fetchAll();
print_r($sonuc);
$id = 2;
$stmt->execute();
$sonuc = $stmt->fetchAll();
print_r($sonuc);
$id = 3;
$stmt->execute();
$sonuc = $stmt->fetchAll();
print_r($sonuc);