Author Archives: Can Geliş

PHP: Composer Nedir? Nasıl Kullanılır?

Composer konusunda fazla Türkçe kaynak göremedim onun için burada Composer hakkında bir kaç şey anlatmak istedim. Composer’ın özelliklerinden bir tanesi, yazılımınızın veya kütüphanenizin ihtiyaç duyduğu diğer kütüphaneleri belirtebilmenizdir. Yani siz yaptığınız projenin nelere bağlı olduğunu, hangi kütüphanelere ihtiyaç duyduğunu belirtirsiniz ve Composer sizin için bunları indirir, kurar. Siz kullanıcıya yazılımınızı verirken içerisine bu ek kütüphaneleri eklemek zorunda kalmazsınız. Bu bağımlılıklardan bir taneside PHP versiyonunu belirtebilmeniz. Sizin yazılımınız minimum PHP 5.3 sürümünde çalışıyor ve kullanıcı 5.2 sürümüne sahip ise yazılımınız yüklenmez ve sizde bu ek yükü sırtınızdan atmış olursunuz. Continue reading

PHP & JQuery ile Comet Programlama

Günümüzün kaçınılmaz programlama tekniği olan comet programlamayla ilgili basit bir anlatım ve örnek olacak.

Comet programlama’nın amacı nedir?

Bildiğiniz gibi PHP ve JQuery ile yapabilecekleriniz sınırlı, çünkü sunucu ile ilişkiniz sayfa yüklendiği anda biter. Chat gibi uygulamalarda sunucuyla sürekli bağlantıya ihtiyaç duyarız, bunu aslında küçük bir hile ile ekstradan hiç bir tool kullanmadan halledeceğiz.

Başlarken…

Amacımız sunucu ile sürekli bağlantı sağlamak, yani bağlantımızı koparmamak. Madem sayfa yüklenmesi bittiği anda sunucu ile bağlantımız kesiliyor, bizde sayfanın yüklenmesini hiç bitirmeyeceğiz Nasıl? Sonsuz döngü ile. 🙂 Comet’teki asıl mantıkta burada. Sürekli bağlığız ne zaman ki yeni bir istek geldi (Mesela chat uygulamasında mesaj gelmesi) o zaman bağlantımızı kopartıyoruz yani sonsuz döngümüz bitiyor ve işlemek istediğimiz veriyi işliyoruz ve hemen ardından tekrar sunucu ile bağlantıda kalacak bir php sayfasını çağırıyoruz. Görüldüğü gibi çok zor değil. Şimdi gelelim Facebook, Gmail vs. gibi siteler bu işi nasıl yapıyor? Tamamen aynı! Şimdi size facebook’unuz açıkken arka planda ne olduğuna dair bir resim göstereceğim;

comet

En aşağıda gördüğünüz istek sürekli çalışıyor, yüklenmesi hiç bitmiyor, az önce anlattığım tekniği uyguluyor yani. Comet programlama ile yapılan örneklerde genelde veritabanı yerine dosyalar kullanılır. Bana göre bu pek gerçekçi bir örnek olmadığı için, size veritabanı ile bu işi nasıl halledeceğiz onu göstereceğim. Öncelikle az önce bahsettiğim sonsuz döngümüzde neler olduğunu bir anlatayım, daha sonra bu örneklerde neden veritabanı kullanılmıyor bunu sizde anlayabileceksiniz. Sonsuz döngümüz her zaman şunun kontrolünü yapar; Ben en güncel veriyi aldığımdan beri bir değişiklik olmuş mu? Şimdi eğerki veritabanı ile bu işi yaparsanız, yani siz en güncel veriyi aldığınızdan beri daha güncel veri gelmiş mi diye kontrol ederken veritabanı kullanırsanız şu olur; Sonsuz döngümüz 10 milisaniyede bir kontrol yapacak (10 ms sınırlamasını biz getireceğiz) 10 ms’de bir, veritabanı kontrolü yapılırsa ne olur? Siz tahmin edin 🙂 Dosya ile uygulanmasının sebebi şudur; En son güncel veriye sahip miyiz değil miyiz diye yaptığımız kontrolü dosyanın son değiştirme tarihine bakarak öğrenilir. Dosyanın son değişme tarihi bizim elimizde olan son değişme tarihinden büyükse daha güncel bir veri gelmiş ve hemen bunu alalım demek oluyor. Veritabanından 10 ms’de bir çekmekten çok daha etkili bir yöntem. Şimdi asıl sorunumuz neymiş? Veri en son ne zaman güncellendi bunun bilgisini sunucuda bir yerde saklamalıyız. Benim çözümüm bellekte tutmak yani; PHP’de memcache kullanmak. Bu yöntem ile dosya ile yapılan uygulamadan çok daha hızlı ve etkili erişebiliriz verimize. Eğerki windows kullanıcı iseniz memcache eklentisini php sunucunuza kurmanız gerekiyor, google’dan destek alabilirsiniz 🙂

Continue reading

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);