Ultimate MySQL Sınıfı

Bir süredir geliştirdiğim ufak çaplı PHP + MySQL uygulamalarında Jeff Williams tarafından yazılmış olan Ultimate MySQL sınıfını kullanıyorum. En temel ihtiyaçlarımı karşılamakla beraber kolay geliştirilebilir bir yapısı olduğundan her yeni projede ihtiyaca göre üzerine bir şeyler ekleyebiliyorum.

PHP Classes sitesindeki Ultimate MySQL sayfasından sınıfı edinebilirsiniz. İsterseniz GetXML ve GetJSON fonksiyonlarını eklediğim ve ufak bir problemini düzelttiğim versiyonu buradan indirebilirsiniz. Aslında eklediğim daha bir çok fonksiyon olmasına rağmen, kimisi projeye yönelik olduğundan kimisini ise çok fazla kontrol etmediğimden (SQL Injection sorunuyla karşılaşmanızı istemem) en güvenilir bulduğum şekilde yayınlıyorum.

Paketin içinde çok kapsamlı bir yardım dosyası (help.html – İngilizce) yer alıyor. Ben de kısaca bir kaç örnek vereyim;

include("mysql.class.php");

$vt = new MySQL();
$vt = new MySQL(true, "veritabanı");
$vt = new MySQL(true, "veritabanı", "sunucu", "kullanici_adi", "parola");

Öncelikle mysql.class.php dosyamızı projemize dahil ediyoruz. tek bir veritabanı ile çalışıyorsanız, mysql.class.php dosyasını açıp, varsayılan sunucu ve veritabanı bilgileri girebilirsiniz. Böylece hiç parametre vermeden nesneyi yarattığınızda varsayılan değerler ile bir bağlantı yaratılır. Sunucu ve veritabanı bilgilerini parametre olarak geçerek birden çok sunucuya/veritabanına özel bağlantılar da oluşturabilirsiniz.

Kayıt ekleme:

$degerler["Ad"] = MySQL::SQLValue("Elma");
$degerler["Adet"]  = MySQL::SQLValue(6, MySQL::SQLVALUE_NUMBER);

$sonuc = $vt->InsertRow("meyveler", $degerler);

if (! $sonuc)
  $vt->Kill();
else
  echo "Yeni kayıt numarası: " . $sonuc;

Kayıt güncelleme:

$filtre["Id"] = 4;

$degerler["Ad"] = MySQL::SQLValue("Armut");
$degerler["Adet"]  = MySQL::SQLValue(3, MySQL::SQLVALUE_NUMBER);

if (! $vt->UpdateRows("meyveler", $values, $filtre))
  $vt->Kill();

Kayıt Silme:

$filtre["ID"] = 4;

if (! $vt->DeleteRows("meyveler", $filtre))
  $vt->Kill();

Kayıt Çekme:

$filtre["Ad"]     = MySQL::SQLValue("Armut");

$sonuc = $db->SelectRows("meyveler", $filtre);

if (! $sonuc)
  $db->Kill();
else {
  $db->MoveFirst();
  while (! $db->EndOfSeek()) {
    $satir = $db->Row();
    echo $satir->Ad . " " . $row->Adet . "\n";
  }
}

Bunlar dört temel işlemi ne kadar kolay yapabileceğinizi gösteriyor. Sınıf bu kadarla sınırlı değil. SQL sorguları yazıp çalıştırmanıza imkan sağlayan metotlar, tablo yapısı ile ilgili işlemler yapabilmenizi sağlayan metotlar vb bir çok yararlı metoda sahip. Biraz kullandıktan sonra hemen alışıyorsuınuz.

Takıldığınız yerlerde yardım istemekten çekinmeyin. Sınıfı ben geliştirmedim belki ama elimden geldiğince yardımcı olmaya çalışırım.

PHP ile uygulama geliştirmek – Bölüm 2′ye Ek

Bu makale < ?PHP echo “Merhaba Türkiye”; ?> gruplarında yazmaya başladığım PHP ile uygulama geliştirmek yazı dizisinin ikinci bölümüdür. Halen gelecek vaat etmeyebileceği konusunda ısrarcıyım. Taslaktır, geliştirilebilir.

