Sayfalar

PHP Kodlama Standartları - 4


Soyutlama (Abstraction) ozellikle Object Oriented (obje temelli) programlamada vazgecilmez bir programlama prensibidir.

Basitce soyutlama kavramini her zaman ve her sartta kullanilmaya uygun, mumkun olan butun kosullar ve hata senaryolari goz onunde bulundurularak yazilmis ve spesifik olmayip genel (jenerik) olarak kullanilabilen fonksiyonlar kullanimi olarak tanimlayabiliriz.

Bu makalenin konusuyla da ilgili bir ornek vererek soyutlama kavramini biraz daha aciklayalim.

Bir cogumuz MySQL ile calisacak programlar yazarken her seferinde, mysql_connect, mysql_select_db, mysql_query fonksiyonlarini ard arda yazarak cagiracagimiza bunlari 'wrapper' (kapsayici,ortucu) denen fonksiyonlar icinde koyarak basit bir veritabani_sorgula() fonksiyonuna indirgeyebiliriz. Bu sayede hem kodumuz cok daha kisa bir hale gelecektir hem de daha onemlisi iki ay sonra PostgreSQL ile calismaya karar verdigimizde kodumuzu bu yeni veritabanina uyarlamak cok daha kolay olacaktir. Tek yapmamiz gereken veritabani_sorgula fonksiyonuna geri donup onu PostgreSQL ile calisacak sekilde uyarlamaktir.

Peki kodumuzu baska bir veritabanina uyarlamak bu kadar kolaysa PHP'nin en son surumuyle gelen DBX Soyutlama fonksiyonlarina neden bu kadar seviniyoruz. Bunun birkac sebebini asagida siraliyorum.

1) Yeni baslayan PHP programcilari soyutlama veya wrapper kullanimi konusunda bilgisiz olduklarindan her veritabaninin kendi fonksiyonlarini kullanmaya alismaktadir. Bu cok verimsiz bir kodlama seklidir.
2) Soyutlama ve Wrapper fonksiyonlardan faydalanan programcilarin hemen hemen hepsi bu fonksiyonlarin kendi versiyonlarini yazmaktadirlar. Bu yuzden ne belli bir standard olusmakta ne de her zaman ve her ortamda kullanilabilecek bir beceri kazanilmaktadir. Ayrica bu kitapliklar yanlizca bir programcinin urunu oldugu icin yeterli optimizasyon saglanamamaktadir. Ayrica programcinin hic tecrubesi olmadigi bir veritabaninda bu kitapliklar kullanilamaz.
3) Ilave moduller ve kitapliklar halinde bir cok veritabani soyutlama kitapligi olmasina ragmen bunlarin kullanimi standard bir boyuta ulasmamistir. 2. basamakta rastlanilan sorunlarin coguna daha az bir seviyede de olsa burda da rastlanmaktadir. Ayrica bu moduller buyuk cogunlukla PHP'de yazildiklari icin PHP'nin kendisinin yazildigi dil gibi daha asagi seviyede calisan dillerde yazilan fonksiyonlara nazaran daha verimsiz olmaya mahkumdurler.
4) Bu kitapliklar standard bir PHP kurulumunda olmayacagindan kodunuz bir makinede calisirken digerinde calismayacaktir. Ozellikle tumuyle kendinize ait olmayan ortamlarda bu buyuk bir sorun yaratacaktir.

Peki DBX bize ne kazandiracak?

DBX ile birlikte bir veritabanina baglanip, sorgulama ve sonuclari alma isi tam anlamiyla bir standard haline gelmistir. Hangi veritabanini kullandiginiza bagli olmaksizin ayni ODBC ve JDBC teknolojilerinde oldugu gibi ayni fonksiyonlari kullanarak desteklenen her turlu veritabani ile calisma imkaniniz olacaktir.

Eger kodunuzu baska bir veritabanina uyarlamaniz gerekirse tek yapmaniz gereken en bastaki hangi tur bir veritabanina baglanildigini belirleyen secenegi yeni veritabanina degistirmektir. Bunu yaptiktan sonra teoride kodunuz yeni veritabani ile hic bir kod degisikligine gereksinim kalmadan calisacaktir.

