You are on page 1of 117

NDEKLER

NDEKLER.......................................................................................................................................1 Kiisel Web Server Kuralm...............................................................................................................8 PWS Kurulurken Hata Verirse.............................................................................................9 Bir rnek Yapalm...............................................................................................................................10 Internette ASP .....................................................................................................................10 ODBC liyor Mu?.................................................................................................................14 ASPnin Unsurlar...............................................................................................................................14 ASPnin Dili..........................................................................................................................................15 Bir iki yazm kural................................................................................................................17 Deikenler.........................................................................................................................................18 Kt programcl nlemek iin!.......................................................................................18 Array Fonksiyonu.................................................................................................................19 Sabit Deerler.......................................................................................................................22 VBScriptte lemciler (Operatrler)...................................................................................22 VBScriptde Program Kontrol..........................................................................................................23 Mantksal Snamalar.............................................................................................................23 If.. Else.................................................................................................................................23 Dnen Deer.......................................................................................................................24 Select Case.........................................................................................................................25 Dngler................................................................................................................................26 For..Next dngs...............................................................................................................26 While...Wend.......................................................................................................................27 Do..Loop..............................................................................................................................28 Tesadf Say.......................................................................................................................30 Tam Say Elde Etmek iin: Int ve Round.............................................................................30 Dizi deikenler iin dng: For Each..Next........................................................................31 Dngy durdurmak isterseniz............................................................................................31 Sreler (Prosedrler).........................................................................................................32 Sk Kullanacamz Hazr Fonksiyonlar .............................................................................33 Tarih ve saat........................................................................................................................34 Karakter-dizisi Dzenleme...................................................................................................34 Dizi-Deiken (Array) Fonksiyonu......................................................................................35 Test Fonksiyonlar................................................................................................................37 Hata (Err) Nesnesi................................................................................................................39 Dosya Sistemi Nesnesi......................................................................................................................40
ACTIVE SERVER PAGES 1

Metin (TextStream) Nesnesi...............................................................................................................44 Metin Dosyas Oluturma (CreateTextFile)........................................................................44 Varolan Metin Dosyasna Ek Yapma (OpenTextFile)........................................................44 Sunucu (Server) Nesneleri.................................................................................................................46 Server Nesnesi.....................................................................................................................46 Talep (Request) Nesnesi......................................................................................................48 QueryString ve Form...........................................................................................................48 ServerVariables (Server Deikenleri)................................................................................48 Cookie (erez).....................................................................................................................51 Sertifika Nesnesi..................................................................................................................51 Karlk (Response) Nesnesi...............................................................................................52 Cookieler.............................................................................................................................52 Metodlar...............................................................................................................................52 zellikler..............................................................................................................................53 Uygulama (Application) ve Oturum (Session) Nesnesi....................................................55 ActiveX Veri Eriim (ADO) Nesneleri................................................................................................56 ODBC ve OLE-DB ................................................................................................................57 Connection (Veritabanna balant)....................................................................................58 Recordset (Kayt dizisi)........................................................................................................58 Hzl SQL Kursu: Select.......................................................................................................59 Recordset.Open...................................................................................................................60 ADO Sabit Deerleri.............................................................................................................60 Recordset.Update................................................................................................................61 Recordset.Delete.................................................................................................................62 Recordset.AddNew..............................................................................................................62 DSNsiz Veri Balants........................................................................................................62 Veri ile HTML Etiketlerini Doldurma...................................................................................63 Seme Kutular: SELECT....................................................................................................63 aretleme Alanlar: INPUT-RADIO.....................................................................................66 aretleme Alanlar: INPUT-CHECHBOX............................................................................67 ASP Kaynaklar...................................................................................................................................69 Doum Gn Hesab............................................................................................................71 ift Trnak Gerekince!..........................................................................................................73 HTML Dnda erik.............................................................................................................73 Baka Sayfaya Ynlendirme...............................................................................................74 Ziyaretiden Bilgi Alma........................................................................................................75 Form etiketlerinden bilgi alma............................................................................................79 Parola le Sayfa Koruma......................................................................................................80 Dinamik indekiler Sayfas.................................................................................................81
ACTIVE SERVER PAGES 2

Gecikme Bildirme Sayfas...................................................................................................84 Form Deerlerini Yakalayalm.............................................................................................86 Veri iin hazrlk..................................................................................................................................94 naata Balarken...............................................................................................................................95 ODBCe Veritabanmz Bildirelim.......................................................................................96 Sra Web Programnda........................................................................................................96 Elektronik Adres Dorulama.............................................................................................................109 Zararl Kod Temizleme.......................................................................................................................112 ADO Gvenlii ve Hata Mesajlar......................................................................................................114 ASP Hatas Arama..............................................................................................................................116 leri ASP Konular................................................................................................................................116

ACTIVE SERVER PAGES

nsz 1
Merhaba: Ben bilgisayar hastasKroninukus computeriumniversiteyi yeni bitirmi bir gencim. Byte dergisiyle verilen "Internet Tasarm Rehberi" kitapn okuyarak HTML'i renmeye alyorum ve bu konuda ok istekliyim. Bundan iki ay kadar nce bir shareware program kullanarak bir site hazrladm. Fakat bu program kullanmak iin hi bir HTML etiketini renmek gerekmiyordu. Oysa ben kendi abalarmla bu ii halletmeyi ve hatta daha da ileri gtrmeyi dnyorum. Sizden ricam bana nereye gitmem gerektiini bildirmeniz, ve bunun iin gerekli bilgi ve belgeleri salamanz, bizlere yardm etmenizdir. Gayretleriniz iin ok teekkr ediyor, almalarnzda baarlar diliyorum. Merhaba: ok deil, bir buuk yl nce yazdnz bu mektuba, o gnden beri srekli karlk verdim. nce Byte, ardndan PC World ve imdi de PC Life dergisinin eki kitapklarla, bu arzunuzu yerine getirdik. Size bir harita sunduk; bu haritaya gre ilerlediniz. HTMLden sonra site yeri edinme yollaryla ie baladk. Ardndan HTMLin duraan kalbn yrtmak iin JavaScript rendik. Sonra, sitemizi ziyaret edenlerle etkilemeli sayfalar yapmak, onlardan Form yoluyla bilgiler almak, konuk defterleri yapmak iin CGI imkanlarn kullanmak amacyla Perle sra geldi. imdi yolun sonundayz. ASP teknii ile sitelerimizi veritabanna dayal hale getireceiz; Server nesnelerini kullanarak gerek dinamizme kavuturacaz. Bunu yaparken Visual Basic Scripting Edition (veya ksa adyla VBScript) ile tanacaz. Geri bu ve gelecek ay sunacamz ASP Uygulamalar kitapyla, birlikte yrmek zere izdiimiz eitim dneminin sonuna gelmi oluyoruz; ama sizin nnzde uzun bir yol var. Bu yol, Internet denen yeni iletiim aracn kullanarak, toplumumuza yeni bir soluk kazandrma yoludur. Bu yolda yalnz ilerleyeceksiniz. Bilgisayarnzn ekrannn aydnlatt yolda, klavye ile ba baasnz. Kalbiniz ve onu dolduran Biliim Teknolojisi ak size rehber olacak. Daha reneceiniz ok ey var hayatta. Hergn yeni teknolojilerin kt bir alan setiinizin farkndasnz. Sakn kafanz karmasn: Siz ustasnz; teknoloji, ad stnde, aratan ibaret. Hergn yenisi ile karlatnz teknolojiler sizi korkutmamal. Srasyla hepsini baaracaksnz. rendike, ok deil bir ay nce sizi korkutan bir dilin, bir tekniin ne kadar basit olduunu greceksiniz. Asla Ben bunlarn hepsinin altndan nasl kalkarm? demeyeceksiniz. Srasyla hereyi renebilirsiniz. Daima unu tekrar edin: renen nasl rendi ise, ben de renirim! Bu yolda aklnz ve kalbiniz size rehber olacaktr. Yeter ki onlara kulak verin. ASP veya Active Server Pages (Etkin Sunucu Sayfalar) teknii, sayfalarnz canlandracak bir tekniktir. Bu teknik, bir ka sayfa sonra greceksiniz ki, sil batan bir bilgisayar programlama dili renmeye gerek olmadan uygulanabilir. Bu kitap yazarken sizinle yolun bandan beri beraber olduumuzu, yani HTML bildiinizi varsayyorum. Ayrca Webin nasl altn, Server (Sunucu) ve Client (stemci) ilikisinin nasl yrdn de biliyor olmalsnz. ASP teknolojisinden yararlanmak istediinizde Web sitesine evsahiplii yapan bilgisayarda almakta olan Web Servern ASP teknolojisini tanmas ve sitenize bu hizmeti vermesi gerekir. ASP, bir zamanlar sadece Microsoftun NT ve daha sonra Windows 2000 iletim sistemine dayanan MS-IIS (Internet Information Server) programnda ileyebilirdi. Fakat imdi artk NT-tabanl dier Web Server programlar gibi Unix-tabanl Web Server programlar da
ACTIVE SERVER PAGES 4