Araya baya uzunca bir süre girdi ama bu yazı dizisine devam etmeye kararlıyım. Kaldığımız yerden devam edelim. Bir önceki yazımın sonunda da belirttiğim gibi önceki yazıda constantlardan da bahsetmeyi planlamış fakat unutmuştum. Bir önceki yazıyı güncellemek yerine yeni bir yazı yazarak constantları daha derinlemesine incelemeye karar verdim. Yazının geri kalanında constant kelimesi yerine sabit kelimesini kullanacağım.

Şimdi düşününce önceki yazıda sabitlerden bahsetmemek isabet olmuş. Neden diye soracak olursanız, değişkenlerden, değişken değişkenlerden bahsederken sabitlerden bahsetmek kafa karıştırabilirdi. Neyse lafı fazla uzatmadan konuya girelim.

Değişkenlerle karşılaştırıldığında çok daha az özelliğe sahip olan sabitlerin en önemli özelliği global tanımlayıcılar olmalarıdır. Bir kere tanımladıktan sonra isterseniz fonksiyon içinde isterseniz sınıf içinde rahatça kullanabilirsiniz. Sabitlerde saklayabileceğiniz veri tipleri sınırlıdır(metin(string), tamsayı(integer), mantıksal(boolean) ve ). Global olmaları ve sınırlı veri tipi gibi sebeplerden genellikle uygulamaların ayar bilgilerini saklamak için kullanılır ve bu işte oldukça iyidirler.

Sabitleri tanımlamak değişkenlere nazaran oldukça farklılık gösterir. Sadece define() fonksiyonu ile tanımlanabilirler ve bir kere tanımlandıktan sonra içeriği değiştirilemez ya da yok edilemez (Sihirli sabitler (Magic Constants) haricinde (ki onlar da aslında sabit sayılmazlar)). Değişkenleri tanımlarken değişken isminin başına konan $ işareti sabitlerde kullanılmaz. İsimlendirme konusunda değişkenlerle hemen hemen aynı kurallara tabidir. Büyük/Küçük harf duyarlıdırlar ama bir zorunluluk olmasa da sabit isimleri genelde tamamıyla büyük harflerden oluşur. Geçerli bir sabit ismi bir harf ya da alt çizgi ile başlar ve devamında istenildiği kadar harf, sayı ya da alt çizgi kullanılabilir.

< ?php
// Geçerli sabit tanımlamaları
define("MEYVA", "Elma");
define("SEBZE3", "Patlıcan");
define("_ARABA", "Şahin");

// Geçersiz sabit tanımlamaları
define("3SEBZE", "Patlıcan");
define("SEBZE-3", "Patlıcan");
?>

Ufak bir uyarı; aşağıdaki kullanım doğru ve geçerli olmakla beraber kullanılmaması tavsiye edilir. PHP gelecekte sizin verdiğiniz isimle aynı isimde bir sihirli sabit tanımlarsa uygulamanızda problemler ortaya çıkabilir.

< ?php
define("__SEBZE__", "Patlıcan");
?> 

PHP’de önceden tanımlanmış bir çok sabit vardır. Bunları Öntanımlı Sabitler(Predefined Constants) başlığı altında PHP Manual‘da bulabilirsiniz. (PHP_OS, PHP_VERSION vb.) Bir çok öntanımlı sabit bulunmasına rağmen her zaman bunların hepsini kullanamayabilirsiniz. Bazı öntanımlı sabitler belli uzantıların (extension) yüklü olmasını gerektirir. (PEAR_INSTALL_DIR vb.) Değişken yaratırken ve kullanırken bunları aklınızdan çıkarmayın.

Gelelim yazıda da bir kaç kez adı geçen sihirli sabitlere. Şu an için 5 adet olan bu sabitlerin isimleri sabit olsa da belirli durumlarda değerleri değişebilir.

İsim Açıklama
__LINE__ O an PHP derleyicisi tarafından İşlenen satır numarası
__FILE__ Çalışmakta olan sayfanın tam adresi
__FUNCTION__ İşletilmekte olan fonksiyonun ismi
__CLASS__ İşletilmekte olan sınıfın ismi
__METHOD__ Sınıfa ait metodun ismi

Evet, bir bölümün (daha doğrusu ara bölümün) daha sonuna geldik. Önceki yazıda bahsettiğim gibi, gelecek yazıda veri tipleri ve operatörler hakkında karalayacağım.

Mutlu kodlamalar!

Gettext ile PHP uygulamalarınıza çoklu dil desteği

Aziz Nesin‘in “Parle Vu Fransızca” adlı bir öyküsü vardır. Şuradan öğrendiğime göre “İnsanlar Uyanıyor” adlı kitabında yer alıyor bu öykü. Öykünün kısa bir özetini geçeyim sizlere.

