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.
Basarilar.
Oktay Altunergil
oktay@turk-php.com
http://www.turk-php.com/
|