ASP anlar ve iletir hale gelmi bulunuyor. Fakat ASP sayfalarnz gerek Internet ortamnda ziyaretilerinizin hizmetine sunmadan nce, kendi bilgisayarnzda snamanz gerekir. Bunun iin bilgisayarnzn iletim sistemi Windows 95/98 ise Kiisel Web Server (PWS), NT 4.0 ise IIS kurulmu olmaldr. Sisteminiz Windows 2000 ise, IIS 5.0 kendiliinden kurulmu demektir. imdi biraz ASPden sz edelim. Bu ksaltmay, a..se..pe veya ey-es-pi diye harf-harf okuyanlar olduu gibi, eyspi diye bir kelime halinde okuyanlar da vardr; ve bana sorarsanz, hepsi de dorudur. Internet programclar, btn grevi bir sabit diskteki HTML dosyalarn alp, ziyaretinin Browserna gndermekten ibaret olan Web Server programn yeniden tasarlamaya baladklarnda, Servern sadece duraan sayfalar gndermesi yerine, ziyaretiden de veri kabul etmesinin uygun olacan dndler. Bu amala Internet istemcisi ile sunucusunun bulutuu noktada, yani Common Gateway Interface (Ortak Geit Arayz) katmannda Web Server programnn, istemci programdan (browser) kendisine bilgi ve komutlar gnderilmesini saladlar. rnein bir Formdaki bilgilerin alnp, bir dosyaya kaydedilmesi iin vereceimiz komut, sitemizin bulunduu bilgisayarn iletim sisteminde CGI katman tarafndan icra ettirilir. Bu manada CGI, Web Servern Internet ziyaretisinin Browsern gelen bilgi ve komutlar iledii veya kendi iletim sistemine aktard noktadr. Bu gelimenin sonucu olarak ortaya CGI program dediimiz eyler kt. Perl, C/C++, Delphi, Visual Basic ile yazlan bu programlar Web Server tarafndan altrlr, ve verecei komutlar iletim sistemine iletilir. CGI programlar ile ok ey yaplabilir; fakat Web Servera ayn anda birden fazla kii eriir ve ayn CGI programn altrrsa, (yani ayn anda ayn formun Gnder dmesini tklarlarsa), CGI programnn birden fazla kopyas almaya balar. Ayn anda ayn forma ulaan kii says 4-5 ise bu belki sorun oluturmaz; ama bu say arttka Web Server da adeta yerlerde srnmeye balar! zetle CGI programlar Web Server yavalatr. Microsoft programclar biraz geriden gelmekle birlikte Server iine el attklarnda, istemci ile sunucunun etkilemesini, btn sistemi yavalatan haric programlar yerine, iletim sisteminin bir ilevi haline getirebileceklerini dndler. Bunun yolu ise iletim sisteminin Uygulama Program Arayz (API, Application Programming Interface) denen unsurlarn kullanmakt. Nitekim Microsoft, oturup bir dizi Internet Server API (veya ksaca ISAPI) tasarlad. ISAPI, tpk CGI gibi, Web Server programnn bulunduu bilgisayardaki dier programlarla alveriini salar. Ne var ki ISAPIden yararlanan programlar reterek bunlar Web Servern emrine vermek olduka pahal bir yol. Baka bir deyile, bir formda Gnder dmesinin alabilmesi iin szgelimi Excel ayarnda bir program yazdrtmak pek akl kr olmasa gerek. Bu noktada eitli firmalar ISAPI benzeri yorumlayclar gelitirerek, dz yaz bir Script yazmakla ve bu Scriptin iindeki komutlar Server programna icra ettirmekle, Web tasarmcsnn hayatn ok kolaylatrabileceklerini grdler. Microsoftun bu noktadaki zm ASP oldu. Yani bir bakma Servera Aktif Sayfalar sunma teknolojisi! NetObjects firmas kendi Server Extensionlarn gelitirdi. Linux-Unix dnyasnda bir baka grup PHP dilinden yararlanarak PHP Sayfalar sistemini gelitirdi. Bunlardan sadece MSun ASP teknolojisi birden fazla dil ile Script kabul edebilen teknoloji olarak, dierlerinden ayrld. Bu noktaya birazdan geleceiz; ama nce ASP nasl alr? sorusunun zerinde duralm. Ama nce biraz baa dnelim: Siz Web ziyaretisi olarak Browsernzn URL hanesine bir HTML sayfasnn Internet yolunu ve adn yazp (rnein, http://www.pclife.com.tr/index.htm)
ACTIVE SERVER PAGES 5

Git dmesini tkladnzda veya klavyede Enter/Return tuuna bastnz zaman ne olur? Web Server, Internetin bulutlar arasndan geip kendisine gelen bu istem zerine, index.htmi bulur ve yine ayn bulutlarn arasndan sizin blgisayarnza kadar gnderir. ASP teknoloji ile reteceiniz sayfann adnn uzatmas ise .asp eklinde olur. Siz bu kez URL hanesine bu dosyann adn (rnein http://www.pclife.com.tr/index.asp) yazarsnz. Bu durumda Web Server, bu sayfay alp, doruca size gndermez: nce iindeki kodlar icra eder. Sonra bu kodlar ayklar ve geriye saf ve temiz HTML kalr. Ve bu sayfa, bizim Browsermza gnderilir. Yukardaki son cmleyi ltfen yeniden okur musunuz? Nelere dikkat ettiniz: 1. ASP sayfasnn iinde kod vardr. 2. ASP sayfasnn kodlar Web Server tarafndan icra edilir. 3. ASP sayfas, Browsera salt HTML olarak gelir. imdi burada ASP ile Javascriptin farkn grebiliyor musunuz? Javascript, HTMLin iine konuluyor; ama Serverda deil, Browserda alyor. Peki CGI/Perl program ile ASPnin farkn grebiliyor musunuz? HTML sayfasn Perl ile yazdnz program retiyor (print <HTML>\n; kodunu hatrlyor musunuz?); oysa ASPde ziyaretiye gidecek HTMLi Server ve tasarmc birlikte retiyorsunuz. Bu bakmdan, Javascript istemci-tarafnda alrken, ASP, CGI programlar gibi, sunucu-tarafnda alr. Bunun sonucu ise ASP ile yazacanz sayfalarn, ziyaretinin bilgisayarnda kurulu Browser program ne olursa olsun (Netscape Navigator, Opera, Amaya, Internet Explorer), mutlaka grntlenecek olmasdr. ASP sayfalarnza koyacanz VBScript kodlar Serverda icra edilecei iin, ziyaretinin Browsernn rnein VBScripti tanmayan Netscape olmas, sizi hi etkilemeyecek. Bununla birlikte ASP yoluyla reteceiniz sayfalarda yer alacak dinamik HTML kodlarnn, her Browserda mutlaka arzu ettiiniz gibi yorumlanmayacan unutmamalsnz. Peki, ASPnin iinde HTML ile kod yan yanadr, dedik. Nedir bu kodlar? Hangi dille yazlr? ASP yoluyla Web Servera vereceiniz komutlar ieren bu kodlar, tabir yerinde ise, arzu ettiiniz bir Script dili ile yazlabilir. Bu VBScript olabilir; Javascript veya Jscript olabilir; hatta, MSun yeni teknolojisi olan Windows Scripting Host ile uyumlu olmak kouluyla, kendi Script dilinizi icad edip, bunu Web Servera retecek plug-in (ek program) gelitirebilirsiniz. lk dnemlerinde ASP kodlarn VBScript ile yazmak adeta artt. Giderek daha ok kaynakta ASPnin Javascript ile yazldn gryorum. Fakat BT gibi srekli gelien ve yenilenen bir alanda, Web tasarmcsn yeni bir dille tanmasna imkan salamak iin bu kitapkta kodlarmz VBScript ile yazacaz; dolaysyla kitapn byke bir blm VBScripte ayrlacak. imdi kollar svayp; ie balyoruz. Bir dizinin sonu olan bu kitap, Kroninukus computeriuma adyorum. Sadece BT alannda deil, tm yaamnda yolun ak ve aydnlk olsun. Bu eitime birlikte baladmzda bilgisayar hastas idin; eer imdi usta bir bilgisayar hastas olman salayabildimse, ben grevimi yerine getirmi saylrm. Bundan sonra sra sende. imdi yardm edecek olan sensin. Bu yardm kimseden esirgeme. Kim olduunu ve ilevini daima hatrla. Kalbinde duyduun arya her zaman kulak ver.

rnek Kodlar
ki kitapktan oluan ASP rehberinin btn rnek kodlar ve veritaban dosyalar, http://www.pclife.com.tr/......... adresinden edinilebilir. Ancak ASP renirken rnek kodlar kendiniz yazmalsnz. Kodlamann incelikleri ancak kodlar siz yazarsanz renilebilir. Bu
ACTIVE SERVER PAGES 6

rneklerden sadece kendi yazdnz kodlar hata verdii ve hatay bulmaktan glk ektiiniz zaman, karlatrma amacyla yararlanmalsnz.

Teekkrler
Bu kitapktaki kodlarn deiik ortamlarda snanmas iin iin bana yardmc olan dilini ve yazmn denetleyen dostlarm Mustafa Durcan, Osman Nuri Hmek ve Armaan Ergona teekkr ederim. Varolan hatalar elbette bana aittir. Sevgili arkadam Mustafa Durcann btn dizinin geliimine katksn daima kranla hatrlayacam.

ACTIVE SERVER PAGES

ASPye Giri
Bir HTML sayfay snamak iin sadece Browser programna ihtiyacnz var; bir HTML belgesini iki kere tkladnzda varsaylan Browser alacak ve bu sayfay yorumlayarak, grntleyecektir. Fakat uzatmas .asp olan bir dosyay iki kere tkladnzda ya Windows size bu dosyay hangi programla amak istediinizi soracak; ya da MS Visual Studio veya Adobe Photoshop alacaktr. Bilgisayarnzda MS Visual Studio program kurulu ise, onun almas normal: nk MSun ASP dahil hemen hemen btn Web tasarm aralar Visual Studionun yesi. Photoshop ise renk paletlerini belirlemek zere kulland dosyalara .asp uzatmasn veriyor. Bilgisayarnzda MS Visual Studio kurulu deilse, fakat Photoshop varsa, ASP dosyalarnzn simgesi Photoshopa ait olacaktr. MS Visual Studiodan yararlanmyorsanz, ASP dosyalarnz, (herhangi bir klasrn Grnm mensnden Klasr Seenekleri maddesini seerek ve nc sekme olan Dosya Trlerini tkladktan sonra ASP satrn iaretleyerek ve Dzenle dmesine basarak) Not Defteri ile ilikilendirmek en doru yoldur. Bu, bu kitapktaki rnek ASP dosyalarn oluturmak, dzenlemek, deitirmek iin kullanacamz balca programn da herhangi bir dzyaz program olduu anlamna gelir. ASP retim iini herhangi bir ortamda yapabilirsiniz. Bunun iin bilgisayarnzda mutlaka Windows kurulu olmas gerekmez. Fakat ASP dosyalarnn alp almadn snamak iin sayfalarnz gerek Web Servera gndermeden nce kendi bilgisayarnzda altrmanz gerekir. Bunu Kiisel Web Server (PWS) veya IIS ile yapacaz.

Kiisel Web Server Kuralm


Bilgisayarnz Windows 95, 98, NT4 WorkStation veya NT4 Server ile alyorsa, sisteminize bir Web Server programn siz kurmak zorundasnz. Windows 2000 Professional veya Windows 2000 Server ise Kiisel Web Server programn kendiliinden kurar. Windows 98e bir kiisel Web Server kurmaya gemeden nce bilgisayarmza bir kimlik vermemiz gerekir: Bilgisayarm/Denetim Masas/A tklayarak aacanz diyalog kutusunda ikinci sekme olan Tanmlamay an ve Bilgisayar ad kutusuna istediiniz ad yazn. Bilgisayarn a ortamnda olmas gerekmez. Windows 98e Kiisel Web Server kurmak iin iki yol izleyebilirsiniz. Windows 98 CDROMunda Add-ons klasrndeki PWS dizininde Kur.exeyi tklayn veya Windows NT Option Pack CD-ROMunda Default.htmi an. Bilgisayarnzn Windows 98 ile altn alglayacak olan program size Personal (kiisel) Web Server (PWS) kurmay nerecektir. Kiisel Web Server kurarken her iki durumda da ikinci diyalog kutusunda Minimum/En az veya Typical/Tipik seeneini deil, Custom/zeli sein ve alacak yeni diyalog kutusunda Microsoft Data Access Components (MS Veri Eriim Bileenleri) satrna iaret koyarak, Alt Bileenleri Gster dmesini tklayn. Alacak seme kutusunda ise ADO Documentation satrna iaret koyun. Bu belgelerden daha sonra veri-ynlendirmeli Web Uygulamas yaparken yararlanacaz. Kiisel Web Server kurulduktan sonra bilgisayar yeniden balatmak gerekir. //////////////////////KUTU//////////////////
ACTIVE SERVER PAGES 8

PWS Kurulurken Hata Verirse Windows 98e PWS kurarken, programn Microsoft Transaction Server blmne ilikin sistem kaytlar yaplrken, iki hata mesaj ile karlaabilirsiniz (0x80004005 ve 0xfee662). Bu, orijinal Windows 98 CD-ROMundaki PWS Kur programnn, Windows Registry dosyasnn byk olmas halinde hata vermesinden kaynaklanyor. Byle bir durumla karlarsanz, Bilgisayarm/Denetim Masas/Program Ekle Kaldr araclyla, Personel Web Server kaldrn. Bilgisayar kapanp aldktan sonra, Windows 98 CD-ROMunda Addons/PWS dizinindeki btn dosyalar, sabit diskinizde Temp dizinine kopyalayn. Sonra http://support.microsoft.com/support/kb/articles/q246/0/81.asp adresinde Download Mstsetup.dll satrn tklayn. Mssetup.exe adl bir dosya bilgisayarnza indirilince; bu dosyay iki kere tklayn ve dosyann geniletilecei yer olarak C:\Tempi gsterin; program Mstsetup.dll dosyasnn deitirilmesini isteyip istemediinizi sorduu zaman Tamam tklayn. imdi, C:\Tempdeki Kur.exe (Windows CD-ROMunuz ngilizce ise Setup.exe) programn iki kere tklayn. PWS imdi hatasz kurulacaktr. Windows NT4.0 Workstation veya Servera IIS4.0 kurmak iin Option Pack CD-ROMundaki default.htmi altrmanz ve alacak Browser penceresinde IISi kurma seeneini tklamanz yeter. Burada da ADO Documentation sabit diskinize aktarabilmek iin gerekli seeneki iaretleyin. Windows 98e Kiisel Web Server kurulduunda Masastnde Yaymla (Publish) adl bir simge belirecektir. NT sistemlerinde ise Balat mensnde Programlar blmne IIS Manager satr eklenir. Bu yollardan biriyle PWS veya IISi altrn. Kiisel Web Serverda Personel Web Server Manager (Ynetici) kutusu aldnda soldaki ara ubuunda Yneticinin eitli blmlerine gitmeniz iin gereken gezinme simgelerini greceksiniz. imdi, alan ana pencerede iki unsura dikkat edin: 1. Kiisel Web Servernzn ad. Bilgisayarnzn ad buraya Server ad olarak yazlm olmal. Biraz sonra, Internete koymadan nce snayacamz ASP sayfalarn arrken, Browsern adres kutusuna burada grdmz ad yazacaz. 2. Kiisel Web Servern bilgisayarmzda sabit diskteki gerek adresi. Bu, sizin Kiisel Web Servernzn kk (root) dizinidir. Bu genellikle C:\inetpub\wwwroot klasrdr. Kiisel Web sitesi yaparsanz, sitenin gerektirdii btn dizinleriniz ve dosyalarnz burada grdnz dizinin iinde olmaldr. Yapacamz ASP dosyalarn ite bu dizinin iine koyacaz. Bunlar bir kenara not ettikten sonra, soldaki ara ubuunda Gelimi simgesini tklayn; ortadaki pencerede sanal dizinlerinizi gryorsunuz. Bunlardan Homeu sein ve sadaki zellikleri dzenle dmesini tklayn. Ana dizinin okuma, yrtme ve makro eriim haklarnn iaretli olmasna dikkat edin. lerde kendinize Kiisel Web Servernzn kk dizininde yeni bir dizin oluturursanz (rnein resimler gibi) ve iine sitenizle ilgili dosyalar koyarsanz, Gelimi penceresinde Ekle dmesini tklayarak bu gerek dizini de sitenin sanal dizinlerinden biri haline getirmeniz gerekir. Gerek dizinin ad XYZ bile olsa, sanal dizin haline getirirken istediiniz sanal ad verebilirsiniz. Ama unutmayn, Browsern adres hanesine gerek dizin adn deil sanal dizin adn yazmanz gerekir. Bu ilemleri IISte deiik aralar ve diyalog kutularyla, fakat temel ilkeler itibariyle ayn ekilde yapabilirsiniz. NT4 sistemlerine IISi kurmadan nce, Service Pack 3 uygulayn; Internet Explorer 5i kurun. Elinizde varsa Service Pack 4, 5 veya 6y en son uygulayn.
ACTIVE SERVER PAGES 9

Bu noktada, ASP sayfalarnz snayacanz bilgisayarda Microsoft Internet Explorer programnn kurulu bulunmasnn art olmadn hatrlatalm. ASP sayfalarnz Netscape ile de snayabilirsiniz.

Bir rnek Yapalm


imdi ilk ASP sayfamz yapalm ve bununla kiisel Web Server programnn alp almadn snayalm. Buraya kadar anlam olduunuz gibi ASP sayfas da HTML gibi dz yaz dosyasdr; dolaysyla beendiiniz bir dz yaz program ile ASP yazabilirsiniz. imdi an en beendiiniz dz yaz programn ve balayn yazmaya. Eer kelime-ilemci kolaynza gidiyorsa, dosyay ASCII veya ANSI biiminde kaydetmeyi unutmayn (10ncu satrn sonunda nokta olduuna dikkat edin):
<HTML> <HEAD> <TITLE>ASP ILE ILK SAYFA</TITLE> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254"> </HEAD> <BODY> <H1><CENTER>Merhaba Dnya!</H1> <H2>Bugn: <% Response.Write(Date) %>. </CENTER </H2> </BODY> </HTML>

Bu dosyay merhaba.asp adyla kaydedin ve kendi bilgisayarnzda kiisel Web Serverda veya ISSte snayacaksanz, bu programlar altrn. Browsernzn URL hanesine, kiisel Servernzn adyla birlikte dosyann adn yazn; ve ilk ASP programnz dnyaya Merhaba desin. Internette ASP ASP teknolojisi ile oluturduunuz sayfalar, yani iinde ASP teknolojisinin gerektirdii kodlar bulunan HTML dosyalarn, .asp uzatmasyla kaydederiz. Bu dosyalar talep edildiinde, Web Server program, eer ASP teknolojisini tanyorsa, talep edilenin ASP sayfas olduunu dosya adnn uzatmasndan anlar; ve bu sayfay ziyaretiye yollamadan nce kendisi ileme tabi tutar. ASP sayfamzdaki kodlar byk bir ihtimalle bir takm dinamik iler yapacak, rnein hesaplamalar, aratrmalar, veri tabanndan veri ekme, dosya sisteminden dosya isteme gibi grevlerini yerine getirecek, ve ortaya kacak olan HTML dosyasn ziyaretiye gnderecektir. Diyelim ki bu kitapktaki rnekleri yaptnz ve cretsiz Site yeri edinmi
ACTIVE SERVER PAGES 10

olduunuz Hosting firmasnn bilgisayarndaki sitenize yerletirdiniz. Sonra Browsernzn URL hanesine bu ASP dosyasnn adn yazdnz ve sayfay talep ettiniz. Karnza, ya ASP sayfasnn iindeki kodlar grntleyen veya sadece sayfann HTML unsurlarna yer veren bir sayfa geldi! Bu Servernzn ASP anlamadn gsterir. ASP sayfalarnz ASP-uyumlu Web sunucularnda altrabilirsiniz. Sitenizde ASP sayfalar bulunacaksa ve cretli evsahibi firmalardan site alan edinecekseniz, sunucunun ASP-uyumlu olmasna dikkat edin. imdi, ilk ASPmizi altrdmza gre, biraz teknikten sz edebiliriz. HTMLin ziyaretinin bilgisayarnda altn biliyorsunuz; istemci Browser, sizin URL hanesine adn yazdnz HTML dosyasn yine adresteki sunucu Web Serverdan ister. Web Server da bu dosyay bulur ve iinde kaytl resim ve dier unsurlarla birlikte istek sahibine gnderir. Fakat kimi zaman Servera bize sadece bir dosyay gndermesini deil, fakat bu dosyann iinde kaytl komutlar varsa onlar icra etmesini de bildirebiliriz. Bunu yapmann bir yolu CGI programlardr. Bir dier yolu ise ASPdir. Web Server, kendisinden bir ASP belgesi talep edildiinde, kendi kendine Dur bakalm! ASP istendii zaman hemen alp gndermek yok, nce bunu ASP.DLL programna gnderelim.. Ondan sonra iimize devam ederiz! der. ASP.DLL, kendisine bir .asp dosyasnn geldiini grnce, hemen ASPlerin Anayasas olan global.aspnin alp almadna bakar. global.asa, tpk dier ASP dosyalar gibi bir dz yaz dosyasdr ve ASP programlarnn alma koullarn dzenleyen kurallar ierir. (Bu dosyay sras gelince ele alacaz.) Yukardaki rnekte grdmz gibi ASP dosyas hem HTML kodlar ierir, hem de iinde bir Script diliyle yazlm kodlar vardr. ASPye program zellii kazandran bu Script dili ile yazlm kodlardr. ASP.DLL, nce gelen .asp dosyasnda hangi Script dilinin kullanldna bakar ve bunun iin gerekli ortam oluturur; yani bu Script dilini yorumlayacak program altrr; bu program Scripti yorumlar ve icra edilecek komutlar icra eder; ASP.DLL, icra edilen komutlar, iletim sisteminin yardmn istiyorsa (rnein bir veritabanndan veri ekmek gibi, veya dosya sistemine bir dosya atrmak, yazdrmak, sildirmek gibi) bu yardmn edinilmesini de salar. Btn bu ilerin sonunda sizin yazdnz HTML kodlarna ek yapmak (rnein bir tablonun iini, ekilen verilerle doldurmak veya dosya sisteminden edinilen bir dosyann ieriini sayfaya aktarmak gibi) gerekiyorsa bu ekleri ASP.DLL yapar. ASP.DLL, kendisine sevk edilen dosyay satr satr okur ve nce dosyadaki ASP kodlarnn gerektirdii HTML deerlerini bulur; yani nce ASP icra edilir, gerei yerine getirilir. Sonra HTML blmleri ile birletirilip sonuta sunucuya saf ve temiz bir HTML sayfas gnderilir. Bu sayfann iinde bir satr bile ASP kodu bulunmaz. Eer sayfanza ziyaretinin Browsernda almas amacyla Javascript veya VBScript kodlar koydu iseniz, elbette bu kodlar HTMLin paras olarak ziyaretiye gidecektir. Fakat giden sayfada artk ASPye ilikin hi bir ey kalmam olacaktr. Biliyorsunuz, mevcut srmleri itibariyle Browser programlar iinde Netscape VBScript dilini anlamaz. ASP sayfalarmzda istediimiz Script dilini kullanabiliriz; VBScript de kullanabiliriz. Netscapein VBScript anlamamasyla, ASP sayfalarmzda VBScript kullanmamzn bir ilgisi yoktur; nk ASP sayfasnn ortaya kartaca HTML kodunda ASP dolasyla VBScript bulunmayacaktr; dolaysyla ASP sayfalarnz, Netscape tarafndan da anlalp, grntlenebilecektir. Tabi ortaya kacak HTML sayfasnn Netscape tarafndan arzu ettiiniz gibi grntlenebilmesi iin Netscapein anlayabildii dinamik HTML unsurlarna yer verme zorunluunuz hl devam ediyor.
ACTIVE SERVER PAGES 11

ASP tekniinin nasl altn anladmza gre imdi biraz terminoloji serpitirelim ki, Webmaster meslektalarnzla biraraya geldiinizde, gerekten ASP ile mesela Javascript arasndaki fark bildiiniz belli olsun. ASP bir Server-Side Script teknolojisidir. Internette istemci ile sunucu arasndaki izginin sunucu tarafna Server-Side (Sunucu Taraf), istemci tarafna da Client-Side (evet, doru tahmin ettiniz: stemci Taraf) denir. Server-Sideda alan Script programlar da Server-Side Script (Sunucu Taraf Scripti) adn alr. Dolaysyla yle bir sayfa yaparsanz (merhaba.htm), bu sayfada Client-Side Script teknolojisi kullanm olursunuz:
<HTML> <HEAD> <TITLE>JavaScript ile Tarih</TITLE> <meta http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <meta http-equiv="Content-Type" content="text/html; charset=windows-1254"> </HEAD> <BODY BGCOLOR=WHITE> <H1>Merhaba Dnya</H1> <H2>Bugn:</H2> <H3> <SCRIPT LANGUAGE=JAVASCRIPT> <!-tarih = new Date(); document.write(tarih); //--> </SCRIPT> .</H3> </BODY> </HTML>

HTML sayfanza <SCRIPT>..</SCRIPT> etiketleri arasna yerletireceiniz bu kodun almas iin Servern hibir ey yapmas gerekmez; kodu Browser altracak ve gnn tarihini size (Trkeletirmediiniz iin ngilizce olarak) bildirecektir. imdi, bir de Server tarafnda alan Script ieren sayfaya rnek verelim (merhaba2.asp). Bu kodu yazarken kapanan Script etiketinden sonra nokta olduuna dikkat edin:
<HTML> <HEAD> <TITLE>VBScript ile Tarih</TITLE> <meta http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <meta http-equiv="Content-Type" content="text/html; charset=windows-1254"> </HEAD>
ACTIVE SERVER PAGES 12

<BODY BGCOLOR=WHITE> <H1>Merhaba Dnya</H1> <H2>Bugn:</H2> <H3> <SCRIPT LANGUAGE=VBScript RUNAT=SERVER> Response.write(Date) </SCRIPT>. </H3> </BODY> </HTML>

Bu sayfada kullandnz Scripti VBScript ile yazdnz farkettiniz. Yani? Bu HTML sayfas, Netscapede grntlenemez! Hayr. Grntlenir, nk Scripti Netscape deil, Server altracak. Bunu <SCRIPT> etiketinin iindeki RUNAT zellii ile belirtiyoruz. (Run, altr; at ise iinde, zerinde anlamna gelir. RUNAT ...de altr gibi bir anlama sahiptir.) Burada RUNATin karsna yazdmz SERVER ifadesi ile, Scriptin Browsera gnderilmeden nce Serverda altrlmasn salyoruz; Servera Bu Scripti Serverda altr! demi oluyoruz. Netscape bu sayfay grntleyecektir; ama galiba bir terslik var. merhaba.asp ile merhaba2.aspnin ekran grntlerini ve kodlarn karlatrrsanz, birinde noktann olmas gereken yerde olduu halde dierinde noktann yanl yerde olduunu gryoruz. Oysa iki kodu da karlatrrsanz, ikisinde de nokta iareti, kodun bittii yerde yer alyor. Yukarda ASPnin icrasnda HTML sayfa Servera verilmeden nce ASP.DLL tarafndan iindeki ASP kodlarnn icra edildiini sylemitik. Nitekim, burada grdnz gibi, ASP.DLL, HTML sayfay iinde Servern altrmas gereken blmle birlikte Servera gnderdi; Server kendisine gelen dosyada kendi icra etmesi gereken (RUNAT=SERVER zellii verilmi olan Scripti) blm icra etti ve sonucu Browsera aktard. Yani, Servern altrd Scriptin sonucu sayfaya ASPden sonra eklendi. Dolaysyla, nokta, yanl yerde kald. Bundan kartacamz sonu u olacak: ASP sayfalarmza, Browser, Server ve ASP.DLL tarafndan altrlacak kodlar yerletirirken, srasna dikkat edeceiz ve hangi srada icra edilmelerini istiyorsak, o srada koyacaz. Server ile ASP.DLLin ilikisi sadece Script dilini altrmaktan ibaret deildir. ASP, istemciden gelen HTTP stemi (Request) ve HTTPye giden Karlk (Response) unsurlarndan tutun, ActiveX Data Objects (ADO, AcvtiveX Veri Nesneleri) araclyla, iletim sisteminin sunaca veritabanna eriim imkann ve iletim sisteminin sunduu dosya ynetimine kadar bir ok imkan kullanr. Bu imkanlar ASPnin eline getii anda nesne (Object) saylrlar imdi bu nesnelere biraz yakndan bakabiliriz.

ACTIVE SERVER PAGES

13

ODBC liyor Mu? Kollar svayp, ASPye kodu yazmaya balamadan nce yapmamz gereken bir i daha var: ASP sayfalar gelitirme ortammzda, ODBC (Open Database Connectivity, Ak Veritaban Balants) olmas gerekir. Windows 98, 95 (OSR2) veya NT4.0 iletim sisteminizde Denetim Masasnda ODBC, ODBC32 veya ODBC Veri Kaynaklar (32 Bit) adl bir simge gryor olmalsnz. Bunu an, Sistem DSN sekmesini ve alan pencerede greceiniz Ekle dmesini tklayn. Buradaki Access, dBase, Excel, FoxPro, Paradox srcleri 4.00.3711.08 veya daha byk m? Deilse, Microsoftun sitesinden (http://www.microsoft.com/data/download.htm) Microsoft Data Access Components (srm 2.1.1.3711.11 GA, 6.2 MB) gncelleme dosyasn indirin ve sisteminizi gncelletirin. Windows 2000 kurulu sistemlerde bunu yapmaya gerek yok. Bylece sisteminiz, ilerde yazacamz veri-ynlendirmeli Web uygulamalar iin hazr hale gelmi olacaktr.

ASPnin Unsurlar
ASP tasarmcs olarak, biz gerekte ASPnin Nesneleri ile bireyler yaparz; baka bir deyile ASP kodlarmz bu nesnelere yneliktir, onlar kullanma ve onlardan bir sonu alma veya onlara bir sonu aktarma amacna yneliktir. ASPnin Nesneleri alt grupta toplanr: Application/Uygulama: Bir ASP sitesi, gerekte bir Uygulama Program olarak grlr. Bu, HTML/CGI geleneine aina tasarmc iin yeni bir kavram. ASPyi icad edenler; bir ziyareti bir ASP sayfasndan girerek, bir sitede surfinge baladnda, onu bir program ileten bilgisayar kullancs olarak gryorlar. Bylece, sitemiz, her ziyaretinin karsna ktnda bir program alm gibi saylyor. Bu yaklamn Web tasarmcs olarak bize kazandrd imkanlar ele alacaz. Session/Oturum: Bir ziyareti sitemize geldiinde, hangi sayfamz talep ederse etsin, bu balant ASP asndan bir oturum saylr. Her oturumun belirli bir sre devam eden zellikleri, deikenleri ve deerleri vardr. Site tasarmnda oturum zelliklerinden geni lde yararlanacaz. Request/Talep: Browserdan Servera ulaan btn bilgiler, Request (Talep) nesnesinin geleridir. Bu nesneyi kullanarak, istemciden gelen her trl HTTP bilgisini kullanrz. Response/Karlk: Serverdan ziyaretinin bilgisayarna gnderdiimiz btn bilgiler, erezler (cookie) ve balklar (Header) Response (Karlk) nesnesinin geleridir. Bu nesneyi kullanarak ziyaretiye gndermek istediklerimizi gndeririz. Server/Sunucu: ASP, Web Server programn bir nesne olarak ele alr ve onun bize salad aralar ve imkanlar kullanmamz salar. ObjectContext/Nesne Balam: Microsoftun Transaction Server (MTS) programnn sunduu hizmetlere erimemizi salar. MTS, ASP sayfalar iinden, uygulama programlarndan yararlanmamz salar. ASP uzmanlnz ileri dzeylere ulatrdnz zaman MTS ve ObjectContext nesnesinden yararlanabilirsiniz.

ACTIVE SERVER PAGES

14

ASPnin Dili
ASP, bir teknolojidir. Kendi bana bir yazm kural yoktur. ASP tekniini kullanabilmek iin, ASP sayfasnn talep edilmesi halinde ziyaretiye gnderilmeden nce ASP.DLLye teslim edilmesi bu teknolojinin kullanlabilmesi iin hemen hemen tek arttr. Bunu, dosya uzantsn .asp yaparak salarz. ASP.DLL ise, dnyada mevcut btn Script dilleri ile verilecek komutlar kabul edebilir. Sadece ASP.DLLe sayfadaki kodlarn hangi dilde olduunu sylemeniz gerekir. Bunu, ASP sayfasnn birinci satrnda yaparz. rnein ASPye VBScript dilini kullanmasn belirtmek iin bu satr yle yazarz:
<% @Language=VBScript %>

ASP sayfalarnda genellikle VBScript, JavaScript ve JScript kullanlr. Ancak rnein Perl dilinden tretilen PerlScript, PHPden tretilen PHPScript de giderek ilgi eken ASP dilleri arasna giriyor. Bir ASP sayfas iinde farkl Script dilleri kullanlabilir. Biz bu kitapkta rneklerimizi VBScript diliyle yazacaz.

ACTIVE SERVER PAGES

15

VBScripte Giri
Bu kitapktaki rneklerimizi VBScript diliyle yazacamza gre, nce hzl bir VBScript kursu grsek iyi olur. Visual Basic dilini biliyorsanz, VBScript biliyorsunuz saylr. VBScript, gl bir dildir; ancak Netscape firmasnn hi bir zaman Browsernda istemci tarafnda altrlabilecek diller arasnda kabul etmemesi sebebiyle VBScript, Webin istemci tarafnda kendisinden bekleneni yapamad. MSun Browser Internet Explorer ise VBScript ile yazacanz stemci-Taraf kodlar okuyabilir ve icra edebilir. Ne var ki ASP kodlarmz hi bir zaman ziyaretinin Browsernn yzn gremeyecei ve sadece Serverda alaca iin Serverda VBScript destei bulunduu srece, ASP sayfalarnz VBScript ile yazabilirsiniz. Bir Serverda ASP destei varsa, VBScript destei de var demektir. VBScriptin hemen hemen btn komutlarn ve yntemlerini ASPde kullanabilirsiniz. Ancak bunun bir ka kstlamas vardr. VB veya VBScripte ASP dnda aina iseniz, mesaj kutusu (MsgBox) ve girdi kutusu (InputBox) aracl ile programlarnza kullancnn bilgi girmesini salayabileceinizi biliyorsunuz demektir. Bu iki komutu ASP iindeki VBScript kodunda kullanamayz. Ayrca ASP teknolojisi zaten VBScriptin btn komutlarn ve deyimlerini kullanmanz da gerekli klmayacaktr. Greceksiniz ki, mkemmel ASP sayfalar oluturmak iin bile bir avu VBScript komutu kullanacaz. ASP sayfalarmzdaki HTML kodlar ile VBScript (veya dier Script dillerinin) kodlarn birbirinden ayrmamz gerekir. Bu ASP.DLLye, HTMLin nerede bittiini, Script diliyle yazlm kodun nerede baladn gsterebilmemiz iin gerekli. Bunu salamak iin Script diliyle yazlm hereyi <% ve %> iaretleri arasna alrz. ASP.DLL bu iaretleri grnce, iindekileri yazmak yerine yapar. Bir ASP sayfanzda HTMLin klasik < ve > iaretleri arasndaki unsurlar, ASP.DLL tarafndan ziyaretiye gnderilecek olan sayfaya aynen aktarlr; ancak <% ve %> arasndaki herey, bata belirttiiniz LANGUAGE etiketinde yazl Script dilinin yorumlaycsna verilir; yorumlatlarak, gerei yerine getirilir. <% ve %> iaretlerine snrlayc denir. Snrlaycnn iinde bir veya daha ok satr kod bulunabilir. Snrlayclar ve iindeki Script, HTML etiketlerinin iinde veya dnda yer alabilir. Snrlaycnn iindeki kodlarmz aklamak iin koyacamz yorum satrlarnn bana tek trnak iareti (') koyarz. te bu kurallar uyguladmz bir ASP sayfas rnei:
<% @LANGUAGE=VBscript %> <html> <head> <title>Hogeldiniz!</title> <meta http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <meta http-equiv="Content-Type" content="text/html; charset=windows-1254"> </head> <body>
ACTIVE SERVER PAGES 16

<center> <% ' Yaz tipi boyutunu tutacamz bir deiken tanmlayalm Dim fontBoyut %> <% ' yaz tipi boyutunu 1'den 7'ye kadar deitirelim For fontBoyut = 1 To 7 %> <font size = <%=fontBoyut%>> Hogeldiniz!<br> <% Next %> </center> <h3>Bugn <% =WeekdayName(Weekday(Date)) %>, <% = Date %>. u anda Server'da saat: <% = Time %>.<p> </h3> </body> </html>

Burada snrlayc arasnda tek veya ok satrl VBScript kodlar ile banda tek trnak olan icra edilmeyen, yorum satrlarn gryorsunuz. HTML etiketinin iine gmlm VBScript kodu ise HTMLin <FONT> etiketinde yer alyor: <font size = <%=fontBoyut%>>. Burada karlatmz <%= ifadesi, ASPye, Bu deikenin deerini bul ve tam buraya yaz! dememizi salyor. Bu ifade daha sonra yakndan ele alacamz Response.Write metodunun ksaltlm halidir. HTML etiketinin iine yazdmz VBScript blmnn kendi snrlayc iaretlerinin yine de kullanldna dikkat edin. Bir iki yazm kural VBScript komutlar, anahtar kelimeleri ve deiken adlarnn byk harf-kk harf olmas nemli deildir. Yani yukardaki ifadelerden birini u biimlerden birinde yazabilirdik; kodumuz yine de alrd:
For fontBoyut = 1 To 7 FOR FONTBOYUT = 1 TO 7 for fontboyut = 1 to 7

Fakat... Bu demek deildir ki, VBScript ile kodlamann kendi gelenekleri yok! VBScriptiler genellikle komutlarn birinci harfini byk yaparlar: For gibi. Deiken adlarnda ise kendinize anlaml gelen bir biim tutturabilir ve yle devam edebilirsiniz.
ACTIVE SERVER PAGES 17

Eer bir kod satr ok uzun geliyor ve daha sonra anlalmas imkansz derecede uzuyorsa, bu satr alt izgi (_) ile aa satrda devam ettirebilirsiniz. rnek:
<% If degisken1 > 1 And _ deisken1 < 10 Then %>

Deikenler
Programclkta ilemlerimizi deikenlerle yaparz. deikeni bir kap gibi dnebilirsiniz. Szgelimi Gn, deikenin ad ise bu deikenin deeri Pazar, Pazartesi, Sal, vd., olabilir. Her deiken, trne gre, ya bir ya da daha fazla deer tutar. Adndan da anlalaca gibi deikenin deeri deiir! Bu deiiklii biz yapabiliriz; programn kendisi yapabilir. VBScriptte, bir ok baka bilgisayar programlama dilinden farkl olarak deikenlerin tanmlanmas veya beyan edilmesi, boyutlandrlmas gerekmez. Belirtilmemi, nceden tanmlanmam bir deikene deer atamaya kalkarsanz, VBScript bunu mkemmel ekilde kabul eder. Fakat bu kt bir programclktr. yi programclk deikenlerin nceden beyan edilmesini gerektirir. Bunu DIM komutuyla yaparz. DIM, Dimension (boyutlandr) kelimesinden ksaltlmtr. Pek akllca grnmese de bu komut, bilgisayarn deiken yeri olarak bir bellek alannn boyutunu belirtmesini salar. rnekler:
<% DIM Gun, Ay, Ogrenci, Not Gun = Pazartesi Ay = Ocak Ogrenci = Necip Not = 5 %>

imdi burada Gun, Ay, Ogrenci, Not adyla drt deiken oluturduumuzu ve bunlara srasyla Pazartesi, Ocak, Necip ve 5 deerlerini atadmz gryorsunuz. Bu noktada VBScript yorumlaycsna sorsanz, Peki, syle bakalm, Gun deikeninin deeri nedir? diye, yorumlayc size Bunu bilmeyecek ne var? Elbette Pazartesidir! derdi. Belki bu noktada siz de kendi kendinize Pazartesi, Ocak ve Necip kelimeleri trnak iinde iken, acaba 5 rakam neden trnak iinde deil? diye soruyorsunuz. Gzel soru. Ama cevab iin biraz bekleyeceksiniz. Deiken isimleri, mutlaka harfle balamaldr; iinde noktalama iaretleri bulunamaz ve uzunluu 255 karakteri geemez. Kt programcl nlemek iin! Deikenleri tanmlamadan kullanmak kt programclktr demek, ilerde kendi banza elinizle program hatas getirirsiniz demektir. Daha sonra rneklerini greceiz; ASP, sitemize giren bir ziyaretiye bir oturum (Session) aar ve baz deikenleri oturum boyunca aklnda
ACTIVE SERVER PAGES 18

tutar. Bir sayfada kullandnz bir deikeni, daha sonraki sayfada kullanabilmek iin, bu deikenin deerinin yeni sayfada deimemesi gerekir. ASP program yazarken, bazen geliigzel deikenlere deer atayabilirsiniz. Neden? O anda aklnza deiken ad olacak kelime gelmedii iin! Bu deiken adn daha nce kullanmsanz ve iinde biraz sonra kullanacanz bir deer varsa, deer deitirilmi olacaktr. VBScript, savurgan ve dank programcl nlemek iin OPTION EXPLICIT imkann verir. Bir ASP sayfasnn birinci satr olarak
<% OPTION EXPLICIT %>

yazarsanz VBScript DIM komutuyla belirlenmemi deiken kullanmanza izin vermez; kullanrsanz hata verir ve durur. Bu ifadenin iinize ok yarayaca bir dier nokta, kodda deiken adn yazarken hata yapmanz nlemektir. VBScript sizin hata yaptnz bilemeyecei iin yanl kelimeyi yeni bir deiken sayacaktr. Deer atamadnz bu yeni deikeni kullandnz yerlerde ya programnz hata verir, ya da kendisine doru grnen ilemler yapar, fakat beklediiniz sonucu elde edemezsiniz. OPTION EXPLICIT, yanl yazdnz deikeni yeni deiken sayarak nceden tanmlanmam deiken kullandnz dnerek, duracaktr. Peki, yle bir deiken tanmlama acaba ortaya nasl bir deiken kartr:
<% %> DIM Gunler(31), Aylar(12), Ogrenciler(210), Notlar(10)

Bu yntemle oluturduumuz kodlarla elde edilecek kaplar, birden fazla deer tutabilir. Yani:
<% DIM Gunler(7), Aylar(12), Ogrenciler(21), Notlar(10) Gunler(1) = Pazartesi Aylar(3) = Mart Ogrenciler(12) = Necip Notlar(5) = 5 %>

Bu durumda iinde 7 ayr deiken tutabilecek olan Gnler deikeninin 1 numaral olannn deeri Pazartesi, 12 deer tutabilecek olan Aylar deikeninin 3 numaral olannn deeri Mart, 21 ayr deer tutabilecek olan Ogrenciler deikeninin 12 numaral olannn deeri Necip ve nihayet 10 ayr deer tutabilecek olan Notlar deikeninin 5 numaral olannn deeri ise 5 olacaktr. Byle, birden fazla deer tutabilen deikenlere Dizi Deiken veya Array denir. Array Fonksiyonu VBScriptin kullanlmaya hazr bir ok fonksiyonu vardr; bunlardan biri olan Array ile, kolayca dizi deiken oluturabiliriz. Diyelim ki, Gunler(7) dizi-deikenini gn adlar ile doldurarak oluturmak istiyoruz:
ACTIVE SERVER PAGES 19

<% Dim Gunler = Array (Pazartesi , Sal , aramba , Perembe , Cuma , Cumartesi, Pazar) %>

ile hem dizi-deikeni oluturabiliriz; hem de deerlerini atayabiliriz. Bu suretle oluturduumuz dizi deikenin yelerine daha sonra sra numaralar ile atfta bulunabilirsiniz. rnein: <%=Gunler(6)%> bize Pazar verir. Neden? nk hayatlarnn byk blmn penceresiz ortamlarda geiren kiiler olan dil tasarmclar, say saymaya biz normal insanlar gibi 1den deil 0dan balarlar; dolaysyla Gunler dizi-deikeni Gunler(0)dan balar! /////////////////KUTU BTT/////////////// imdi, aklnza u soru gelebilir: Dizi deiken oluturacamza, neden ogrenci1, ogrenci2, ogrenci3 diye deikenler oluturmuyoruz ve bunlara deerler atamyoruz? Kt soru! Dolaysyla cevabn hemen verelim. Dizi deikenlerde bir deikene numarasyla atfta bulunabilirsiniz. Ve numara yerine bir baka deikeni kullanabilirsiniz. rnein, OgrenciNo deikeninizin deeri 12 ise
<% .... If Ogrenciler(OgrenciNo) = Necip ... %>

eklinde bir dng ile aradnz rencinin Necip olup olmadn snayabiliriz. (Dnglere birazdan geliyoruz!) Baka programlama dillerine zellikle Visual Basice aina olanlarn aklna yle bir soru gelebilir: VBScriptte deikenin metin mi, say m olduunu ayrt etmiyor muyuz? Baka programlama dillerinde bir deikenin deeri harf ve rakamlardan oluuyorsa, yani matematik ilem yapmaya elverili deilse bunlara String (Alfanmerik, karakter deerler) denir. Programlama dillerinde bir de matematik ilem yapmaya elverili deiken tr vardr: Say (Number). VBScript, bir deikene alfanmerik (karakter, metin) olarak atadnz deeri ift trnak iine almanz ister. Szgelimi Ogrenci(12) deikeni iin Necip deerini atamak istiyorsunuz: Necip kelimesini ift trnak iine almak zorundasnz. Say olarak kullanacanz deerleri ise trnak iine almazsnz. (Say olarak kullanacanz deerlerin sadece rakam olabileceini sylemek gerekmez!) Fakat, ileri kartran nokta, VBScript asndan deiken tr diye bir ey olmamasdr. Visual Basic, kltlp Script dili haline getirilirken, deiken tr zellii alnmaynca, ortaya ileri kartran (veya kolaylatran) byle bir durum km bulunuyor. Karklk, ift trnak iinde verdiiniz bir deeri matematik ilemde kullanmaya kalktnzda karnza kabilir. Rakam olmayan bir karakter-dizisini bir deikene trnaksz olarak atadnzda VBScript tanmsz deiken vermeye kalktnz syleyerek, duracaktr. VBScriptin bu eksikliini gidermek iin baz ASP programclar deiken adlarnn nne karakter-dizileri iin str harflerini koyarlar: strAy, strOgrenciler, gibi. sterseniz, VBScriptin karakter-dizisi ve say deikenleri nasl ayrt ettiini veya etmediini bir ka rnekle grelim. u kodu yazarak, altrn:
ACTIVE SERVER PAGES 20

<% Option Explicit %> <HTML> <% Dim Degisken(2), Toplam Degisken(1) = "Necip" Degisken(2) = "Dayanr" Toplam = degisken(1) + Degisken(2) %> <% =Toplam %> </HTML>

Sonu: NecipDayanr deil mi? (Arada boluk olmamasna aldrmayn imdilik!) Peki; imdi Degisken(1) deeri olarak trnak iine alarak 5, Degisken(2) deeri olarak yine trnak iinde 10 yazn. Program tekrar altrn. Sonu? 510!? Peki; trnaklar kaldrn 5 ve 10un evresinden. Sonu? 15. Oh, neyse! Bir an iin VBScript matematik bilmiyor sandk! Bu durum VBScriptin matematik bilgisinin ktlndan deil, trnak iindeki deerlerin, VBScript ayrm yapmyor bile olsa, karakter-dizisi (String) iken toplama ileminde ard arda eklenmesinden (concatenate) kaynaklanyor. Trnaklar kaldrdnzda, VBScript bu deerlerin say olduunu anlad ve doru ilemi, yani toplama ilemini yapt. imdi VBScriptin deikenleri ele al tarzn daha iyi kavramak iin Degisken(1) deeri olarak trnak iareti koymadan kendi adnz, Degisken(2) deeri olarak da soyadnz yazn ve program altrn. Ne sonu aldnz? VBScriptin kulland tek tr deikene variant denir. Variant, karakter-dizini (String) de olabilir, say (Number) da. Fakat bir variantn iindeki deer, veri olarak nitelendiinde u trlerden birine girer: Boolean Deikenin deeri ya True (doru) ya da False (yanl) olur; Truenun deeri 1, Falseun deeri ise 0dr. Byte 0 ile 255 arasnda bir saysal deer olabilir. Double Yzen noktal deer denilen veri trdr. Pozitif saylar iin 4.9E-324 ile 1.8E308 arasnda, negatif saylarda -4.9E-324 ile -1.8E308 arasnda bir deer alabilir. Date/Time nceden belirlenmi biimlerde tarih ve zaman bilgisi ierir. Empty Tanmlanm ancak henz deer atanmam (bo) deiken trdr. Error Programn hata mesajlarn ve hata deerlerini tutar. Integer Noktalk blm iermeyen tamsay verilerdir; deeri -32.768 ile +32.767 arasnda olabilir. Long Noktalk blm iermeyen tamsay verilerdir; deeri -2.147.483.648 ile 2.147.483.648 arasnda olabilir. Null inde veri bulunmamak zere tanmlanm deikenlerdir. Object Windows OLE Nesnelerini tutmak zere tanmlanm deikenlerdir. Single Yzen noktal deer denilen veri trdr. Pozitif saylar iin 1.4E-45 ile 3.4E38 arasnda, negatif saylarda 1.4E-45 ile -3.4E38 arasnda bir deer alabilir. String Alfanumerik veri tutan deikenlerin deeridir

ACTIVE SERVER PAGES

21

Sabit Deerler VBScriptte bir kere verdiiniz deeri hi deimeyen unsurlar (deiken diyemezdik, deil mi?) vardr. Sabit deer, btn ASP sayfas boyunca (hatta isterseniz, btn site, yani Uygulama boyunca) deimeden kalr. Bu deerleri Const (constant, sabit kelimesinden tretilme) komutuyla belirtiriz:
Const DolarDeger = 560780 Const SirketinAdi = Web Tasarm ve Site Onarm A.. Const Slogan = Siteler ve Krk Kalpler Onarlr

VBScriptte lemciler (Operatrler) Bilgisayar Operatr ile program Operatr arasnda fazla bir fark yoktur. Her ikisi de verdiiniz deerleri ya karlatrr bir sonu bulurlar; ya da bu deerlerle aritmetik iler yapar ve bir sonu ortaya kartrlar. Bilgisayar Operatr daha sonra bu i iin sizden para ister; program operatr istemez! VBScriptin operatrleri ve yaptklar iler yle sralanr: Operatr lev Snf + Toplama Aritmetik kartma * arpma / Blme ^ ssn alma \ Tamsay blme Mod Modler aritmetik = Bir deikenin dierine eit olduunu snar Karlatrma <> Bir deikenin dierine eit olmadn snar >and< Bir deikenin dierinden byk veya kk olduunu snar (and kelimesi var) >= and <= Bir deikenin dierinden byk veya eit, veya kk veya eit olduunu snar (and kelimesi var) Is Bir ifadedeki iki referansn ayn Nesneye yaplp yaplmadn snar And Bir veya daha fazla deikeni test olarak karlatrr Mantksal Or Bir ilemin devam iin hangi koulun olumas gerektiini snar Not Bir ifadeyi negatif hale getirir XoR Sadece bir koulun doru olup olmadn snar Eqv ki deikenin eitliini snar Imp ki ifadede mantksal implikasyon ilemi yapar. VBScript ile yazacamz ASP sayfalarnda bu ilemcileri beklediimiz sonucu verebilmesi iin kullanm sralar nemlidir. Bunu bir rnekle aklayalm. 100den 6y karmak ve sonucu 2ye blmek istiyorsunuz; sonu 47 olacaktr. Yani: 100-6/2. Deil mi? Bu ilemin
ACTIVE SERVER PAGES 22

VBScriptteki sonucu 97 olacaktr. nk, VBScript nce 6y 2ye blecek ve elde ettii sonucu 100den kartacaktr. VBScriptte, aritmetik ilemlerin yaplma sras yledir: Operatr lev ncelik + Toplama 3 kartma 3 * arpma 2 / Blme 2 ^ ssn alma 1 VBScript ile hesap ilemi yaparken, aritmetik ilem srasn kartrarak hatal sonu almamak iin sk sk parantez kullanmak yerinde olur. Yukardaki rnek yle yazlabilirdi: (100-6)/2. Tabii amacnz 100 6/2ye blmek ise bu ilemi yle yazmalsnz: 100-(6/2).

VBScriptde Program Kontrol


ster Script diliyle, ister gerek programlama diliyle yazlsn, bir bilgisayar programnn varlk sebebi, eitli durumlar deerlendirerek, belirli durumlarda belirli kararlar verebilmesidir. Bunu programn kontrol elerini kullanarak yaparz. Programlar, bu eler sayesinde karlatrma yaparlar; belirli durumlarn oluup olumadn snarlar; veya belirli bir durumun olumasna veya sona ermesine bal olarak bir i yaparlar veya yapmazlar. Bunu snamalarla (koullu ifadelerle) veya dnglerle salarz. Kimi zaman da, programa (programn mant erevesinde) istediimiz anda yapmakta olduu ii durdurarak, baka bir ii yapmasn bildirebiliriz. Bunlara da Sreler (veya Prosedrler) denir. (Adndaki Basice bakarak, VBScripti basit bir dil sanmyordunuz, umarm!) Mantksal Snamalar VBScriptte programn karar vermesini salayan ilk kontrol gesini eer ... ise... yap! eklinde zetleyebiliriz. VBScript bu ilemi iki ayr ifadeyle yaparz:
If.. Else

VBScriptin vereceiniz bir durumun bulunup bulunmadn snamasn salar. Genel yazm kural yledir:
If art Then Else [art doru deilse yaplacak iler] End If [art doru ise yaplacak iler]

Bunu bir rnekle ifade edelim: Eer saat 12den nce ise sayfaya Gnaydn yazdr; saat 12den sonra ise Tnaydn yazdr. Fakat burada bir eksiklik var: Saat 18den sonra ise sayfaya yi akamlar! yazdrmamz daha doru olmaz m? If dngs kendi iinde snrsz Elseif (ikinci artl dng) imkan vererek bize bunu salar. Her Elseifi yeni bir If gibi dnebilirsiniz. te u senaryoyu gerekletirecek kod rnei (hosgeldiniz01.asp):
<HTML> <HEAD>
ACTIVE SERVER PAGES 23

<TITLE>ASP ILE SAATE GORE SELAM</TITLE> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254"> </HEAD> <BODY> <H2> <CENTER> <% If Hour(Now) <12 Then Response.Write "Gnaydn! " ElseIf Hour(Now) >= 18 Then Response.Write "yi akamlar! " Else Response.Write "Tnaydn! " End If Response.Write "<BR>" Response.Write "Site Onarm Sitesine Hogeldiniz" %> </CENTER> </H2> </BODY> </HTML>

Bu program altrdnz zaman, altrdnz saate gre sayfadaki selamn deitiini greceksiniz. (Bu rnekte, sadece artl dng ilemi yapmyoruz; fakat ayn zamanda Hour(Now) fonksiyonu ile tanyoruz ve sayfadaki btn unsurlar ASP yntemiyle yazdryoruz! Fakat imdilik bu iki unsurun zerinde de durmayn.) Programmz nasl alyor? Yukarda baka vesile ile VBScriptin kullanlmaya hazr fonksiyonlar vardr, demitik. Bunlardan biri de o andaki saati ve tarihi bildiren Now() fonksiyonudur. Bu fonksiyondan dnen deerle bu andaki saati reniyoruz; ve bunu nce 12 ile karlatryoruz. Fonksiyondan dnen deer, eer 12den kkse, programmz Response (Karlk) Nesnesinin .Write Metodunu kullanarak (Nesneler ve Metodlar meselesi zerinde de durmayn!) ziyaretinin Browser penceresine Gnaydn yazdryor.
Dnen Deer

Fonksiyonlar, kendilerini greve aran VBScript komutlarna ve ilemlerine bir deer sunarak karlk verirler. Buna fonksiyondan dnen deer denir. Yani diyelim ki Now() fonksiyonunu greve ardnz. Bu fonksiyon derhal iletim sisteminden saati ve tarihi renerek kendisini greve aran ileme bildirir. Daha sonra VBScriptin kullanlmaya hazr dier bir ok fonksiyonunu kullanacaz ve kendi fonksiyonlarmz yazacaz. Ne zaman bir
ACTIVE SERVER PAGES 24

fonksiyona bir noktada atf yaparsak, o noktaya fonksiyon tarafndan bir deer getirileceini bimemiz gerekir. Eer bu ilk snamann sonucu doru deilse, VBScript If satrndan sonraki birinci deyimi atlayacak ve ikinci deyimi icra edecektir. Yani eer saat 12den kk deilse, ElseIf satr icra edilecektir. ElseIf de tpk If gibi iledii iin bu kez yeni bir snav yaplacak ve saatin 18e eit veya byk olup olmad snanacaktr. Eer saat 18e eit veya bykse, (snav sonucu doru ise) ilk satr icra edilecek ve ziyaretinin Browser penceresine yi akamlar! yazdrlacaktr. Eer bu snavn sonucu da doru deilse, ElseIfin ikinci satr icra edilecektir. Bu satrda ise Else bulunuyor. Else, If ve ElseIf gibi snav yapmaz; ne olursa olsun, kendisinden sonra gelen deyimi yerine getirir. Yani saat 12den kk deilse, 18den kk veya 18e eit deilse, yani 12 ile 17 arasnda ise, ekrana Tnaydn yazlacaktr.
Select Case

VBScriptin bir dier duruma bakarak karar verme ifadesi, Select Case (Durum Se) yapsdr. Bu kontrol esinin nasl altn yle zetleyebiliriz: Durum Se (Durumlarn listesi veya durumlar belirten bir deiken) Durum 1 : Yaplacak iler Durum 2: Yaplacak iler Durum 3: Yaplacak iler Durum n: Yaplacak iler Semeyi Bitir VBScript, verdiiniz durum listesine veya iinde eitli deerler bulunan deikene bakarak, bu deikenin her bir deerini bir durum sayacak ve verdiiniz durumlardan hangisini tutuyorsa, ona ait komut dizisini icra edecektir. Yukardaki sayfamz bu kez bu yapy kullanarak yazalm (hosgeldiniz02.asp):
<HTML> <HEAD> <TITLE>ASP ILE SAATE GRE SELAM</TITLE> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254"> </HEAD> <BODY> <H2> <CENTER> <% Select Case Hour(Now) Case 0,1,2,3,4,5,6,7,8,9,10,11 Response.Write "Gnaydn!" Case 12,13,14,15,16,17 Response.Write "Tnaydn" Case Else
ACTIVE SERVER PAGES 25

Response.Write "yi Akamlar!" End Select Response.Write "<BR>" Response.Write "Site Onarm Sitesine Hogeldiniz" %> </CENTER> </H2> </BODY> </HTML>

Select Case komutuna, iindeki deerleri durum sayaca dizi veya deiken olarak VBScriptin kullanlmaya hazr fonksiyonlarndan Hour(Now) veriyoruz. Bu fonksiyondan, 0 ile 24 arasnda bir deer dnecektir. Bu deer Select Case iin bir durum demektir. Select Case, bu deer ile altta sralanan Caseleri karlatracak ve elindeki deer hangi Casei tutuyorsa ona ait komutlar icra edecektir. Sonuncu Casee ltfen dikkat edin: Burada Case olarak Else (baka) veriliyor. Bu bizi, 17den 23e kadar olan saatleri sralamaktan kurtarr. 0dan 11e kadar olan saatlerle 12den 17ye kadar olan saatleri sraladmza gre baka hangi saat olursa olsun, ziyaretimize yi akamlar! dileyebiliriz. Eer 24den sonra ve 04den nce ziyaretinize yi geceler! dilemek isterseniz, bu program nasl deitirirdiniz? Dngler Snama bir programn akn kontrol iin kullanacamz birinci en nemli unsur ise, dng de ikinci en nemli unsur saylr. Hatta programcnn tembellik katsaysna gre, belki de birinci en nemli unsuru bile saylabilir! nk Dng (Loop) programa, bir ii biteviye yaptrmaya yarar. Tabi bu i sonsuza kadar srecek olursa, buna Endless Loop (Sonsuz Dng) denir; en iyi program ve Windows dondurma yntemidir! VBScriptte kullanabileceimiz dng yntemleri unlardr:
For..Next dngs

Programn bir ii belirli kere yapmasn istiyorsak, ona yapaca ii bir saya deikeniyle birlikte, For dngsyle bildiririz: For saya = balang To son Step adm yaplacak iler Next Burada, saya yerine istediiniz bir deiken adn, balang yerine sayacn balamasn istediiniz sayy, son yerine sayacn durmasn istediiniz sayy, ve adm yerine, sayacn kaar-kaar artmasn istediinizi yazabilirsiniz. En sondaki Next deyimi ise dngnn bir sonraki adma gemesini salar. Bu admda saya, Step kelimesi varsa, karsndaki deer kadar arttrlr ve yaplacak iler yeniden yaplr. Bir rnek yapalm (gunler.asp):
<HTML> <HEAD> <TITLE>ASP ILE GNLERI SAYMA</TITLE> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9">
ACTIVE SERVER PAGES 26

<META http-equiv="Content-Type" content="text/html; charset=windows-1254"> </HEAD> <BODY> <H2> <CENTER> <% Dim Gunler Gunler = Array("Pazartesi", "Sal", "aramba", "Perembe", "Cuma", "Cumartesi", "Pazar") For sayac = 0 to 6 Response.Write Gunler(sayac) Response.Write "<BR>" Next %> </CENTER> </H2> </BODY> </HTML>

Bu ASP kodunda, Gunler adyla bir dizi-deiken oluturuyoruz ve bu deikenin yedi hanesine, gnlerin adlarn atyoruz. Sonra, sayac adl sayac 0dan 6ya kadar arttryoruz (Bir saya birer birer artsn istersek, Step blmne adm says yazmayz). imdi kendimizi bir an iin VBScriptin yerine koyalm ve birinci admda yapacamz ii dnelim: Hmm.. Programc bey, benim sayac nce 0 yapmam istiyor; peki sayac 0 olsun. Sonra, Gunler dizideikeninden saya deeri ile ayn sayy tayan deikeni alp, bunu ziyaretinin Browserna yazmam istiyor. Peki, Gunler(0) ne imi, bakalm. Hmm Gunler(0) Pazartesi imi. o halde ziyaretinin ekranna bir Pazartesi kelimesi yazalm. Sonra bir de <BR> kodu yazmam istiyor. Onu da yazalm.. imdi, srada Next var. Yani bir sonraki adma devam edeceiz. Step deeri olmadna gre sayac bir arttraym. Saya bylece 1 oldu. ... Ve bylece VBScript, sayacn son deeri olan 6ya ulancaya kadar, biteviye Gunler dizideikeninden sayacn deerine gre deer seerek ve bunu ekrana yazdrarak, iini yapacaktr. Bu bakmdan VBScript, gvenilir ve alkan bir arkadatr!
While...Wend

Ne var ki, program mant bazen bize byle ak ve seik bir saya kurma imkan vermez. Saya olarak kullanacamz deer, programn baka bir blm tarafndan retiliyor olabilir. Veya bu deer ziyareti tarafndan belirlenmi olabilir. zetle yaplmasn arzu ettiimiz iin ancak saya bir deerden azsa, oksa veya eitse yaplmasn, bu durum deiirse durmasn isteyebiliriz. Bunu While (..iken) komutuyla yapabiliriz. While dngsn kullandmz zaman sayac bizim arttrmamz gerekir. Szgelimi, yukardaki programn 7 gnn tmn ekrana yazmasn deil de, mesela gn says 5den kk ise yazmasn istiyor olabiliriz. Bu durumda kodumuzda For.. Next arasnda kalan blmde u deiiklii yapabiliriz:
ACTIVE SERVER PAGES 27

While sayac <= 5 Response.Write Gunler(sayac) Response.Write "<BR>" sayac = sayac + 1 Wend

Burada While dngsnn Wend kelimesiyle sonlandrldna dikkat edin. While satrndaki sayac deitirdik, programn saya 5den kk veya 5e eit iken ilemesini saladk. Fordan farkl bir dier ifade ise sayac arttran sayac = sayac + 1 ifadesidir. Bu ifade, ilk bakta garip grnebilir. Fakat bilgisayar asndan bu sayacn o andaki deerini al, 1 ile topla ve bulduun yeni deeri sayacn mevcut deerinin yerine yaz! demektir. VBScript sayac bir arttrdktan sonra nce While satrndaki artn gerekleip gereklemediine bakar; gereklemi ise Wendi izleyen ilk satra gider; gereklememise While dngsnn iindeki ii yapmaya devam eder. Kendinizi VBScriptin yerine koyup, birinci ve ikinci admda nasl dndnz ve ne i yaptnz syleyebilir misiniz?
Do..Loop

Do (Yap) komutu ile kuracamz dngler iki ayr trde olabilir: bu dng ile bir dizi komutu, bir koul doru iken veya doru oluncaya kadar yaptrabiliriz. Bu yntemlerden her biri iki ayr ekilde yazlabilir. Bir koul doru iken baz ilerin biteviye yaplmasn istiyorsak, Do While yntemini kullanrz: Do While koul koul doru iken yaplacak iler Loop Bu ifade ile VBScript koul doru olduu srece istediimiz ii yapacaktr. Buradaki Loop kelimesi, dngnn baa dnmesini salar. Bu yntemden u ekilde de yararlanabiliriz: Do koul doru iken yaplacak iler Loop While koul Burada, Loop komutu artn hl doru olup olmadn snar ve doru ise verilen ileri yapar; artk deilse bir sonraki satra geer. Dngnn bir art gerekleinceye kadar bir ii yapmasn ise Do Until yntemiyle salarz. Bu durumda dng yle yazlr: Do Until koul koul gerekleinceye kadar yaplacak iler Loop Bu ifade ile VBScript koul doru oluncaya kadar istediimiz ii yapacaktr. Buradaki Loop kelimesi, dngnn baa dnmesini salar. Bu yntemden u ekilde de yararlanabiliriz: Do koul gerekleinceye kadar yaplacak iler Loop Until koul Burada, Loop komutu artn henz gerekleip gereklemediini snar ve henz gereklememise verilen ileri yapar; gereklemise bir sonraki satra geer. Visual Basic metinlerinde bu dngye verilen klasik rnek, bilgisayara yaz-tura attrmaktr! Biz de ASP sayfamza yaz-tura attrabiliriz. Bunun iin u kodu yazn ve yazi-tura.asp adyla kaydedin:
ACTIVE SERVER PAGES 28

<% Option Explicit %> <HTML> <HEAD> <TITLE>ASP ILE YAZI-TURA</TITLE> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254"> </HEAD> <BODY> <H2> <CENTER> <% Dim ParaAt, Yazi, Tura, Atis Randomize Yazi = 0 Tura = 0 Atis = 0 Do While Tura < 3 atis = Atis + 1 ParaAt = Int(Rnd * 2) + 1 If ParaAt = 1 Then %> Yaz!<P> <% Yazi = Yazi + 1 Else %> Tura!<P> <% Tura = Tura + 1 End If Loop %> 3 Tura getirebilmek iin paray <%=Atis%> kere atmak gerekti! </HTML>

Bu kodda u ana kadar karmza kmam olan Randomize (Tesadf say bulma) Fonksiyonunun kullanldn gryoruz.
ACTIVE SERVER PAGES 29

Tesadf Say

Bilgisayarn matematik ilemlerde, zellikle istatistik hesaplamalarla kullanlmas tesadf (rastlantsal) say retmeyi gerekli klmt. Fakat daha sonra bilgisayar oyunlar bu ilemi adeta zorunla hale getirdi. Rastlantsal say, bir dizide tekrar etmesi belirli bir dzene tabi olmayan say demektir. Bilgisayar yokken, tesadf say tablolar matematikiler tarafndan uzun uralarla retilirdi. VBScript, bu amala Visual Basicin Randomize ve Rnd komutlarn almtr. Randomize, tesadf say retme srecini balatr; Rnd da bu sayy size verir. Kodunuzda bir yerde Rnd kullanacaksnz, ondan nce bir yerlerde mutlaka Randomize komutunun yer almas gerekir. Bunun bir uygulamas u olabilir:
<% OPTION EXPLICIT %> <HTML> <% Dim TesadufiSayi Randomize TesadufiSayi = Rnd %> <%=TesadufiSayi%> </HTML>

Bu dosyay tesaduf.asp adyla kaydedip altrn; Browsern Yenile dmesini her tkladnzda ekranda yeni bir say greceksiniz. Bu saylarn rastlantsal olmas, bir kere daha gelmeleri iin hi bir kural (rnein her rakamn 123 kerede bir gelmesi veya 1 milyon 245 bin kerede bir gelmesi gibi) bulunmamasdr. in tekniini bilmek isterseniz, VBScript, her Rnd komutu icra edildiinde bilgisayarn saatini renir; iinden seecei bir rakam son derece karmak bir formlden geirerek size bir rakam verir. bu rakam daima 0 ile 1 arasnda olur. (Rnd*6)+1 forml bize 1 ile 6 arasnda (yani bir zarn deerlerinden her hangi biri), (Rnd*13)+1 forml ise 1 ile 13 arasnda (yani bir iskambil destesindeki kat deerlerinden herhangi biri) bir deer verir. Fakat dikkat: bu deerler tam say deildir! Programmzn btn ilemi Do dngs blmnde yaplyor ve bilgisayarn bir tesadf say retmesi esasna dayanyor. Bunu Randomize ve Rnd fonksiyonlar ile yapyoruz. Rndun verdii tesadf rakam, iki ile arpyor ve kan sayy 1 ile topluyoruz; bylece ortaya 1den byk 3den kk bir kesirli rakam km oluyor (Neden?). Bu rakam Int() fonksiyonundan geirerek, kesirinden kurtaryoruz.
Tam Say Elde Etmek iin: Int ve Round

Rnd fonksiyonu ile ilgili yukardaki rnei yaptysanz, dnen saynn 0 ile 1 arasnda, yani daima kesirli olduunu grm olmalsnz. Bazen bizim sayfalarmzdaki hesaplamalar veya veritabanndan alnan deerler de kesirli olabilir. rnein rencilerin not ortalamalarn hesaplattrrken VBScript size sonu gelmez kesirler verecektir. Oysa ou zaman bu rakamlarn ya yukar yuvarlanmas, ya da sadece tam say blm gerekir.

ACTIVE SERVER PAGES

30

VBScriptte Int() fonksiyonu, bize bir saynn tam say blmn verir. Diyelim ki elimizdeki KesirliSayi deikeninin deeri 123,234567 olsun.
Tamsayi = Int(KesirliSayi)

ileminden sonra Tamsayi deikenin deeri 123 olur. Fakat kimi zaman bir saynn kesirli blmn byle bakla kesip atmak iimize gelmeyebilir. Round() fonksiyonu, kesirli bir sayy yukar veya aa yuvarlayarak tam say haline getirir. Bu kez ki elimizdeki KesirliSayi deikeninin deeri 5,6 olsun.
Tamsayi = Int(KesirliSayi)

ileminden sonra Tamsayi deikenin deeri 6 olur. Kesirli say 56,2 ise, Round() fonksiyonu bize 56 deerini verir. Programmz, elde ettii ve Paraat deikenine kaydettii bu say 1 ise, Yaz gelmi sayyor; ve Browser Penceresine Yaz! yazyor. Bu arada yaplan at saysn kaydettiimiz Atis ve gelen tura saysn tuttuumuz Tura deikenlerinin deeri bir arttrlyor. ParaAt deikeninin deeri baka bir eyse (ne olabilir?), programmz bu kez tura geldiine hkmediyor ve Browser penceresine Tura! yazyor. Do dngs, Tura gelen atlarn says 3 oluncaya kadar devam ediyor. nk Do dngsn While Tura < 3 (Tura 3den az iken) deyimi ile altryoruz. Ve program sonunda 3 tura gelinceye kadar ka at yaptn yazyor. Bu ASP sayfas grntlenirken Browsern Yenile dmesini tklarsanz, her seferinde Tura getirmek iin farkl sayda at yapmak gerektiini; ayn sayda at yaplsa bile turalarla yazlarn yerinin deitiini greceksiniz.
Dizi deikenler iin dng: For Each..Next

For..Next gibi alan bu zel dng, saya deeri kullanmaz, fakat bir dizi deikenin btn deerleri iin bir kere icra edilir. Dizi-deikenler, VBScript ile yapacamz ilemlerde nemli bir yer tutar. rnein bir snftaki rencilerin veya mterilerimizin listesi bir dizi deikenin elemanlar olabilirler. Yapmak istediimiz ilem, dizi-deikenin btn elemanlar iin tekrar edilecekse, For Each..Next dngs daha elverili olabilir. Bir dizi-deikenin eleman says ilerde deiirse ve siz dngy For..Next ile kurmusanz dngnn sayac iin verdiiniz iin alt ve st snr deitirmek zorunda kalrsnz. Oysa For Each, ka kere tekrar edeceine ilikin deeri her zaman dizi-deikenin elemanlarn saysndan alr. rnein, btn rencilerin listesini tutan grenciler dizi-deikeninin btn elemanlarnn deerini ekrana yazdralm:
For Each Ogrenci In Ogrenciler Response.Write Ogrenci Next

Burada Ogrenci Ogrenciler dizi-deikeninde dngnn her admnda okunan bir elemann deerini tutar. For Each dngs tarafndan okunmakta olan dizi-deikenin her bir deeri srayla bu deikene yazlacaktr. Bunu bir tr endeks deiken olarak dnebilirsiniz.
Dngy durdurmak isterseniz

Bir dngden belirlediiniz koul gereklesin-gereklemesin kmanz gerekebilir. Bunu bir baka deikendeki deiiklik zorunlu klabilir. Bir dngden kmak iin Exit (k) ifadesini kullanabilirsiniz. Bu ifade, dngnn yapt iler arasnda, genellikle bir If deyimi ile birlikte yer alr. rnein:
For sayac = 1 to 10 [..bir takm iler yap..]
ACTIVE SERVER PAGES 31

If Degisken1 > Degisken 2 Then Exit For [..bir takm ilere devam et..] Next

Bu durumda For..Next dngs, Degisken1in deerinin Degisken2den yksek olduunu belirlerse, derhal dngy durdurarak, Nextten sonraki satra gidecektir. Do dngsnden ise Exit Do ile kababiliriz. Bu ifadenin kullanm da Exit For gibi olur. Sreler (Prosedrler) VBScriptte programn ak kontrolnde kullanacanz bir dier grup ara ise rnein Javascript veya Perlde fonksiyon dediimiz gruplandrlm ve isimlendirilmi ilem kmeleridir. Bu kmeler programn bir yerinde topluca dururlar ve programn baka bir yerinden isimleriyle arlrlar; veya bu kmelere isimleriyle referans yaplr. VBScriptte bu kmelenmi kod gruplarna Prosedr (Sre) denir. iki trl olur: fonksiyon (Function) ve Subroutine (sab-rutin okunur; ksaca Sub diye yazlr ve sab diye okunur). Bu iki sre arasndaki balca fark, fonksiyondan kendisini aran komuta daima bir deer dner; Subdan dnmeyebilir. Sub, yapaca ii yapar ve programn kontroln kendine atf yaplan noktaya devreder. VBScriptde bir programa farkl yerlerde sk sk ayn ii yaptryorsak, bunu bir Sub ile yaptrrz; fakat programmza bir deer gerekiyorsa, bu deeri bir fonksiyona hesaplattrrz. Her ikisi de kendilerine atfta bulunan veya kendilerini greve aran satrdan (komuttan, deyimden) verilebilecek deerleri kabul edebilirler. Biraz kark oldu; ama bunu ilerde gerek ASP uygulamalar yazarken daha iyi anlayacaz. imdilik bir iki noktay ylece renmeye bakalm. Bir fonksiyonun ad, tpk bir deiken ad gibi, fonksiyonun rettii deeri tutar; ve bu deer kendisini aran komuta verilir. Diyelim ki, programmzn eitli noktalarnda yaz-tura atp, elde edilecek sonuca gre bir i yapmak zorundayz. Bu ihtiyacn doduu yerde, yaz-tura komutlarn yazabiliriz. Ancak bu ortaya ok uzun bir programn kmasna sebep olur. Oysa yaz-tura ilemlerini bir fonksiyonda toplar ve ihtiya halinde sadece bu fonksiyonu arrsak ve fonksiyon bize o anda yaz m geldiini, yoksa tura m geldiini bildirirse, iimiz ok kolaylam olur. Byle bir fonksiyon, yukardaki rnekten hareketle, yle olabilir:
<% Function YaziTura Dim ParaAt Randomize ParaAt = Int(Rnd * 2) + 1 If ParaAt = 1 Then YaziTura = Yaz Else YaziTura = Tura End If End Function %>
ACTIVE SERVER PAGES 32

Bu fonksiyonu, ASP programnn herhangi bir yerinden, yle bir yntemle arabilir; ve verecei sonucu programn akna uygun ekilde kullanabilirsiniz:
<% NeGeldi = YaziTura Response.Write NeGeldi %>

Fonksiyonun sonunda End Function ifadesinin bulunduuna ve fonksiyonun elde ettii sonucu kendi adna atadmza dikkat edin. DIM ifadesiyle byle bir deiken tanmlamadmz halde VBScript, fonksiyonu ardnz anda bunu kendiliinden yapacaktr. Ayn ilemi Subroutine (Sub) olarak yazabiliriz. Fakat bu kez Sub, elde edecei deeri kendisi kullanacak ve bittii anda kontrol programa geri dnecektir:
<% Sub YaziTura() Dim ParaAt Randomize ParaAt = Int(Rnd * 2) + 1 If ParaAt = 1 Then Response.Write Yaz Else Response.Write Tura End If End Sub %>

Fonksiyon adlarnn sonuna, bizden bekledii deer varsa onlar belirleyen deiken adlarn parantez iinde yazarz. Fonksiyon bizden bir deer beklemiyorsa alan kapanan (bo) parantezlere ihtiya yoktur. ancak bir ok VBScript programcs bunu adet edinmitir. Sublarn arlmas, fonksiyondan farkldr. Subn icra edilmesini istediiniz noktaya sadece adn yazarz. Sublar ileyebilmek iin bizden deer bekliyorsa, bu deerleri Sub adnn yanna, parantez iine almadan ve virglle ayrarak, yazarz. rnein, Hesapla isimli ve bizden iki deer bekleyen bir Sub yle arlr:
Hesapla 10, 20

Bu Sub iini bitirdii anda programn ak, Suba atf yaptmz noktada devam eder. Sk Kullanacamz Hazr Fonksiyonlar VBScriptte kullanabileceimiz bir iki hazr-fonksiyona yukarda deindik. Tesadf say reten Rnd() fonksiyonu bunlardan biriydi; ayrca Int() fonksiyonu ile kesirli bir saynn tam blmn alabildiimizi grdk. VBScriptin kullanlmaya hazr daha bir ok fonksiyonu vardr; ancak ASP uygulamalarnda sk kullanacamz ve zellikle metin dzenlemeye ait olan bir kan burada sralayalm.
ACTIVE SERVER PAGES 33

Tarih ve saat

Belki de Webin zamana ok bal oluu dolaysyla, Visual Basicin hemen hemen btn zaman-tarih fonksiyonlar VBScriptte de kullanlr. Date: Bugn tarihini verir. (25.03.2000 gibi) Time: O andaki saati verir. (22:24:40 gibi) Now: O andaki tarih ve saati birlikte verir. (25.03.2000 22:24:40 gibi) VBScriptin buna ek olarak Weekday (haftann gn), WeekdayName (gnn ad) ve Monthname (ayn ad) fonksiyonlar da vardr. Bu fonksiyonlar deerlerini Date fonksiyonuna gre alrlar. rnein,
<%= WeekdayName(Weekday(Date))%>

komutu bize bugn Cumartesi ise Cumartesi deerini verir.


<%= MonthName(Month(Date))%>

komutu bize bu ay Mart ise Mart deerini verir. VBScriptin bunlara ek olarak Day (gn), Month (ay) ve Year (yl) fonksiyonlar da deerlerini Date fonksiyonundan alarak, size bir rakam verirler. Eer tarih 25 Mart 2000 ise: <%= Day(Date)%>... 25 <%= Month(Date)%>... 3 <%= Year(Date)%>... 2000 deerini verir. VBScript, bu deerleri doruca iletim sisteminden alr. Dolaysyla iletim sisteminin blgesel ayarlar Trkiye iin yaplmsa, gn adlar Trke olarak dnecektir. Ayrca, tarih ve saat biimleri de blgesel ayarlara bal olarak, ay nde, gn arkada veya tersi, saat de 12 saat veya 24 saat esasna gre dner. ASP programlarnz kiisel Web Serverda denerken kendi bilgisayarnzn tarih ve saatini; gerek Internette altrrken Servern tarih ve saatini alrsnz. Sayfalarnzda ay ve gn adlarn Trke grntlemek iin, nce Servern blgesel ayarlarn snamanz ve eer isimler Trke gelmiyorsa, bunlar eviren Sublar veya fonksiyonlar yazmanz gerekebilir.
Karakter-dizisi Dzenleme

Karakter-dizisi veya String, VBScript iin herey olabilir. Sana Sevdann Yollar Bana Kurunlar bir Stringdir. Bugn 7 Austos 2000 bir Stringdir. Doum Gnn Kutlu Olsun! bir Stringdir. Web sitemizi ziyaret eden kiinin formlarmza yazaca ve Gnder tuunu tklayarak Servera gnderecei bilgiler Stringdir. Fakat bunlarn hepsi olduu ekliyle iimize yaramaz. Bunlar yeniden dzenlemek, iinden semeler yapmak veya biimlerini deitirmek gerekebilir. VBScript bu amala kullanlmaya hazr bir dizi fonksiyon verir: InStr Uzun bir Stringin iinde vereceiniz daha ksa bir Stringin bulunup bulunmadn arar; bulursa bu ksa Stringin balama noktasnn deerini verir. Diyelim ki, Sana Sevdann Yollar Bana Kurunlar Stringini Kayahan deikenine, Sevda kelimesini de Ara deikenine atadnz. InStr fonksiyonu ile Arann deerinin yerini Kayahann deerinin iinde bulabilirsiniz: Yer = InStr(Kayahan, Ara) Yerin deeri 6 olacaktr; nk Sevda kelimesi, uzun Stringde 6nc karakterden balamaktatr. Len Bir Stringin uzunluunu belirler. Yukardaki rnekte yer alan Kayahan deikenin uzunluunu yle belirleyebiliriz: Uzunluk = Len(Kayahan)
ACTIVE SERVER PAGES 34

Uzunluk deikeninin deeri 36 olacaktr. UCase Vereceiniz bir Stringin tm karakterlerini byk harfe evirir. YeniString = UCase(Kayahan) Yeni Stringin deeri: SANA SEVDANIN YOLLARI BANA KURUNLAR olacaktr. LCase Vereceiniz bir Stringin tm karakterlerini kk harfe evirir. YeniString = LCase(Kayahan) Yeni Stringin deeri: sana sevdann yollar bana kurunlar olacaktr. LTrim, RTrim, Trim Verdiiniz Stringin (srasyla) solunda yani ba tarafnda; sanda yani sonunda ve hem banda ve hem de sonundaki boluklar temizler. Space inde, vereceiniz say kadar boluk olan bo bir String oluturur. rnein Bosluk = Space(20) Bosluk deikenin deeri (20 boluk) olacaktr. String stediiniz sayda ve istediiniz bir karakterle bir String oluturur. YeniString = String(3, *) YeniString deikeninin deeri *** olacaktr. Left, Right Bir Stringin iinde soldan (batan) veya sadan (sondan) verdiiniz sayya kadar olan karakterleri verir. rnein, yine yukardaki Kayahan deikenini kullanrsak: Solda = Left(Kayahan, 4) Solda deikeninin deeri Sana olacaktr; nk Kayahan deikeninin soldan itibaren drt harfi Sana kelimesine denk geliyor. Mid Bir Stringin iinde balang noktasn ve karakter olarak boyunu verdiiniz alanda yer alan Stringi verir. Ortada = Mid(Kayahan, 5, 8) Ortada deikeninin deeri Sevdan olacaktr; nk Kayahan deikeninin soldan 5nci deikeninden itibaren 8 karakterlik alanda Sevdan karakterleri yer alyor. Dizi-Deiken (Array) Fonksiyonu VBScriptin dizi-deiken oluturmada Array() fonksiyonu ile salad kolaylklara ksaca deindik. Fakat Array ile daha bir ok i yapabiliriz; ve dizi deiken oluturmakta VBScriptin dier baz kolaylklarndan yararlanabiliriz. Dizi-deikenler, zellikle Web ziyaretilerimizden gelecek bilgilerin kaydedilmesinde; veritabanndan ekeceimiz verilerin kullanlr hale getirilmesinde yararl bir aratr. Dolaysyla ASP sayfalarnzda sk sk okboyutlu dizi deikenlerden yararlanacaksnz. Bunun iin gerekli aralar ksaca ve topluca ele almamz yerinde olur. Bir dizi deiken olutururken, deikenin eleman saysn belirtmezsek, VBScript, kendi kendine Anlalan bu diziyi dinamik yapmam istiyorlar! der; ve daha sonra elemanlarnn deerleri sonradan belirtilebilecek ve eleman says sonradan arttrlabilecek bir dinamik dizideiken oluturur. (VBScript iyi huyludur, demi miydim?) rnek:
Dim Ogrenciler()

Bu komutla, Ogrenciler dizi-deikeni oluturulur; ancak eleman says belirtilmedii iin dizi dinamiktir; yani daha sonra bu dizinin eleman sayn belirleyebilirsiniz. Bunu:
ReDim Ogrenciler(15)
ACTIVE SERVER PAGES

35

gibi bir komutla yapabiliriz. imdi aklnza u soru gelebilir: Peki neden Ogrenciler dizisini batan eleman saysn belirterek tanmlamyoruz? Gzel soru! Cevab u olabilir mi? Dizideikenimizin eleman saysn henz bilmiyoruz; ve programn ak iinde bu say, baka bir fonksiyonun, Subn veya kullanc girdisinin sonucu olarak belirlenebilir. Fakat hemen belirtmek gereken bir nokta var: ReDim komutu, mevcut bir dizi-deikenin iindeki hereyi siler! Mevcut dizinin elemanlarn ve onlarn deerlerini korumak istiyorsak:
ReDim Preserve Ogrenciler(20)

yazmamz gerekir. Buradaki Preserve (koru) komutu, VBScripte mevcut dizi iindeki elemanlar korumasn, ve eleman saysn 20ye kartmasn bildirir. Buna neden gerek olabilir? Ziyaretinin tercihleri deiebilir; rnein bir elektronik alveri sitesinde ziyaretiniz yeni eyler alabilir; daha nceki alverilerine ilikin verileri tuttuunuz dizideikenin eleman saysn, daha nceki bilgileri silmeden arttrmanz gerekir. VBScriptin dizi-deikenlerini tm ayn ad tayan bir liste olarak dnebilirsiniz; sadece deiken adnn yannda dizinin kanc eleman olduunu belirten say bulunur: Ogrenciler(1): Necip Ogrenciler(2): Serap Ogrenciler(3): Neslihan Fakat VBScript ok boyutlu dizi deiken de oluturabilir. ki boyutlu dizi-deikeni tablo gibi dnn; dizinin elemanlar ayn ad tayan deikenler fakat bu kez sadece tek say deil sra ve stun numaralar ile belirleniyorlar: Ogrenciler(1,1): Necip Ogrenciler(1,2): Serap Ogrenciler(1,3): Neslihan Ogrenciler(2,1): Selim Ogrenciler(2,2): Murat Ogrenciler(2,3): Merve Ogrenciler(3,1): Elif Ogrenciler(3,2); Hande Ogrenciler(3,3): Leyla imdi, burada sral, stunlu bir tablo getirebilirsiniz gznzn nne. Bu dizideikeni u komutla oluturabiliriz:
Dim Ogrenciler(3,3)

Byle bir deikende szgelimi birinci sra (numaras 1,x olanlar) alkanlar, ikinci sradakiler (2,xler) daha az alkanlar vs., belirtebilir. VBScript, , drt ve hatta be boyutlu dizi-deiken oluturur. Ama bunu nerede kullanacanz siz kararlatrabilirsiniz. Bir dizi-deikenin herhangi bir elemann deerini, programn herhangi bir aamasnda deitirebilirsiniz:
Ogrenciler(3,2) = Caner

komutu, Handenin adn siler ve yerine Canerin adn yazar. Dizi-deikenlerimizin eleman saysn bilmek isteyebiliriz. Kimi zaman dizideikenlerimizin eleman says biz belirlemeyiz; bu bilgi bir formdan gelebilir; bir veritabanndan alnabilir; fakat mesela bir dng iin bu deikenin ka eleman olduunu bilmek gerekir. rnein elimizde 35 eleman olan Ogrenciler dizi-deikeni varsa, bu sayy
ElemanSayisi = UBound(Ogrenciler)
ACTIVE SERVER PAGES 36

komutu ile ElemanSayisi deikenine yazdrrz. ElemanSayisinin deeri bu durumda 35 olacaktr. Test Fonksiyonlar VBScriptte kullandmz baz deikenlerin o andaki durumu, programmzn akn kontrolde kullanacamz bilgiyi salayabilir. Szgelimi bir deikenin deeri bo ise, ziyaretimizin formu tam olarak doldurmadn dnebiliriz. VBScript, bize deikenlerin durumunu snamamz iin baz zel fonksiyonlar salar. Bu zel fonksiyonlardan dnen deer True (doru) veya False (yanl) olur; doru sonucun deeri 1, yanl sonucun deeri ise 0dr: IsArray Bir deikenin dizi-deiken (Array) olup olmadn snar. IsDate Bir deikenin deerinin tarihe (Date) evrilip evrilemeyeceini snar. IsEmpty Bir deikenin tanmlanp deer atanm olup olmadn snar. IsNull Bir deikenin geerli bir deer tutup tutmadn snar. IsNumeric Bir deikenin say olarak ileme tabi tutup tutulamayacan snar IsObject Bir ifadenin geerli bir ActiveX veya OLE nesnesine referansta bulunup bulunmadn snar. TypeName Bir deikenin trn belirtir. VarType Bir deikenin trn belirten sayy verir. *** imdi ASP iin gerekli VBScript bilgisi bu kadar deil tabi. Ama bu, ie balamamz iin yeter. lerde yeni VBScript komutlar, veya fonksiyonlar ile karlarsak (ki size garanti ederim, karlaacanz!) onlar orada ksaca ele alrz. Ama yukardaki VBScript bilgisi, her zaman lazm!

ACTIVE SERVER PAGES

37

ASPnin Nesneleri
Masa, nesnedir. Notebook bilgisayarnz da nesnedir! Arkadanz da bir nesnedir. Tabi bunu onun yzne kar sylemeseniz, iyi olur. Her nesnenin zellikleri vardr. Masa serttir. Su, iine konulduu nesnenin biimi alr. ASP tekniinde de amacmz nesnelerin zelliklerini kullanarak, ya bu zellikleri belirlemek, ya da deitirmektir. Nesne Ynelimli Programlama (Object Oriented Programming, OOP) kavramn daha nce ok duymu olmalsnz. Bir nceki blmde fonksiyonlarla, Sublarla, deikenlerle tantk. Diyelim ki retmensiniz (ah, nerede o gnler!) ve ASP programnzda her rencinin notunu veritabanna ileyen, veritabanndan notlar alarak geeni-kalan belirleyen veya rencilerle ilgili daha yaplmas gereken bir ok ii yapan fonksiyonlarnz ve Sublarnz var; bunlarn kulland bir ok deikeniniz var: demek ki sizin ASP programnzda renci diye bir nesneniz var. Ve siz bu nesneye ynelimli program yapmsnz! Her program nesnesi iki unsura sahiptir: zellik (Property, Attribute): Bir nesnenin zellikleri, onun deikenleridir. renci nesnesinin rencinin Ad, Notlar, Adresi gibi deikenleri, yani zellikleri vardr. Metod (Method): Bir nesnenin ilemesi, almas iin, ksaca kendisinden bekleneni yerine getirebilmesi iin alma yntemlerine ihtiyac vardr. Dolaysyla bir ASP nesnesinin fonksiyonlar, onun metodlardr. Fakat ASPde nesneler sadece sizin bekler halinde toplayacanz fonksiyonlar ve deikenlerden ibaret deildir. Bir kere, ASP programnda kullandnz Script dilinin getirdii nesneler vardr. ASP sayfasn Javascript ile yazarsanz baka, VBScript ile yazarsanz baka dil nesnelerine sahip olursunuz; ancak her ikisinde de ortak olan Scripting nesneleri vardr. Bunlara birazdan ayrntl ele alacaz. Sonra Web Servern size hazr sunduu nesneler vardr. Bunlar daha sonraki blmde greceiz. Ve tabi, Browsern bir HTML sayfasnn blmlerini nesne sayarak oluturduu nesneler vardr. Bunlara da dier nesneleri ele alrken sras geldike deineceiz. (Tabi bir de ASP programnz Javascript ile yazarsanz, VBScriptten farkl olarak kendisi nesne-ynelimli bir dil olan Javascriptin oluturmanza imkan verecei nesneler vardr. Fakat bu nesneler, bu kitapn kapsam dnda kalyor.) Nesneler nasl olumu olursa olsunlar, daima size bir deer verirler: Nesne.zellik = Deer Bir nesnenin bir zelliinin deeri, bizim iin bir deiken deeri gibi nem tar: If Nesne.zellik > Deer Then ... Nesnelerin zelliklerinin deerlerini deikenlere atayabiliriz; ancak bunu yaparken Nesnenin bir metoduna (fonksiyonu) gndermede bulunmamz ve gerekiyorsa bu fonksiyona kullanmas iin veri gndermeliyiz (bir fonksiyona kullanmas iin gnderilen deere argman/argument denir): Degisken = Nesne.Metod(argman1, argman2...) Daha sonra bu deikeni istediimiz yerde kullanrz. Bu kadar teoriden sonra bir rnek nesne oluturursak, belki iin iinden daha kolay kabiliriz.
ACTIVE SERVER PAGES 38

Nesneler, dier yararlarnn yan sra, birbiri ile ilgili Sublarmz, fonksiyonlarmz ve deikenlerimizi birarada tutmamz salar. imdi VBScript ile bir nesne oluturabiliriz:
<% Class Ogrenci Public Adi, Soyadi, No Function AdiSoyadi AdiSoyadi = Adi & & Soyadi End Function End Class %>

Bir dakika! Nesne (object) adn verdik fakat Class (snf) oluturduk! Bu grubun Object..End Object olmas gerekmiyor mu? Belki haklsnz; ama bir snf ancak VBScript tarafndan kullanlmaya balanrsa Nesne olur. Dolaysyla biz snf yazarz; VBScript onu Nesne haline getirir. Peki, nesneyi oluturduk; imdi bunu nasl kullanacaz. ok kolay; nce bu nesneden yeni bir olgu (instance) oluturacaz; sonra.. Ama nce bunu nasl yapacamz yazalm:
<% Dim Ogr1 Set Ogr1 = New Ogrenci Ogr1.Adi = Necip Ogr1.Soyadi = Fazl Ogr1.No = 181 Response.Write Ogr1.AdiSoyadi %>

Her nesne, New (yeni) komutu ile yeni bir deikene btn zelliklerini verir. Burada Ogr1 deikeni, yukarda oluturduumuz Ogrenci nesnesinin btn zelliklerini kazanm oluyor. Ogrenci nesnesinin .Adi, .Soyadi ve .No zellikleri olmas gerekir; nitekim Ogr1e bu zelliklerini burada veriyoruz. Ogrenci nesnesinin bir de metodu (fonksiyonu) var; Ogr1 bunu da kazanabilir mi? Tabi; hem kazanr, hem de bunu ziyaretinin Browser penceresine yazdrabilir. Nesne kavramn kavramak zordur. Fakat yukardaki rnekte grld gibi, ASP sayfalarnzda nesne oluturarak almaya altnz zaman bunun salad kolaylktan kolayca vazgemeyeceksiniz. ///////////////KUTU//////////////////// Hata (Err) Nesnesi Hangi dille olursa olsun program yazarken hata yapmak kanlmaz bir kuraldr. Dolaysyla kullandnz programlama dili hatalarnz kolayca yakalamanza imkan vermelidir. ASP programlarnzda yazm yanll, olmayan deikene gnderme gibi Script hatas olmamas gerekir. Bu tr hatalar, program Webe gnderilmeden mutlaka ayklanmaldr.
ACTIVE SERVER PAGES 39

Fakat programc olarak ngremeyeceiniz, ve ou Web ziyaretisinden veya ziyaretinin bilgisayarndan kaynaklanan hata durumlar olabilir. VBScript, u standart komutla beklenmedik hata durumlarnda programn yoluna devam etmesini salayabilir:
<% On Error Resume Next %>

Bu komutla VBScripte, hata halinde bir sonraki satrdan yoluna devam edecektir. Fakat oluan hata, programn daha sonra vermesi beklenen sonucu vermesini nleyebilir. VBScript, Err (Hata) Nesnesinin bir ok zelliinden zellikle hata says (Number), tanm (Description) ve kaynak (Source) zellikleri ile size hatann ne olduunu ve nereden kaynaklandn syleyebilir. Bu zellikleri kullanarak, programlarnzda, en azndan gelitirme aamasnda, rnein,
If Err:Number = xx Then

eklinde bir ifade ile hatann trne gre programn kazasz yrmesini salayabilirsiniz. Burada xx yerine 108 ayr hata numaras yapabilirsiniz. Hata numaralar, Microsoftun VBScript sitesinden edinilebilir. Nesneler hakknda aa yukar bir fikir edindiimize gre, imdi kullanlmaya hazr Nesnelerden balayarak, VBScript kullanrken, ASP sayfalarmzda yararlanabileceimiz Nesneleri ele alabiliriz.

Dosya Sistemi Nesnesi


Dosya Sistemi Nesnesi (FileSystemObject), ASP programnn, Web Sunucusunun sabit disk sisteminde, srcleri, klasrleri ve dosyalar ynetmekte kullanacamz temel aratr. Burada, ne denli gl bir aratan sz ettiimizi hemen grebilmek iin u kodu yazalm ve dosya_yaz.asp adyla kaydedelim:
<% Option Explicit %> <HTML> <HEAD> <TITLE>ASP ILE DOSYA YAZMA</TITLE> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254"> </HEAD> <BODY> <% Dim YaziFSO, yaz Set YaziFSO = CreateObject("Scripting.FileSystemObject") Set yaz = YaziFSO.CreateTextFile("c:\yazi_deneme.txt",True) yaz.WriteLine("Bu bir denemedir.") yaz.Close %> <H2><CENTER>Bu Web sayfas sabit diske yaz yazdrr!! <BR>imdi C: srcsnde yazi_deneme.txt adl bir dosya olmas gerekir!
ACTIVE SERVER PAGES 40

<BR>Ltfen bakar msnz?</H2></CENTER> </BODY> </HTML>

Kodumuzun Dim satrnda iki deiken belirlediimizi gryorsunuz. Fakat bu iki deikeni sistem nesnesi olan Scriptingin yeni bir olgusu olarak kullanacamz iin daha nce standart deikenlere deer atadmz gibi deil, fakat Set komutundan yararlanyoruz, ve YaziFSO deikeninde bir Scripting.FileSystemObject nesnesi oluturulmasn salyoruz. (ASP uzmanlar arasnda gelenek, nesne deeri tutan deikenlere, ilgili nesnenin ba harflerini eklemektir. Bylece bir deikenin adna bakarak, ilevini anlamak mmkn olur.) yaz deikeni YaziFSOda yeni bir olgusunu oluturduumuz FileSystemObjectin CreateTextFile (Dzyaz dosyas olutur) metodunu kullanyoruz; bu metod oluturulacak dosyann adn ve eer bu dosya varsa zerine yazlmasna izin veren True (doru) veya buna izin vermeyen False (yanl) kelimesini argman olarak alr. yaz deikeni imdi kendisi bir metod kullanabilecek ekilde, FileSystemObjectin bir rneidir; nitekim WriteLine metodu ile biraz nce oluturulan dosyaya, argman olarak verdiimiz metni yazdrmaktadr. Bu kodu altrdktan sonra, sabit diskinize bakarsanz, dzyaz dosyasn greceksiniz: Bugne kadar Web teknii olarak Browserda bir sayfay grntleyebileceimizi sanyor idiysek, sistem nesneleri kullanarak ok daha farkl eyler yapabileceimizi grm olduk. imdi FileSystemObjecti daha yakndan tanyabiliriz. Bu nesne bize sabit diske erime ve onun kaynaklarn kullanma imkan verir. Btn nesneler gibi kullanlabilmesi iin nce bir deikenin bnyesinde oluturulmas gerekir:
<% Dim DosyaSistemi Set DosyaSistemi = CreateObject(Scripting.FileSystemObject) %>

Dosya Sistemi Nesnesinin 20den fazla metodu vardr; fakat bunlardan nemlileri yle sralanabilir: CopyFile (dosya kopyala), MoveFile (Dosya ta), CopyFolder (klasr kopyala), MoveFolder (klasr ta), Create Folder (klasr olutur), DeleteFile (dosya sil), DeleteFolder (klasr sil). imdi bunlardan birinin nasl kullanlabileceine bir rnek verelim:
<% Dim DosyaSistemi Set DosyaSistemi = CreateObject(Scripting.FileSystemObject) DosyaSistemi.DeleteFile c:\belgelerim\test.* %>

Bu program ile Belgelerim klasrndeki test isimli btn dosyalar silmi olursunuz. (Bu program altrmadan nce bir ka kez dnmeniz, sanrm iyi olur; nk ASP yoluyla sildiiniz dosyalar, Geri Dnm Kutusuna gitmez!) Daha az zararl bir dier rnek ise yle olabilir:
<% Dim DosyaSistemi Set DosyaSistemi = CreateObject(Scripting.FileSystemObject)
ACTIVE SERVER PAGES 41

DosyaSistemi.CopyFile c:\belgelerim\*.*, c:\yedekler\ %>

Bu program Belgelerim dizinindeki btn dosyalar Yedekler dizinine kopyalar. FileSystemObjectin sadece bir zellii (Property) vardr: Drives (srcler). Fakat bu zellik, bir deil bir ok elemandan oluan bir dizi-deiken gibi Kolleksiyon (Collection) saylr. Nede? nk bir Web Serverda birden ok src bulunur. Her src, bu kolleksiyonun yesidir (FileSystem.Drives) ve her birinin src harfi (.DriveLetter), disk ad (.VolumeName), byte olarak bo alan (.FreeSpace) zellikleri vardr. suruculer.asp adyla kaydedeceiniz u program, denediiniz sistemin disk-disket-CD-ROM durumunu size listeleyecektir.
<% Option Explicit %> <HTML> <HEAD> <TITLE>ASP ILE SRC KOLLEKSYONU</TITLE> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254"> </HEAD> <BODY> <% Dim DosyaSistemi, Surucu, Suruculer Set DosyaSistemi = CreateObject("Scripting.FileSystemObject") Set Suruculer = DosyaSistemi.Drives For Each Surucu In Suruculer %> <b>Src:</b> <%=Surucu.DriveLetter%><br> <% If Surucu.IsReady = True Then%> <b>Disk Ad:</b> <%=Surucu.VolumeName%><br> <b>Bo alan:</b> <%=Surucu.FreeSpace%><br> <% Else %> <i>Src hazr deil!</i><br> <% End If Next %> </BODY> </HTML>

Burada zelliklerini ve metodlarn DosyaSistemi adl deikene atadmz Dosya suistemi Nesnesinin srcler kolleksiyonunun dizi-deiken gibi olduunu sylemitik. For..Next ak kontrol ile bu kolleksiyonun btn yelerinin srayla src harfi, ve hazrsa disk ad ve bo alan bilgilerini alyoruz. Drives kolleksiyonunun dier zellikleri arasnda toplam yzey
ACTIVE SERVER PAGES 42

genilii (TotalSize), src tr (DriveType; 0=bilinmiyor; 1=kartlabilir; 2=sabit; 3=a; 4=CD-ROM; 5= RAM-Drive), ve dosya sistemi (FileSystem; FAT, NTFS, CDFS), kk dizin (RootFolder) vardr. Bu program bir PWSda altnda, u sonucu alyoruz: <asp0010.tif> VBScript asndan, her srcde klasrler (Folders) ve onlarn iinde alt-klasr (Subfolders) ve dosya (Files) kolleksiyonlar bulunur. (Her klasrn iinde iinde bir alt-klasr nesnesi bulunduu iin ASP ile sonsuza kadar btn klasrlere gnderme yapabilirsiniz. Klasr nesnesinin baz zellikleri unlardr: Ad (Name), oluturulma (DateCreated), eriim (DateLastAccessed), deitirme (DateLastModified) tarihleri, iindeki dosyalar ve alt-klasrlerdeki dosyalarla birlikte boyutu (Size), bulunduu src (Drive), iinde bulunduu klasr (ParentFolder), alt-klasrler (SubFolders), kk dizin olup olmad (IsRoot). Klasr nesnesinin kopyala (Copy), sil (Delete) ve Ta (Move) metodlar vardr. Dosya (File) nesnesinin de ad, oluturma, eriim, deitirme, boyut, src ve iinde bulunduu src zellikleri, ve kopyala, sil, ta metodlar vardr. PWSnzn bulunduu sistemde, sz gelisi C: srcsnn kk dizinindeki btn dosyalarn listesini size veren bir kod yle yazlabilir (dosyalar.asp):
<% Option Explicit %> <HTML> <HEAD> <TITLE>ASP ILE KLASOR - DOSYA KOLLEKSYONU</TITLE> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254"> </HEAD> <BODY> <% Dim DosyaSistemi, Surucu, Dosya, KokDizin, KokDosyalar, DosyaNesnesi Dim SurucuHarfi SurucuHarfi = "C:" Set DosyaSistemi = CreateObject("Scripting.FileSystemObject") Set Surucu = DosyaSistemi.GetDrive(SurucuHarfi) Set KokDizin = Surucu.RootFolder Set KokDosyalar = KokDizin.Files For Each DosyaNesnesi In KokDosyalar %> <%=DosyaNesnesi.Name%><br> <% Next %> </BODY> </HTML>
ACTIVE SERVER PAGES 43

Burada SurucuHarfi deikenin deerini deistirerek, arzu ettiiniz disk/disket veya CDROMa ulaabilirsiniz. GetDrive metodu dikkatinizi ekmi olmal; bu metodla, VBScript, fiilen disk/disket sistemine eriir. Daha sonra yapacamz ASP sayfalarnda dosya sistemi nesnesinden ve disk srcleri kolleksiyonundan yararlanacaz.

Metin (TextStream) Nesnesi


Dosya sistemi nesnesi bize disk sistemine, klasrlere ve dosyalara erime imkan verir ama yeni dosyalar oluturmak veya mevcutlara ek yapmak iin yeterli zellik ve metoddan yoksundur. Bunu TextSream nesnesi salar. Bilgisayar iletim sistemlerinin anas, Unixe aina iseniz, klavyeden sabit diske kadar bir bilgisayara girdi akm bulunduunu, bunlardan birinin de metinler olduunu hatrlayacaksnz (Aina deilseniz, imdi oldunuz!). Bir iletim sistemi, metin dosyalarn okurken, yazarken bir metin ak olur; TextStream nesnesinin ad da bunu anlatyor: Metin Akm. Web Server ve dolaysyla ASP asndan sabit diske bir metin yazarken, veya sabit diskten bir metin okurken, bir metin ak nesnesi oluur. Bu nesnenin zellikleri ve metodlarn kullanarak, rnein ziyaretilerin sitemize brakacaklar form bilgilerini Web Servern sabit diskine yazdrabiliriz. Veya mevcut metinleri okuyabilir ve bunlarn ieriini ziyaretimize gndereceimiz HTML sayfann etiketlerinin ierii olarak kullanabiliriz. Metin dosyas okumak ve yazmak disk sistemini ilgilendiren bir eylem olduu iin yine Scripting nesnelerinden FileSystemObject nesnesinden yararlanacaz; fakat bu kez deiik metodlar kullanacaz. Metin Dosyas Oluturma (CreateTextFile) Aslnda biraz nce, ASP nesnelerinin neler yapabileceine rnek olarak yazp dosya_yaz.asp adyla kaydettiimiz program, bir metin dosyasn yazdrma ilemiydi. Oradaki kodlara yeniden gz atarsanz, CreateTextFile (metin dosyas olutur) metodunu yardma aryor ve bu metoda argman olarak yeni metin dosyasnn yolunu ve adn veriyorduk. Bu metod TextStream nesnesinindir; ve otomatik olarak bu nesnenin dier metodlarn kullanmamz salar. kullandmz metodlar ise WriteLine (satr yaz: bir Stringi sonuna yeni satr karakteri koyarak dosyaya yazar) ve Close (kapat: alan metin dosyasn kapatr). TextStreamin burada kullandmz ikisinin dnda iki metodu daha vardr: Write (yaz): Bir Stringi dosyaya yazdrr; satr sonuna yeni batr karakteri (Return kodu) koymaz. WriteBlankLines (bo satr yaz): Bir metin dosyasna argman olarak vereceiniz sayda bo satr yazdrr. Varolan Metin Dosyasna Ek Yapma (OpenTextFile) Metin yazdrma ilerinde sk sk uygulayacamz bir senaryo, mevcut bir metin dosyasna ek yapmak olacaktr. rnein btn ziyaretilerimizin sitemizdeki konuk defterine yazdklarn, bir metin dosyasnda toplamak isteyebiliriz. Bunu OpenTextFile metodu ile yapacaz. Bu metod, tahmin edeceiniz gibi, alacak dosyann yolunu ve adn isteyecektir. rnein, dosya_yaz.aspnin ilgili satr yle olacak:
Set yaz = YaziFSO.OpenTextFile("c:\yazi_deneme.txt",8,0)
ACTIVE SERVER PAGES

44

Burada dosya yolunu ve adn veren birinci argmana ek olarak iki yeni argman gryorsunuz: 8,0 eklinde. Bunlardan birinicisi girdi/kt durumu (I/O Mode), ikincisi ise biim (Format) ile ilgilidir. I/O Mode parametreleri unlardr: 1: okumak iin a 8: eklemek iin a Alacak dosyann biimini belirttiimiz son argman ise u deerlerden birini alabilir: 0: ASCII dosyas olarak a -1: Unicode dosyas olarak a (rnein iinde Trke karakterler varsa) -2: Sistemin varsaylan dosya tr olarak a Buna gre, bir dosyay salt okumak iin amak amacyla 1,0 argmanlarn kullanmamz gerekir. Diyelim ki bir dosyay atk. indekileri nasl okuyabiliriz? Bir dngyle. te rnei:
<% Option Explicit %> <HTML> <HEAD> <TITLE>ASP ILE DOSYADAN METN OKUMA</TITLE> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254"> </HEAD> <BODY> <% Dim DosyaSistemi, MetinDosyasi, Satir Set DosyaSistemi = CreateObject("Scripting.FileSystemObject") Set MetinDosyasi = DosyaSistemi.OpenTextFile("c:\yazi_deneme.txt",1, 0) Do Satir = MetinDosyasi.ReadLine %> <%=Satir%> <% Loop Until MetinDosyasi.AtEndOfStream MetinDosyasi.Close %> </BODY> </HTML>

Burada kullandmz metod dikkatinizi ekmi olmal: ReadLine. Bu, alan metin dosyasndan bir satr okutmamz salar. kinci ve son satrlar okutmamz ise Do..Loop kontrol salyor. Bu dng ne kadar sryor? MetinDosyas nesnesi, AtEndOfStream (akmn sonunda) oluncaya kadar. Bu, dosyann sonuna geldiimiz anda ortaya kan bir durum; bu durumla karlat anda Do..Loop, yapt ii durdurup, bir sonraki komuta geecektir.
ACTIVE SERVER PAGES 45

Burada kullandmz ReadLine metoduna ek olarak yararlanabileceimiz dier metodlar ise unlardr: Read (oku): Bir say rgman ile alr ve verdiiniz say kadar karakter okur. ReadLine (satr oku): Bir satr okur ve String olarak verir. ReadAll (tmn oku): Btn satrlar okur ve tek String olarak verir. Skip (atla): Bir say argman ile alr ve verdiiniz say kadar karakteri atlar. SkipLine (satr atla): Bir sonraki satra atlar. Bu metodlarla saladmz okuma iinin kontrol amacyla u zellikleri de kullanabiliriz: AtEndOfStream (akmn sonunda): Okutulan dosyann sonuna gelinmesi halinde True (doru) olur. AtEndOfLine (satrn sonunda): Okutulan satrn sonuna gelinmesi halinde True (doru) olur.

Sunucu (Server) Nesneleri


Buraya kadar ele aldmz nesneler bir anlamda bizim sadece tek tek sayfalarda yararlanacamz aralar salyor. Oysa ASPyi dier CGI teknolojilerinden ayran balca zelliklerden biri tek tek Web sayfalarn sanki bir bilgisayar programnn eitli pencereleri, diyalog kutular, mesaj kutular, girdi kutular gibi, birarada bir uygulama program olarak balayabilmesidir. Baka bir deyile bize, ziyaretinin sitemize baland ve ana sayfamz at andan itibaren sitemizin bir program btnlnde almasn salayacak aralar gerekir. Bunu ancak Web Servern yardmyla yapabiliriz. ASP sayfalarmzda kullanacamz ikinci grup nesne, Sunucu Nesneleridir. Bu grupta tabi nce Sunucunun kendisi yer alr; sonra ziyareti ile kurduumuz iliki gelir. Ziyareti ile ilikimizi iki ynl trafie benzetebilirsiniz: ondan bize gelen talepler, bizim ona karlklarmz. Ziyaretiden bize gelen trafie neden Talep diyoruz? Ziyareti, Browsernn URL hanesine yazd her adresle, veya formlardaki bir dmeyi veya sayfalarmzdaki herhangi bir kpry tklamakla, Servera Bana unu gndersene! demi olur. Bu taleptir. Ziyareti taleplerinin tm Talep Nesnesi (Request Object) olarak bir arada ele alnabilir. Servern bu taleplere verdii karlklar, yani ziyaretinin Browserna gnderdii sayfalar, resimler, sesler, videolar ise karlktr ve ASP asndan Karlk Nesnesini (Response Object) oluturur. Bu blmde bu nesneleri daha yakndan tanyacaz. Server Nesnesi Web Server, ASP iin bir nesnedir, ASPnin bir ok iini bu nesnenin zellikleri ve metodlar halleder. Server nesnesinin bir zellii (ScriptTimeout) ve drt metodu (CreateObject, HTMLEncode, URLEncode, MapPath) vardr. Web Server alt bilgisayarn sizin siteniz adna ynetiminden sorumludur; dolaysyla bu kadar az zellik ve metodu var diye bu nesneden ok yararlanmayacamz sanmayn. ActiveX ve COM bileenlerini altrmak Servern grevidir. ScriptTimeout zellii: Diyelim ki bir ASP Scripti ya bizim, ya ziyaretinin, ya da Servern bir hatas znden sonsuz dngye girdi! Dngnn durmas iin gerekli art asla yerine gelmiyor ve Script bir trl yapaca ii yapp, sonlandrmyor. Bu durumlarda ziyaretinin ve tabi Servern sonsuza kadar beklemesi mmkn deil! Programn bir ekilde durdurulmas gerekir. Bunu hemen hemen btn Web server programlarnn Script Timeout (Script sre
ACTIVE SERVER PAGES 46

snr) diyalog kutusuna bir deer girilerek yaplr. rein MS-Internet Information Server iin varsaylan Script Timeout sresi 90 saniyedir. Yani ISS, herhangi bir Scriptin alpdurmasn 90 saniye bekler; bu srenin sonunda Scriptin almas tamamlanmazsa ziyaretiye arzu ettii sayfann veya unsurun bulunamadn bildirir. Bu sreyi (Servern varsaylan deerinin altnda) ksaltmak deilse bile uzatmak elimizdedir. Bunu ScriptTimeout zelliini kullanarak yaparz. ASP sayfasnn herhangi bir yerine rnein u kodu koymak yeter:
<% Server.ScriptTimeout = 100 %>

Bu rnee gre Servern varsaylan Script Timeout sresi 90 saniye ise 100 saniyeye km olur. Byle bir eyi neden yapmak isteyebiliriz? Scriptiniz ok karmak veya baka bir Serverdaki veritabanndan veri ekiyor, olabilir. Geri bu anlamda 90 saniye bilgisayar milleti iin bir asr anlamna gelir, ama yine de durdurulmasayd iini baaryla tamamlayacak bir Script, bu srenin ksal yznden Server tarafndan durdurulabilir. ASP sayfalarnz ok karmaksa ve srekli Timeout hatas veriyorsa, hata aramadan nce bu sreyi uzatabilirsiniz. CreateObject Metodu: lk ASP kodunu yazdmz andan beri bu metodu kullandmz gryorsunuz. CreateObject (nesne olutur) olmasa idi, drt mevsim birbirini izleyebilir, Dnya Gnein etrafnda dnebilir miydi? Hi sanmam. Fakat ltfen o CreateObject ile bu CreateObjecti birbirine kartrmayn. Yukarda kullandklarmz Scripting nesnesinin bir metodu idi; bu Server nesnesine aittir. Diyelim ki sayfanzda reklam amal banner grafiklerini belirli zaman aral ile veya ziyaretiye gnderdiiniz Cookie (erez) bilgilerine gre deitirmek istiyorsunuz. Bunun iin diyelim ki MS-Web Server Programnn AdRotator bileininden yararlanacaksnz; yle bir kod iinizi grebilir:
<% Set Reklam = Server.CreateObject (MSWS.AdRotator)%> <%= Reklam.GetAdvertisement(/reklamlar/buyukbanka.txt)%>

Burada GetAdvertisement, Servern AdRotator bileininin bir metodudur. Servern CreateObject metodundan, veritabanna ularken de yararlanacaz. MapPath (Yolu belirle) Metodu: Web Server asndan kk dizin (root directory) Servern bulunduu bilgisayarn sabit diskinde, herhangi bir klasr olabilir. rnein IIS iin bu varsaylan deer olarak C:\inetbup\wwwroot klasrdr. zellikle ASP ile program niteliinde siteler yapmaya baladmzda, sitenin ilgili btn dosyalarnn bulunduu bir dizin iin yol belirlemek isteyebiliriz. Bunu Server nesnesinin MapPath (Yolu belirle) metodu ile yapabiliriz:
WebDizini = Server.MapPath(/benim_site)

Bu komutla WebDizini deikenin deeri muhtemelen yle olacaktr: C:\inetbup\wwwroot\benim_site\ Fakat bu metodun sadece byle duragan biimde kullanlmas gerekmez; bazen sayfalarmzda ziyareti ile etkilemenin sonucu olarak varsaylan Web dizinimizi deitirmek isteyebiliriz. Szgelimi biri Trke, dieri ngilizce iki sitemiz varsa, ve ana sayfamzda ziyareti Trkeyi setiyse, o noktadan itibaren Web uygulamamz iin Web kk-dizini, /turkish/ olacak ve mesela resimlerimiz iin verdiimiz /resimler/ dizini kk dizinde deil, /turkish/resimler/ klasrnde aranacaktr. Web yolunu dinamik olarak, yani ziyaretinin tercihine bal ekilde deitirebilmek iin, nce ziyaretiden gelecek bilgileri nasl kullanacamza, yani Request (talep) nesnesine deinmemiz gerekir.
ACTIVE SERVER PAGES 47

HTMLEncode, URLEncode: inde HTML asndan kod paras veya zel iaret saylan karakterler bulunan metinleri sayfamza ierik olarak gndereceimiz zaman Servern iaretleri aynen metin gibi gndermesini salamak iin, rnein:
Server.HTMLEncode(Deisken1 < Deisken2)

yazarsak, ASP bu metni HTML kodu olarak yorumlamaz, metin olarak alglar. Internette bazen zellikle sayfa adresleri belirtilirken baz deerlerin URL Kodu dediimiz ekilde kodlanm olarak gnderilmesi gerekir. Bu kodlama trnde boluklarn yerine + iareti konmu olmas arttr. Bu tr bilgiler gndereceimiz zaman:
Server.URLEncode(kelime 1 kelime2 kelimeme2)

eklindeki bir kod Bunu hemen u ekle sokacaktr: kelime1+kelime2+kelime3 Talep (Request) Nesnesi Web Server ok akll bir programdr; bir Web ziyaretisi herhangi bir talepte bulunduu, yani bir sayfann gnderilmesini istedii anda, bu talebi, bir nesne halinde ele alr; kolleksiyonlar oluturur. Bu kolleksiyonlar, HTTP protokol ile iletiimin sonucu olarak ziyaretinin Browserndan ve Internete giri noktas olan ISSin bilgisayarndan balayan ve Web Serverdan derlenen bir dizi bilgidir. Bir anlamda, Request nesnesi, Web programmzn Girdi (Input) blmn oluturur. Request nesnesi kendi iinde drt ana nesne barndrr:
QueryString ve Form

Web ziyaretisinin bilgisayarndan kalkp Servera gelen herey, QueryString kolleksiyonunu oluturur. Bu ziyaretinin Browsern URL adresi hanesine yazd bir basit HTML sayfas yolu ve ad olabilir; bir Formun Gnder dmesini tkladnda gelen bilgiler olabilir. Bu bilgilerin u zelliklerini kullanabiliriz: Content_Length: Bir Formdan gelen bilgilerin tmmn byte olarak boyutudur. Remote_Host: Ziyaretinin IP adresini verir; ancak Internete evirmeli a ile balanan ziyaretilerimiz her seferinde farkl bir IP bildirebilirler. Bu yzden bu bilgiyi ziyaretinin kimlii sayamayz. Request_Method: Formda kullandmz GET veya POST metodunu bildirir. ki yntemle gelen bilgi farkldr. Formun oluturduu bilgileri GET yntemi ile alrsak bu, evre deikenlerinden QUERY_STRING deikeninin iine yazlr. Baka bir ifade ile Formdaki btn deikenlerin adlar ve bu deikenin ierdii deer yumak yaplr (bu yuman niteliine ve nasl zeceimize geleceiz!) ve Serverda QUERY_STRING deikeninin deeri olarak yazlr. Formun bilgilerini POST yoluyla alyorsak bunlar Request nesnesinin Form kolleksiyonunun iinde Formun deiken adlar ve ziyaretinin bu deikenler iin salad deerler olarak ayr ayr yazlr. GET ile snrl, POST ile snrsz bilgi alabiliriz. Script_Name: O anda altrlmakta olan ASP sayfasnn adn verir.
ServerVariables (Server Deikenleri)

Request nesnesinin bir dier kolleksiyonu, bizim kendi Web Servermzn o anda almakta olan ASP sayfas iin oluturduu ortamn deikenleridir. Bunlarn arasnda ziyaretinin
ACTIVE SERVER PAGES 48

Browserna ilikin bilgiler de vardr. nvc u ksa ASP sayfasn altrarak kendi Servermzn u andaki deikenlerini grelim; sonra bunlar ayrntl ele alalm (SerDeg.asp):
<HTML> <HEAD> <TITLE>HTTP ServerDegikenleri Kolleksiyonu</TITLE> <meta http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <meta http-equiv="Content-Type" content="text/html; charset=windows-1254"> </HEAD> <BODY BGCOLOR=white> <CENTER> <H2>HTTP Server Deikenleri Kolleksiyonu</H2> </CENTER> <TABLE BORDER=1> <TR><TD><B>Deikenin ad</B></TD> <TD><B>Deeri</B></TD></TR> <% For Each key in Request.ServerVariables %> <TR> <TD><% = key %></TD> <TD> <%If Request.ServerVariables(key) = "" Then Response.Write "&nbsp;" Else Response.Write Request.ServerVariables(key) End If Response.Write "</TD>"%> </TR> <% Next %> </TABLE> <p> Sizin Host'unuzun ad:<B> <%=Request.ServerVariables("HTTP_HOST")%></B> </BODY> </HTML>

Bu sayfay altrdmz zaman grntlenecek tabloda, Bir HTTP Servern SerDeg.asp sayfasn altrd anda oluturduu ortama ekil veren btn deikenleri greceksiniz. Bu deikenleri programlama yoluyla deitiremeyiz; sadece okuyup, yararlanabiliriz. HTTP Server Deikenleri Kolleksiyonunun elemanlar yle sralanr: Deikenin ad Deeri

ACTIVE SERVER PAGES

49

ALL_HTTP

HTTP Header iinde yer alan btn deikenler ve deerleri. Header adlarnn nnde HTTP_ neki vardr. ALL_RAW HTTP Header iinde yer alan btn deikenler ve deerleri. Header adlar ve deerleri istemci Browsern verdii ekilde gsterilir. APPL_MD_PATH Web Servern ISAPI.DLL dosyas iin varsayd kk dizin APPL_PHYSICAL_PATH Web Servern varsayd kk dizinin gerek yolu AUTH_PASSWORD Kullanc Web Servera kullanc ad/parola yntemiyle balanabiliyorsa, kullanlan parola AUTH_TYPE Kullanc Web Servera kullanc ad/parola yntemiyle balanabiliyorsa, kullanlan yetkilendirme yntemi AUTH_USER Kullanc Web Servera kullanc ad/parola yntemiyle balanabiliyorsa, kullanc ad CERT_COOKIE Kullanc siteye balanmak iin yetkilendirme sertifikas kullanyorsa kendisine verilen kimlik (ID) CERT_FLAGS Sertifikann varln gsteren bit deeri CERT_ISSUER Sertifika varsa veren kurum CERT_KEYSIZE Secure Socket Layers kullanlyorsa, balant iin anahtar deeri CERT_SECRETKEYSIZE zel anahtar deeri CERT_SERIALNUMBER Sertifika seri no. CERT_SERVER_ISSUER Sertifikay veren merci CERT_SERVER_SUBJECT Server Sertifikasnn konu alan deeri CERT_SUBJECT stemci Sertifikasnn konu alan deeri CONTENT_LENGTH stemcinin gnderdii bilgi yumann boyutu CONTENT_TYPE Ziyaretiden gelen bilgilerin GET veya POST metoduna gre edindii tr GATEWAY_INTERFACE Web Servern ziyareti ile etkileim arayznn ad ve srm. Genellikle: CGI/1.1 HTTPS Ziyareti ile balant gvenli ise ON, deilse OFF HTTPS_KEYSIZE Secure Sockets Layer iin balant anahtar says HTTPS_SECRETKEYSIZE zel Server sertifikasnn gizli anahtar says HTTPS_SERVER_ISSUER zel Server sertifikasnn veren merci HTTPS_SERVER_SUBJECT zel Server sertifikasnn konusu INSTANCE_ID Web Servern ayn anda ka kere almakta olduu INSTANCE_META_PATH u anda almakta olan Web Servern Meta yolu LOCAL_ADDR stemcinin IP numaras LOGON_USER stemci Windows NT sisteminde ise oturum ama ad PATH_INFO almakta olan ASPnin greli yolu ve ad PATH_TRANSLATED almakta olan ASPnin gerek yolu ve ad QUERY_STRING stemcinin gnderdii bilgi kmesi REMOTE_ADDR stemcinin Hostunun (ISSinin) IPsi REMOTE_HOST stemcinin Hostunun (ISSinin) ad
ACTIVE SERVER PAGES 50

REMOTE_USER REQUEST_METHOD SCRIPT_NAME SERVER_NAME SERVER_PORT SERVER_PORT_SECURE SERVER_PROTOCOL SERVER_SOFTWARE URL


Cookie (erez)

stemcinin gerek ad stemciden bilgi isteme yntemi (GET veya POST) almakta olan ASPnin ad Sunucunun ad Sunucuya balantnn geldii TCP kap numaras TCP kaps gvenli ise 1, deilse 0 Servern altrd HTTPnin srm Server programnn ad ve srm u anda geerli URL

Daha nce ne kadar ok olursa olsun tek-tek Web sayfalarndan oluan siteler yaptysanz bile, Cookie (erez) ile ilginiz olmam olabilir. Ya da sadece Internet ziyaretisi olarak bakalarnn size gnderdiii Cookielere sinirlenmekle yetinmi olabilirsiniz. Fakat imdi ASP ile Web Program oluturmaya hazrlanan kii olarak Cookielerle daha yakndan ilgilenmeniz gerekiyor. nk artk siz de bakalarna erez gndereceksiniz! Tabi bunun iin nce Cookie neden gereklidir? sorusunu yantlamak gerekir. HTTP ile yaplan iletiim, belirgin olmayan durum balantsna dayanr: yani ne istemci sunucunun, ne de sunucu istemcinin o anda hatta (on-line) olduunu bilmek zorunda deildir; birbirlerinden istedikleri ve gnderdikleri eyleri kar tarafndan almaya hazr olduunu bilmeden gnderirler. Oysa szgelimi elektronik alveri gibi ziyaretinin bir yerlere bireyler kaydettii, geici deikenler oluturduu durumlarda sitemizde kimin ne yaptn bilmek zorundayz. Ziyeretinin bir sayfada yapt tercihler dier sayfalarda ona sunacamz ierii etkileyebilir, belirleyebilir. Oysa ayn ziyareti bir sayfadan dierine geerken Server ile ilikisini kaybedebilir. Bunun iin ziyaretinin Internetten kopmas gerekmez; sadece TCP/IP protokol gerei bizimle balants kesilebilir. Bunu ziyareti farketmeyebilir; ama Server etmek zorundadr. Heryeni ilikiye yeni bir application (uygulama program) balatamayz; ziyaretinin bir nceki sayfada yapt tercihlerin devam etmesi gerekir. Bu devamll ziyaretiyi iaretleyerek yaparz; bu iareti de Cookie salar. ASP tekniiyle tasarladmz sitede, ziyaretilerimize Cookie gndermek zorunluktur diyebiliriz. ASP asndan Cookieler bir nesne olutururlar. Aslnda, Cookieler ASP iin iki ayr grup Cookie nesnesi olutururlar: verilenler, ve hakknda bilgi alnan varolan Cookieler. Birinci grup Request (talep) nesneleri, ikinci grup ise Response (karlk) neslereni iinde ele alnabilir. Cookie konusunun devamn Response nesnelerine deindiimiz yere brakalm.
Sertifika Nesnesi

Sertifika, HTTP balantsnda Ben filancaym! diyen istemcinin, gerekten filanca olup olmadn gsterir. Bir yazlmdan ibaret olan sertifikalar yetkili bir kurum veya irket verir; bir seri numaras olur. ifreleme teknikleri gelimi olduu iin taklit edilmesi zordur. Sertifika uygulamas iin Web Servern Secure Socket Layers denen gvenli HTTP protokoln kullanmas gerekir. Bu durumda Servern URLi, http:// diye deil https:// diye yazlr. ASP asndan sertifika ile ilgili her trl bilgi ClientCertificate kolleksiyonunda durur. Szgelimi, bir ziyaretinin gerekten sitenize girmeye yetkili olup olmadn anlamak iin:
<%SertifikaNo = Request.ClientCertificate(SerialNumber) %>

gibi bir kodla istemcinin Sertifika seri numarasn SertifikaNo deikenine atayabilir ve daha sonra bu deikenin deerini elinizdeki bir liste ile karlatrabilirsiniz.
ACTIVE SERVER PAGES 51

Karlk (Response) Nesnesi Ve geldik Web Serverin kt (Output) salad istemciye giden karlklarn oluturduu nesneye. Serverdan Browsera giden herey karlktr. Bu bir ASP veya HTML sayfas olabilir, sayfann iindeki GIF, JPG veya PNG grafii, bir Flash, video veya ses dosyas olabilir. Bylesine zengin ierii olmakla birlikte Response nesnesinin sadece bir kolleksiyonu vardr: Cookieler. Buna karlk Response nesnesinin kullanabileceimiz ok sayda zellii ve metodu bulunur. nce Cookie kolleksiyonunu ele alalm; sonra nemli Response nesnesi zellikleri ve metodlar zerinde duralm.
Cookieler

Request nesnesinin Cookie kolleksiyonuna deinirken, ziyaretilerimizi Browserlarna Cookie gndererek tabir yerinde ise iaretleriz, demitik. Bu iaretleme, sz gelimi, ziyaretinin bir Forma yazd ad ve soyad ile elektronik posta adresini Cookie olarak onun bilgisayarna kaydetmek eklinde olur. Bir kii sayfamz talep ettii anda, ASP programmz bu kiinin bilgisayarnda daha nce koyduumuz Cookieyi arar ve bulur; Cookieden bu kiinin adn renir ve mesela sayfamz Sayn Filanca, sitemize ho geldiniz! baln grntler. Cookieler sadece byle fiyaka amal olarak kullanlmaz; ziyaretinin daha nce sitemizde ziyaret ettii sayfalar veya elektronik ticaret sitemizden satn ald kitap trlerini Cookieye kaydedebiliriz. Ziyaretinin ikinci ziyaretinde ona nce bu sayfalarn veya kitaplarn kprlerini sunabiliriz. Bir Cookienin ad ve anahtarlar (key) ile bu anahtarlara karlk deerler olur. rnein:
<% Response.Cookie(Bizim_Cerez)(Adi_Soyadi)= Necip Fazl %>

Bu, ziyaretinin Browserna (yani sabit diskine) Bizim_Cerez isimli bir Cookie gnderir; bu Cookienin Adi_Soyadi adl bir anahtar vardr; bu anahtarn deeri ise Necip Fazl olur. Cookie kolleksiyonunun iki zellii bulunur: Expires (zaman aam sresi): Bir cookienin artk geersiz olduu tarihi gsterir.:
<% Response.Cookie(Bizim_Cerez).CookieExpires = August 7, 2000 %>

Bu Cookie, 7 Austos 2000 tarihinden sonra kullanlmaz olacak demektir. HasKeys: Cookienin String mi ierdii yoksa anahtarlar ve deerleri mi bulunduunu belirtir, HasKeys = False birinci, HasKeys = True ise ikinci durumu belirtir. Bir Cookiede birden fazla anahtar ve deer bulunuyorsa, tmn bir ASP kodu iinde yazmak, Cookienin gnderilmesini kolaylatrr
Metodlar

Response nesnesinin bir ok metodu vardr; bunlardan .Write yukardaki rneklerde sk sk kulandk:
<% DIM Adi_Soyadi Adi_Soyadi = Necip Fazl Dayanr Response.Write(Merhaba, benim adm, & Adi_Soyadi) %>

rnei, ziyaretinini Browser penceresine: Merhaba, benim adm Necip Fazl Dayanr yazdrr. Fakat VBScript, size bir kolaylk salar; buna baz ASP tasarmclar eittir metodu adn verir:
ACTIVE SERVER PAGES 52

<% DIM Adi_Soyadi Adi_Soyadi = Necip Fazl Dayanr %> <%= Merhaba, benim adm, & Adi_Soyadi %>

zellikler

Response nesnesinin bir ok zelliini kullanarak ziyaretimize gndereceimiz sayfalar ve dier unsurlar ynetiriz: Buffer (Tampon) : True (doru) olarak ayarlandnda ziyaretiye gnderilecek sayfann btn unsurlar bir tampon blgede toplanr, Scriptin almas bitinceye kadar beklenir ve HTML sayfa toptan gnderilir. Kimi zaman ASP kodumuz sonuna kadar altnda ziyaretiyi baka bir sayfaya ve siteye ynlendirebilir. Bu gibi sebeplerle, zellikle ok ilem gerektiren ASP sayfalarnn batarafna bunu salayan kodu koymakta yarar olabilir:
<% Option Explicit Response.Buffer = TRUE %>

Flush (hemen gnder): Buffer metodu sayfann tmnn Scriptin icras bitmeden gnderilmesini nlerken, Flush bunun tam tersini yapar. ASP, Response nesnesinin Flush metodu kullandmz grd anda, o ana kadar icra edilmi kodun sonucu olan HTMLi Browsera gnderir:
<% Option Explicit Response.Flush %>

Clear (Boalt): Buffer metodu ile Scriptin sonunu beklerken geici bir alanda tutulmakta olan HTML, Clear metodu ile temizlenir, yok edilir. Flush metodunda tampondaki HTML Browsera gnderilir; ancak Clear metodu tampon blgedeki hereyi yok eder. Byle tehlikeli bir metod neden vardr, ve nerede kullanlabilir? Bir ok yerde: ziyaretinin szgelimi elektronik alveri sitemizde alveriten vazgetiini belirtmesi zerine tampon blgede tutmakta olduumuz ve alnan mallar listesini ieren HTMLi bu yntemle temizleriz:
<% Option Explicit Response.Clear %>

Expires (Sresi dolar): Kullanc tersine bir ayar yapmadysa, Browser genellikle grntledii sayfalar Geici Internet Dosyalar dizinine (cache) kaydeder ve tekrar ayn sayfay grntlemek istediinizde sayfay Internetten edinmek yerine kendi sabit diskinden alr. Oysa zellikle haber gibi sreli bilgilerin sunulduu Web sitelerinde bu sitenin itibarn sarsar.

ACTIVE SERVER PAGES

53

ASP tekniiyle bunu nleyebiliriz. ASP sayfamzda bu sayfann gzgelimi 60 dakikadan fazla cach dizinde tutulmamasn salayacak Expires metodunu kullanabiliriz:
<% Option Explicit Response.Expires = 60 %>

Burada yazdmz rakam deitirerek, sayfann cachde tutulaca dakikay deitirebiliriz. Expires = 0 sayfann hi saklanmamasn salar. End (Son): Response nesnesinin o anda icra edilmekte olan Scripti durdurarak, o ana kadar ne elde edilmise hepsini Browsera gndermesini salayan metodu olan End, ayn zamanda Buffer metoduyla tutulan HTMLin de gnderilmesine yol aar. Bu metoddan sonraki HTML veya ASP kodlar icra edilmez:
<% Option Explicit Response.End %>

Response nesnesinin ASP sayfasnn kt kontroln salayan bu metodlarn aadaki elenceli Scriptle snayabilirsiniz (ASP ile elence de bundan daha fazla olamaz!). Burada Browsera gitmesi midiyle cmle var. Program altrn ve bakalm hangisi ekranda kalacak? Bu kadar elendiinize gre u soruyu da yantlayabilirsiniz: Neden?
<% @LANGUAGE = VBScript %> <% Option Explicit Response.Buffer = True Response.Expires = 60 %> <HTML> <BODY> Bu 1 Numaral mesaj m Browsera gidecek? <% Response.Clear Response.Expires = 0 %> <HTML> <BODY> Bu 2 numaral mesaj m Browser'a gidecek) <% Response.Flush
ACTIVE SERVER PAGES 54

%> </BODY> </HTML> <% Response.End %> Bu 3 numaral mesaj m Browsera gidecek? </BODY> </HTML>

Uygulama (Application) ve Oturum (Session) Nesnesi ASPnin varlk sebebi, standart CGIn yetersiz kald noktalardan biri olan Web Servern her bir Web ziyaretiyi oturumunun bandan sonuna izleyebilmesi iindir, dersek durumu abartm olmayz. ASP asndan, bir site uygulama program (Application) saylr. Her ziyareti de bir oturum (Session) saylr. Bir takm ASP ve HTML sayfalarndan oluan bildiimiz Siteye application, her hangi bir ziyarete de session denmesinin sebebi nedir? Bunu her iki nesnenin ilevleri ile aklayabiliriz. Application nesnesi, sitenin tmyle ilgili bilgileri (deikenleri, nesneleri ve metodlar) tutar; Session nesnesi ziyaretinin sitemize girmesinden itibaren izini srer. Diyelim ki bir borsa sitesi yaptnz; ziyaretileriniz gelerek, sata sunulan hisse senetlerinin deerlendirmelerini okuyacak ve size u, u hisse senetleri al! diye talimat brakacak. Btn ziyaretilerinizin eriecei sadece bir veritabannz var; buna karlk her bir ziyaretinin yapaca farkl tercihler, verecei farkl kararlar olacaktr. Application nesnesi, sitenizle (artk site yerine Web Uygulama Program desek de azmz almaya balasa!) veritabanna erimekten tutun, alverilerie kadar sitede yaplacak btn ilerin btn kurallarn bilecek ve uygulayacak; Session nesnesi ise szgelimi benim alverilerimi, tercihlerimi bilecektir. HTML ve Javascript ile biraz oynadysanz, bilirsiniz ki bir sayfadan tekine deiken deeri aktarmak, imkansza yakn derecede zordur. Deikenlerin mr, fonksiyonla snrldr. Bir ASP sayfasnda herhangi bir deikeni fonksiyon dnda tanmlamakla ve deer atamakla onu btn fonksiyonlar iin geerli hale getirebiliriz. Fakat kimi zaman isteriz ki, bir fonksiyonun deeri btn sayfalarda ayn olsun; ziyaretinin sayfa deitirmesi ile deikenin deeri deimesin. Bunu ASPde yapmak ok kolaydr. ASPde bu zorluu yenebilmek iin deikenlerimizi Session nesnesi iin oluturabiliriz; ve bu deer ziyaretinin oturumu boyunca devam eder; btn ASP sayfalarndaki btn Fonksiyonlar tarafndan bilinebilir. rnein:
Session (Tupras) = 44500

btn Session iin geerli bir Tupras deikeni oluturur ve ona 44500 deerini atar. Kimi zaman, deikenin ok daha geni kapsaml olmasn, yani mrnn Session ile deil btn Application boyunca belirli olmasn isteyebiliriz. O zaman bu deikeni Application dzeyinde tanmlayabiliriz:
Application (Tupras) = 44500

Bu durumda Tupras deikeni btn ziyaretiler iin ayn deere sahip olacakatr.
ACTIVE SERVER PAGES 55

Session nesnesinin oluabilmesi iin, ziyaretiye mutlaka bir Cookie gndererek, sitemizde (hani Uygulama Program diyecektik?) bir iaret vermemiz gerekir. Daha nce, HTTP ile kurduumuz balant, belirsiz durum balantsdr demitik. Bu, Servern bir ziyaretiye arzu ettii sayfay gnderdikten sonra, onu alp almadn, o sayfada ne tercihler yaptn bilmemesi demektir. Oysa, ziyaretiye sitemize baland anda bir Session kimlii verirsek ve her yeni sayfa talebinde bu kimlii kontrol edersek, kimin hangi oturumunu srdrdn biliriz. ASPuyumlu bir Web Server, ziyareti yeni bir tercih yapmad taktirde her Session nesnesini 20 dakika ak tutar; sonra siler. Bu sreyi Session nesnesinin Timeout zellii yoluyla deitirebilirsiniz. Session belirleyen Cookie ASP-uyumlu Web Server tarafndan otomatik olarak gnderilir ve takip edilir; tasarmc olarak bizim bu konuda bir ey yapmamz gerekmez. Bir Web programnza ayn anda ka kii ularsa (yani sayfalarnz ka kii talep ederse), o kadar Session nesnesi oluur; fakat siteniz bir adet olduuna gre bir adet Application nesnesi vardr. Bu nesnenin btn Sessionl ar iin sitemizin ihtiyalarna uygun ve ayn uygulama kurallarna sahip olmasn salayan bir dosya vardr: Global.asa. Bu dosya PWS veya IIS kurulurken oluturulur. ASP ile Web programlarnz, rnein MS Visual Studio ile oluturuyorsanz, program sizin iin setiiniz dizinde bir Global.asa dosyas oluturacaktr. Bu dosyada, ou zaman, sitemize ilk ziyaretinin gelmesiyle oluan Application_OnStart ve son ziyaretinin kmasyla oluan Application_OnEnd ile herhangi bir ziyaretinin bir sayfaya erimesiyle oluan Session_OnStart ve ziyaretinin sitemizden kmas ile oluan Session_OnEnd olaylar halinde ne yaplaca yazldr. Bu dosyann ierii standart bir ASP dosyasna benzemekle birlikte adndaki uzatmann .asp deil de .asa olmasnn sebebi, dosyann Active Server Application dosyas olmasdr. ASP-uyumlu bir Web Server program sitemize ulaan ilk ziyaretiyi grd anda Global.asa dosyasn altrr. Application ve Session nesnelerin kendi balarna en ok kullanld yer, sitemize gelen ziyaretilerin saysn (sitemizin ald Hit saysn) tutmasn salamaktr. Bu genellikle Global.asa pogramna bir saya yerletirilerek yaplr.

ActiveX Veri Eriim (ADO) Nesneleri


ASPnin dier CGI tekniklerine gre kolay olmasnn (peki, kabul, kolay grnmesi diyelim!) belki de sadece veri eriimini adeta ocuk oyunca haline getirmesidir. ADO, gerekte bir ASP nesnesi olmaktan ok Server Componenti (sunucu bileeni) saylr. Bu bileene biz ASP iinden bir ActiveX nesnesi ile ularz. Veritaban, gnmzde giderek Web Programlarnn temelini oluturuyor. Sayfalarn unsurlar veritaban dosyasndan alnyor; ziyaretilerin verdikleri bilgiler veritabanna yazlyor. Bu geliimin balca sebebi, veritabannn site gncelletirme ilerini kolaylatrmasdr. Sz gelimi bir sayfadaki seenekleriniz, bir veritabanndan alnyorsa, bu seenekleri alan VBScript kodu hi deimeden kalacak ve siz sadece veritaban dosyanzda ilgili verinin alnd alana yeni deerler girerek, sayfanz srekli gncel tutmu olacaksnz. Bir dier sebep ise veritaban dosyalarnn idaresinin kolay olmasdr. Szgelimi ziyaretilerinizden aldnz bilgileri daha sonra muhasebe kaytlarnza veya adres defterinize, mteri ktne ya da baka suretle kayda geirmek istiyorsunuz. Ziyaretilerimizin form yoluyla bize ilettii bilgileri dzyaz dosyasna ilemenin yollarn Dosya sistemi Nesnesini (FileSystem)
ACTIVE SERVER PAGES 56

grrken, ele aldk. Bunu yapabiliriz kolayca. Ama daha sonra dz yaz dosyasnn idaresi, veritabannn idaresi kadar kolay olamaz. ASP sayfalarnz Access, Excel, Paradox, FilePro, SQL Server ve Oracle veritabanlarna ve spreadsheet dosyalarna eriebilir; bu dosyalardan veri okur ve bu dosyalara veri yazabilir. zetle, ASP programlarmzla, SQL-uyumlu veya Windows ve dier sistemler iin yazlm ODBC (Open Database Connectivity/Ak Veritaban Balants) ile uyumlu her trl dosyaya, ADO nesnesi araclyla ulaabiliriz. ODBC ve OLE-DB Bu kitapn batarafnda, ASP dosyalarnz gelitirmeye balamadan nce bilgisayarnzda ODBC (Open Database Connectivity/Ak Veritaban Balants) srclerinin kurulu olmas gerektiini belirtmitik. ODBC, ADOnun kulland tek sistem deildir; ve Microsoft firmas, ODBCnin yerine hzla OLE-DB adn verdii yeni bir teknolojinin almas iin youn aba iinde. OLE-DB, ODBCnin Webde salad baarnn zerine bina edilen yeni bir teknoloji. ODBC, ilikilendirilmi (relational) veritabanlarna erimek zere tasarland halde OLE-DB her trl veritabanna eriebilir. OLE-DB, ASP programlarmza yeni nesneler kazandrabilir; kullanlmaya hazr elektronik ticaret bileenlerini kullanmaya imkan verir. Bu konuda geni bilgiyi, Microsofttan edirebilirsiniz. ASP sayfalarmzda kullanacamz ADO nesneleri ilerde de ODBC srclerine erime imkann koruyaca iin, imdilik sadece ODBC teknii ile almakta ve bu teknii renmekte saknca yok. OLE-DB, ODBCnin yerini almayacak; fakat iinde ODBCyi de bulunduracak. Bu da u anda oluturacamz ASP uygulamalarnn ilerde OLE-DB teknii ile alan sunucularda ileyecei anlamna geliyor. imdi ADO ile aada yapacamz kk rnekler iin bilgisayarnzda kurulu bir veritaban program varsa onu kullanarak bir veritaban dosyasnda uyeler adyla u tabloyu oluturabilirsiniz: Alan Ad: Veri tr uyeNo AutoNumber (Birincil Anahtar/Primary Key) uyeAdi metin uyeSoyadi metin email metin mesaj memo Daha sonra da renkler adyla u tabloyu yapn: Alan Ad: Veri tr renkID AutoNumber (Birincil Anahtar/Primary Key) renk metin Bu tablolardan birincisine bir ka isim ve dier bilgileri; ikincisine ise drt-be renk ad girin. Bilgisayarnzda veritaban oluturma program yoksa bu kitapn kodlar arasnda bulunan uyeler.mdb adl MS-Access dosyasn kullanabilirsiniz. Bu dosyay, kiisel Web Servernzn kk dizinine kopyalayn. Sonra, Denetim Masasn an ve ad ODBC, ODBC 32 Bit, ya da ODBC Data Source olan simgeyi altrn; ikinci sekme olan System DSNi tklayn. Alacak kutuda Add/Ekle dmesini tklayarak, yeni veri kayna oluturmak iin ilk adm olan veriyi okumakta kullanacamz srcy seebileceimiz kutunun almasn salayn. Burada, yukarda oluturduunuz veri dosyasna uygun srcy sein. rnek uyeler.mdbyi
ACTIVE SERVER PAGES 57

kullanyorsanz, birinci seenek olan Microsoft Access Driver semeniz gerekir. Son dmesini tklayn ve Access dosyasnn kurulumunu yapmaya balayalm. Buradaki Data Source Name (DSN, Veri Kaynak Ad), biraz sonra ADO nesnesiyle ilgili metodlar ve deyimleri yazarken kullanacamz veri addr; buraya uyeler yazn; nk rneklerde bu veriye uyeler adyla gnderme yapacaz. sterseniz, Description/Aklama blmne veritabannn niteliini belirten bir ka kelime yazabilirsiniz. Sonra, Select/Se dmesini tklayarak ve alcak diyalog kutusu yardmyla veritaban dosyasn kopyaladnz yerde bulun; OK/Tamam tklayarak, veritaban seme ilemini tamamlayn. DSN oluturma kutularn srasyla OK/Tamam dmelerini tklayarak kapatn; uyeler verisi, u andan itibaren btn Web uygulamalarmzn hizmetine girmi demektir. Internet sitenize koyacanz ve veritabanna erimesi gereken sayfalarnz iin bu ilemi gerek Internet ortamnda da yapmak zorundasnz. Veritaban dosyanz Internet sitenizde kk dizinine veya bir dier dizine kopyaladktan sonra sistem yneticisine ya elektronik mektupla, ya da evsahibi firmann ynetim ve teknik destek yardm salayan sayfasnda veritabannzn dosya adn, yolunu, ve DSN olarak kullanmak istedeiniz ismi bildirerek, bizim burada yaptmz ii Server yneticisinin yapmasn salamamz gerekir. ADOnun bize salad imkanlardan yararlanabilmek iin onun nesnelerini kullanlrz. Bu blmde ADOnun nesneleri ve metodlarn ele alacaz. Connection (Veritabanna balant) ADOdan yararlanabilmek iin kullanacamz ilk nesne Connectiondr. Bu nesne ile veritaban ile balant salarz, yol aarz:
<% Dim Veriyolu Set Veriyolu = Server.CreateObject(ADODB.Connection) Veriyolu.Open Veri_adi %>

Burada, Servern CreateObject metodu ile ADOBD.Connection nesnesini oluturuyoruz. Oluturduumuz balantya istediimiz deiken adn verebiliriz. Bu rnekte veriye kurduumuz bu balant Veriyolu adyla biliyor. Bu yolla salayacamz veriler, ASP program boyunca bir isimle bilinmelidir. Veriyolunun aaca veri kmesinin ismini buradaki Veri_adi kelimelerinin yerine yazarz. Bu isim, balantnn .Open metodu ile aaca verinin addr. Bu, kullanacamz veritaban dosyasnn ad deildir. Bu isim ile sz konusu veritaban dosyasn iletim sisteminin ODBC aracna tantrken kullandnz isim ayn olmaldr. Bir veritaban dosyasn ODBC aracn kullanarak sisteme tantma (DSN-Data Source Name) ayarnn nasl yapldn daha nce ele aldk. Bu satrla, ASP program, Serverdan ADO araclyla, sistemin Veri_adi kelimelerinin yerine yazacanz isimli veriye yol aacaktr. rnein yukardaki kutuda oluturduumuz ODBC veri kaynan kullanacamz zaman, buraya uyeler kelimesini yazacaz, Recordset (Kayt dizisi) Veritabanna balanty oluturduktan sonra, buradaki tabir yerindeyse ham verileri, kullanlr kaytlar haline getirmemiz gerekir. Bunu ise ADOnun Recordset nesnesi salar. Kurduumuz
ACTIVE SERVER PAGES 58

veriyolundan programmza bilgi gelmesi iin .Execute (icra et) metodunu kullanrz; ancak bu komuta icra edecei bir komut vermemiz gerekir. Batan beri ADO ile kullanabileceimiz veritabannn SQL (sequyel okunur; Structured Query Language/Yapsal Sorgu Dili) uyumlu olmas gerektiini sylyoruz. Bu dil, verilerin sabit diske yazlmas ve okunmasn dzenleyen bir ok veritaban dilinden sadece biri, fakat en yaygndr. Bir veritabanndan veri okumak, veri deitirmek veya eklemek iin komutlarmz bu dille vermek zorundayz. ASP amacyla SQL komutlarndan ok az ksmn kullanrz; bu bakmdan ASP Tasarmcs olmak iin snrl da olsa SQL renmek gerekir. Hzl SQL Kursu: Select ASP amal olarak kullanacamz komut gerekte sadece SELECTtir. Fakat hatrlamamz gereken veritaban ilkeleri var. Bir veritaban kabaca alanlar (stunlar) ve bunlarn iinde yazl deerler (satrlar) halinde olur; her satr bir elemann deerleridir; ve Kayt adn alr. SELECT Bir veritabanndan veri semeye yarar. SQL Sorgusu da denir. Drt blm vardr. Tipik bir SELECT komutu yle yazlr: SELECT alan1, alan2.. FROM tablo WHERE koul = deer ORDER BY alan1 Seilecek alanlarn ad SELECT komutunun ilk blmn oluturur. Bir veritabannda birden fazla tablo bulunabilir; seimin hangi tabloda yaplaca FROM blmnde gsterilir. Kimi zaman bir tablodaki alanda bulunan btn kaytlar semek isteyebiliriz; fakat ou zaman seimin snrlarn daraltmak iin szgelimi bir alandaki deerlerin vereceimiz bir koula uymasn isteyebiliriz. Bu durumda koul = deer testini WHERE blmnde yaparz. Seilen deerlerin hangi alandaki kaytlara gre sralanmasn istiyorsak, ORDER BY blmnde bunu belirtelibiliriz. rnek: SELECT Adi, Soyadi, TelNo FROM Telefonlar WHERE Alankodu = 0535 ORDER BY Adi Bu komutla veritabannn Telefonlar isimli tablosundan Adi, soyadi ve TelNo adl stunlarndaki kaytlardan Alankodu stunundaki deeri 0535 olanlar semi oluruz. Bir tablodaki btn alanlarn btn deerlerini semek iin SELECT komutunu yle yazarz: SELECT * FROM Veri_adi Buradaki Veri_adi kelimelerinin yerine DSNe verdiiniz ad (ornein yukardaki rnekte olduu gibi, uyeler kelimesini) yazacaksnz. SQLin INSERT, UPDATE ve DELETE komutlarnn nasl kullanldn renirseniz, ADO nesnesinin bunlara denk gelen ve aada nasl kullanldklarn greceimiz yeni kayt ekleme, kaytlar gncelleme ve silme metodlar yerine kendi SQL komutlarnz yazabilirsiniz. Saladmz veri balantsn kullanarak, yararlanabileceimiz bir veri grubu oluturmak iin, yukarda .Connection metodunu kullanrken yazdmz kodu yle gelitirmemiz gerekir:
<% Dim Veriyolu, Kayitdizisi
ACTIVE SERVER PAGES 59

Set Veriyolu = Server.CreateObject(ADODB.Connection) Veriyolu.Open Veri_adi Set Kayitdizisi = Veriyolu.Execute(SELECT * FROM Veri_adi) %>

Buradaki .Execute metodu, DSNini verdiiniz kaynaktaki veritabanndan verileri fiilen alp getirmeye ve bir Recordset (Kayt dizisi) oluturmaya yarar. Kaytlar tek tek okumas iin Kayitdizisine bir sonraki kayda gitmesini bildirmemiz gerekir. Bunu .MoveNext (bir sonrakine git) metodu ile yaparz. Okunan her kayt Kayitdizi adl deikenin iindedir. Bu nesnenin elemanlarn herhangi bir dng yntemiyle ziyaretinin Browser penceresinde grntleyebiliriz; bir HTML etikenin ierii yapabiliriz; veya baka bir ekilde kullanabiliriz. Ayn dng, .MoveNext ile bir sonraki kaydn okunmasn da salayacaktr. Bunun bir rneini daha sonra greceiz.
Recordset.Open

Veritabanna dayanan Web uygulamalarmzda sorun buradaki gibi sadece veriyi okumakla bitmeyebilir; veriyi gncelletirmek veya silmek isteyebiliriz. Bunun iin doruca ADOnun .Recordset metodundan yararlanmamz gerekir. .Recordset metodu ne yapar? Tpk ekrannzdaki bir yaznn iinde duran imle (cursor) gibi hayal bir imleci gtrr verilerinizin en bana koyar. Bu hayali imleci veritaban zerinde dolatrmak ve gittii yerdeki deeri okutmak bizim iimizdir. .Recordset metodu, ile bir veritabann okuyacak imleci ekilde ayarlayabilirsiniz: Static (Duragan) SELECT komutu icra edilir ve okunan kayt arzu ettiiniz deikene yazlr. (ADO Sabit Deerleri dosyasndan yararlanyorsak, adOpenStatic) Forward only (Sadece ilerle) mle veritaban iinde sadece ileri doru gider ve her seferinde bir kayt okunur. (Varsaylan imle tr budur.) (ADO Sabit Deerleri dosyasndan yararlanyorsak, adOpenForwardonly) Dynamic (Dinamik) Veritabanna ulaan ve deiiklik yapan baka bir kullanc varsa, bu deiiklik size annda yanstlr. (ADO Sabit Deerleri dosyasndan yararlanyorsak, adOpenDynamic) Bu yntemlerden birini semekle veriyi belirli bir okuma tarznda am olursunuz. Bu yntemlerden hangisini setiinizi .Recordset metodunu kullanacak olan .Open komutunun argman olarak aka belirtmeniz gerekir. ADO, bunun iin sizden saylar halinde argmanlar ister. ADO Sabit Deerleri ADO+ODBC yoluyla kuracamz veri balantlar, ou zaman adeta ifreli ifadeler ierebilir ve bir ok komutun argman renmesi zor saylar halinde verilir. Microsoft ve kullanlmaya hazr ASP Uygulamalar reten firmalar, bu karmak ifadeleri dz metinler olarak ifade etmeye yarayan haric dosyalar (include files) hazrlar ve sunarlar. Bunlar arasnda en yaygn olan (bu kitapn kodlar arasnda bulunan) Microsoftun ADOVBS (adovbs.inc) dosyasdr. (Ayn dosyann JavaScript srm ise adojavs.inc ardn tar). Bu dosyadan yararlanabilmek iin, sitenize kopyalamanz ve daha sonra sayfalarnza u kodu eklemeniz gerekir:
<!- - #include file=adovbs.inc - - >
ACTIVE SERVER PAGES 60

Bu dosya, Server tarafndan icra edilir ve ADO nesnesinin say halindeki btn argmanlarn anlalabilir ngilizce kelimelere evirir. Bu dosyann ieriinden nasl yararlanacamz ele alacaz. Bir veriye balanty kurduktan sonra kayit dizimizi .Recordset metodu ile salayacaksak, yukardaki rnek kodumuzu yle yazmak gerekir:
<!- - #include file=adovbs.inc - - > <% Dim Veriyolu, Kayitdizisi, Sorgu Set Veriyolu = Server.CreateObject(ADODB.Connection) Veriyolu.Open Veri_adi Set Kayitdizisi = Server.CreateObject(ADODB.Recordset) Sorgu = SELECT * FROM Veri_adi Kayitdizisi.Open Sorgu, Veriyolu, aOpenStatic %>

Bu kod ile, .Recordset metodu son .Open komutu ile bizim iin veri balantsn salar; verdiimiz SQL Sorgusu icra edilir ve kayt diziniz Kayitdizisine kaydedilmeye hazr hale gelir. imdi imlecinizi ilerleterek, veriyi fiilen okutmanz gerekir; ki bunu yapmak iin yukarda kolayca .Execute metodu ile oluturduumuz kayt dizisinde kullandmz basit .MoveNextten daha ok imkana sahibiz: MoveFirst: Kayt dizisinin (Recordsetin) birinci satna gider. MoveLast: Kayt dizisinin (Recordsetin) son satna gider. MoveNext: Kayt dizisinin (Recordsetin) bir sonraki satna gider. MovePrevious: Kayt dizisinin (Recordsetin) bir nceki satna gider. Move: Kayt dizisinin (Recordsetin) iinde vereceiniz sayya gre ilerler. Bunun iin iki say vermeniz gerekir: balang noktas ve ilerlenecek kayt says.
Recordset.Update

Veritabanndan aldmz deerleri, kimi zaman ziyaretinin verecei deerlerle veya ziyaretinin bir takm tercihleri sonucu gncelletirmemiz gerekir. Bu Recordset nesnesinin .Update metodu ile kolayca yaplr. Yalnz burada hassas bir nokta var: diyelim ki ayn anda iki veya daha fazla kullanc Web programmzn veritabanna ular ve ayn anda deiiklik yaparlarsa ne olur? Biraz nce Recordsetin .Open metodunun imlelerinden sz ederken, okumann ynn veya imlecin hareket tarzn belirleyen argmanlar sralamtk. Bu argman dizisine bir yenisini ekleyerek, veritabanna eriimin niteliini ve gncelletirmenin nasl yaplaca ve yanstlacan da belirleyebiliriz. Bu ilemin temel ilkesi veritaban kaytlarnn kilitlenmesi esasdr. Bu kilitlemenin trn belirleyerek, gncelletirmenin de nasl yaplacan belirlemi oluruz. Burada kullanacamz argmanlar da ADOnin ifreli saylar olmas gerekirken, adovbs.inc dosyas sayesinde ngilizce (ve dolaysyla anlalabilir) kelimeler olur. advbs.inc dosyasn devreye soktuysanz, u iki tr kiliti kullanabiliriz: adLockReadOnly Kaytlarn gncelletirilmesini nler; ziyaretimiz veritabanna kayt yapmayacaksa, bu kilit trn kullanmamz gerekir.
ACTIVE SERVER PAGES 61

Veritabanna ek yapacaksak, mevcut kaytmlar dzelteceksek ve bazlarn sileceksek, bu kilit trn kullanmamz gerekir. Yukardaki kod rneimizin sadece son satrn, bu metodu kullanmak amacyla, yle yazabiliriz:
Kayitdizisi.Open Sorgu, Veriyolu, aOpenStatic, adLockOptimistic

adLockOptimistic

Tabi bir veritabann gncelletirmek iin imleci veritabannda doru kaydn zerine gtrmek ve bu arada Recordsetin bize salad mevcut verilerin yerine yeni deerleri atam olmak gerekir. Bunu saladktan sonra btn yapacamz ey .Update metodunu kullanmak ibarettir:
Kayitdizisi(Adi) = Necip Fazl Kayitdizisi(Soyad) Dayanr Kayitdizisi.Update

Bu komut, imle o srada hangi kaydn zerinde ise o kaydn Adi ve Soyadi alanlarndaki veriyi Necip Fazl ve Dayanr haline getirir. Bu metodu kullanrken bir kaydn btn alanlarn gncelletirmemiz veya gncelletirilmeyen alanlar eski deerleri ile tekrar etmemiz gerekmez.
Recordset.Delete

Bir veritabanndaki kayd silmek de ADO ile olduka kolaydr. mleci, silinecek kaydn zerine gtrdkten sonra, Recordsetin , .Delete metodunu ararak o andaki kayt silinir. Bu metod, bir kayd btn alanlarndaki deerlerle birlikte (yani veritabannn bir satrn tmyle) siler:
Kayitdizisi.Update

Recordset.AddNew

Bir veritabanna yeni kayt eklemek istediimizde, Recordsetin .AddNew (yeni ekle) metodundan yararlanrz. Bu metodun zellii bizim imleci veritaban iinde bir yere gtrme zorunluumuz olmamasdr. Bu metod kendiliinden imleci dosyann en son satrnn altna gtrr. .AddNew metodu bir veritaban dosyasna kayt eklerken, veritabannda mevcut btn alanlar iin deer vermenizi isteyecektir. rnein
<% Kayitdizisi.AddNew Kayitdizisi(Adi) = Necip Fazl Kayitdizisi(Soyad) Dayanr Kayitdizisi(TelNo) = 0342-3390000 Kayitdizisi.Update %>

Veritabanna yeni kayd, .Update metodunun yaptna dikkat edin. DSNsiz Veri Balants Bu kadar DSN oluturmay rendikten sonra, Aslnda DSN olmadan da veritabanlarnza ulaabilirsiniz! derlerse, herhalde ok sevinmeyiz. Ama iin dorusu DSN yoludur. Fakat yine de DSN oluturmadan veritabanna ulaabileceimizi bilmemiz gerekir.
ACTIVE SERVER PAGES 62

DSN, genellikle Web Serverlar yavalatr; Web Server, DSNini belirttiiniz veriye ulamak iin nce ODBCnin yardmn ister; ODBC, bir takm srcleri devreye sokar ve sonunda veriye ularz. Bir DSN-verisine 20-30dan fazla kullanc ayn anda eritii zaman bu yavalama gzle grnr hale gelebilir. Bir sre ncesine kadar Microsoft firmas, veriye dayanan Web sitelerinin veri-ban DSN yoluyla kurmasn tavsiye ederken, imdi MS yaynlarnda sk sk DSNsiz veri balantsnn da etkin ekilde kullanlaca belirtiliyor. Yukarda verdiimiz DSN rnei yle idi:
<% Dim Veriyolu, Kayitdizisi Set Veriyolu = Server.CreateObject(ADODB.Connection) Veriyolu.Open Veri_adi Set Kayitdizisi = Veriyolu.Execute(SELECT * FROM Veri_adi) %>

Byle bir DSN balantsn kullanabilmemiz iin, kendi kiisel Web Server ortammzda Denetim Masasndaki ODBC aracn kullanarak bir DSN oluturmamz; Internet ortamnda ise bu ad vereceimiz veritaban dosyasna DSN oluturulmas iin Web Server yneticisinin yardmn istememiz gerekiyor. Oysa ayn ilemi DSNsiz veri balants kurarak da yapabiliriz. Bunun iin, DSNe yukardaki gibi dorudan gndermede bulunmak yerine; ya ODBC srcsne ya da ODBCnin kulland Microsoft Jet OLEDB srcsne dorudan atfta bulunuruz. rnek:
Veriyolu.Open "Veri=" & Server.MapPath("..../veriler/uyeler.mdb") & "; Driver = {Microsoft Access Driver (*.mdb);"

Burada, DNSsiz balant iin veritaban dosyasnn Serverdaki greli yerini, adn ve hangi srcnn kullanlacan belirtiyoruz. Ayn balanty, doruca Jet srcs iin de yazabilirdik:
Veriyolu.Open "Veri=" & Server.MapPath("..../veriler/uyeler.mdb") & "; Provider=Microsoft.Jet.OLEDB4.0;"

Tabi buradaki sorun kullandnz veritaban dosya trne uygun Microsoft Jet srcs seebilmektir. Bu konuda geni bilgi Microsoftun Internet sitesinde bulunabilir. Veri ile HTML Etiketlerini Doldurma ADO nesnesini tandk; metodlarn grdk. ADOnun veritaban ile DSN ile ve DSNsiz nasl balant kuracan ele aldk. imdi ok ksa olarak elde ettiimiz verilerle, HTML etiketlerinin iini nasl dolduracamz grelim. Burada iini doldurmak (veya bir ok ngilizce kaynakta greceiniz zere populate etmek) bir etiketin deer (value) blmn yazmak anlamna geliyor). Burada kk bir ka rnekle, veri kaynan kullanarak HTML etiketlerinin iini doldurma altrmas yapalm. Buradaki bz rneklerde ODBC konusunu ele alrken oluturduumuz uyeler.mdbyi DSN olarak uyeler verisi eklinde kullanacaz; fakat siz istediiniz veriyi kullanabilirsiniz.
Seme Kutular: SELECT

SELECT, ziyaretilerimize nceden belirlenmi bir ok unsurdan birini veya daha fazlasn semelerine imkan veren bir etikettir. Ziyareti, seimini SELECTin OPTIONlar arasndan
ACTIVE SERVER PAGES 63

yapar. Seenekler (OPTION), sahip olduklar deeri Servera gnderirler. Genel yazm kural yledir:
<FORM ACTION=... METHOD=POST|GET> <SELECT NAME=metin> <OPTION VALUE=deer1>Tercih 1 <OPTION VALUE=deer2>Tercih 2 <OPTION VALUE=deer3>Tercih 3 </SELECT>

Bu Formun gnder (Submit) dmesi ile salanan hareket (ACTION), seilen deeri veya deerleri, Formu ileyecek ASP programna gnderir. Ziyaretimize sunacamz seenekler, iki- adet ise, bunu HTML dosyasn yazarken, OPTIONlar halinde kodlamak kolay olabilir. Ancak seenek says artyorsa, veya seeneklerimiz sk sk deiiyorsa, bunlar bir veri tabannda toplamak ve OPTION deerlerini veritabannn bir alanndan alarak ziyaretiye sunmak ok daha kolay olur. Bylece ASP sayfas deimeden kalr; biz sadece veritabann gncelletiririz. ou zaman bu gncelletirme ziyaretilerin yapacaklar eklerin veritabanna yazlmasyla saland iin, ortaya gerekten dinamik bir Web Uygulamas km olur. Diyelim ki, bizim grubumuzun yelerini gsteren yukarda oluturduumuz uyeler.mdb (DSNi uyeler olan veritaban) dosyasnn ad-soyad alanlarn birletirerek, sayfamzdaki bir SELECT etiketinin OPTIONlarna yazmak istiyoruz. Bunun iin nce sayfamzda kullanacamz deikenleri tanmlayalm:
<% Dim connVeriyolu, rsVeri, SQL %>

Sonra, bu deikenlerden veri ile ilgili olanlara .Connection ve .Recordset iin gerekli ifadeleri yazalm. Veri ile alrken tasarmcnn deiken adlarna bakarak hangisinin .Connection, hangisinin .Recordset deerlerini ierdiini anlamas zorlaabilir. Bu bakmdan deiken adlarnn nne .Connection iin olannda conn, .Recordset iin olannda rs harflerini kulllanmak yararl olabilir. Veritabanndan fiilen hangi verileri ekeceimizi gsteren SQL deyimini de belirgin bir ekilde SQL deikenine yazabiliriz:
<% Set connVeriyolu = Server.CreateObject("ADODB.Connection") SQL ="SELECT uyeAdi, uyeSoyadi FROM uyeler" %>

imdi bu deerlere dayanan ve adna uyeler diyeceimiz veri kmesini oluturalm:


<% connVeriyolu.open "uyeler" Set rsVeri=connVeriyolu.execute(SQL) %>

ACTIVE SERVER PAGES

64

Artk elimizde iinde btn yelerin ad ve soyadn tutan bir dizi-deiken var. imdi biliyoruz ki veritabanndan veri satr-satr okunur. Birinci satrn okunmas srasnda bu deikenin deerlerini yazacak olursak: rsVeri (0) = ye 1in ad rsVeri(1) = ye 1in soyad olacaktr. Veritabanndan ikinci satrn okunmasnda ikinci yenin ad ve soyad, nc satrn okunmasnda nc yenin ad ve soyad bu deikenlerin deeri olacaktr. Demek ki, bu deerleri bir SELECT etiketinin OPTION deeri olarak kullancaksak, bu ilemi ikinci satr okunmadan yaptrmamz gerekir. O halde:
<SELECT NAME="AdSoyad"> <% Do While Not uyeler.eof %> <OPTION VALUE = "<%= rsVeri(0) & " " & rsVeri(1)%>"><%= rsVeri(0) & " " & rsVeri(1)%> </Option> <%rsVeri.movenext loop%> </select> <% rsVeri.close %> </SELECT>

Do dngsnn iinde iken veritabanndan alnan deer, herhangi bir deikenin deeri gibi kullanlabilir. Burada verilerin uyeler dizisinin dosya sonuna (eof, End Of File) okunduuna dikkat edin. imdi yukardaki kodlar bir Form iinde birletirelim:
<%@ LANGUAGE="VBSCRIPT" %> <% Option Explicit %> <HTML> <HEAD> <TITLE>ASP SELECT DOLDURMA</TITLE> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254"> </HEAD> <% ' Deikenleri tanmlayalm Dim connVeriyolu, rsVeri, SQL Set connVeriyolu = Server.CreateObject("ADODB.Connection") SQL ="SELECT uyeAdi, uyeSoyadi FROM uyeler" connVeriyolu.open "uyeler" Set rsVeri=connVeriyolu.execute(SQL) %> <BODY>
ACTIVE SERVER PAGES 65

Bu listeden bir yenin adn seiniz: <SELECT NAME="AdSoyad"> <% Do While Not rsVeri.eof %> <OPTION VALUE = "<%= rsVeri(0) & " " & rsVeri(1)%>"><%= rsVeri(0) & " " & rsVeri(1)%> </Option> <%rsVeri.movenext loop%> </select> <% rsVeri.close %> </SELECT> </BODY> </HTML>

Bu sayfay option.asp adyla kaydederek snayabiliriz. Alacamz sonu una benzemelidir: <odbc0003.tif> Burada yaplan seim sonucu elde edilen deer Servera gnderilebilir; ve sz gelimi ziyaretinin setii kiiye ait bilgiler kendisine ulatrlabilir.
aretleme Alanlar: INPUT-RADIO

INPUT etiketi trleri ziyaretilerimizin nceden belirlenmi bir ok unsurdan birini veya daha fazlasn semelerine veya kendilerinin girdi yapmalarna imkan veren bir etikettir. INPUT trlerinden Radio ve Checkbox (iaretleme kutusu) veritabanndan ekilen deerlerle doldurularak ziyaretiye sunulabilir. Ziyareti, seimini radyo dmelerinden veya iaret kutularndan birini iaretleyerek yapar. INPUT etiketinin radyo dmesi trnn genel yazm kural yledir:
<FORM ACTION=... METHOD=POST|GET> <INPUT TYPE=Radio NAME=metin1 VALUE=deger1> <INPUT TYPE=Radio NAME=metin1 VALUE=deger2> <INPUT TYPE=Radio NAME=metin1 VALUE=deger3> </SELECT>

Bu Formun gnder (Submit) dmesi ile salanan hareket (ACTION), seilen deeri Formu ileyecek ASP programna gnderir. Bir Formdaki bir grup oluturan btn radyo dmeleri ayn ad alrlar, ki bylece ASP programna bir deiken iin deer gnderilmi olur. Diyelim ki ziyaretimizden beendii rengi semesini isteyen bir grup radyo dmesi sunan bir Form yapacaz. u kodu radyo.asp adyla kaydedelim:
<%@ LANGUAGE="VBSCRIPT" %> <HTML> <HEAD> <TITLE>ASP OPTION-RADIO DOLDURMA</TITLE> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254">
ACTIVE SERVER PAGES 66

</HEAD> <% ' Deikenleri tanmlayalm Dim connVeriyolu, rsVeri, SQL Set connVeriyolu = Server.CreateObject("ADODB.Connection") SQL ="SELECT renk FROM renkler" connVeriyolu.open "uyeler" Set rsVeri=connVeriyolu.execute(SQL) %> <BODY> <FORM><DIV ALIGN="center"><center><TABLE BORDER="0"> <TR> <TD colspan="2" align="center"><h3>Renk</h3></TD> </TR> <% Do While Not rsVeri.eof %> <TR><TD><INPUT TYPE="radio" VALUE="<%=rsVeri(0)%>" NAME="Radyo"></TD> <TD>< %=rsVeri(0)%></TD></TR> <%rsVeri.movenext loop%> </TABLE></CENTER></DIV></FORM> </BODY> </HTML>

Burada Radyo isimli radyo dmesine verdiimiz deerleri, ODBCnin uyeler adyla tand veritabanndan alyoruz; bir nceki rnekten farkl olarak bu kez ayn veritabanndaki farkl tablodan, renkler tablosundan ve sadece bir alann, renk alannn deerlerini ekiyoruz. Bu rnek programda da ziyaretinin setii deerleri Servera gnderecek bir Gnder dmesi yok. Ama ieriini veritabanndan aldmz deerlerle doldurduktan sonra, ziyaretinin radyo dmeleriyle yapaca tercihler, tpk klasik HTMLdeki gibi kullanlabilir; Servera deiken olarak gnderilebilir; veya ziyaretinin bilgisayarnda (client-side) herhangi bir Script tarafndan kullanlabilir.
aretleme Alanlar: INPUT-CHECHBOX

INPUT etiketinin ziyaretiye iaretleyerek tercih imkan veren dier arac Checkbox (iaretleme kutusu) trdr. Tpk radyo dmesinde olduu gibi veritabanndan ekilen deerlerle doldurularak ziyaretiye sunulabilir. Ziyareti, seimini iaret kutularndan birini iaretleyerek yapar. INPUT etiketinin Checkbox trnn genel yazm kural yledir:
<FORM ACTION=... METHOD=POST|GET> <INPUT TYPE=checkbox NAME=metin1 VALUE=deger1> <INPUT TYPE=checkbox NAME=metin1 VALUE=deger2>
ACTIVE SERVER PAGES 67

<INPUT TYPE=checkbox NAME=metin1 VALUE=deger3> </SELECT>

Bu Formun gnder (Submit) dmesi ile salanan hareket (ACTION) seilen deeri Forma gnderecektir. Radyo dmesi ile Checkboxn arasndaki fark, ziyaretinin ayn ismi tayan radyo dmelerinden birini iaretleyebilirken; istedii kadar Checkboxa iaret koyabilmesidir. Birden fazla Checkbox iaretlendii taktirde Servera metin1=deger1, deger2.. eklinde bilgi gnderirler. (ASP programlama asndan, bu deiken Request.Form nesnesinde Checkboxn adn tayan kolleksiyonun iinde dizi-deiken olarak yazlr.) Yukardaki radyo dmesi rneimizin sadece Do dngsne ait ksmn deitirerek,Checkboxa uyarlayalm, ve isaret.asp adyla kaydedelim:
<% Do While Not rsVeri.eof %> <TR><TD><INPUT TYPE="checkbox" VALUE="<%=rsVeri(0)%>" NAME="Isaret"></TD> <TD>< %=rsVeri(0)%></TD></TR> <%rsVeri.movenext loop%>

Ziyareti bu form ile birden fazla kutu iaretleyerek Gnder dmesine basarsa, Servera gelecek bilgi rnein, Isaret=Krmz, Mavi eklinde olacaktr.

ACTIVE SERVER PAGES

68

ASP Kaynaklar
Bu kitapkta rendiimiz ASP ve VBScript tekniklerinin uygulamasna ilikin rnekleri, ikinci kitapkta bulacaksnz. kinci kitapa gemeden nce, buradaki kk uygulamalarn yaplmas ve rneklerin altrlmas yerinde olur. Bu srada ASP teknikleri ve VBScript komutlar hakknda geni bilgiyi Internette u kaynaklarda bulabilirsiniz: asp.superexpert.com/ aspwire.com/ www.15seconds.com/ www.asp101.com/home/home.asp www.aspalliance.com/ www.aspdeveloper.net/ www.aspexpress.com/aspexpress.asp www.aspforums.com/ www.aspguild.org/default.asp www.asp-help.com/ www.asphole.com/asphole/default.asp www.aspin.com/index/default.asp www.asplists.com/asplists/ www.aspmessageboard.com/ www.asppipeline.com/ www.aspsite.com/ www.codeave.com/ www.devasp.com/ www.haneng.com/ www.mavweb.net/ www.programmersresource.com/ www.shopit.co.uk/ www.takempis.com/ www.tcp-ip.com/

ACTIVE SERVER PAGES

69

nsz 2
Bu kitapk nce Byte, ardndan PC World ve imdi de PC Life dergisinin eki bid dizinin son blm olan ASP tekniklerinin temel ilkelerini ve VBScript kullarn anlattmz kitapn devam niteliindedir. Bu kitapktan yararlanabilmek iin PC Life dergisi Eitim dizisinin Haziran 2000 saysyla verilen birinci blmn edinmeniz gerekir. ASP veya Active Server Pages (Etkin Sunucu Sayfalar) teknii, sayfalarnz canlandracak bir tekniktir. Bu teknik, sil batan bir bilgisayar programlama dili renmeye gerek olmadan uygulanabilir. Bununla birlikte ASP tekniini kullanabilmek iin HTML ve Webin nasl altn, Server (Sunucu) ve Client (stemci) ilikisinin nasl yrdn de bilmek gerekir. ASP teknolojisinden yararlanabilmek iin Web sitesine evsahiplii yapan bilgisayarda almakta olan Web Servern ASP teknolojisini tanmas ve sitenize bu hizmeti vermesi arttr. ASP, bir zamanlar sadece Microsoftun NT ve daha sonra Windows 2000 iletim sistemine dayanan MS-IIS (Internet Information Server) programnda ileyebilirdi. Fakat imdi artk NT-tabanl dier Web Server programlar gibi Unix-tabanl Web Server programlar da ASP anlar ve iletir hale gelmi bulunuyor. Fakat ASP sayfalarnz gerek Internet ortamnda ziyaretilerinizin hizmetine sunmadan nce, kendi bilgisayarnzda snamanz gerekir. Bunun iin bilgisayarnzn iletim sistemi Windows 95/98 ise Kiisel Web Server (PWS), NT 4.0 ise IIS kurulmu olmaldr. Sisteminiz Windows 2000 ise, IIS 5.0 kendiliinden kurulmu demektir.

rnek Kodlar
ki kitapktan oluan ASP rehberinin btn rnek kodlar ve veritaban dosyalar, http://www.pclife.com.tr/......... adresinden edinilebilir. Ancak ASP renirken rnek kodlar kendiniz yazmalsnz. Kodlamann incelikleri ancak kodlar siz yazarsanz renilebilir. Bu rneklerden sadece kendi yazdnz kodlar hata verdii ve hatay bulmaktan glk ektiiniz zaman, karlatrma amacyla yararlanmalsnz.

Teekkrler
Bu kitapktaki kodlarn deiik ortamlarda snanmas iin iin bana yardmc olan dilini ve yazmn denetleyen dostlarm Mustafa Durcan, Osman Nuri Hmek ve Armaan Ergona teekkr ederim. Varolan hatalar elbette bana aittir. ok sevgili arkadam Mustafa Durcann btn dizinin geliimine katksn daima kranla hatrlayacam.

ACTIVE SERVER PAGES

70

Altrma Uygulamalar
Bu blmde, birinci kitapkta rendiklerimizi kk ASP uygulamalarnda kullanacaz; ve bylece son iki blmde yer alan nisbeten daha byk ASP Programlar iin hazrlk yapm olacaz. Bu blmdeki rnekleri mutlaka kendiniz yazmalsnz ve aklanmam kodlardan anlamadklarnz olursa mutlaka daha nceki blmlere dnerek gzatmalsnz. Bu blmdeki kodlar dikkatle incelerseniz, ounda daha nce ele aldmz temel VBScript komutlarnn veya ASP nesnelerine ait metodlarnn kimi zaman deiik tarzda kullanmna yer verdiimizi greceksiniz. Temel kullanm biimlerini rendikten sonra, mutlaka Microsoftun MSDevelopers Network sitesinde (http://www.microsoft.com/msdn) VBScript ve ASP konularndaki belgeleri ve eitim metinlerini incelemelisiniz. Doum Gn Hesab VBScriptin dil olarak bize salad baz kolaylklar ASP teknolojisi ile birletirebiliriz. ASP sayfalarmzda istediimiz gibi HTML kodlar da kullanrz. Bu rnekte, bu iki unsuru da birarada greceiz. Aadaki kodu dogumgunu01.asp adyla kaydedin:
<% @LANGUAGE=VBscript %> <% Option Explicit Response.Expires = 0 Dim serverSaat, kalanSaat serverSaat = Time ' aadaki satrda iaretler arasndaki yere kendi doum gnnz yazn kalanSaat = DateDiff("h",Now,#7/8/2000#) %> <HTML> <HEAD> <TITLE>Dogum Gn Hesab!</TITLE> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254"> </HEAD> <BODY> <H3> <CENTER> <p>Selam:</p> <p>u anda saat: <%=ServerSaat%></p>
ACTIVE SERVER PAGES 71

<% If kalanSaat > 0 Then Response.Write "Doum gnnze " & kalanSaat & " saat var." & VbCrLf ElseIf kalanSaat < 0 Then Response.Write "Doum gnnz " & kalanSaat & " gemi buluyor." & VbCrLf Else Response.Write "<b>Doum gnnz kutlu olsun!</b>" & VbCrLf End If %> </CENTER> </H3> </BODY> </HTML>

Bu kodda bulunan ASP nesnelerini ve metodlarn kolayca gryor olmalsnz. Tanmlamadmz bir deiken kullanmay veya deiken adlarn yanl yazmay nleyen Option Explicit ifadesi dikkatinizi ekiyor olmal. Sayfamzda bir hesap yaplaca iin Browser tarafndan geici Internet dosyalar arasnda (cache) saklanmasn istemediimizi, Response.Expiresn deerini 0 yaparak belirtiyoruz. iki deiken tanmlyoruz (serverSaat ve kalanSaat) ve bunlardan birincisine Servern o andaki saatini Time fonksiyonu ile atyoruz. kinci deiken ise hesaplama sonucu belirlenecek. Bu arada ASP programnn hangi tarihe ka saat kaldn hesaplamasn istiyorsak, kalanSaati belirleyecek formle o tarihi yazyoruz. Bu formle dikkatle bakalm:
kalanSaat = DateDiff("h",Now,#7/8/2000#)

DateDiff ve DateAdd, VBScriptin vereceiniz iki tarih arasnda, yine vereceiniz biime gre fark bulmasn veya toplamasn salar. Buradaki h hesap sonucunun saat olarak verilmesini istediimiz gsterir. d ise sonucu gn olarak istediimiz anlamna gelir. Now, Servern o andaki saatidir; # iaretleri arasnda ise hesabn yaplaca tarih, veya buradaki rnekte doum gnnz yer alyor. kalanSaat deikeninin deeri bu hesaplama sonucu olarak doum gnnze kalan saat olacaktr. Kodumuzun geri kalan blmnde ise elde ettiimiz sonucu Browsera yollayan bir If seimi var: doum gnnze kalan saat 0dan bykse veya kkse bunu farkl cmlelerle belirtiyoruz. Kalan sre 0 ise, bugn doumgnnz demektir! (ASP ile bu kadar urarsa, insann doum gnn filan unutmas normaldir. zlmeyin!) Daha nce VBScriptin metin ve deikenleri birbirine & iareti ile eklediini grmtk. VBScript ile yazdrdmz satrlarn sonuna kimi zaman <BR> kodu koyarak, yeni satrn bir satr aadan balamasn saladmz hatrlyor olmalsnz. Burada & VbCrLf eklinde grdmz ifade de bunu salar. Bu, Visual Basicin alt satra ge, baa git! (Carriage Return, Line Feed) komutudur. Dedik ki, DateDiff ve DateAdd fonksiyonlarnn, sonucu gn olarak vermesini istiyorsanz, d argmann kullanmanz gerekir. imdi burada rendikleriniz bu program doumgnnze
ACTIVE SERVER PAGES 72

kalan saati deil de gn hesaplayacak ekilde deitirebilir misiniz? (Ortaya kartacanz kodu bu kitapn kodlar arasndaki dogumgunu02.asp dosyas ile karalatrabilirsiniz.) ift Trnak Gerekince! Kimi zaman ASP yoluyla ziyaretinin Browserna HTML kodu gndermek gerektiinde HTMLin gerektirdii ift trmak iaretini yazdrma sorunuyla karlarz. VBScriptin gerei olan ift-trnak iaretinin iine koyacamz HTMLin gerei olan ift trnak, ASP hatasna yol aar, C'den tretilen dillerde ters bl iaretiyle yaptmz trden, kontrol karakterlerinin metin olarak anlalmamas iini (ESCape-ing'i) VBScriptte trl ekillerde yapabiliriz. Burada, yerine gre, yntemden yararlanabiliriz ie yarar: 1. Trnak iareti gereken yerde iki kere trnak yazmak; 2. erdeki trnak yerine tek-trnak kullanmak 3. erdeki trnak yerine & Chr(34) & kullanmak. (Bu yntemi kullandmzda "dardaki" trnak diye bir ey kalmadna dikkat etmek gerekir.) rnekler:
objMetin.WriteLine("<%@ LANGUAGE=""VBScript""%\>") objMetin.WriteLine("<%@ LANGUAGE='VBScript'%\>") objTsOut.WriteLine("<%@ LANGUAGE=" & Chr(34) & "VBScript" & Chr(34) & "%\>")

HTML Dnda erik HTTP iletiiminde istemci Browser ile Server arasnda her talep ve sunula birlikte bir dizi HTTP Header (balk) bilgisi gnderildiini biliyoruz. Bu bilgiler arasnda neler bulunduunu dabu kitapn kodlar arasnda bulunan SerDeg.asp dosyasn altrarak inceleyebilirsiniz. Browser penceresinde beliren bilgilere dikkat ederseniz, Browser, Servera HTTP yoluyla kabul edebilecei bilgi trlerini de sralyor:
HTTP_ACCEPT:image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/msword, application/vnd.ms-powerpoint, application/vnd.ms-excel, */*

Burada dzyaz (text/plain) trnn bulunmadn gryorsunuz. Fakat ASP yoluyla, sayfanza dz yaz gnderebilirsiniz. Aadaki kodu duzyazi.asp adyla kaydedin, ve altrn:
<% @LANGUAGE=VBscript %> <% Response.ContentType = "text/plain" Response.Expires = 0 %> Selamlar Bu dosyada HTML etiketi kullanmyoruz. Metin tamamen bir dz yazdan ibaret. inde <BR> kodu bulunmad halde satrlar Enter'a bastmz yerde alt satra geecektir.

ACTIVE SERVER PAGES

73

Bu kodu yazarken buradaki rnekte grdnz satr sonlarnda Entera basmalsnz. Browsernzdaki sonu una benzer olmal: Genellikle HTML sayfalarmz tasarlarken ierik trn belirten Content-Type zelliini yazmayz; nk Browser, ierik tr belirtilmemise gelen belgenin mutlaka text/html olduunu varsayar. Fakat burada olduu gibi, iinde bir tek HTML etiketi (hatta <HTML> etiketi bile) olmayan bir metni Browsara gnderebilir ve istediimiz ekilde grntletebiliriz. Bunu Response.ContentType = "text/plain" ifadesi salamaktadr. Response nesnesi, varsaylan trler dnda sadece dz yaz tr gndermekle kalmaz, Browsern kabul edebilecei ve HTTPnin aktarlmasna elverili olduu her trl dosyay gnderebilir. Bu dosya trlerinin hangileri olabileceini evre deikenlerinden HTTP_Acceptin iinde grebilirsiniz. Bunu snamak iin duzyazi.aspnin Content-Type satrn u ekilde deitirin ve dosyay msword.asp adyla kaydedin:
Response.ContentType = "application/msword"

Bu dosyay altrdnzda, Browser trnze ve ayarlarnza ve sisteminizde MS-Word programnn bulunup bulunmamasna bal olarak, ya doruca ya da size sorarak, bilgisayarnz MS Word kelime ilemcisini aacaktr: Bu imkandan ziyaretiye resim veya dier tr dosyalar gndermek iin yayarlanabiliriz. Ancak bir resim dosyasn gnderirken, metin vermek yerine dosya yolu ve adn belirtmemiz gerekir. Baka Sayfaya Ynlendirme Diyelim ki ziyaretilerimizin Web programmzda belirli ileri yapabilmeleri veya eski ifadesiyle sitemizde belirli bir sayfaya erimek iin kayt yaptrm olmalar gerekiyor; bu kayd yaptrmam olanlar kayt sayfasna ynlendirmek istiyoruz. Birazdan form yoluyla ziyaretiden bilgi alma ve bunu ilemeyi greceiz, ama imdilik sadece bu senaryonun ikinci ksmn ele alalm: ziyaretimizi baka sayfaya ynlendirelim. Bunun iin iki ayr sayfa yapacaz. nce u kodu, gonder.asp adyla kaydedin:
<% @LANGUAGE=VBscript %> <% Response.Redirect("yeni.asp") Response.Expires = 0 %> <HTML> <HEAD> <TITLE>ASP ILE YONLENDRME</TITLE> </HEAD> <BODY> Bu sayfada yazl olanlar okumanz mmkn olmayacak<br> nk bu sayfa sizi baka sayfaya gnderecek.. </BODY>
ACTIVE SERVER PAGES 74

</HTML>

imdi u kodu da yeni.asp adyla kaydedin:


<HTML> <HEAD> <TITLE>YEN SAYFA</TITLE> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254"> </HEAD> <BODY> <%= Sizi buraya baka sayfa gnderdi.. <BR>%> </BODY> </HTML>

gonder.aspyi arn; karnza yeni.aspnin ierii gelecektir; nk gonder.asp kendisinden beklediimizi yapacak ve sizi yeni.aspye gnderecektir. Bunu Response.Redirect metodu yapmaktadr. Bu metodun argman olarak kendi programmzn bir baka sayfasn verebileceiz gibi, bir Internet sitesinin URLini de verebiliriz. Ziyaretiden Bilgi Alma stersek adna Web Program diyelim, sitemize ziyaretilerin bilgi ulatrmas ancak HTMLin Form etiketi yoluyla olur. Klasik HTML+CGI yntemleri ile ASP tekniinde Form etiketlerinin ilevleri arasnda bir fark yoktur. Ancak aralarndaki benzerlik de hemen hemen bundan ibarettir. Klasik HTML+CGI ynteminde Formlarmzn Action zelliine deer olarak ou zaman bir CGI programnn yolunu ve adn yazarz; oysa ASPde Form bu bilgileri kendisinin de iinde bulunduu ASP sayfasna gnderebilir; ve rnein formun eksik doldurulup doldurulmadn snayabilir. HTML bilgilerinizi tazelerseniz; bir Formdan Servera iki metodla bilgi gelebilir: Get ve Post yntemleriyle. Get, Browsern bilgileri yumak yapp, aradaki boluklar kaldrarak ve ASCII olmayan karakterleri URL koduyla ifreleyerek Query_String iine yazdrmasn salar. Dier yntemi birazdan ele alacaz. Kk bir form oluturalm ve bu formdan Get yoluyla gelecek bilgileri daha sonra nasl kullanabileceimizi grmek iin, imdilik sadece sayfamza yazdralm. u kodu miniform_get.asp adyla kaydedin:
<% @LANGUAGE=VBscript %> <% Option Explicit Response.Expires = 0 Dim strAdi, strSoyadi, hamBilgi, islenmisBilgi If Request.ServerVariables("QUERY_STRING") <> "" Then strAdi = Trim(Request.QueryString("adi")) strSoyadi = Trim(Request.QueryString("soyadi"))
ACTIVE SERVER PAGES 75

hamBilgi = Trim(Request.QueryString("mesaj")) islenmisBilgi = Replace(hamBilgi, vbcrlf, "<BR>" & vbcrlf) %> <html> <head> <title>Mini Form</title> <meta http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <meta http-equiv="Content-Type" content="text/html; charset=windows-1254"> </head> <body> Script'imize Form'dan bilgi ulat <BR><BR> Gelen bilgiler:<BR> Formu dolduran kiinin ad: <%= strAdi%> <BR><BR> Formu dolduran kiinin Soyad: <%= strSoyadi%> <BR><BR> Ham Bilgiler: <%= hamBilgi%> <BR><BR> lenmi Bilgiler: <%= islenmisBilgi%> <BR><BR> "Query_String" olarak gelen bilgi: <BR> <%= Request.ServerVariables("QUERY_STRING")%> </body> </html> <% Else %> <html> <body> Bize bilgi verir misiniz?<BR> <FORM ACTION= "<%= Request.ServerVariables("SCRIPT_NAME") %>" METHOD="GET"> Adnz: <INPUT TYPE="Text" NAME="adi"><BR> Soyadnz: <INPUT TYPE="Text" NAME="soyadi"><BR> Mesajnz: <TEXTAREA NAME="mesaj">Mesajnz buraya yazn!</TEXTAREA><BR> <INPUT TYPE="Submit" NAME="Gnder" VALUE="Gnder"> </FORM> </body> </html> <% End If %>

ACTIVE SERVER PAGES

76

Kodumuzun bir deiken tanmladmz ve Formdan gelen bilgileri ileyen blm, bir de henz bu bilgi gelmeden nce Formu oluturan blm olduuna dikkat ediyor musunuz? Bu iki blm bir If snama deyimiyle oluturduumuzu da gryorsunuz. ASP teknii ve VBScriptin kolaylklar birleince, CGIda olduu gibi, Formdan gelen bilgileri zel fonksiyonlar yazarak ayklamamz gerekmez. ASPnin anlad ekliyle, Query_String Formdan GET metoduyla gelen bilgileri Formun bilgileri atad deikenlerin adlaryla eletirerek tutar; ve bize sadece Formdaki deikenlerin deerlerini, istiyorsak, baka deikenlere atamak kalr. Burada Formun adi olan deikenini bir String deikeni olan strAdi deikenine, yine Formun soyadi olan deikenini baka bir bir String deikeni olan strSoyadi deikenine atyoruz. Bunu yapmamzn sebeplerinden biri iki dizi deikenden hangisinin ASP tarafnda kullanldn bilmektir. Formun nc deikeni olan mesaj ise ASP tarafndan ilenirken, iki ekilde ele alnacak: hamBilgi deikeninin deeri olarak, ve bunu Replace() fonksiyonu ile iledikten sonra atayacamz islenmisBilgi deikenini deeri olarak. Replace() fonksiyonu, bir deikende bir deeri bulur ve arzu ettiimiz bir baka deerle detirir. argman alr: iinde arama ve deiiklik yaplacak deiken, aranacak deer ve yerine konacak deer. Burada iki veya daha fazla paragraf ieren bir mesajn iindeki satrbayeni paragraf karakterini, HTMLin anlayaca <BR> ve satrba karakteri ile deitiriyoruz. imdi miniform_get.aspyi altrn, doldurun (mesaj blmnde iki paragraf oluturmak iin bir yerde Ctrl+Entera basmay unutmayn! Yoksa ilenmi bilgi ile ham bilginin farkn gremeyiz!) ve Gnder tuunu tklayn. Bu arada Browsernzn URL hanesine bakn. Bu Get metodunun bilgi gnderme eklidir. Bilgiler URL-kodu olarak deitirilir ve gidecei sayfann adna, soru iareti ile eklenerek, gnderilir. (Tabii ziyaretiniz yldzlar halinde grntlenen bir parola yazdysa onu da burada ak ekilde grecektir!) <asp0015.tif> Bizim Form bilgilerimiz hangi sayfaya gnderiliyor? Yine kendisine. Bunu Form etiketinin Action zelliinin karsnda yazl olan VBScript kodu salyor. Bu yolla gelen bilgi, una benzer olmaldr:
Script'imize Form'dan bilgi ulat Gelen bilgiler: Formu dolduran kiinin ad: Kroninukus Formu dolduran kiinin Soyad: Computerium Ham Bilgiler: Merhaba Ben niversiteyi yeni bitirmi bir gencim! lenmi Bilgiler: Merhaba Ben niversiteyi yeni bitirmi bir gencim! "Query_String" olarak gelen bilgi: adi=Kroninukus+&soyadi=Computerium+&mesaj=Merhaba%0D%0ABen+ %FCniversiteyi+yeni+bitirmi%FE+bir+gencim%21+%0D%0A&G%F6nder=G%F6nder

Replace() fonksiyonunun, mesajn iindeki CRLF karakterini bulup yerine <BR> koyduuna dikkat edin. Query_Stringin yazdnz ad ve soyad ile mesaj nasl yumak (tek String) yaptna bakn. Ve programmzn bu yumaktan bilgileri alp, yeni deikenlere atayarak Browser penceresinde nasl grntlediini inceleyin. Bu programn canalc noktas, Request nesnesinin ServerVariables kolleksiyonunda, Query_String koleksiyonunu kullanmasdr. nk Get, Formun salad bilgileri bu koleksiyona kaydetmi bulunuyor.
ACTIVE SERVER PAGES 77

imdi ayn ii Post metodu ile yapalm. Bunun iin biraz nce kaydediiniz kodda u deiiklikleri yapn ve miniform_post.asp adyla kaydedin:
<% @LANGUAGE=VBscript %> <% Option Explicit Response.Expires = 0 Dim strAdi, strSoyadi, strBilgi If Request.ServerVariables("CONTENT_LENGTH") <> 0 Then strAdi = Trim(Request.Form("adi")) strSoyadi = Trim(Request.Form("soyadi")) strBilgi = Trim(Request.Form("mesaj")) strBilgi = Replace(strBilgi, vbcrlf, "<BR>" & vbcrlf) %> <html> <head> <title>Mini Form (Post)</title> <meta http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <meta http-equiv="Content-Type" content="text/html; charset=windows-1254"> </head> <body> Script'imize Form'dan bilgi ulat <BR><BR> Gelen bilgiler:<BR> Formu dolduran kiinin ad: <%= strAdi%> <BR><BR> Formu dolduran kiinin Soyad: <%= strSoyadi%> <BR><BR> Mesaj: <%= strBilgi%> <BR><BR> </body> </html> <% Else %> <html> <body> Bize bilgi verir misiniz?<BR> <FORM ACTION= "<%= Request.ServerVariables("SCRIPT_NAME") %>" METHOD="POST"> Adnz: <INPUT TYPE="Text" NAME="adi"><BR> Soyadnz: <INPUT TYPE="Text" NAME="soyadi"><BR>
ACTIVE SERVER PAGES 78

Mesajnz: <TEXTAREA NAME="mesaj">Mesajnz buraya yazn!</TEXTAREA><BR> <INPUT TYPE="Submit" NAME="Gnder" VALUE="Gnder"> </FORM> </body> </html> <% End If %>

ki Miniform sayfas arasndaki deiiklii farkettiniz mi? nce, Form etiketinin METHOD zelliinin Post olduuna dikkat edin. Bu yntemle gelen bilgiler, Request nesnesinin Form kolleksiyonuna, ilenmi (yani deiken=deer iftleri halinde yazlm) olaca iin, Form bilgilerini yeni deikenlere atama ifadelerimizi de farkl yazyoruz. nce formdan gerekten bilgi gelip gelmediini Content_Length deikeninin boyutunun sfr olup olmadna bakarak anlyoruz. Bu deikenin boyutu 0 ise form ii bo gnderilmi demektir; bu durumda ziyaretiyi formu doldurmas iin uyaran bir Suba gnderebiliriz. Form doldurulmu ise, kodumuzun birinci blm yapmas gereken deikenlere atama ilemini yapyor; ve sonular ziyaretinin Browser penceresine yazyor. Daha sonra yapacamz rnek Konuk Defterinde bu bilgileri ziyaretinin ekrarna deil, bir metin dosyasna yazacamz greceksiniz. Form etiketlerinden bilgi alma Form iinde kullandmz bir ok etiket, Servera farkl biimde bilgi gnderir. Yukardaki rnekte grdmz Input ve Textarea etiketleri, kendi adlarn deiken ad yaparak ve deikene ziyaretinin yazd metni deer olarak atayarak, gnderir. Fakat HTMLin <SELECT MULTIPLE> etiketi biraz daha dikkat etmemizi gerektirir; nk ziyareti bu etiketle oluturduunuz seeneklerden birden fazla seebilir ve bunlar Servera bir kolleksiyonun elemanlar olarak gelir. yle bir rnek dnn:
<SELECT NAME=CokluSecme SIZE=3 MULTIPLE> <OPTION VALUE=Emrah SELECTED> Emrah <OPTION VALUE=Karacaoglan> Karacaolan <OPTION VALUE=Sulari> Davud Sulari <OPTION VALUE=Daimi> Ak Daimi <OPTION VALUE=Pirsultan> Pir Sultan Abdal

Browser, kullanc birden fazla seim yaptysa, yaplan seim saysn, yani ka seenek seildiini bize bildirir ve bu Request nesnesinin Form kolleksiyonunda CokluSecme elemannn .Count deikenine yazlr. Bu bakmdan CokluSecme kendisi bir kolleksiyondur. Yani, bu deikenin deerini kullanarak, CokluSecme kolleksiyonunun elemanlarn tek tek okutmak iin bir For dngsnden yararlanabiliriz:
For sayac = 1 to Request.Form(CokluSecme).Count Response.Write(sayac & . seim: & Request.Form(CokluSecme) (sayac) & <BR>) Next

Bu iki kodu, miniform_post.aspye katabilir misiniz? (Ortaya kartacanz rnei bu kitapn rnekleri arasndaki miniform_multi.asp ile karlatrabilirsiniz.)
ACTIVE SERVER PAGES 79

Parola le Sayfa Koruma Internette gizlilik olmaz! ilkesine ramen, bazen yle sayfalarmz olur ki, bunlarn ieriini btn Internet ziyaretilerinin grmesini istemeyebiliriz. rnein derneimizin veya grubumuzun telefon numaralar ve elektronik posta adreslerini gsteren sayfamza sadece grup yelerinin ulamasn arzu edebiliriz. Bir Web sitesinin herhangi bir sayfasn ziyaretilerden gizlemek iin sayfann almasn belirli bir artn yerine gelmi olmasna, mesela ziyaretinin bir Form araclyla bize doru parolay gndermesine balayabiliriz. Bu tr sayfa gizleme yollarn istemci-tarafnda alan bir programla yapmak mmkndr; ancak sayfa gizlemenin mantna aykrdr. szgelimi bir Formda parola alanna girilecek bilginin gerek parola ile karlatrlmasn bir Script fonksiyonu ile yapmaya kalkarsak, ziyaretinin kayna grntlemesi halinde ziyaretinin girdisi ile parolay karlatran Script, ve tabi bizim kymetli parolamz, ziyareti tarafndan renilecektir. Oysa ASP kodlar ile gizlediimiz parolann ziyaretiye grnmesi imkanszdr; nk ASP kodlar hi bir zaman ziyaretiye gnderilmeyecei iin parola snayan program da ziyaretiye gidemeyecektir. nce u kodu, parola.asp adyla kaydedelim:
<%@ LANGUAGE="VBSCRIPT" %> <% Response.ExpiresAbsolute = Now() - 1 'Sayfann yedeklenmesini nleyelim FormParola = ucase(trim(request.form("FormParola"))) If FormParola <> "PAROLA" Then %> <HTML> <HEAD> <TITLE>ASP ILE PAROLA</TITLE> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254"> </HEAD> <BODY bgcolor="#ccffff" text="black" link="navy" vlink="purple"> <DIV align="center"> <FORM action="parola.asp" method="POST"> <h2>Ana sayfaya girmek iin parolay yaznz (Mesela, PAROLA) ?</h2> <input type="password" name="FormParola" size="10"><br><br> <input type="submit" value="Girebilir Miyim?"> </form> </div> </body> </html> <% Else %>
ACTIVE SERVER PAGES 80

imdi ana sayfaya girmi oldunuz.. <% End If %>

imdi kodumuzu ayrntl indereleyebiliriz. nce, bu sayfann ziyaretinin Browser tarafndan ziyaretinin bilgisayarnda yedeklenmesini nlediimize dikkat edin: Bunu Response nesnesinin .Expries metodunun farkl bir tr ile yapyoruz. .ExpiresAbsolute sadece .Expires metodundan farkl olarak, bizden bir deer ister. Bu deerin zaman olarak verilmesi gerekir. Burada VBScriptin o andaki zaman belirten Now() fonksiyonu ile yapyoruz ve bu fonksiyonun verdii deerden (yani o andaki saatten) 1 saat kartyoruz. Bylece sayfann geerlii oktan dolmu oluyor. Browser, bu ifadeyi grd anda sayfann daha sonra bavurulmak zere bir kopyasn saklamayacaktr. Bunu neden yapyoruz? Diyelim ki parolay doru bilen bir ziyareti kulland bilgisayarn bandan kalkt ve yerine baka bir kullanc geti. Bu kiinin Browsern Yenile dmesini tklamas halinde bizim zene-bezene gizlediimiz sayfa yeniden grntlenecektir. Oysa Browsera bu sayfann artk geerli olmadn bildirmekle, yenilenme ileminin Cache bellekten (ziyaretinin bilgisayarnda sabit diskte kaydedilen kopyadan) deil de, mutlaka Serverdan yaplmasn istiyoruz. Sayfamz alrken, (kodumuzun drt ve beinci satrnda) kendi ierdii formda bilgi olup olmadn snyor. Bunu formdaki formParola isimli INPUT alannn deerini atadmz deikenin ieriini parola olarak setiimiz kelime karlatrarak yapyoruz. Eer bu deiken (buradaki rnekte PAROLA kelimesine) eit deilse, yani parola yanl veya bosa If sorgusu olumlu sonu verecek ve program devam edecektir. If sorgusu yanl sonu vermi olsayd, yani ziyareti Forma bilgi girmi ve bu bilgi bizim karlatrmay yaptmz kelimeye eit olmu olsayd, program ELSE ifadesine atlayacakt. Programn devam formu oluturmaktadr; ELSE ifade ise formu atlamakta ve ziyaretinin Browser penceresine imdi ana sayfaya girmi oldunuz cmlesini yazdrmaktadr. Tabi gerek bir uygulamada bu cmlenin yerinde gerek bir sayfann geleri yer alacakt. Bu yntemi uygularken sayfann VBScriptnin End If ifadesiyle bittiine dikkat edin. Dinamik indekiler Sayfas Internet sitemizin sayfalar genellikle ok zenilmi, cicili-bicili, albenisi olan, grsel odak noktalarnn olumasna dikkat edilmi tasarmlar olur. Fakat bazen, nemli olan sadece bir dizindeki btn HTML ve ASP belgelerinin adlarn ve balklarn liste halinde ziyaretiye sunmaktr. Byle bir sayfada da tasarmn grsel ilkelerine dikkat edilebilir. Fakat burada nemli olan, sayfann kendi kendisini ina etmesi ve sayfann bir dizinin iindeki tm dosyalar zyaretiye listeyen blmnn otomatik olarak gncellenmesidir. Bunu, bir HTML sayfas oluturan ASP program olarak tasarlayabiliriz. Aadaki biraz uzunca kodu, menu.asp adyla kaydedin veya bu kitapn rnek dosyalar arasnda bulun:
<%@ LANGUAGE=VBSCRIPT %> <% Server.ScriptTimeOut = 300 strListKlasor = "/" %> <HTML>
ACTIVE SERVER PAGES 81

'Server'a daha ok zaman tanmak iin

strMenuSayfaURL = "/menu.htm" 'oluturacamz sayfann yolu 'iindekileri bulacamz dizin

<TITLE>ASP ILE MENU OLUSTURMA</TITLE> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254"> <META http-equiv="Copyright" content="Alex Homer"> <BODY> <% Response.Write "<P>Men sayfas oluturuluyor: " & strMenuSayfaURL & " ...</P>" 'men sayfas olacak dz yaz dosyasn oluturalm Set objFSO = CreateObject("Scripting.FileSystemObject") strDosyaAdi = Server.MapPath(strMenuSayfaURL) Set objMenuSayfa = objFSO.CreateTextFile(strDosyaAdi, True) 'dosyann stne yaz 'men sayfasnn balk blmn yazalm objMenuSayfa.WriteLine "<HTML><BODY><P><B>Dosyalarn listesi</B></P>" 'belirtilen dizindeki dosyalarn listesini ieren kolleksiyonu oluturalm Set objKlasor = objFSO.GetFolder(Server.MapPath(strListKlasor)) Set kolDosyalar = objKlasor.Files 'Her bir dosyann baln okuyarak listemizi yapalm For Each objDosya in kolDosyalar 'dosya adnn uzants ASP ve HTM olanlar ayralm strDosyaTuru = objFSO.GetExtensionName(objDosya.Name) If (strDosyaTuru = "asp") Or (Left(strDosyaTuru, 3) = "htm") Then 'dosyann tmn okuyup bir String'de tutalm Set objOku = objDosya.OpenAsTextStream(1) 'okumak iin strIcerik = objOku.ReadAll objOku.Close 'iinden balk blmn alalm strBaslik = "" intBaslangic = Instr(UCase(strIcerik), "<TITLE>") + 7
ACTIVE SERVER PAGES 82

intSon = Instr(UCase(strIcerik), "</TITLE>") If (intBaslangic > 0) And (intSon > intBaslangic) Then strBaslik = Trim(Mid(strIcerik, intBaslangic, intSon - intBaslangic)) End If If Len(strBaslik) = 0 Then strBaslik = "Adsz sayfa '" & objDosya.Name & "'" 'Men sayfas iin metni oluturalm strBuDosyaURL = strListKlasor & objDosya.Name strKopru="<A HREF=" & Chr(34) & strBuDosyaURL & Chr(34) & ">" & strBaslik & "</A><BR>" objMenuSayfa.WriteLine(strKopru) End If Next 'Men sayfasnn son blmn yazalm objMenuSayfa.WriteLine "</BODY></HTML>" objMenuSayfa.Close Response.Write "<P>Men sayfas oluturuldu.</P>" %> <P><A HREF="<% = strMenuSayfaURL %>">Men sayfasn a</A></P> </BODY> </HTML>

Programn daha ncekilere gre uzun oluu, Dosya Sistemi (FileObject) Nesnesini kullanarak oluturaca menu.htm dosyasnn ieriini salamak iin verdiiniz dizinde bulunan ve dosya ad uzatmas .htm ve .asp olan btn dosyalarn iinde <TITLE>..</TITLE> etiketini aramasndan kaynaklanyor. Programn yazar Alex Homerin btn deiken adlarnn nnde, deikenin trn belirten n-ekler kullandna dikkat edin. Bylece nesneleri (obj), saysal (int) ve kolleksiyon (kol) deerlerden ayrmamz kolaylayor. Program altrdmz zaman, Browser penceresinde men sayfasnn oluturulduuna ilikin mesaj belirliyor; ve ilem tamamlandnda da oluturulan menu.htm sayfasnn kprs veriliyor. Bu kpry tkladmzda ise programn beinci satrnda strListKlasor = "/" ifadesiyle verdiimiz dizinin iindeki btn HTML ve ASP dosyalarnn baln, bu dosyalara kpr verilmi olarak grrz. sterseniz, strListKlasor deikeninin deeri olarak, szgelimi /html/ gibi, kendi Web Servernzdaki dier herhangi bir dizinin adn da verebilirsiniz. Bunu yaparken dizin adnn sonuna bl iareti koymay unutmamak gerekir. Bu program byle bamsz olarak altrlabilecei gibi, bir erevenin (Frame) iinde altrlabilir ve sonular, baka bir erevenin iinde grntlenebilir. Bu programn indekiler sayfasn hazrlad dizine ne kadar yeni dosya koyarsanz koyun veya mevcut dosyalar kartrsanz kartn, ne zaman bu program altrrsanz, indekiler listesi dinamik olarak mevcudu yanstacaktr.
ACTIVE SERVER PAGES 83

Gecikme Bildirme Sayfas Yukardak rnei birlikte uyguladysak, ASP programna indekiler listesini kartmas iin verdiimiz dizinin ierdii dosya saysna bal olarak, programn almas epey uzun sre alacaktr. 20 saniyenin zerinde beklemenin bir yzyla yakn etki yapt gnmz Internet ziyaretisi iin bu sre ok uzun grnebilir. Ziyaretimize, szgelimi Browser programnn donmadn, veya Internet balantsnn kesilmediini belirtebilmek iin, Ltfen bekleyiniz! mesaj vermek yerinde olabilir. Yukardaki rnekte bunu ayn sayfa iinde yapma imkanmz vard; nk programmz tabir yerinde ise ziyaretiyi bu sayfadan alp, baka bir sayfaya gtrmyordu. Oysa Web uygulamamzn ak plan yle gerektirebilir ki, ziyaretimizin bir talebini karlayabilmek iin ona Ltfen bekleyiniz! mesajn ne hareket ettii, ne de gittii sayfada veremeyiz. Bunun iin bir ara sayfa gerekebilir; bir tr Ltfen bekleyiniz!.. sayfas. Bu rnekte byle bir sayfa yapacaz; ancak bu amacmz tek sayfa karlamayaca iin, ortaya iki sayfa kartacaz. imdi u kodu bekle01.asp adyla kaydedin:
<% Response.Buffer = True %> <HTML> <% mesaj = Server.URLEncode("Arzu ettiiniz i yaplyor.. Ltfen bekleyiniz") %> <% Response.Redirect ("bekle02.asp?BEKLE_SURE=3&BEKLE_MESAJ=" & mesaj & _ "&GONDER_URL=index.htm") %> <HEAD> <TITLE>ASP ILE BEKLETME 01</TITLE> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254"> </HEAD> <BODY> </BODY> </HTML>

Burada ASP kodunun tm ilemeden, ortaya kan HTMLin ziyaretinin Browserna para para gnderilmesini nlemek amacyla Response nesnesinin .Buffer metodunun True (doru) olarak belirlendiini gryorsunuz. Programn kullanaca mesajn, mesaj adl deikene atandna dikkat edin. Bu sayfann tek ilevi ise Response nesnesinin .Redirect metodu ile bekle02.asp sayfasn armaktan ibaret. Baka bir deyile bekle01.asp, gerekte Browsern yzn bile gremeyecektir! Biraz sonra kendisine deiken verilmesini bekleyen bekle02.asp program yazacaz. Nitekim bekle01.aspnin iinde deiken deeri belirleniyor; ve bunlar bekle02.aspye URL-GET metodu ile yazlyor. Burada GET metodu ile bir bir sayfaya veri gnderme tekniini hatrlayalm. Bir Formun Servera veri gnderme metodu GET ise, Formdan (veya sayfadan URL yoluyla) derlenen verilerin deiken=deer iftleri halinde ve iftlerin arasnda & iareti konularak gnderilir. Bu yntemi, HTTP yoluyla Browser nasl kullanyorsa, biz de istediimiz anda kullanabiliriz. Burada;
ACTIVE SERVER PAGES 84

bekle02.asp?BEKLE_SURE=3&BEKLE_MESAJ=" & mesaj & _ "&GONDER_URL=index.htm

eklindeki ifade de sayfa adndan sonra konan soru iareti, Servera bu bilgi kmesinin bu sayfaya iletilmesi komutunu vermenizi salar; bir bakma Servera u bilgileri al; bekle02.asp sayfasna ver! demi oluyoruz. Bu bilgiler hatrlayacaksnz, Serverda Request nesnesinde tutulur; eittir iaretinin nndeki ksm deiken, arkasndaki ksm ise deer saylr. Dedik ki: bekle02.asp kendinise deiken verilmesi beklemektedir. Bunu salayan nedir? Resquest nesnesinden alnp, bu sayfann iindeki deikenlere atanan deer bulunmas. bekle02.aspyi de yazalm:
<%@ LANGUAGE="VBSCRIPT" %> <% BEKLE_SURE = Request("BEKLE_SURE") GONDER_URL = Request("GONDER_URL") BEKLE_MESAJ = Request("BEKLE_MESAJ") %> <html> <head> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254"> <META http-equiv="Refresh" content="<% =BEKLE_SURE %>; URL=<% =GONDER_URL %>"> <title>ASP ile Bekletme</title> </head> <body color="#FFFFFF"> <font face="Arial"> <p align = "center"><strong><% =BEKLE_MESAJ%></strong> </p> </font> </body> </html>

Daha nce yazdmz bekle01.asp, ziyaretiyi bekle02.aspye ynlendirirken ona deiken=deer iftti gnderiyor; bekle02.asp bunlar Request nesnesinden alarak, kendi deikenlerine atyor. Bu deikenini inceleyelim. Ziyaretinin bekleme sresince Browser penceresinde grecei mesaj, BEKLE_MESAJ deikeninde yer alyor; Bu mesaj grntlendii sayfann ziyaretinin Browsernda kalaca sreyi BEKLE_SURE deikenin deeri belirliyor: Bu sayfann yerini alacak olan hedef sayfa veya ziyaretinin Browserna gnderilecek yeni sayfann adresini, GONDER_URL deikeni belirliyor. Bu programlar altrdnzda ziyaretinin Browsernda saniye sreyle Arzu ettiiniz i yaplyor.. Ltfen bekleyiniz! yazs grntlenecek; daha sonra Browsera index.htm sayfas gnderilecektir. Bu iki program kendi ihtiyalarnza uyarlamak isterseniz, szgelimi bir veritabannn gncellenmesi srasnda veya benzeri bir muhtemel gecikme durumunda,
ACTIVE SERVER PAGES 85

ziyaretiye durumu bildirmek iin, kpry bekle01.aspe verebilirsiniz; asl hedef URLi ise bekle01.aspde verebilirsiniz. Form Deerlerini Yakalayalm Bir veritabanndan ektiimiz verilerle, Form etiketi iinde kullanabileceimiz ve ziyaretinin ya metin girmesine ya da seim yapmasna imkan veren kutular, seenekleri nasl doldurabileceimize ilikin bir rnei birinci kitapkta grmtk. Burada imdi bir Formdan gelen verileri nasl deikenlere atayacamz ve bunlar nasl kullanacamz ele alalm. Bu amala iki sayfa hazrlayacaz: birincisi iinde bir ok tercihler bulunan formlar olan bir HTML dosyas, dieri ise bu Formun deerlerini alarak, kullanlr hale getirecek bir ASP program olacak. nce FormOrnek.htm adl u dosyay kaydedelim:
<HTML> <HEAD> <TITLE>Form Ornegi</TITLE> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254"> </HEAD> <BODY> <H4>Birinci Form</H4> <FORM ACTION="FormOrnek.asp?HangiForm=1" METHOD="POST"> <INPUT TYPE="Text" NAME="MetinGir" VALUE="Mesajnz buraya yaznz" SIZE="30" MAXLENGTH="75"><BR> <INPUT TYPE="Password" NAME="ParolaAlani" SIZE="30" VALUE="parola"><BR> <TEXTAREA NAME="MetinAlani" COLS="30" ROWS="3" WRAP="VIRTUAL"> Buraya istediiniz yazy yazabilirsiniz...</TEXTAREA><P> <INPUT TYPE="Submit" VALUE="Gnder">&nbsp;&nbsp;<INPUT TYPE="RESET" VALUE="Sil"> </FORM> <HR> <H4>kinci Form</H4> <FORM ACTION="FormOrnek.asp?HangiForm=2" METHOD="POST"> <TABLE BORDER = 0><TR><TD><INPUT TYPE="Radio" NAME="Radyo" VALUE="Tercih1" CHECKED>Radyo Dmesi Tercih 1<BR> <INPUT TYPE="Radio" NAME="Radyo" VALUE="Tercih2">Radyo Dmesi Tercih 2<BR> <INPUT TYPE="Radio" NAME="Radyo" VALUE="Tercih3">Radyo Dmesi Tercih 3</TD> <TD width=30>&nbsp;</TD> <TD><INPUT TYPE="Checkbox" NAME="IsaretKutusu" VALUE="Isaret1">aret Kutusu 1<BR> <INPUT TYPE="Checkbox" NAME="IsaretKutusu" VALUE="Isaret2">aret Kutusu 2<BR>
ACTIVE SERVER PAGES 86

<INPUT TYPE="Checkbox" NAME="IsaretKutusu" VALUE="Isaret3">aret Kutusu 3</TD> </TR></TABLE><BR> <INPUT TYPE="Submit" VALUE="Gnder">&nbsp;&nbsp;<INPUT TYPE="RESET" VALUE="Sil"></FORM> <HR> <H4>nc Form</H4> <FORM ACTION="FormOrnek.asp" METHOD="GET"> <INPUT TYPE="Hidden" NAME="HangiForm" VALUE="3"> <SELECT NAME="SecmeListesi" SIZE="1"> <OPTION VALUE="ListeTercih1">Liste Tercih 1 <OPTION VALUE="ListeTercih2">Liste Tercih 2 <OPTION VALUE="ListeTercih3">Liste Tercih 3 </SELECT> <SELECT NAME="CokluSecme" SIZE="3" MULTIPLE> <OPTION VALUE="ListeKutu1">oklu Seme Kutusu 1 <OPTION VALUE="ListeKutu2">oklu Seme Kutusu 2 <OPTION VALUE="ListeKutu3">oklu Seme Kutusu 3 </SELECT><P> <INPUT TYPE="Submit" VALUE="Gnder">&nbsp;&nbsp;<INPUT TYPE="RESET" VALUE="Sil"> </FORM> </BODY> </HTML>

Daha sonra belirlediimiz deikenlerin Formun hangi elerinden geldiinin rahat anlalmas iin burada Form unsurlarnn deeri olarak unsurun adna yakn kelimeleri kullandmza dikkat edin. Sayfada ayr Form bulunduu, ilk iki formun POST, ncsnn ise GET metoduyla Servera bilgi gnderdii de dikkatinizi ekmi olmal. POST metodunda Servera giden bilgiler, talep edilen sayfann adna URL kodlama yntemiyle (ve dolaysyla Browsernzn URL kutusuna yazlarak) gnderilmez; Fakat ilk iki Formda POST metodu kullanm olmamza ramen, formu ileyecek programa bilgilerin hangi formdan gittii sanki GET metodu kullanlm gibi bildiriliyor. Bu yntemi, Request.Form kolleksiyonuna yazlmasn istemediimiz bilgiler iin kullanabibiliriz. nc Form ise bilgilerini GET yoluyla gnderiyor ve kendisinin hangi form olduuna ilikin bilgiyi ise gizli bir deikene yazyor. Her durumda da HagiForm deikeninin deeri olarak, ASP programna formun sra numaras anlamna gelen say gnderiliyor. Birinci form 1, ikinci form 2, nc form ise 3 deerini yolluyor. Bu HTML dosyasn Browserda aarsanz, ayr formu greceksiniz. <asp0018> Her formun gnderdii bilgiler aadaki programa ulayor. Bu program FormOrnek.asp adyla kaydedebilirsiniz:
ACTIVE SERVER PAGES 87

<HTML> <HEAD> <TITLE>ORNEK FORM SONUCLARI</TITLE> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254"> </HEAD> <BODY> <% dim FormTercihi FormTercihi = Request.QueryString("HangiForm") Select Case FormTercihi Case 1 %> Metin alan sonular<P> <TABLE BORDER=1 CELLPADDING=5 width=75%> <TR><TD>Input/Text Alan</TD><TD><B><%= Request.Form("MetinGir") %></B></TD></TR> <TR><TD>Input/Passsword Alan</TD><TD><B><%= Request.Form("ParolaAlani") %></B></TD></TR> <TR><TD>TextArea Alan</TD><TD><B><%= Request.Form("MetinAlani") %></B></TD></TR> </TABLE> <HR> <% Case 2 %> Radyo Dmesi ve aret Kutusu Sonular<P> <TABLE BORDER=1 CELLPADDING=5 width=25%> <TR><TD>Seilen Radyo Dmesi</TD><TD><B><%= Request.Form("Radyo") %></B></TD></TR> <TR><TD>aretlenen Kutular</TD><TD><B><% dim strIsaretlenen for each strIsaretlenen in Request.Form("IsaretKutusu") Response.Write strIsaretlenen & "<BR>" next %></B></TD></TR> </TABLE>
ACTIVE SERVER PAGES 88

<HR> <% Case 3 %> Seme Alanlar sonular<P> <TABLE BORDER=1 CELLPADDING=5 width=35%> <TR><TD>Seilen Liste gesi</TD><TD><B><%= Request("SecmeListesi") %></B></TD></TR> <TR><TD>Seilen oklu Liste geleri</TD><TD><B><% for each strIsaretlenen in Request("CokluSecme") Response.Write strIsaretlenen & "<BR>" next %></B></TD></TR> </TABLE> <HR> <% End Select %>

Bu programda, ayr formdan gelebilecek bilgiler, HangiForm deikeninin deerine gre, Select Case dngs ile ayr blmde ileniyor. lk iki formda, bilgiler POST metodu ile geldii iin Request.Form nesnesinin iinde, deiken adyla aranabilir. nc Formda ise bilgiler Request.QueryString nesnesinde bulunuyor. Burada bu bilgilerin daha nce grmediimiz ksaltma yntemiyle alnp, sayfaya aktarldn gryorsunuz; < %=Request("SecmeListesi")>, aslnda;
Response.Write Request.QueryString(SecmeListesi)

ifadesinin ksaltlmdr. FormOrnek.htmin her formunda da baz tercihler yaparak Gnder dmesini tkladnzda, FormOrnek.aspye gnderilen URL bilgisine dikkat edin. lk ikisinde sadece seilen formun HangiForm deeri yer ald halde. ncsnde formdaki btn bilgiler burada URLkodlanm olarak yer alacaktr. Programn bilgi ileyen blmn kendiniz irdeleyebilir misiniz?

ACTIVE SERVER PAGES

89

Konuk Defteri Uygulamas


Bu blmde ilk tam ASP sitesini adm adm birlikte oluturacaz; daha nce teorik veya ksaca uygulamal grdmz komutlar, metodlar ve ifadeleri toplu halde kullanma imkan bulacaz. Konuk Defteri, Internet sitemizi ziyaret edenlerle en kolay bilgi alverii yntemidir; konuklarmz defterimize kendileri hakknda baz bilgiler girerler. Burada yapacamz rnekte, ziyaretimize nce konuk defterimize bilgi girmek isteyip istemediini soran bir sayfa sunacaz; burada konuk defteri bilgilerinin yer ald bir Form sayfasna gitmesini salayan kpr olacak. Form sayfamzdaki Gnder dmesi tklandnda bir ASP sayfas, Formun yollad bilgileri ziyaretimize gsterecek ve arzu ederse defterde yer alan dier bilgileri okuma imkan verecek. Ziyaretimiz defterdeki dier bilgileri okumak isterse, bir dier ASP sayfas, bu bilgileri dosyadan okuyarak ziyaretimize sunacak. Birinci sayfamz burada basit bir HTMLsayfas ancak siz bunu isterseniz kendi ana sayfanzla btnletirebilirsiniz. Diyelim ki aadaki kodu, konuk01.htm adyla kaydettik:
<HTML> <HEAD> <TITLE>KONUK DEFTERIM</TITLE> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254"> </HEAD> <BODY> <H1><CENTER>Hogeldiniz!</CENTER></H1> Konuk Defterimi imzalamak ister misiniz? ok teekkrler <p><A HREF="konuk02.htm">Deftere Git</A> </BODY> </HTML>

Burada konuk defterini izmalamak isteyenler iin konuk defterini ieren dosyaya bir kpr var. Aadaki form da konuk defterimiz olsun! Bunu da konuk02.htm adyla kaydedelim:
<HTML> <HEAD> <TITLE>KONUK DEFTERIM</TITLE> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254"> </HEAD> <BODY>
ACTIVE SERVER PAGES 90

<H1><CENTER>Konuk Defteri!</CENTER></H1> Konuk defteri sayfama hogeldiniz. Buraya kaydedeceiniz bilgilerle birbirimizi daha iyi tanma imkan bulabiliriz. <p>ok teekkrler</p> <FORM ACTION="konuk_isle.asp" METHOD="post"> <p>Adnz: <INPUT TYPE="Text" SIZE="20" NAME="Adi"></p> <p>Soyadnz: <INPUT TYPE="Text" SIZE="20" NAME="Soyadi"></p> <p>E-Posta Adresiniz: <INPUT TYPE="Text" SIZE="20" NAME="Email"></p> <p>Dnceleriniz: <br><TEXTAREA NAME="Mesaj" COLS="40" ROWS="4">Sitem hakkndaki dnceleriniz</TEXTAREA></p> <INPUT TYPE="Submit" NAME="Gonder" VALUE="Gnder!">&nbsp;<INPUT TYPE="Reset" NAME="Sil" VALUE=" Sil! "> </BODY> </HTML>

Burada oluturduumuz HTML alanlarndan drd, daha sonra ilenmek zere, bize drt deiken verecek: Adi, Soyadi, Email ve Mesaj. Aadaki kod ile bu verileri ileyeceiz. Bu kodlar da konuk_isle.asp adyla kaydedelim:
<% @LANGUAGE=VBscript Option Explicit %> <HTML> <HEAD> <TITLE>KONUK DEFTERI KAYIT</TITLE> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254"> </HEAD> <BODY> <h2>Verdiiniz Bilgiler:</h2> Adnz: <%=Request.Form("Adi")%><BR> Soyadnz: <%=Request.Form("Soyadi")%><BR> E-Posta Adresiniz: <%=Request.Form("Email")%><BR> Dnceleriniz: <%=Request.Form("Mesaj")%><BR> <p> <% Dim DosyaSistemi, KonukDosyasi Set DosyaSistemi = CreateObject("Scripting.FileSystemObject")
ACTIVE SERVER PAGES 91

Set KonukDosyasi = DosyaSistemi.OpenTextFile("c:\inetpub\wwwroot\konuklar.txt",8, True) KonukDosyasi.WriteLine Request.Form("Adi") KonukDosyasi.WriteLine Request.Form("Soyadi") KonukDosyasi.WriteLine Request.Form("Email") KonukDosyasi.WriteLine Request.Form("Mesaj") KonukDosyasi.Close %> <H3>Konuk Defterime kaydedildi. ok teekkr ederim.</H3> <A HREF="konuk_oku.asp">Konuk Defterini Oku!</A>&nbsp;&nbsp;&nbsp;<A HREF="index.htm">Ana Sayfaya Dn!</A> </BODY> </HTML>

<%

Burada biraz duralm ve konuk_isle.aspyi irdeleyelim. Formu oluturan sayfamzda dikkat ettiiniz gibi, verileri POST metodu ile alyoruz; dolaysyla Formdan gelen bilgiler, Request nesnesinin Form kolleksiyonunda yer alyor; ve nce bu bilgileri ziyearetimizin Browser penceresine yazdryoruz. Ziyaretimiz bylece ne bilgi verdiini ber kere daha grm oluyor. Sonra, FileSystem nesnesini kullanarak, bu bilgileri Web Servern kk dizininde konuklar.txt adl dosyaya eklettiriyoruz. Bu ilemi yapan WriteLine metodu, her bir deikenin deerini yazdktan sonra satr sonuna yeni satr karakteri girecektir. Yine Bu bilgilerin kaydedildiini ziyaretiye bildirdikten sonra, kendisine defterimizdeki dier girdileri okuma veya ana sayfaya dnme seeneini veriyoruz. Ziyareti, defterdeki dier bilgileri okuma seeneini seecek olursa gidecei sayfann kodlar ise aada. Bu kodlar da konuk_oku.asp adyla kaydedelim:

@LANGUAGE=VBscript Option Explicit %> <HTML> <HEAD> <TITLE>KONUK DEFTERI OKUMA</TITLE> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254"> </HEAD> <BODY> <h2>Konuk Defterimde Yeralan Bilgiler:</h2> Bugne kadar konuk defterimi imzalayan btn dostlarma teekkr ederim. <p> <% Dim DosyaSistemi, KonukDosyasi, Adi, Soyadi, Email, Mesaj
ACTIVE SERVER PAGES 92

Set DosyaSistemi = CreateObject("Scripting.FileSystemObject") Set KonukDosyasi = DosyaSistemi.OpenTextFile("c:\inetpub\wwwroot\konuklar.txt",1) Do While Not KonukDosyasi.AtEndOfStream Adi = KonukDosyasi.ReadLine Soyadi = KonukDosyasi.ReadLine Email = KonukDosyasi.ReadLine Mesaj = KonukDosyasi.ReadLine Response.Write Adi & "<BR>" Response.Write Soyadi & "<BR>" Response.Write Email & "<BR>" Response.Write Mesaj & "<P>" Loop KonukDosyasi.Close %> <A HREF="index.htm">Ana Sayfaya Dn!</A> </BODY> </HTML>

imdi de bu kodun zerinde duralm: Yine FileSystem nesnesinin OpenTextFile metodu ile, mevcut konuk girdileri dosyasn ayoruz; ve ieriini Do dngs ile, dosya sonuna varncaya kadar ReadLine metodu ile okutuyoruz. ReadLine, dosyay satr satr okuyacaktr; burada satr ls, dosya ba ile satrsonu-yeni satr (CRLF veya enter/Return) karakteri, iki satrsonu aras, veya bir satrsonu ve dosya sonu iareti arasnda kalan metindir. Dosyamzn her bir satr bir deikenin deeri olarak yazldna gre, okunan her satr srasyla, Adi, Soyadi, Email ve Mesaj deikenlerine deer olarak kaydedilecek ve ziyaretininin Browser penceresine yazlacaktr. Bu ana kodun etrafnda sayfalarn grsel olarak zenginletirmek, tabi sizin elinizde!

ACTIVE SERVER PAGES

93

Veri Ynlendirmeli Web Uygulamas


Birinci kitapkta, ADO nesnesini tandk ve ne ie yaradn grdk. Bu blmde ADO nesnesinin nasl kullanldn ele alacaz; bu amala veritabanna dayanan, HTML etiketlerinin ieriini bir veritabanndan alan ve ziyaretinin girdilerini bir veritabanna yazan rnek uygulama oluturacaz. Bunu yaparken ADOyu tantrken ele almadmz baz SQL komutlar ile tanacaz. rnek uygulamamz, nl bir Web Tasarmcsnn mstakbel mterilerine randevu verdii bir site olacak. Mstakbel mterilerimiz, Web sitemize balanacaklar, nasl bir Web sitesi oluturmak istediklerini onlara sunacamz bir listeden seecekler; sitelerinin zelliklerini ve bizimle ilk grmeyi yapmak istedikleri zaman belirtecekler; Web programmz, btn bu bilgileri bir veritabanndaki veri tablolarna dayanarak mstakbel mterimize seenek olarak sunacak; ziyaretinin kabul ettii randevu zaman dilimini veritabanndaki tabloda baka mterilere verilmemek zere, kapatacak. Fakat bu ie balamadan nce hzl bir bir veritaban oluturma kursu grelim.

Veri iin hazrlk


Kullanacamz veritabann burada MS Access ile oluturacaz. Fakat siz istediiniz herhangi bir program, rnein FileMaker Pro veya Paradoxu kullanabilirsiniz. Elinizin altnda Oracle veya MS SQL Server varsa, onlar kullanmanzdan daha tabi bir ey olamaz. likilendirilmi Veritaban (Relational Database) deyimini daha ce duymu olmalsnz. Web Programmzda, byle bir veritaban kullanacaz. likilendirilmi Veritaban, bir dosya iinde tablolarn en az bir stunundaki kaydn dier tablolardaki en az bir stunla ayn olduu ve bu iki stun birbirine balanm veritaban demektir. (Bu rnekte kullanacamz veritabannn Microsoft Access ile oluturulmu rneini, bu kitapn kod rnekleri arasnda bulabilir ve bilgisayarnzda kurulu bir veritaban ileme program ile inceleyebilirsiniz. Bu tablolar kendi programnzda oluturmak isterseniz, kayt alanlar ve zelliklerini buradaki rneklere uygun olarak oluturmalsnz.) Veritaban tablolarnn ilikilendirilme durumunu, oluturacamz veritabannn iki tablosu zerinde gsterelim: Bu tabloda, mterinin kurmak istedii site trn belirten bir endeks stunu var: TurNO. (Daha sonra bu veritabann ykleyeceimiz Web Servern iletim sistemini bilmediimiz iin, Trke alfabeyi desteklemeyen bir Servern Tablo veya Alan Bulunamad hatas vermesini nlemek iin alan adlarnda Trke karakter kullanmamaya zen gstermemiz gerekir.) Bu kayt, Site Trleri tablosunda da var:
ACTIVE SERVER PAGES 94

Veritabann olutururken bu iki tabloyu TrNO stunlarndan ilikilendirir ve ilerde veritabanna, Bana, Mteriler ve Site Trleri tablolarndan TrNo stunundaki veri ayn olan btn kaytlar bul eklinde bir sorgulama emri (SQL JOIN komutu) verecek olursanz, Windowsun ODBC program, veritabann inceleyecek ve ortaya kartaca verilerden biri yle olacaktr: ADI Abdullah SOYADI Can EMAIL acan@sirket.com.tr STENO GRAFNOTURNO TURADI TURRAY 1 1 2 Intranet 4

imdi diyebilirsiniz ki, daha sonra iki tabloyu birletirmek yerine, neden batan tek tablo yapmadk da, ilikilendirme ve bir bir yn SQL komutu yazma (ve tabi renme) klfetine girdik? Bunun eitli sebepleri var: Bir kere veritaban uzmanlar, birden fazla tabloda aynen tekrar eden deerleri, ayr bir tabloda toplamay bilgisayarn bellek ynetimi asndan daha etkin bir alma tarz sayarlar. kincisi, fiyat belirlerken Intranet tr Web siteleri iin uygulayacamz katsayy ilerde deitirmek zorunda kalrsak, (bu i tutarsa, en ksa zamanda fiyatlara zam yapacamz phesiz olduuna gre!) ve elimizde iinde 1500 kayt bulunan bir tablo varsa, herbirinde trRayi stundaki veriyi tek-tek gncelletirmek ok zor olabilir. Oysa bu tr ilikilendirilmi bir veritabannda bir tabloda bir kayd deitirmekle, bir dier tablodaki binlerce, hatta milyonlarca kayd gncelletirmi oluruz. Siz kendi veritabannz olutururken, hangi verilerin hangi tabloda toplanacana ve hangilerinin ayr tablolara konulacana u kriterle karar verebilirsiniz: Bir tablonun birincil endeksine baml olmayan btn bilgiler o tablonun dna kmaldr. (Bu kriter size bir lde ifreli grnyorsa, veritaban oluturma ve ynetme konusunda bir kitap edinmeniz yerinde olur!) Veritaban konularna aina olmayanlar iin bir iki noktaya daha aklk getirmek gerekir. Tablolarmzn alan adlarn ve alanlardaki verilerin trlerini gsteren tabloya bakarsanz, btn tablolarda bir stunun Birincil endeks diye iaretlendiini greceksiniz. Bu alan, biri dnda btn tablolarda otomatik sra numaras eklinde; Mteri tablosunda ise mterinin elektronik posta adresi eklinde tayin edilmi bulunuyor. Bu alann varlk sebebi, kaytlarmzda dier btn alanlardaki verileri ayn bile olsa her bir mterinin ayr bir varlk olarak korunmasn salar. (Tabi, burada, iki mterinin ayn elektronik posta adresine sahip olmayacan varsayyoruz!)

naata Balarken
Biraz daha teknik olarak ifade edersek, ina ettiimiz programn (Web sitesinin) fonksiyonu, mteriden baz temel bilgileri alp, bu bilgileri mteri tablosuna ilemek, mteriye bizim randevu defterimize (veri tabanndaki Randevu tablosuna) bakarak, bo bir zaman nermek, mterinin kabul ettii zaman dilimini Randevu tablosuna ilemek, ve bu zaman dilimini bakasna vermemek zere kapatmak olacak. Biz, Web sitesi tasarmcs olarak, srekli, veritaban dosyasn aarak, yeni randevu alan olup olmadn kontrol etmek zorundayz. Yine arada bir, Randevu tablosuna yeni mteri kabul edebileceimiz bo zamanlarmz eklememiz gerekir. Bu ilemi, rnein Access programn kullanarak yapabiliriz. Bu amala kullanacamz tablolarn ilikilerini yle gsterebiliriz:

ACTIVE SERVER PAGES

95

Bu emada grlen ilikiler u anda bir anlam ifade etmiyorsa, biraz sonra tablo ok daha aydnlanacaktr. imdilik, ya bu tablolara ve ilikilere sahip bir veritaban oluturun; ya da rnek veritaban dosyasn Kiisel Web Servern dizini iine kopyalayn. ODBCe Veritabanmz Bildirelim Windowsun Denetim Masasn atnzda, ya ODBC Data Sources, ya da ODBC(32 Bit) adl bir simge greceksiniz. kinci sekme olan System DSNi an ve Add (Ekle) dmesini tklayn. Alacak kutuda, veritaban dosyanza uygun srcy sein. Bu kitapn rnek kodlar arasnda bulacanz web.mdb adl dosyay kullanyorsanz, Microsoft Access Driver adl srcy sein) ve Son dmesini tklayn. Alacak kutuda Data Source Name (Veri kaynann ad) kutusuna Web (veya kendi veritabannzn adn) yazn, isterseniz Description kutusuna veritabann tanmlayan bir ka kelime yazabilirsiniz. Database blmnde Select (Se) dmesini tklayarak veritaban dosyanz bulun. imdi, bilgisayarnzn ODBC arayz, Kiisel Web Servernz (vereceimiz ASP komutlar dolaysyla) talep ettii anda Browsernza Web adl veritabanndan arzu edilen verileri seip verecek veya bu dosyadaki tablolarda (yine ASP komutlar ile talep edeceiniz) gncelletirmeleri yapacaktr. Sra Web Programnda Kuracamz sitenin ileyi tarzn veya stratejisini bir kere daha belirtelim: Sitemize ev sahiplii yapan Web Serverda bir veritaban dosyamz var ve elimizdeki i durumuna gre randevu verebileceimiz, serbest olduumuz gnleri bu veritabanndaki Randevu tablosuna iliyoruz. Ziyaretilerimiz, ana sayfadan getikten sonra, bir Web sitesi yaptrmek iin bizimle grmek istiyorlarsa, baz bilgiler veriyorlar ve bu bilgilere gre, Web programmz, mteriye tanmlad siteyi kaa yapacamz bildiriyor ve bo olduumuz zamanlarn bir listesini sunuyor. Mteri aday, bu listeden kendisi iin elverili zaman seiyor. Web programmz mterinin verdii bilgileri veritabanna iliyor; ve mterinin setii zaman randevu tablosunda kapal hale getiriyor, ki ayn zaman aral baka bir mteriye daha nerilmesin! (Aada, sayfalarmz adm-adm olutururken, oluturdumuz baz deikenlerin ne ie yarayaca o anda belli olmayabilir. Bunlar anlamadan gememek iin nerim, bu kitapn kodlarn edindiyseniz, veritabann sisteminize tantarak, ilgili ASP programn index.htmden balayarak bir ka kere altrmanzdr.) nce index.htm sayfamz yapalm. Bu basit bir Hogeldiniz! sayfas olacak. aadaki kodu index.htm adyla kaydedin:
<HTML> <HEAD> <TITLE>Web Sitesi Yaplr</TITLE> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254">
ACTIVE SERVER PAGES 96

</HEAD> <BODY bgcolor=DarkOrange text="white"> <br><br><br><br><br> <center> <table width="250"> <tr><td><font face="arial" size="6">Web Sitenize Sahip Olmak stiyorsunuz? <br></font> <p><p><p><font face="arial" size="3">Ama nasl? HTML, ASP, ADO, ODBC ve daha bir ok alfabe orbas renmek zorundasnz <p>Ama bunlar renmeye zamannz yok. Aslnda renirsiniz renmeye, fakat zaman meselesi. <p>Biz ook siteler yaptk, ve size de yardma hazrz. Bizim iimiz Web sitesi yapmak! <p>Sizin de sitenizi yapalm. <p><p><center><a href="sayfa1.asp">Size de yardmc olalm</a></center></font> </td></tr></table></center> </BODY></HTML>

<veriuyg0001.tif> Bu sayfamzda verdiimiz mesaj beenen mstakbel mterilerimiz, sayfadaki kpry tklayarak, nereye gidecekler? u aadaki kodun yer ald sayfaya. Bunu da sayfa1.asp adyla kaydedin:
<% @Language = VBscript %> <HTML> <HEAD> <TITLE>Web Sitesi Yapilir</TITLE> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254"> </HEAD> <BODY bgcolor=darkorange text="white" language=Turkish> <br><br><br><br><br><center><table width="250"><tr><td> <font face="arial" size="6">Arzu ettiiniz siteyi sr'atle oluturabiliriz.<p>nce nasl bir site istediinizi ve grafik malzemenin durumunu belirtin?</font> </P> </td></tr></table> <p><p><table width="500"> <form action="sayfa2.asp" method="get"> <TBODY><tr><td width="500" align="middle"> <p><!--#include file="siteler.inc"-->
ACTIVE SERVER PAGES 97

Kullanlacak grafik malzemenin durumu: <!--#include file="grafikler.inc"--><br> <br><br><br><p><input type="submit" value="Gnder" align="left"></p> </td></tr></form></TBODY></table></center> </BODY> </HTML>

Bu sayfada ASP teknii kullanmay gerektiren hemen hemen hi bir ge yok! diyebilirsiniz; ama demeyin. ki haric dosyay #include yoluyla sayfaya eklediimizi gruyor musunuz? Bu sayfann btn ilevi ite bu iki dosyada gizli! siteler.inc ve grafikler.inc, veritabanndan veri eken ve bunu getirip yukardaki yerlere yazmakla grevli olacaklar. nce siteler.inci yapalm:
<% 'Siteler tablosundan siteAdi stunundaki bilgileri al. SQLSITE = "SELECT siteAdi, siteNO FROM Siteler" set connsite = server.createobject("ADODB.Connection") connsite.open "web" set siteler=connsite.execute(SQLSITE) %> <select name="siteNO"> <% 'Listedeki her kayit iin su isi yap. %> <% Do while Not siteler.eof %> <Option value = "<%= siteler(1) %>"><%= siteler(0) %></Option> <%siteler.MoveNext Loop%> </select> <% siteler.close %>

Hatrlarsanz, #include yoluyla sayfaya eklenen dosyann ierii ne ise aynen bu komutun olduu yere yazlm gibi olur, demitik. sayfa1.aspye bakn; ve yukardaki kodu tam siteler.incin olduu yerde dnn. imdi siteler.inc, tek bir i yapyor: web isimli DSNin verdii bilgiler arasndan Siteler tablosundan siteAdi ve siteNo stunlarndaki btn bilgileri ekiyor ve bunu HTMLin SELECT etiketinin iini doldurmakta kullanyor. OPTIONn nasl yazldn hatrlyorsunuz deil mi? imdi siteler.incin iine bakabiliriz. nce SELECT siteAdi, siteNO FROM Siteler ifadesini ele alalm. Bu, yukarda szn ettiimiz SQL dili ile, Windowsun ODBC arayzne vereceimiz VBScript komutudur. Peki, bu edindiimiz veriler nerede duruyor? ASPnin alt Web Servern bulunduu iletim sisteminin RAMinde (veya sanal belleinde) oluturulan geici bir tabloda duruyor. Veritabanndaki Siteler tablosunda birinci stunda siteNo, ikinci stunda ise siteAdi alanlar var. Burada nce siteAdini okutuyoruz; yani dizi deikenin siteler(0) adl birinci gesi site tr adn, siteler(1) adl ikinci gesi ise bu trn numarasn tutuyor. Nitekim, bir Do dngs ile bu deerleri SELECTin geleri olarak
ACTIVE SERVER PAGES 98

kullandmzda nce OPTIONn VALUE zelliini siteNo, metnini ise siteAdi ile dolduruyoruz. Ve tabi atmz veri balantsn kapatyoruz: siteler.close. imdi sayfa1.aspnin ikinci haric dosyas olan grafikler.inci yazalm:
<% 'Grafik durumuyla ilgili bilgileri Grafik tablosundan al. SQLGRAF = "SELECT grafNO, grafDurum FROM Grafik" Set conngraf = server.createobject("ADODB.Connection") conngraf.open "web" Set graf=conngraf.execute(SQLGRAF) %> <SELECT name="grafNO"> <% Do while Not graf.eof %> <% 'Bu bilgilerle seenek kutusu yap. %> <Option value = "<%= graf(0) %>"><%= graf(1) %></Option> <%graf.movenext loop%> <% graf.close %> </select>

Bu dosya zerinde uzun uzadya durmaya gerek yok; yine ayn DSNden, fakat bu kez veritabann Grafik tablosundan iki alandaki verileri ekiyoruz; Do dngs ile yeni bir SELECTin iini dolduruyoruz. include dosyalar ile birlikte bu sayfa u grnty veriyor: sayfa1.aspdeki formun Gnder dmesi tklandnda bu bilgilerin GET metoduyla sayfa2.aspye gnderileceini hatrlayacaksnz. O halde, bu HTML kodunu, sayfa2.htm adyla kaydedin:
<%@ Language = VBscript %> <% Dim siteNO Dim grafNO Dim SQLSITEADI Dim connsiteadi Dim siteadi siteNO=Request.Querystring("siteNO") grafNO=Request.Querystring("grafNO") SQLSITEADI="SELECT siteAdi FROM Siteler " SQLSITEADI=SQLSITEADI & "WHERE siteNO= " & siteNO set connsiteadi = server.createobject("ADODB.Connection")
ACTIVE SERVER PAGES 99

connsiteadi.open "web" set siteadi=connsiteadi.execute(SQLSITEADI) %> <HTML> <HEAD> <TITLE>Web Sitesi retim Merkezi</TITLE> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254"> </HEAD> <BODY bgcolor=DarkOrange text="white"><br><br><br><br><br><center> <table width="250"><tr><td> <font face="arial" size="6">Arzu ettiiniz <%= siteadi(0) %> sitesini tasarlamaya hazrz. <p>Bu sitenin kullanm amac hakknda bilgi verir misiniz?</font> <form action="icra.asp" method="get"> <input type="Hidden" name="siteNO" value="<%= siteNO %>"> <input type="Hidden" name="grafNO" value="<%= grafNO %>"> <% 'Bu bilgilerle Tr tablosundan bilgi se. %> <!--#include file="turler.inc"--> &nbsp; <input type="Submit" value="Gnder" align="LEFT"> </form></td></tr></table></center> </BODY> </HTML>

sayfa1.asp, ziyaretimizin Formda yapt iki seimin deerini sayfa2.aspye gnderdiinde, sayfa2.asp bunlar otomatik olarak kullanamaz; bilgiler GET yoluyla geldii iin QueryString deikeninin iine yazlacak bu bilgileri bizim kullanlr hale getirmemiz gerekir. Yukardaki kodun u satrlar bu ii yapyor:
siteNO=Request.Querystring("siteNO") grafNO=Request.Querystring("grafNO")

sayfa1.aspnin gnderdii siteNo ve grafNo deikenlerinin deerleri (bu kez bu sayfann ayn isimdeki) deikenlerine deer olarak atanyor. sayfa2.aspde yapacamz veri ilemlerinde bu deerleri lt olarak kullanacaz:
SQLSITEADI="SELECT siteAdi FROM Siteler " SQLSITEADI=SQLSITEADI & "WHERE siteNO= " & siteNO

Burada aslnda tek sorgu deyimi oluturduumuz halde, derdimizi neden iki ayr satrda anlatyoruz? Daha nce yazdmz sorgu deyimlerine bakn? Tm ift trnak iinde deil mi? Peki, burada siteNo deikenini trnak iine alrsak ne olur? Deiken, deiken olmaktan
ACTIVE SERVER PAGES 100

kar; metin olur; oysa biz burada siteNo deikeninin verecei deeri kullanmak istiyoruz. Bu yolla veritabanndan ekeceimiz deeri hemen aada metnin iinde kullanacaz:
Arzu ettiiniz <%= siteadi(0) %> sitesini tasarlamaya hazrz.

Sadece bir deer istediimiz ve bu deiri ihtiyacmza uygun setiimiz iin veri okutma iini dngyle yapmyoruz bu kez; okunan ilk deeri Response.Write metodunun ksaltmasyla, sayfaya gnderiyoruz. Bu arada ziyaretimizden ek bilgi almaya devam ediyoruz; yeni bir haric dosya ile bu kez size tasarlatmak istedikleri sitenin trn soruyoruz; bu bilgileri ise turler.inc salyor:
<% SQLTUR="SELECT turNO, turAdi FROM Tur" set conntur = server.createobject("ADODB.Connection") conntur.open "web" set tur=conntur.execute(SQLTUR) %> <SELECT NAME="turNO"> <% Do While not tur.eof %> <Option value = "<%= tur(0) %>"><%= tur(1) %></Option> <%tur.movenext Loop%> <% tur.close %> </select>

Bu kodun irdelenmesine gerek yok; Tur tablosundan turNo ve turAdi alanlarndaki deerleri alyoruz ve OPTION etiketinin iini dolduruyoruz. Devam etmeden nce sayfa2.aspde dikkatinizi ekmi olmas gereken u iki satra dnelim:
<input type="Hidden" name="siteNO" value="<%= siteNO %>"> <input type="Hidden" name="grafNO" value="<%= grafNO %>">

HTMLden hatrlayacaksnz, Formun iinde Servera gizli (HIDDEN) tr deiken ve deer gnderebiliriz. Buradaki gizli kelimesi sizi aldatmasn; Form bir HTML gesidir ve ziyareti Browsernn kayna grntleme arac vastasyla gizli-ak hereyi grebilir. Buradaki gizlilik sadece bu deikenlerin sayfada grntlenmemesinden ibarettir. Bu iki szm-ona gizli deikene, taa kodumuzun banda elde ettiimiz siteNo deikeni ile biraz nce veritabanndan ektiimiz grafNo deikenlerini atyoruz. (Merak etmeyin! Hepsini daha sonra kullanacaz.) <veriuyg0003.tif> Ve bu kullanm, Formumumuzun ACTION zelliinde ad yazl olan icra.asp yapacak. u uzunca kodu bu isimle kaydedin:
<%@ Language = VBscript %> <%
ACTIVE SERVER PAGES 101

Dim siteNO, grafNO, turNO, randNO Dim SQLSITETUTAR, SQLGRAFTUTAR, SQLTURTUTAR Dim bedel, turkatsayi, grafkatsayi, sitekatsayi siteNO=Request.Querystring("siteNO") grafNO=Request.Querystring("grafNO") turNO=Request.Querystring("turNO") randNO=Request.Querystring("randNO") SQLSITETUTAR="SELECT siteAdi, olcRayic FROM Siteler, Olcu " SQLSITETUTAR=SQLSITETUTAR & "WHERE Siteler.olcNO = Olcu.olcNO and siteNO=" & siteNO Set conn = server.createobject("ADODB.Connection") conn.open "web" Set sitetutar=conn.execute(SQLSITETUTAR) siteadi=sitetutar(0) sitekatsayi=sitetutar(1) SQLGRAFTUTAR="SELECT grafRayic, grafDurum FROM Grafik " SQLGRAFTUTAR=SQLGRAFTUTAR & "WHERE grafNO=" & grafNO Set graftutar=conn.execute(SQLGRAFTUTAR) grafkatsayi=graftutar(0) grafdurum=graftutar(1) SQLTURTUTAR="SELECT turRayic, turAdi FROM Tur " SQLTURTUTAR=SQLTURTUTAR & "WHERE turNO=" & turNO set turtutar=conn.execute(SQLTURTUTAR) turkatsayi=turtutar(0) turadi=turtutar(1) conn.close SET conn = Nothing bedel = 100 * turkatsayi * grafkatsayi * sitekatsayi %>

ACTIVE SERVER PAGES

102

<HTML> <HEAD> <TITLE>Web Tasarim Merkezi</TITLE> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254"> </HEAD> <BODY bgcolor=DarkOrange text="white"><br><br><br><br><br><center> <table width="250"><tr><td> <font face="arial" size="6">ok gzel!<p>Grafik malzemesi <%= grafdurum %> olan < %= siteadi %> ve <%= turadi %> amal bir Web sitesi, iin cret US$<%= bedel %> olacaktr.</font></td></tr></table><br><br><br><br> <table width="500"><tr><td width="150" valign="top"><font face="arial" size="5">lk grme iin iki saatlik randevu almanz gerekir.</font> <p><font face="arial" size="3">(Ak olan randevu tarihi ve saatinden beendiinizi tklaynz)</font></td> <td width="50"></td> <td width="300" valign="top"><!--#include file="rand.inc"--></td></tr></table> </center> </BODY> </HTML>

Ad icra.asp olduuna gre, bu sayfa ok i icra ediyor olsa gerek! Gerekten de bu sayfa, daha nceki sayfalarda elde ettiimiz btn bilgileri kullanarak ziyareti sitesini ka paraya yapacamz hesap edecektir. icra.asp, nce Querystringden alaca bilgileri, kendi iine yarayacak deikenlere yerletirecek ve bunlarla katsay hesaplayacak ve bu katsaylar kullanarak mterinin sitesi iin bir bedel kartacak (bedel = 100 * turkatsayi * grafkatsayi * sitekatsayi). Sonra bedel deikeninin iindeki deeri mteriye Dolar olarak bildirecek (Bedel formlnde 100 yerine mesela 600000 rakamn, veya bu ii yaptnz andaki Dolarn TL cinsinden kurunu gsteren rakam, kullanarak, fiyat Dolar yerine TL olarak da bildirebilirsiniz). icra.asp daha sonra rand.incin yardmyla veritabanndan bo saatlerimizi seerek mteriye randevu almas iin sunacaktr. rand.inc, veritabanmzn Randevu tablosundan serbest zaman dilimlerini okumak ve elde edecei sonucu icra.asp programna vermektedir. u kodu rand.inc adyla kaydedelim:
<% SQLRAND="SELECT randNO, randZaman FROM Randevu WHERE randDurum = 'SERBEST' ORDER BY randZaman" Set connrand = server.createobject("ADODB.Connection") connrand.open "web" Set rand=connrand.execute(SQLRAND) %>
ACTIVE SERVER PAGES 103

<font face="arial" size="5"> <% do while not rand.eof %> <a href="rezerv.asp?siteNO=<%= siteNO %>&grafNO=<%= grafNO %>&turNO=<%= turNO %>&randNO=<%= rand(0) %>&randRayic=<%= bedel %>"><%= rand(1) %></a><br> <%rand.movenext loop%> </font> <% connrand.close SET connrand = Nothing %>

Bu haric dosyamz, ncekilerden farkl: bir OPTION etiketini deil; fakat bir Anchor etiketinin iini dolduruyor. Bu etikete dikkat edersek, HREF zelliinin deeri olan rezerv.aspye aslnda bir ok bilginin gnderilmesine de yaradmc oluyor, Herhangi bir ziyaretinin seimleri sonucu oluacak bir rnek u olabilirdi:
<a href="rezerv.asp?siteNO=1&grafNO=1&turNO=1&randNO=10&randRayic=500"> 05.05.2000 14:00:00</a><br>

<veriuyg0004.tif> Bu, rezervasyon yaptracak olan sayfaya, siteNo, grafNo, randNo ve biraz nce hesapladmz randRayic deikenlerini gnderiyor. Bu sayfa ise, aadaki kodlarla kaydedeceimiz rezerv.asp:
<%@ Language = VBscript %> <% Dim siteNO, grafNO, turNO, randNO, randRayic Dim SQLZAMAN, connzaman, zaman, randzaman siteNO=Request.Querystring("siteNO") grafNO=Request.Querystring("grafNO") turNO=Request.Querystring("turNO") randNO=Request.Querystring("randNO") randRayic=Request.Querystring("randRayic") SQLZAMAN="SELECT randZaman FROM randevu " SQLZAMAN=SQLZAMAN & "WHERE randNO=" & randNO Set connzaman = server.createobject("ADODB.Connection") connzaman.open "Web" Set zaman=connzaman.execute(SQLZAMAN)
ACTIVE SERVER PAGES 104

randzaman=zaman(0) connzaman.close %> <HTML> <HEAD> <TITLE>Randevu Defteri</TITLE> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254"> </HEAD> <BODY bgcolor=DarkOrange text="white"><br><br><br><br><br><center> <table width="250"><tr><td> <font face="arial" size="6">Ltfen elverili randevu zaman olan<font color="blue"><%= randzaman %></font> iin rezervasyon yapmak zere gerekli bilgileri giriniz.</font> <p><font face="arial" size="4"> <form action="guncelle.asp" method="get"> <input type="Hidden" name="siteNO" value="<%= siteNO %>"> <input type="Hidden" name="grafNO" value="<%= grafNO %>"> <input type="Hidden" name="turNO" value="<%= turNO %>"> <input type="Hidden" name="randNO" value="<%= randNO %>"> <input type="Hidden" name="randRayic" value="<%= randRayic %>"> <input type="Text" name="adi" size="20"><i>Adnz</i> <p><input type="Text" name="soyadi" size="20"><i>Soyadnz </i> <p><input type="Text" name="email" size="20"> <i>e-adresiniz</i> <p><input type="Submit" value="Gnder"> </form> </td></tr></table> <p><p></center> </BODY> </HTML>

Geri bu sayfann sadece ziyaretiye setii randevu tarih ve saatini bildirdiini ve ziyaretiden bize adn, soyadn ve elektronik mektup adresini vermesi istediini greceksiniz, ama gerekte bu sayfa u ana kadar oluturduumuz veri kmesini veritabanna yazmak zere hazrlk yapmaktadr. Gizlenmi (HIDDEN) deikenlerin grevi bu. <veriuyg0005.tif>

ACTIVE SERVER PAGES

105

Derlenen bu deikenlerin tm, ziyaretinin girecei bilgiler dahil, guncelle.aspye gnderilecek. O halde o kodu yazalm:
<%@ Language = VBscript %> <% Dim siteNO, grafNO, TurNO, randNO, randRayic, adi, soyadi, email Dim SQLINSERT, connupdate, SQLUPDATE, URL, simdi siteNO=Request.Querystring("siteNO") grafNO=Request.Querystring("grafNO") turNO=Request.Querystring("turNO") randNO=Request.Querystring("randNO") randRayic=Request.Querystring("randRayic") adi=Request.Querystring("adi") soyadi=Request.Querystring("soyadi") email=Request.Querystring("email") SQLINSERT="INSERT INTO Musteriler (adi, soyadi, email, siteNO, grafNO, turNO) " SQLINSERT=SQLINSERT & "VALUES (" SQLINSERT=SQLINSERT & "'" & adi & "', " SQLINSERT=SQLINSERT & "'" & soyadi & "', " SQLINSERT=SQLINSERT & "'" & email & "', " SQLINSERT=SQLINSERT & siteNO & ", " SQLINSERT=SQLINSERT & grafNO & ", " SQLINSERT=SQLINSERT & turNO & ") " set connupdate = server.createobject("ADODB.Connection") connupdate.open "web" connupdate.execute(SQLINSERT) simdi = FormatDateTime(now,vbLongDateTime) SQLUPDATE="UPDATE Randevu SET " SQLUPDATE=SQLUPDATE & "email = '" & email & "', " SQLUPDATE=SQLUPDATE & "randNezaman = '" & simdi & "', " SQLUPDATE=SQLUPDATE & "randDurum = 'DOLU', " SQLUPDATE=SQLUPDATE & "randRayic = " & randRayic SQLUPDATE=SQLUPDATE & " WHERE randNO =" & randNO
ACTIVE SERVER PAGES 106

connupdate.execute(SQLUPDATE) connupdate.close SET connupdate = Nothing URL="son.asp?adi=" & adi Response.Redirect (URL) %>

Program altrdysanz, guncelle.aspnin Browsern yzn bile grmediini farketmi olmalsnz; Yukardaki kodun, ziyaretiye kendi yerine baka bir sayfay gnderdiini nereden anlyoruz? En sondaki Response.Redirect komutundan. Bu komut ziyaretiye, son.asp sayfasn yolluyor. Fakat bu sayfaya gemeden nce yaptmz gncelleme ileminin zerinde duralm. Bu programda uzunca bir SQL INSERT deyimi hazrlyoruz:
INSERT INTO Musteriler (adi, soyadi, email, siteNO, grafNO, turNO) VALUES (adi, soyadi, email, siteNO, grafNO, turNO)

Daha nce SQL dilinin SELECT deyimini renmitik. INSERT de bir veritabanna veri ekleme iini yapan SQL deyimidir. Deyimin INTO blmne tablonun adn ve hangi alanlarn bulunduunu; VALUES blmne ise bu alanlara atayacamz deerleri yazarz. Bizim programmzda deerler, deikenlerden alnaca iin dikkatli bir yazma ilemi gerekiyor. Bu yzden deiken adlar ile & (ve) iareti ve virgl birbirinden kolayca ayrt etmek iin uzunda bir yazma yntemi kullanyoruz. Hazrladmz bu deyimle yeni mteriyi mteriler tablosuna ekliyoruz. Programmzda bir de SQL UPDATE deyimi var. Bu deyimle, mevcut Randevu tablomuzda mterinin setii zaman aralna ait girdiyi, SERBESTten DOLUya eviriyoruz ve bu zaman kime ayrdmz, bu grmenin saat creti olan rayici tabloya iliyoruz. Bu amala oluturduumuz SQL UPDATE deyimi yle gsterilebilir:
UPDATE Randevu SET email = "email", randNezaman = "simdi", randDurum = "DOLU", randRayic = "randRayic" WHERE randNO = "randNO"

SQLin UPDATE deyiminin de blmleri vardr. SET blmnde hangi alana ne deeri gireceimizi belirtiriz. Normal bir SQL deyiminde alan adnn kansna bu alana yazlacak deer girerken, burada olduu gibi deerleri deikenlerden de alabiliriz. Burada gsterilen kelimeler deiken ad ise trnak dnda yazlmaldr. Bunu salamak ve aralarna gereken virglleri koyabilmek iin, yine uzunca bir deyim yazyoruz. imdi, aadaki kodu son.asp adyla kaydedelim:
<%@ Language = VBscript %> <% adi=Request.Querystring("adi") %> <html> <head> <title>Randevunuz Kesinlesti</title>
ACTIVE SERVER PAGES 107

<META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254"> </head> <BODY bgcolor=DarkOrange text="white"> <br><br><br><br><br><center> <table width="250"> <tr><td><font face="arial" size="6"><%= adi %>, sizinle verimli bir ibirlii yapacamzdan eminiz. ok teekkrler. Grmek zere.</font></td></tr> </table> </BODY> </html>

Bu sayfa, ziyaretimize bir nceki sayfada kaydettiimiz adi deikenin deeri alarak, yani mteriye adyla hitabediyor ve randevusunun kesinletiini bildiriyor; ve veri-ynlendirmeli Web uygulamamzn da sonu oluyor. te hepsi bu. Ziyaretimizden veri aldk; veritabanndan veri ektik; bunlar sayfalarmzda kullandk ve veritabanna iledik. Fakat bu ASP programlarnda, veritabanyla ilgili unsurlarn dikkatten kamamas iin, gvenlikle ilgili nlemler alnmadna, ziyaretinin girdii deerlerin denetlenmediine dikkat etmi olmalsnz. Normal olarak Internete koyacamz ASP programlarmzda gvenlikle ilgili blmler olmas gerekir. Bu ve dier program-konulu unsurlar son blmde ele alacaz.

ACTIVE SERVER PAGES

108

ASPde Gvenlik
Internette iyiniyetli olunmaz. Ac, ama gerek. Internete iine zararl kod yerletirilebilecek bir Form koyarsanz, emin olmalsnz ki, birisi bu zararl kodu koyacaktr. Sadece ktniyetli kiilerin size sz gelimi elektronik posta adresi veya mesaj grnmnde zararl kod gndermesini nlemek iin deil, fakat normal kullanclarn yapabilecekleri sradan hatalar yakalamak ve dzeltmek iin de nlem almanz gerekir. Server gvenlii son derece nemli bir konu olmakla birlikte, bunu salamak genellikle tasarmcnn sorumluluunda deildir. Bununla birlikte sayfalarmzn ve veritabanmzn gvenlii ve Web uygulamalarmzn doru ilemesi bizden sorulur. Bir form ile sizin sayfalarnza veya veritabannza ne gibi zararlar verilebilir? Bu zararlarn banda, en hafifinden sizin sayfanz baka yere ynlendirmek gelebilir. Ktniyetin ls arttka bu, Server programnn aklarndan yararlanarak, Serverdaki dosyalar deitirmeye veya tahrip etmeye kadar gidebilir. Normal ziyareti hatalar arasnda ise szgelimi elektronik posta adresini iki @ iaretiyle yazmaktan tutun, bu iareti koymamaya, metktubun gidecei bilgisayarn adresini eksik yazmaya kadar uzanan bir dizi yanllk bulunabilir. Ziyaretiler formu eksik doldurabilirler. Bu gibi eksiklikler ve yanllklar daha sonra dzeltmek zaman kaybna yol aar. Kimi zaman eksik doldurulmu bir Form, bu bilgilerin ulatrlaca ASP programnda hataya yol aabilir. Bu sebeple, zellikle Form yoluyla alnan bilgilerin denetimi ve dorulatlmas arttr. Bir Formun ierdii bilgilerin denetimi ve dorulanmas iki yerde yaplabilir: istemcitarafnda, sunucu-tarafnda. stemci tarafnda, yani ziyaretiye gndereceimiz HTML sayfasnn iinde yer alan kodlarla yapacamz denetim-dorulama, hzl alr; ve ziyareti ile sunucu arasnda iletiim kurulmadan nce yaplr; bylece ziyaretinin szgelimi gnder dmesini tkladktan sonra ok beklemesi gerekmez. Ne var ki bu yntemde denetimdorulama kodu ziyaretiye gnderilmitir; kt niyetli kii neyi denetlediinizi grecek ve isterse bu denetimi kaldracak size zararl kod paracklar gnderebilecektir. Denetimin sunucu tarafnda yaplmas, belki biraz daha fazla zaman harcamay gerektirir, fakat gvenlik asndan daha etkili olabilir. Bu blmde ASP programlarnzn gvenlii ve etkinlii asndan almanz gereken bir ok nlemden ikisini, elektronik posta adresi dorulama ile mesajlarn iinden zararl kodlar ayklama yntemlerini grelim.

Elektronik Adres Dorulama


Ziyaretimizin doru adres verdiini, bu adresin geerli bir elektronik posta alcsna ait olduunu dorulamamz mmkn deil, ama en azndan adresin doru yazlp yazlmadn denetleyebiliriz. Bunu yapmann bir yolu elektronik adresin iinde @ karakteri ile en az bir adet nokta bulunduunu garantilemek olabilir. Bunu denetleyecek kodu ieren aadaki rnek kodu email.asp adyla kaydedin:
<% @Language = VBscript %> <HTML>
ACTIVE SERVER PAGES 109

<HEAD> <TITLE>E-Mail Formu</TITLE> <META http-equiv="content-type" content="text/html; charset=ISO-8859-9"> <META http-equiv="Content-Type" content="text/html; charset=windows-1254"><% If Not IsEmpty(Request.Form("Email")) Then strEmail = Request.Form("Email") If dogruMu(strEmail) Then Response.Write strEmail & " adresini aldk; teekkr ederiz.<BR>" ' Else Response.Write strEmail & " adresi doru grnmyor.<BR>" End If End If %> <FORM "Name="Email" Action="email.asp" Method="post"> Enter an email address: <INPUT Name="Email" Type=Text> <BR> <!- - Buraya formun dier unsurlar girecek - - > <INPUT Type=Submit Value="Gnder"> </FORM> <SCRIPT RUNAT=SERVER LANGUAGE=VBScript> Function dogruMu (byval adres) AtIsareti=0 Nokta=0 dogruMu=false KacKarakter=len(adres) For i=1 to KacKarakter karakter=mid(adres, i, 1) if karakter="@" then AtIsareti=AtIsareti + 1 End If if karakter="." Then Nokta=Nokta + 1 End if Next
ACTIVE SERVER PAGES

.....[BURAYA DIER KODLAR GRECEK]........................

'saya olarak kullanacamz 'deikenleri sfrlayalm 'Fonksiyonun deerini yanl olarak belirleyelim 'adresin boyutunu bir deikene atayalm 'dngy balatalm 'sayacn gsterdii karakteri alalm '@ iareti olup olmadna bakalm '@ iareti ise sayac bir arttralm 'nokta iaretini arayalm 'nokta ise nokta sayasn bir arttralm 'bir sonraki karaktere geelim
110

If AtIsareti=1 and Nokta >0 Then dogruMu=true End If End Function </SCRIPT> </HTML>

'Bir @ ve en az bir nokta olduysa

'Fonksiyonun deerini doru yapalm

Bu program, bu ekliyle snama amacyla altrabilirsiniz. Fakat daha sonra programlarnzda kullanmanz gerekirse, baz deiiklikler yapmanz gerekir. Bu deiiklikleri kodu inceledikten sonra ele alalm. Sayfamzda tek elemanl bir Form var ve snama amacyla buraya elektronik posta adresimizi yazabiliriz. Sayfa aldnda alan VBScriptin kendi-iinde varolan isEmpty fonksiyonunu bir If dngs iinde ararak, kendi iindeki formdan kendisine bir deer gelip gelmediine bakacak; deer olmadn grnce formu sunacaktr. Forma herhangi bir ey yazp, Gnder dmesini tkladmz zaman ASP kodumuz, bu kez dogruMu adl fonksiyona formdan gelen Email deikeninin deerini vererek sonucu bekleyecektir. <aspguv0001.tif> dogruMu fonksiyonu gvenlik kaygsyla Serverda alan sunucu-taraf Scripttir; metni ve sonular kesinlikle kullancya gnderilmeyecektir. Bu fonksiyon, kendisine aktarlan deiken deerinde, iie iki If dngs ile @ ve nokta iaretlerini arayarak sayacaktr. Bu saymn sonucu iki deikenin deerleri arzu ettiimiz sayda (AtIsareti bire eit ve Nokta sfrdan byk) ise kendisini aran satra True (doru), deilse False (yanl) deerini gnderecektir. Biliyoruz ki, bir fonksiyon doru sonu verirse, If dngs birinci komuttan, yanl sonu verirse Else blmnden yoluna devam eder. Bu rnekte, dogruMu fonksiyonu doru sonu verirse Response.Write metoduyla Browser penceresine elektronik posta adresinin alndna ilikin teekkr mesaj yazdrlacak; yanl sonu verirse, adresin yanl olduu bildirilecektir. Gerek Internet uygulamasnda bu tr bir snama yapacanz zaman, yukardaki programn fonksiyonu ieren SERVER SCRIPT (<SCRIPT RUNAT=SERVER....> diye balayan ve </SCRIPT> diye biten) blmn aynen sayfanzn herhangi bir yerine koyabilirsiniz. Daha sonra ziyaretiden gelecek elektronik posta adresine gndermede bulunduunuz ilk yerde ve bu adresi tutan deiken ile herhangi bir ilem yapmadan, rnein veri tabanna yazmadan veya programn iinde bir baka ekilde kullanmadan nce, sadece una benzer bir kod blm yazmanz yeter:
strEmail = Request.Form("Email") If dogruMu(strEmail) Then .....[BURAYA KODLAR GRECEK]........................ Else Response.Write strEmail & " adresi doru grnmyor.<BR>" End If

Programnzn gerei olarak dngnn ELSE blmn deitirebilirsiniz.

ACTIVE SERVER PAGES

111

Zararl Kod Temizleme


ASP-uyumlu Server dendii zaman akla ilk gelen Microsoft Internet Information Server, site gvenlii asndan srekli snanan ve a bulunduu taktirde MSun yama programlar ile bu a giderilen bir sunucu program olarak bilinir. Bu, IISin ve dier MS rn Web sunucu programlarnn (MS Site Server ve MS Transaction Server rnlerinin) kurun geirmez olduu anlamna gelmez. Fakat sunucu program reticisi ne kadar nlem alrsa alsn, sizin sitenize, kulllanclarn yollayaca zararl kodlar nlemeye almayacaktr. Bu bir zorunluktur. Sizin iin zararl kod saylan metin, bir baka Internet sitesi iin normal kullanc girdisi olabilir. Server programn gelitirenler sizin ne tr girdiyi zararl sayacan bilemezler. Bunu siz bilmek zorundasnz. Son yllarn deneyimleri gsteriyor ki, baka yollarla Internet sitenizin kk dizinine ulamaya alan Hacker tiplerin dnda kalan zararl kullanclar (Hacker zentisi kiiler!), genellikle bir veritabanna gittiini anladklar Form bilgilerinin iine Server Side Include (sunucu tarafnda alacak haric dosya) ierii grevini yapacak kod paracklar katabilirler. Bu amala kullanlabilecek zararl bir kod yle olabilir:
<script language="JavaScript"><!-function reload() { self.focus(); document.location.href = "http://www.geocities.com/rasimy"; } setTimeout("reload();", 5000); // --></script>

Bu kodun btn zarar, ierdii veritabann ASP sayfasnn herhangi bir etiketi iinde kullanld taktirde ziyaretiyi burada yazl URLe gtrmesi ve buradaki sayfay Browsernzda grntlemek olacaktr. Acemi Hackern ziyaretinizi zorla gtrd yeni Internet sitesi, sadece ierik bakmndan sakncal olmayabilir; ziyaretiniz asndan gerekten tehlikeli bir alan olabilir; gnderecei erezlerle (cookie) ziyaretinin bilgisayarnda zararl iler yapabilir. Ziyareti bu tuzaa sizin sitenizde bulunduu srada dt iin, sorumluluk, en azndan manevi olarak, size ait demektir. Zararl kodlar genellikle bu rnekte olduu gibi byktr-kktr iaretleri, dz ve ters bl ile kesme iareti ierir. rnein bir konuk defterinde ziyaretimizden ne gibi bilgi istersek isteyelim, yazaca metinde < ve > iaretlerinin bulunmamas gerekir. Normal bir mesajda, ancak kod yazarken kullanlan bu iaretlerin yeri olamaz. Hatta daha hassas bir dnceyle, normal ve ksa bir konuk defteri mesajnda tek ve ift trnak, noktal virgl satr ba (CR) ve yeni satr (LF) iaretleri de bulunmamaldr. Eer normal bir ziyareti bu gibi iaretlerle dolu bir mesaj yazmsa, kt niyetli kiilere kar alacamz nlemlerle bu iyiniyetli mesaj da yazarnn verdii biimi kaybedecektir. Bir ka ziyaretimizin konuk defterine fiyakal yazlar yazmasn salamak iin, gvenlikten vaz gememek gerektiine gre, Kurunun yan sra ya da yanar! demekten baka bir are dnmek kolay deil!) Daha nceki blmlerde yazdmz kodlar hatrlyorsanz (veya kimse bakmazken o sayfalar evirir bakarsanz!), ziyaretilerimizin Form yoluyla gnderdikleri verileri iki yolla alr ve bir
ACTIVE SERVER PAGES 112

deikene yazarz: QueryString ve Request.Form. te size bir Internette gerekten kullanlan bir konuk defterinin konuk girdilerini veritabanna ileyen blm:
<% Ad = Request.Form("Isim") Mektup = Request.Form("MailAdr") Gorus = Request.Form("Mesaj") Defter = "INSERT INTO mesaj (Isim, Email, Mesaj) VALUES ( "&" '" & Ad &"' , "&" '" & Mektup &"' , "&" '" & Gorus &"')" Set Veriyolu = Server.CreateObject("ADODB.Connection") Veriyolu.Open("DSN=misdefter;") Set RS = Veriyolu.Execute(Defter) %>

Tasarmc, Formdan gelen deikenin (Isim, MailAdr ve Mesaj) deerini, yeni deikene atamakta ve bunlar oluturduu SQL INSERT deyimi yoluyla misdefter adl veriye yazdrmaktadr. Tasarmcnn dnyay sadece iyi insanlardan oluan bir cennet sand, kendisini tanmasanz bile, bu koddan anlalyor. Dnyay cennet yapmak elimizde olmakla birlikte, henz btn insanlar bu konuda grbirlii iinde olmadna gre, ziyaretiden gelen Form deikenlerini atadmz yeni deikenlerin deerlerini elden geirmeli ve iindeki zararl kodlar ayklamalyz, ki sonra misafir defteriniz kevgire dnmesin! Bu ilemi, szgelimi yukardaki kodun sadece birinci deikeni (Ad) iin yapalm. Buradaki Ad = Request.Form("Isim") satrn atacaz ve yerine u 14 satr koyacaz:
Ad = Trim(Request.Form("Isim"))'nndeki sonundaki boluklari atalm If Len(ad) Then '**************** BURADA ISTENMEYEN KARAKTERLERI AYIKLIYORUZ ****************** Ad = Replace(Ad, Chr(10) , "") 'satr ba Ad = Replace(Ad, Chr(34) , "") 'ift tarnak Ad = Replace(Ad, "'" , "") Ad = Replace(Ad, "<" , " ") Ad = Replace(Ad, ">" , " ") Do While Instr(Ad, " ") Loop Ad = Trim(Ad) End If 'nndeki sonundaki boluklar da attk m tamam ad = Replace(Ad, " " , " ") 'tek trnak 'kktr 'byktr Ad = Replace(Ad, Chr(13) , " ") 'yeni satr

'iki aralk

Bu kod, Ad deikenini, VBScriptin kullanlmaya hazr Replace() fonksiyonundan geirerek, iindeki istenmeyen karakterleri ya yok edecek ya da aralkla deitirecektir. Bylece eer ktniyetli bir kii, Form bilgisi olarak bize kod olarak kullanlacak bir takm metinler
ACTIVE SERVER PAGES 113

yollamsa, kodun ana ierii yerinde kalmakla birlikte, kod olarak kullanlmasn salayacak iaretler yok olaca iin kod dz yazya dnm olacaktr.

ADO Gvenlii ve Hata Mesajlar


MS Internet Information Server (IIS) ve dier Web Server programlar, istemcinin siteye gnderebilecei talepleri hem kendi alarndan, hem de iletim sistemi asndan belirleme ve snrlama imkan salarlar. Windows NT iletim sistemi bakmndan Internet ziyaretisi herhangi bir a kullancsndan farkszdr ve ulaabilecei sayfalar (dosyalar) ve bu dosyalarla yapabilecei iler, Internet Kullanc Hesab denen kullancnn haklarna baldr. IISi kuran Web Yneticisi, bu hesaba istedii gibi haklar kazandrabilir veya snrlamalar getirebilir. Burada iki noktay birbirinden dikkatle ayrmak gerekir: Web ziyaretisinin bir Web Sitesinde kullanabilecei haklar HTTP kaynaklar ile snrldr. letim sistemi ile ilgili haklar bunun dndadr. Fakat ikisinin akt nokta, zellikle veritabanna dayanan Web sitelerinde, veritaban dosyasnn gncelletirilmesi srasnda ortaya kar. HTTPnin ziyaretiye salayabilecei btn okuma-yazma haklar tannsa bile, iletim sistemi bir veritaban dosyasnn yeniden yazlmasna izin vermeyebilir. Bunu, nceki blmlerde veritaban dosyasn gncelletirme rneklerini yeniden altrarak snayabilirsiniz. Kullandnz veri tabann szgelimi Windows Gezgininde bulun ve sa tklayarak Salt okunur hale getirin ve ilgili ASP programn altrn; ODBC hata mesaj verecektir. Bu noktada Web Tasarmcs olarak aklda tutacamz ilke udur: HTTP izinleri ne olursa olsun, eer iletim sisteminin izinleri daha kstlaycs ile, iletim sisteminin dedii olur. Tasarmc olarak bunun bize etkisi, genellikle Web sitemize evsahiplii yapan Server iletmecisinin veritaban dosyalarmza yazma-okuma izni vermesini salamaktr. Web sitesi evsahibi (Hosting) firmas, veritaban dosyasna DSN ayar yaparken bu izni verecektir. Ancak DSN kayd yaptrld halde veritabannz ziyaretilerinize ODBC hata mesaj veriyorsa evsahibi firmann ynetimine, veritaban dosyasnn haklarn yeniden belirlemesini hatrlatmanz gerekebilir. Veritaban ile ynlendirilmi Web sayfalarmzda en sk aldmz hata mesaj:
[Microsoft] [ODBC Driver Manager] Data source name not found

olsa gerek. Bu mesaj, veritabannn ODBCye tantlmas ile ilgili ilemde arza olduunu gsterir. Ya veritaban dosyasnn srm, ODBC srclerinin kapsam dndadr, ya da ODBC srcleri eksik kurulmutur. Bunu, Windowsun Denetim Masasnda ODBC Ynieticisini altrarak ve srcler sekmesini seerek denetleyebilirsiniz. Bir dier sk alnan hata tr ise 80004005dir. Bu hatann bir ka tr olabilir:
Microsoft OLE-DB Provider for ODBC Driver error 80004005 [Microsoft][ODBC Microsoft Access 97 Driver] The Microsoft Jet database engine cannot open the file (unknown)..

Bu hata mesajna bir ka farkl durum sebep olabilir: 1. Internet kullancsna veritabannn iletim sistemi dzeyinde yazma-okuma yetkisi verilmemi olabilir. 2. Veritabannn bulunduu dizinin iletim sistemi asndan dosya oluturma ve silme yetkileri yoktur.
ACTIVE SERVER PAGES 114

3. Veritabannn bulunduu dizin bir a sabit diskinde ise Internet kullancsnn bu diske eriim hakk yoktur. 4. DSN oluturulurken veritaban salt okunur veya Exclusive olarak iaretlenmi olabilir. 5. O anda dosyaya Server tarafnda InterDev gibi bir Web Tasarm Program eriiyor olabilir. 6. Szkonusu Access dosyas, bulunduu ada yerel kullanclarn hizmetine ak olabilir. Bu sorunlarn zm iin ODBC yaplandrma ileminin dikkatle yeniden tekrar ve zellikle sabit disk izinlerinin gzden geirilmesi gerekir. Bu hata mesajn evsahibi firmann bilgisayarndan alyorsanz; Web Server ynetimine yeniden bavurmanz arttr.
Microsoft OLE-DB Provider for ODBC Driver error 80004005 [Microsoft][ODBC Microsoft Access 97 Driver] Couldnt use the file (unknown); the file already in use

Bu hata mesajnn tek sebebi veritaban dosyasnn birden fazla kullanc tarafndan kullanlmasn nleyen kilit deyimlerinin kullanlm olmasdr. zm, dosya ile ilgili .Recordset deyiminin kilidi nleyecek ekilde yazlmasndan ibarettir.
Microsoft OLE-DB Provider for ODBC Driver error 80004005 [Microsoft][ODBC Microsoft Access 97 Driver] Data source name not found and no default driver specified

Veri taban ile veri-yolu balants kuracak Connection komutu, Global.asa dosyasndan alnmak isteniyorsa ve IIS Global.asa dosyasn altramyorsa bu hata mesajyla karlarsnz. Global.asa dosyasnda u kodun bulunup bulunmadn kontrol edin:
<%=auth_user ise & request.servervariables(auth_user)%> <p> <%=auth_type is & request.servervariables(auth_type)%> <p> <%=connection string is & session(baglanti_deyimi%> <p>

Burada baglanti_deyimi ifadesi yerinde sizin Connection deyiminiz yer almaldr. Global.asada bu ifadelerin bulunmasna ramen yine de almyorsa, Web Server programna, global.asann iinde bulunduu kk dizin iin altr (execute) izni verilmemi olabilir. Bu kiisel Web Serverda veya yerel IISte oluyorsa, btn yapacanz ey kk dizin olan klasr sa tklayarak izinlerini deitirmektir. Bu hata evsahibi firmann sitesinde oluyorsa, Web Sitesi ynetimi ile temasa gemeniz gerekir.
Microsoft OLE-DB Provider for ODBC Driver error 80004005 [Microsoft][ODBC Microsoft Access 97 Driver] Data source name not ??

Web Servern bulunduu bilgisayarda MDAC (Microsoft Data Access Component) dosyalar ya bozulmu ya da yanl kurup kaldrma yznden baz bileenleri arasnda srm fark domu demektir. MDACn gncellenmesi zm salayabilir.
Microsoft OLE-DB Provider for ODBC Driver error 80004005 [Microsoft][ODBC Microsoft Access ODBC driver Driver] General error Unable to open registry key...

Registry Editor ile burada ad verilen kayt anahtar (Key) iin verilen izinlerikontrol etmelisiniz. Bunun iin Regedt32.exe programn kullanabilirsiniz.

Microsoft OLE-DB Provider for ODBC Driver error 80004005 [Microsoft][ODBC SQL Server Driver] [dbnmpntw] ConnectionOpen (CreateFile()).
ACTIVE SERVER PAGES 115

Ayn bilgisayarda bile olsa SQL Server izinleri yeterli deilse, ODBC srcleri veritabana ulaamazlar. Sorunu zmek iin SQL Server ynetimiyle grmek ve izinleri deitirmek gerekir. Bu ve dier 80004005 hata mesajlar iin Microsoftun sitesinde Q189408, Q174943, Q173742, ve Q175671 numaral bilgi notlarna (Knowledgebase articles) bavurabilirsiniz.

ASP Hatas Arama


ASP teknolojisi, Internetin kendisine gre nisbeten eski HTTP protokol ile ibirlii yapmak zorundadr ve bazen ASP sayfalarmzda oluan hatalar, bizden (yazdmz VBScript veya dier Script kodlarndan) deil, bu iki teknolojinin Serverdaki uyumsuzluundan kaynaklanyor olabilir. ASP teknolojisi admda alr: 1. Ziyareti bir ASP sayfas talep eder 2. Server talep edilen belgenin bir ASP program olduunu belirler ve bunu ziyaretiye gndermeden nce ASP.DLL araclyla altrr. 3. Ortaya kacak olan HTML belgesi ziyaretiye gnderilir. Bu bakmdan ASP hatasn ararken sorulacak birinci soru hatann nerede olduu olmaldr. Hata istemci tarafnda ise ASP sayfamz muhtemelen ziyaretinin Browser ile uyumlu olmayan HTML kodu retiyor olabilir. Ayrca hatann hangi aamada olduunu yakalamamz gerekir. Sk alacamz bir ASP hatas, Servern verecei VBS Script Error: eklinde balayan mesajlar olacaktr. Bu, gerekten de sayfamzdaki VBScript kodlarnda hata olduunu gsterir. Yaplacak tek ey, iyi bir programc gibi, biraz ak havada gezdikten sonra kodu batan sonra yeniden gzden geirmek veya en iyisi baka bir programcnn yardmn istemektir. Bir sre sonra insan kendi yazd kodlardaki hatalar gremez hale gelir! Nesne oluturma hatalar ise Failed to create ... diye balar ve hemen hemen daima ASP sayfanzdaki Server.CreateObject.. diye balayan deyimin icra edilemediini gsterir. Bu sizin yanl nesneye yanl metod kullandrmaya kalkmanzdan olabilecei gibi, Web Servern size baz bileen dosyalarna (.dll ve .exe) eriim hakk vermiyor olmasndan kaynaklanabilir. cretsiz ASP destei veren sitelerde ou zaman bu tr komutlar ieren Scriptlere izin verilmez.

leri ASP Konular


ASPye giri niteliindeki bu iki kitapn kapsam dnda braklan baz ASP konularn burada sralayarak, bundan sonraki admlarnza yardmc olabiliriz. Server izin verdii ve gerekli yazlm salad taktirde, ASP sayfalarnzdan elektronik posta gnderebilirsiniz. Bunun bir Formun Servern CreateObject metodu ile Servern SMTP protokln kullanan mesaj gnderme programna (IISte CDONTS.Mail nesnesine) ulamas ve bu nesneye alc ve gnderenin adresleri ile konu ve mesaj blmlerini iletmesi gerekir. Bunun iin gerekli program (veya nesne) adn ve ASP sayfalarnzdan mektup gnderme izniniz olup olmadn Web Server ynetiminden renmeniz gerekir. Bir dier ileri ASP teknii ise COM bileenlerini kullanarak, ASP sayfalarnz VBScript veya JavaScript yerine daha hzl ve daha gvenli binary (program) dosyalar ile birletirmek
ACTIVE SERVER PAGES 116

olabilir. C++, Visual Basic, Borland Delphi gibi bir dille yazlm ve derlenmi olan COM bileenleri, kendilerine ASP sayfas tarafndan gnderilen ar zerine harekete geerler ve byk bir ihtimalle Server dnda yapmalar gereken ii yaparak sonucunu ASP sayfasna ulatrlmak zere Servera bildirirler. Derlenmi (program haline getirilmi) olduklar iin COM bileenleri daha hzl alrlar ve Servern kaynaklarn kullanmadklar iin de Web iletiimini yavalatmazlar. Bu tr bileenlere ou zaman ADODB nesnesinin .Command metodu ile eriiriz. Microsoft ve dier firmalar, ASP sayfalarmzla birlikte kullanlmak zere COM programlar retmeye ve pazarlamaya balam bulunuyorlar. Bu tr bileenleri gerek Internet Server ortamnda kullanabilmek iin, programn Servern bulunduu bilgisayarda Registry kaydnn yaplmas gerekir. Bunu Web Server ynetimi ile grmeniz arttr.

ACTIVE SERVER PAGES

117

You might also like