İstanbul’da Fransız bir bayan, yardımcı olabileceği düşüncesiyle trafik polisine adres danışır. Sen misin danışan. Yardımsever trafik polisi kendisi fransızca bilmediği için yoldan çevirdiği insanlardan yardım ister. Turist bir kere yakayı kaptırmıştır. Polis sorunu çözmeden bayanı bırakmak istemez. Çaresizce sokakta fransızca bilen birilerini aramaktadır. İşler çığırından çıkar, polisin ve bayanın çevresi kalabalıklaşır, insanlar kalabalığı gördükçe meraktan daha fazla toplanmaya başlarlar. Olaylar gelişir…

Halbuki bir gettext fonksiyonu olsa bir de gerekli dil dosyası, ne kadar rahat anlaşırdık o fransız bayanla. Gerçek hayatta belki çok işinize yaramayabilir ama programlarınıza çoklu dil desteği eklemek istiyorsanız ve nereden başlayacağınızı bilmiyorsanız gettext ilginizi çekecektir.

gettext fonksiyonlarını C, C++, Phyton, Java, Perl gibi bir çok dilde kullanabilirsiniz. Ben size PHP’deki kullanımından bahsedeceğim.

Öncelikle sunucunuzun PHP ayarlarını kontrol etmelisiniz. gettext fonksiyonlarını kullanabilmek için php_gettext genişleme paketinin aktif olması gerekmektedir. phpinfo() ile PHP kurulum ayarlarınızı ekrana dökün. “gettext” kelimesini arattırın. Karşınıza “GetText Support enabled” yazısını bulduysanız bir şey yapmanıza gerek yok. Eğer phpinfo() çıktısında gettext ile ilgili bir şey bulamıyorsanız, php.ini dosyanızda “php_gettext.dll” diye aratın, bulduğunuz satırın başındaki noktalı virgül (;) işaretini kaldırın ve dosyayı kaydedin. Web sunucunuzu baştan başlatın ve tekrar phpinfo() çıktısını kontrol edin. Her şey yolunda gittiyse phpinfo() çıktısında “gettext” diye arattığınızda “GetText Support enabled” yazısını görmeniz lazım. Bunları yapmanıza rağmen göremiyorsanız php kurulumunuzu gözden geçirin.

gettext fonksiyonlarının aktif olduğunu kabul ederek devam ediyorum. Bu noktadan sonra oluşturacağınız tüm dosyaları UTF-8 karakter setini kullanarak oluşturun. İlk olarak yeni bir php dosyası yaratın ve içine şunları yazın.

[PHP]
< ?php
echo gettext(“Merhaba Türkiye”);
?>
[/PHP]

Tarayıcınızla bu dosyayı çağırdığınızda “Merhaba Türkiye” çıktısını alacaksınız. her seferinde gettext yazmaya üşenenler _() fonksiyonunu da kullanabilir. Aşağıdaki kod da “Merhaba Türkiye” çıktısını üretecektir.

[PHP]
< ?php
echo _(“Merhaba Türkiye”);
?>
[/PHP]

Dil değiştirmenin zamanı geldi. Öncelikle uygulamamızda dil değiştiğinde değişmesi gereken metinlerden bir katalog oluşturmamız lazım. Bunun için bir kaç seçeneğimiz var. Bunlardan biri GNU gettext for WIN32 benzeri windows için hazırlanmış bir program kullanmak bir diğeri de ücretsiz poEdit programını kullanmak. Katalog dosyanızı kendiniz de yaratabilirsiniz ama büyük projelerde tavsiye etmem. (Hatta hiç tavsiye etmem) Benim tercihim poEdit’den yana. Windows versiyonunu kullanıyorum. Kısaca katalog oluşturmayı da anlatayım.