Bu asamada aklimizda tutmamiz gereken 4.0.6 ve DBX'in cok yeni teknolojiler oldugu ve henuz butun veritabanlarini desteklemedigi. Tabi ki acik kod felsefesi sayesinde az veya cok kullanilan veritabanlarinin hepsinin en kisa zamanda desteklenmeye baslayacagindan hic suphemiz yok.
Ornegimize gecmeden once su anda desteklenen veritabanlarina goz atalim. Bu makale yazildigi sirada MySQL,PostgreSQL, Microsoft SQL Server, ve ODBC destekleniyor. Bu arada Oracle,Sybase,DB2 gibi diger bazi veritabanlari desteklenmemesine ragmen ODBC destegi sayesinde bunlarin da DBX ile kullanilmasi mumkun. Unutmadan, DBX'i kullanabilmek icin kurulum asamasinda ./configure 'e --enable-dbx i de eklemek gerekiyor.

Ornek 1.

Bu ornegimizde tek yaptigimiz mysql veritabanina bir baglanti kurup, baglantinin kuruldugunu onayladiktan sonra baglantiyi kapatip cikmak.

<?php
$link = dbx_connect ("mysql", "localhost", "veritabani_adi", "kullanici_adi", "sifre")
or die ("Veritabanina Baglanilamadi");
print ("Veritabanina baglanti saglandi");
dbx_close ($link);
?>

Ikinci ornegimizde ise veritabanimizdaki isciler_tablosu tablosundan iscilerin
ad ve soyadlarini ekranda listeleyen kucuk bir program yazacagiz.

Ornek 2.

<?
// Ilk basamak veritabanina baglantiyi saglamak
$db = dbx_connect ("mysql", "localhost", "veritabani_adi", "kullanici_adi", "sifre");

// Ikinci olarak veritabani sunucusuna bir sorgu yolluyoruz.
$sonuc = dbx_query ($db, "SELECT ad, soyad FROM isciler_tablosu");

// dbx_query() fonksiyonu hata halinde '0' gonderiyor.
// Basarili bir sorgu sonucunda ya '1' ya da varsa sorgu sonuclari gonderiliyor.
if ($sonuc == 0)
{
echo 'Sorgu Calismadi<br />';
}
else
{
// Sorgumuzun sonucu olarak kac sonuc satiri gonderildigini $sonuc
// objesinin 'rows' (satirlar) degiskeninden ogreniyoruz.
// Bu bir sonraki dongu icin gerekli.
$sonuc_satirlari = $sonuc->rows;

// Veritabaninin gonderdigi satirlari bir bir geziyoruz.
for ($satir = 0; $satir <= $sonuc_satirlari; $row++)
{

// Sonuclari sonuc objesinin 'data' degiskenini kullanarak tablodaki alan
// isimlerini denk gelen degiskenleri cagirarak aliyoruz.
echo 'Isci Adi: '.{$sonuc->data[$satir]["ad"]}.'<br />';
echo 'Isci Soyadi: '.{$sonuc->data[$satir]["soyad"]}.'<br />';
}
}

// En son olarak da veritabanina actigimiz baglantiyi kapatiyoruz.
dbx_close($db);
?>

DBX konusunda dikkat etmeniz gereken bir ozellik sonuc satirlarini veritabanindan istemek icin bir fonksiyon bulunmayisi. Yani mysql_fetch_array, mysql_fetch_row tarzi fonksiyonlar kullanilmiyor. Butun sorgular calistirildiklari halde otomatikman sonuclari da bir array'e atiyorlar. Yani dbx_query hem sorgu hem de sonuclari alma islemini yerine getiriyor.

Diyelim ki bu ornegi PostgreSQL ile calistirmak istiyoruz.. Tek yapmamiz gereken ilk satirdaki dbx_connect() fonksiyonundaki ilk parametre olan 'mysql' i , 'pgsql' ile degistirmekten ibaret.

DBX'in kullaniminin cok hizli bir sekilde artacagindan emin olabilirsiniz. Lutfen bu konudaki sorularinizi forumlarimiza tasiyiniz. Tekrarliyorum, PHP 4.0.6'yi --enable-dbx ile configure etmediyseniz bu fonksiyonlari kullanamazsiniz.