Dosya menüsünden Yeni katalog seçeneğini seçtiğinizde karşınıza bir pencere geliyor. Birinci sekmede kataloğun genel ayarlarını yapıyorsunuz. Projenin ismi, kataloğun hangi dilde hazırlandığı, karakter kümesi, kaynak dosyaların karakter kümesini projenize uygun olarak seçtikten sonra ikinci sekmede projenizin çalıştığı yolu ekliyorsunuz. örneğin “c:\apache\htdocs\gettext_ornek\” şeklinde. Üçüncü sekmede ise projede kullandığınız ve çeviri için kullanılacak fonksiyon isimlerini giriyorsunuz. Eğer projenizde “_” ya da “gettext” fonksiyonlarından birini ya da ikisini beraber kullandıysanız bu kısımdan ekleyin. Tamam tuşuna bastığınızda .po dosyanızı nereye kaydetmek istediğinizi soracak. Şimdilik kolayca erişebileceğiniz bir yere kaydedin. Kaydet tuşuna bastığınızda projeniz taranacak ve belirtmiş olduğunuz fonksiyonlardan çevirisi yapılacak metinlerin bir listesi ekrana gelecek. Tamam’a tıkladığınızda çevrilecek metinler ekranda sizi bekliyor olacak. “Merhaba Türkiye” metnini “Hello Türkiye” olarak çevirip .po dosyanızı “mesajlar.po” ismiyle kayıt edin. Kayıt ettiğinizde otomatik olarak .mo dosyanız da oluşacaktır. .mo dosyası da nereden çıktı diyeceksiniz. .mo dosyası da .po dosyanızdan üretilen paketlenmiş katalogdur diyebiliriz.

Katalog dosyamızı da oluşturduğumuza göre bu katalog dosyasını php ile kullanarak projemizi nasıl başka bir dilde çalışır hale getirebileceğinizi bir örnek ile anlatayım.

Öncelikle projenizin kök dizininde “diller” adıyla bir klasör yaratın. “diller” klasörünün altına de ingilizce için “en” adıyla yeni bir klasör yaratın ve son olarak da “en” klasörünün altında “LC_MESSAGES” adıyla yeni bir klasör yaratın. Daha önceden poEdit ile hazırlamış olduğumuz .po ve .mo dosyalarını “LC_MESSAGES” klasörünün altına taşıyın ve isimlerini “mesaj.po”, “mesaj.mo” olarak değiştirin. Aşağıdaki gibi bir klasör yapınız oluşmuş olması lazım.

[code]
/diller
/en
/LC_MESSAGES
mesaj.po
mesaj.mo
[/code]

Artık her şey yerli yerinde. Şimdi sıra php kodunda. Kodunuzu aşağıdaki gibi değiştirin.

[PHP]
< ?php
$locale = “en”;
putenv(“LC_ALL=$locale”);
setlocale(LC_ALL, $locale);
bindtextdomain(“mesaj”, “./diller”);
textdomain(“mesaj”);

echo _(“Merhaba Türkiye”);
?>
[/PHP]

Programınızı çalıştırdığınızda ekranda “Hello Türkiye” çıktısını göreceksiniz. Peki projeniz yeni kodlar eklediniz ve bunların da kataloğa eklenmesi gerekiyor. Ne yapacaksınız? çok basit. Örneğin kodumuza yeni bir satır ekleyin.

[PHP]
< ?php
$locale = “en”;
putenv(“LC_ALL=$locale”);
setlocale(LC_ALL, $locale);
bindtextdomain(“mesaj”, “./diller”);
textdomain(“mesaj”);

echo _(“Merhaba Türkiye”).”
“;
echo _(“Websiteme hoşgeldiniz”);
?>
[/PHP]

poEdit ile ingilizce .po dosyanızı açın ve araç çubuğundan güncelleme çubuğuna basın (eğer değişmediyse soldan sağa üçüncü tuş. Dünyanın çevresinde dönen oklar olan.) Program kodunuzu inceleyerek yeni satırı kataloğa ekleyecektir. Hemen yeni cümleyi çevirin. “Welcome to my website”. Dosyı kaydedip PHP programınızı çağırdığınızda aşağıdaki çıktıyı elde edeceksiniz.

[code]
Hello Türkiye
Welcome to my Website
[/code]

Diyelim ki gettext ile çevrilen bu metinleri her seferinde echo ile ekrana basmak yerine ufak bir fonksiyon kullanmak istediniz. Örneğin;

[PHP]
< ?php
function _e($metin) {
echo _($metin);
}

_e(“Merhaba Türkiye”);
?>
[/PHP]

Katalog ayarlarında anahtar kelimeler sekmesinde bu yeni fonksiyonunuzu da tanıtırsanız ilk güncelleme sırasında yeni fonksiyonunuz ile kullandığınız metinler de katalog dosyasına eklenecektir.

Genel olarak gettext ile anlatacaklarım bu kadar. Kafanıza takılan ya da anlamadığınız bir nokta varsa elimden geldiğince yardımcı olmaya çalışırım.