ASP KİTAP 2

En Büyük İslami Forum Sitesi/ASP KİTAP 2 => Önsöz Bu kitapçık önce Byte, ardından PC World ve şimdi de PC Life dergisinin eki bid dizinin son bölümü olan ASP tekniklerinin temel ilkelerini ve

Gönderen Konu: ASP KİTAP 2  (Okunma sayısı 4781 defa)

0 Üye ve 3 Ziyaretçi konuyu incelemekte.

Çevrimiçi administrator

  • Administrator
  • General
  • *****
  • İleti: 24515
  • Karma: +3/-1
    • Profili Görüntüle
    • Toplist Ekle Site Ekle
ASP KİTAP 2
« : Nisan 30, 2009, 04:00:19 ÖS »
Önsöz
Bu kitapçık önce Byte, ardından PC World ve şimdi de PC Life dergisinin eki bid dizinin son bölümü olan ASP tekniklerinin temel ilkelerini ve VBScript kullarını anlattığımız kitapçığın devamı niteliğindedir. Bu kitapçıktan yararlanabilmek için PC Life dergisi Eğitim dizisinin Haziran 2000 sayısıyla verilen birinci bölümünü edinmeniz gerekir.
ASP veya Active Server Pages (Etkin Sunucu Sayfaları) tekniği, sayfalarınızı canlandıracak bir tekniktir. Bu teknik, sil baştan bir bilgisayar programlama dili öğrenmeye gerek olmadan uygulanabilir. Bununla birlikte ASP tekniğini kullanabilmek için HTML ve Web’in nasıl çalıştığını, Server (Sunucu) ve Client (İstemci) ilişkisinin nasıl yürüdüğünü de bilmek gerekir.
ASP teknolojisinden yararlanabilmek için Web sitesine evsahipliği yapan bilgisayarda çalışmakta olan Web Server’ın ASP teknolojisini tanıması ve sitenize bu hizmeti vermesi şarttır. ASP, bir zamanlar sadece Microsoft’un NT ve daha sonra Windows 2000 işletim sistemine dayanan MS-IIS (Internet Information Server) programında işleyebilirdi. Fakat şimdi artık NT-tabanlı diğer Web Server programları gibi Unix-tabanlı Web Server programları da ASP anlar ve işletir hale gelmiş bulunuyor. Fakat ASP sayfalarınızı gerçek Internet ortamında ziyaretçilerinizin hizmetine sunmadan önce, kendi bilgisayarınızda sınamanız gerekir. Bunun için bilgisayarınızın işletim sistemi Windows 95/98 ise Kişisel Web Server (PWS), NT 4.0 ise IIS kurulmuş olmalıdır. Sisteminiz Windows 2000 ise, IIS 5.0 kendiliğinden kurulmuş demektir.
Örnek Kodlar
İki kitapçıktan oluşan ASP rehberinin bütün örnek kodları ve veritabanı dosyaları, http://www.pclife.com.tr/......... adresinden edinilebilir. Ancak ASP öğrenirken örnek kodları kendiniz yazmalısınız. Kodlamanın incelikleri ancak kodları siz yazarsanız öğrenilebilir. Bu örneklerden sadece kendi yazdığınız kodlar hata verdiği ve hatayı bulmaktan güçlük çektiğiniz zaman, karşılaştırma amacıyla yararlanmalısınız.
Teşekkürler
Bu kitapçıktaki kodların değişik ortamlarda sınanması için için bana yardımcı olan dilini ve yazımını denetleyen dostlarım Mustafa Durcan, Osman Nuri Hömek ve Armağan Ergon’a teşekkür ederim. Varolan hatalar elbette bana aittir. Çok sevgili arkadaşım Mustafa Durcan’ın bütün dizinin gelişimine katkısını daima şükranla hatırlayacağım.
Alıştırma Uygulamaları
Bu bölümde, birinci kitapçıkta öğrendiklerimizi küçük ASP uygulamalarında kullanacağız; ve böylece son iki bölümde yer alan nisbeten daha büyük ASP Programları için hazırlık yapmış olacağız. Bu bölümdeki örnekleri mutlaka kendiniz yazmalısınız ve açıklanmamış kodlardan anlamadıklarınız olursa mutlaka daha önceki bölümlere dönerek gözatmalısınız. Bu bölümdeki kodları dikkatle incelerseniz, çoğunda daha önce ele aldığımız temel VBScript komutlarının veya ASP nesnelerine ait metodlarının kimi zaman değişik tarzda kullanımına yer verdiğimizi göreceksiniz. Temel kullanım biçimlerini öğrendikten sonra, mutlaka Microsoft’un MS-Developers Network sitesinde (http://www.microsoft.com/msdn) VBScript ve ASP konularındaki belgeleri ve eğitim metinlerini incelemelisiniz.
Doğum Günü Hesabı
VBScript’in dil olarak bize sağladığı bazı kolaylıkları ASP teknolojisi ile birleştirebiliriz. ASP sayfalarımızda istediğimiz gibi HTML kodları da kullanırız. Bu örnekte, bu iki unsuru da birarada göreceğiz. Aşağıdaki kodu dogumgunu01.asp adıyla kaydedin:
<% @LANGUAGE=VBscript %>
<%
Option Explicit
Response.Expires = 0
Dim serverSaat, kalanSaat
serverSaat = Time
' aşağıdaki satırda işaretler arasındaki yere kendi doğum gününüzü yazın
kalanSaat = DateDiff("h",Now,#7/8/2000#)
%>
<HTML>
<HEAD>
<TITLE>Dogum Günü 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>
<%
If kalanSaat > 0 Then
   Response.Write "Doğum gününüze " & kalanSaat & " saat var." & VbCrLf
ElseIf kalanSaat < 0 Then
   Response.Write "Doğum gününüz " & kalanSaat & " geçmiş buluyor." & VbCrLf
Else
   Response.Write "Doğum gününüz kutlu olsun!" & VbCrLf
End If
%>
</CENTER>
</H3>
</BODY>
</HTML>
Bu kodda bulunan ASP nesnelerini ve metodlarını kolayca görüyor olmalısınız. Tanımlamadığımız bir değişken kullanmayı veya değişken adlarını yanlış yazmayı önleyen Option Explicit ifadesi dikkatinizi çekiyor olmalı. Sayfamızda bir hesap yapılacağı için Browser tarafından geçici Internet dosyaları arasında (cache) saklanmasını istemediğimizi, Response.Expires’ın değerini 0 yaparak belirtiyoruz. iki değişken tanımlıyoruz (serverSaat ve kalanSaat) ve bunlardan birincisine Server’ın o andaki saatini Time fonksiyonu ile atıyoruz. İkinci değişken ise hesaplama sonucu belirlenecek. Bu arada ASP programının hangi tarihe kaç saat kaldığını hesaplamasını istiyorsak, kalanSaat’i belirleyecek formüle o tarihi yazıyoruz. Bu formüle dikkatle bakalım:
kalanSaat = DateDiff("h",Now,#7/8/2000#)
DateDiff ve DateAdd, VBScript’in vereceğiniz iki tarih arasında, yine vereceğiniz biçime göre farkı bulmasını veya toplamasını sağlar. Buradaki “h” hesap sonucunun saat olarak verilmesini istediğimiz gösterir. “d” ise sonucu gün olarak istediğimiz anlamına gelir. Now, Server’ın o andaki saatidir; ”#” işaretleri arasında ise hesabın yapılacağı tarih, veya buradaki örnekte doğum gününüz yer alıyor. kalanSaat değişkeninin değeri bu hesaplama sonucu olarak doğum gününüze kalan saat olacaktır.
Kodumuzun geri kalan bölümünde ise elde ettiğimiz sonucu Browser’a yollayan bir If seçimi var: doğum gününüze kalan saat 0’dan büyükse veya küçükse bunu farklı cümlelerle belirtiyoruz. Kalan süre 0 ise, bugün doğumgününüz demektir! (ASP ile bu kadar uğraşırsa, insanın doğum gününü filan unutması normaldir. üzülmeyin!)
Daha önce VBScript’in metin ve değişkenleri birbirine “&” işareti ile eklediğini görmüştük. VBScript ile yazdırdığımız satırların sonuna kimi zaman <BR> kodu koyarak, yeni satırın bir satır aşağıdan başlamasını sağladığımızı hatırlıyor olmalısınız. Burada & VbCrLf şeklinde gördüğümüz ifade de bunu sağlar. Bu, Visual Basic’in “alt satıra geç, başa git!” (Carriage Return, Line Feed) komutudur.
<asp0011.tif>
Dedik ki, DateDiff ve DateAdd fonksiyonlarının, sonucu gün olarak vermesini istiyorsanız, “d” argümanını kullanmanız gerekir. Şimdi burada öğrendikleriniz bu programı doğumgününüze kalan saati değil de günü hesaplayacak şekilde değiştirebilir misiniz? (Ortaya çıkartacağınız kodu bu kitapçığın kodları arasındaki dogumgunu02.asp dosyası ile karaşılaştırabilirsiniz.)
<asp0012.tif>
//////////////////KUTU///////////////////////
Çift Tırnak Gerekince!
Kimi zaman ASP yoluyla ziyaretçininr Browser’ına HTML kodu göndermek gerektiğinde HTML’in gerektirdiği çift tırmak işaretini yazdırma sorunuyla karşılaşırız. VBScript’in gereği olan çift-tırnak işaretinin içine koyacağımız HTML’in gereği olan çift tırnak, ASP hatasına yol açar, C'den türetilen dillerde ters bölü işaretiyle yaptığımız türden, kontrol karakterlerinin metin olarak anlaşılmaması işini (ESCape-ing'i) VBScript’te türlü şekillerde yapabiliriz. Burada, yerine göre, üç yöntemden yararlanabiliriz işe yarar:
 1. Tırnak işareti gereken yerde iki kere tırnak yazmak;
2. İçerdeki tırnak yerine tek-tırnak kullanmak
3. İçerdeki tırnak yerine & Chr(34) & kullanmak. (Bu yöntemi kullandığımızda "dışardaki" tırnak diye bir şey kalmadığına dikkat etmek gerekir.)
Örnekler:
objMetin.WriteLine("<%@ LANGUAGE=""VBScript""%\>")
objMetin.WriteLine("<%@ LANGUAGE='VBScript'%\>")
objTsOut.WriteLine("<%@ LANGUAGE=" & Chr(34) & "VBScript" & Chr(34) & "%\>")
////////////////KUTU BİTTİ//////////////
HTML Dışında İçerik
HTTP iletişiminde istemci Browser ile Server arasında her talep ve sunuşla birlikte bir dizi HTTP Header (başlık) bilgisi gönderildiğini biliyoruz. Bu bilgiler arasında neler bulunduğunu dabu kitapçığın kodları arasında bulunan SerDeg.asp dosyasını çalıştırarak inceleyebilirsiniz. Browser penceresinde beliren bilgilere dikkat ederseniz, Browser, Server’a HTTP yoluyla kabul edebileceği bilgi türlerini de sıralıyor:
HTTP_ACCEPT:image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/msword, application/vnd.ms-powerpoint, application/vnd.ms-excel, */*
Burada düzyazı (text/plain) türünün bulunmadığını görüyorsunuz. Fakat ASP yoluyla, sayfanıza düz yazı gönderebilirsiniz. Aşağıdaki kodu duzyazi.asp adıyla kaydedin, ve çalıştırın:
<% @LANGUAGE=VBscript %>
<%
Response.ContentType = "text/plain"
Response.Expires = 0
%>
Selamlar
Bu dosyada HTML etiketi kullanmıyoruz.
Metin tamamen bir düz yazıdan ibaret. İçinde <BR> kodu
bulunmadığı halde
satırlar Enter'a bastığımız yerde alt satıra geçecektir.
Bu kodu yazarken buradaki örnekte gördüğünüz satır sonlarında Enter’a basmalısınız. Browser’ınızdaki sonuç şuna benzer ıolmalı:
<asp0013.tif>
Genellikle HTML sayfalarımızı tasarlarken içerik türünü belirten Content-Type özelliğini yazmayız; çünkü Browser, içerik türü belirtilmemişse gelen belgenin mutlaka “text/html” olduğunu varsayar. Fakat burada olduğu gibi, içinde bir tek HTML etiketi (hatta <HTML> etiketi bile) olmayan bir metni Browsar’a gönderebilir ve istediğimiz şekilde görüntületebiliriz. Bunu Response.ContentType = "text/plain" ifadesi sağlamaktadır.
Response nesnesi, varsayılan türler dışında sadece düz yazı türü göndermekle kalmaz, Browser’ın kabul edebileceği ve HTTP’nin aktarılmasına elverişli olduğu her türlü dosyayı gönderebilir. Bu dosya türlerinin hangileri olabileceğini çevre değişkenlerinden HTTP_Accept’in içinde görebilirsiniz. Bunu sınamak için duzyazi.asp’nin Content-Type satırını şu şekilde değiştirin ve dosyayı msword.asp adıyla kaydedin:
Response.ContentType = "application/msword"
Bu dosyayı çalıştırdığınızda, Broewser türünüze ve ayarlarınıza ve sisteminizde MS-Word programının bulunup bulunmamasına bağlı olarak, ya doğruca ya da size sorarak, bilgisayarınız MS Word kelime işlemcisini açacaktır:
<asp0014.tif>
Bu imkandan ziyaretçiye resim veya diğer tür dosyaları göndermek için yayarlanabiliriz. Ancak bir resim dosyasını gönderirken, metin vermek yerine dosya yolu ve adını belirtmemiz gerekir.
Başka Sayfaya Yönlendirme
Diyelim ki ziyaretçilerimizin Web programımızda belirli işleri yapabilmeleri veya eski ifadesiyle sitemizde belirli bir sayfaya erişmek için kayıt yaptırmış olmaları gerekiyor; bu kaydı yaptırmamış olanları kayıt sayfasına yönlendirmek istiyoruz. Birazdan form yoluyla ziyaretçiden bilgi alma ve bunu işlemeyi göreceğiz, ama şimdilik sadece bu senaryonun ikinci kısmını ele alalım: ziyaretçimizi başka sayfaya yönlendirelim. Bunun için iki ayrı sayfa yapacağız. Önce şu kodu, gonder.asp adıyla kaydedin:
<% @LANGUAGE=VBscript %>
<%
Response.Redirect("yeni.asp")
Response.Expires = 0
%>
<HTML>
<HEAD>
<TITLE>ASP ILE YONLENDİRME</TITLE>
</HEAD>
<BODY>
Bu sayfada yazılı olanları okumanız mümkün olmayacak

çünkü bu sayfa sizi başka sayfaya gönderecek..
</BODY>
</HTML>
Şimdi şu kodu da yeni.asp adıyla 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 başka sayfa gönderdi.. <BR>”%>
</BODY>
</HTML>
gonder.asp’yi çağırın; karşınıza yeni.asp’nin içeriği gelecektir; çünkü gonder.asp kendisinden beklediğimizi yapacak ve sizi yeni.asp’ye gönderecektir. Bunu “Response.Redirect” metodu yapmaktadır. Bu metodun argümanı olarak kendi programımızın bir başka sayfasını verebileceğiz gibi, bir Internet sitesinin URL’ini de verebiliriz.
Ziyaretçiden Bilgi Alma
İstersek adına Web Programı diyelim, sitemize ziyaretçilerin bilgi ulaştırması ancak HTML’in Form etiketi yoluyla olur. Klasik HTML+CGI yöntemleri ile ASP tekniğinde Form etiketlerinin işlevleri arasında bir fark yoktur. Ancak aralarındaki benzerlik de hemen hemen bundan ibarettir. Klasik HTML+CGI yönteminde Form’larımızın Action özelliğine değer olarak çoğu zaman bir CGI programının yolunu ve adını yazarız; oysa ASP’de Form bu bilgileri kendisinin de içinde bulunduğu ASP sayfasına gönderebilir; ve örneğin formun eksik doldurulup doldurulmadığını sınayabilir.
HTML bilgilerinizi tazelerseniz; bir Form’dan Server’a iki metodla bilgi gelebilir: Get ve Post yöntemleriyle. Get, Browser’ın bilgileri yumak yapıp, aradaki boşlukları kaldırarak ve ASCII olmayan karakterleri URL koduyla şifreleyerek Query_String içine yazdırmasını sağlar. Diğer yöntemi birazdan ele alacağız.
Küçük bir form oluşturalım ve bu formdan Get yoluyla gelecek bilgileri daha sonra nasıl kullanabileceğimizi görmek için, şimdilik sadece sayfamıza yazdıralım. Şu kodu miniform_get.asp adıyla 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"))
   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 ulaştı <BR><BR>
Gelen bilgiler:<BR>
Formu dolduran kişinin adı: <%= strAdi%> <BR><BR>
Formu dolduran kişinin 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">
Adınız: <INPUT TYPE="Text" NAME="adi"><BR>
Soyadınız: <INPUT TYPE="Text" NAME="soyadi"><BR>
Mesajınız: <TEXTAREA NAME="mesaj">Mesajınızı buraya yazın!</TEXTAREA><BR>
<INPUT TYPE="Submit" NAME="Gönder" VALUE="Gönder">
</FORM>
</body>
</html>
<% End If %>
Kodumuzun bir değişken tanımladığımız ve Form’dan gelen bilgileri işleyen bölümü, bir de henüz bu bilgi gelmeden önce Form’u oluşturan bölümü olduğuna dikkat ediyor musunuz? Bu iki bölümü bir If sınama deyimiyle oluşturduğumuzu da görüyorsunuz.
ASP tekniği ve VBScript’in kolaylıkları birleşince, CGI’da olduğu gibi, Formdan gelen bilgileri özel fonksiyonlar yazarak ayıklamamız gerekmez. ASP’nin anladığı şekliyle, Query_String Form’dan GET metoduyla gelen bilgileri Form’un bilgileri atadığı değişkenlerin adlarıyla eşleştirerek tutar; ve bize sadece Form’daki değişkenlerin değerlerini, istiyorsak, başka değişkenlere atamak kalır. Burada Form’un “adi” olan değişkenini bir String değişkeni olan strAdi değişkenine, yine Form’un “soyadi” olan değişkenini başka bir bir String değişkeni olan strSoyadi değişkenine atıyoruz. Bunu yapmamızın sebeplerinden biri iki dizi değişkenden hangisinin ASP tarafında kullanıldığını bilmektir.
Form’un üçüncü değişkeni olan “mesaj” ise ASP tarafından işlenirken, iki şekilde ele alınacak: hamBilgi değişkeninin değeri olarak, ve bunu Replace() fonksiyonu ile işledikten sonra atayacağımız islenmisBilgi değişkenini değeri olarak.
Replace() fonksiyonu, bir değişkende bir değeri bulur ve arzu ettiğimiz bir başka değerle değştirir. Üç argüman alır: içinde arama ve değişiklik yapılacak değişken, aranacak değer ve yerine konacak değer. Burada iki veya daha fazla paragraf içeren bir mesajın içindeki satırbaşı-yeni paragraf karakterini, HTML’in anlayacağı <BR> ve satırbaşı karakteri ile değiştiriyoruz.
Şimdi miniform_get.asp’yi çalıştırın, doldurun (mesaj bölümünde iki paragraf oluşturmak için bir yerde Ctrl+Enter’a basmayı unutmayın! Yoksa işlenmiş bilgi ile ham bilginin farkını göremeyiz!) ve Gönder tuşunu tıklayın. Bu arada Browser’ınızın URL hanesine bakın. Bu Get metodunun bilgi gönderme şeklidir. Bilgiler URL-kodu olarak değiştirilir ve gideceği sayfanın adına, soru işareti ile eklenerek, gönderilir. (Tabii ziyaretçiniz yıldızlar halinde görüntülenen bir parola yazdıysa onu da burada açık şekilde görecektir!)
<asp0015.tif>
Bizim Form bilgilerimiz hangi sayfaya gönderiliyor? Yine kendisine. Bunu Form etiketinin Action özelliğinin karşısında yazılı olan VBScript kodu sağlıyor. Bu yolla gelen bilgi, şuna benzer olmalıdır:
Script'imize Form'dan bilgi ulaştı
Gelen bilgiler:
Formu dolduran kişinin adı: Kroninukus
Formu dolduran kişinin 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, mesajın içindeki CRLF karakterini bulup yerine <BR> koyduğuna dikkat edin. Query_String’in yazdığınız ad ve soyad ile mesajı nasıl yumak (tek String) yaptığına bakın. Ve programımızın bu yumaktan bilgileri alıp, yeni değişkenlere atayarak Browser penceresinde nasıl görüntülediğini inceleyin.
Bu programın canalıcı noktası, Request nesnesinin ServerVariables kolleksiyonunda, Query_String koleksiyonunu kullanmasıdır. Çünkü Get, Form’un sağladığı bilgileri bu koleksiyona kaydetmiş bulunuyor.
Şimdi aynı işi Post metodu ile yapalım. Bunun için biraz önce kaydediğiniz kodda şu değişiklikleri yapın ve miniform_post.asp adıyla 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 ulaştı <BR><BR>
Gelen bilgiler:<BR>
Formu dolduran kişinin adı: <%= strAdi%> <BR><BR>
Formu dolduran kişinin 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">
Adınız: <INPUT TYPE="Text" NAME="adi"><BR>
Soyadınız: <INPUT TYPE="Text" NAME="soyadi"><BR>
Mesajınız: <TEXTAREA NAME="mesaj">Mesajınızı buraya yazın!</TEXTAREA><BR>
<INPUT TYPE="Submit" NAME="Gönder" VALUE="Gönder">
</FORM>
</body>
</html>
<% End If %>
İki Miniform sayfası arasındaki değişikliği farkettiniz mi? Önce, Form etiketinin METHOD özelliğinin Post olduğuna dikkat edin. Bu yöntemle gelen bilgiler, Request nesnesinin Form kolleksiyonuna, işlenmiş (yani değişken=değer çiftleri halinde yazılmış) olacağı için, Form bilgilerini yeni değişkenlere atama ifadelerimizi de farklı yazıyoruz. Önce formdan gerçekten bilgi gelip gelmediğini Content_Length değişkeninin boyutunun sıfır olup olmadığına bakarak anlıyoruz. Bu değişkenin boyutu 0 ise form içi boş gönderilmiş demektir; bu durumda ziyaretçiyi form’u doldurması için uyaran bir Sub’a gönderebiliriz. Form doldurulmuş ise, kodumuzun birinci bölümü yapması gereken değişkenlere atama işlemini yapıyor; ve sonuçları ziyaretçinin Browser penceresine yazıyor. Daha sonra yapacağımız örnek Konuk Defteri’nde bu bilgileri ziyaretçinin ekrarına değil, bir metin dosyasına yazacağımızı göreceksiniz.
Form etiketlerinden bilgi alma
Form içinde kullandığımız bir çok etiket, Server’a farklı biçimde bilgi gönderir. Yukarıdaki örnekte gördüğümüz Input ve Textarea etiketleri, kendi adlarını değişken adı yaparak ve değişkene ziyaretçinin yazdığı metni değer olarak atayarak, gönderir. Fakat HTML’in <SELECT MULTIPLE> etiketi biraz daha dikkat etmemizi gerektirir; çünkü ziyaretçi bu etiketle oluşturduğunuz seçeneklerden birden fazla seçebilir ve bunlar Server’a bir kolleksiyonun elemanları olarak gelir. Şöyle bir örnek düşünün:
<SELECT NAME=”CokluSecme” SIZE=”3” MULTIPLE>
<OPTION VALUE=”Emrah” SELECTED> Emrah
<OPTION VALUE=”Karacaoglan”> Karacaoğlan
<OPTION VALUE=”Sulari”> Davud Sulari
<OPTION VALUE=”Daimi”> Aşık Daimi
<OPTION VALUE=”Pirsultan”> Pir Sultan Abdal
Browser, kullanıcı birden fazla seçim yaptıysa, yapılan seçim sayısını, yani kaç seçenek seçildiğini bize bildirir ve bu Request nesnesinin Form kolleksiyonunda “CokluSecme” elemanının “.Count” değişkenine yazılır. Bu bakımdan “CokluSecme” kendisi bir kolleksiyondur. Yani, bu değişkenin değerini kullanarak, “CokluSecme” kolleksiyonunun elemanlarını tek tek okutmak için bir For döngüsünden yararlanabiliriz:
For sayac = 1 to Request.Form(“CokluSecme”).Count
   Response.Write(sayac & “. seçim: “ & Request.Form(“CokluSecme”)(sayac) & “<BR>”)
Next
Bu iki kodu, miniform_post.asp’ye katabilir misiniz? (Ortaya çıkartacağınız örneği bu kitapçığın örnekleri arasındaki miniform_multi.asp ile karşılaştırabilirsiniz.)
Parola İle Sayfa Koruma
“Internet’te gizlilik olmaz!” ilkesine rağmen, bazen öyle sayfalarımız olur ki, bunların içeriğini bütün Internet ziyaretçilerinin görmesini istemeyebiliriz. Örneğin derneğimizin veya grubumuzun telefon numaraları ve elektronik posta adreslerini gösteren sayfamıza sadece grup üyelerinin ulaşmasını arzu edebiliriz. Bir Web sitesinin herhangi bir sayfasını ziyaretçilerden gizlemek için sayfanın açılmasını belirli bir şartın yerine gelmiş olmasına, mesela ziyaretçinin bir Form aracılığıyla bize doğru parolayı göndermesine bağlayabiliriz.
Bu tür sayfa gizleme yollarını istemci-tarafında çalışan bir programla yapmak mümkündür; ancak sayfa gizlemenin mantığına aykırıdır. sözgelimi bir Form’da parola alanına girilecek bilginin gerçek parola ile karşılaştırılmasını bir Script fonksiyonu ile yapmaya kalkarsak, ziyaretçinin kaynağı görüntülemesi halinde ziyaretçinin girdisi ile parolayı karşılaştıran Script, ve tabiî bizim kıymetli parolamız, ziyaretçi tarafından öğrenilecektir. Oysa ASP kodları ile gizlediğimiz parolanın ziyaretçiye görünmesi imkansızdır; çünkü ASP kodları hiç bir zaman ziyaretçiye gönderilmeyeceği için parola sınayan program da ziyaretçiye gidemeyecektir.
Önce şu kodu, parola.asp adıyla kaydedelim:
<%@ LANGUAGE="VBSCRIPT" %>
<%
Response.ExpiresAbsolute = Now() - 1 'Sayfanın 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 için parolayı yazınız (Mesela, PAROLA) ?</h2>
  <input type="password" name="FormParola" size="10">


  <input type="submit" value="Girebilir Miyim?">
</form>
</div>
</body>
</html>
<% Else %>
BilX.Net

Çevrimiçi administrator

  • Administrator
  • General
  • *****
  • İleti: 24515
  • Karma: +3/-1
    • Profili Görüntüle
    • Toplist Ekle Site Ekle
Ynt: ASP KİTAP 2
« Yanıtla #1 : Nisan 30, 2009, 04:00:38 ÖS »
Şimdi ana sayfaya girmiş oldunuz..
<% End If %>
Şimdi kodumuzu ayrıntılı indereleyebiliriz. Önce, bu sayfanın ziyaretçinin Browser’ı tarafından ziyaretçinin bilgisayarında yedeklenmesini önlediğimize dikkat edin: Bunu Response nesnesinin .Expries metodunun farklı bir türü ile yapıyoruz. .ExpiresAbsolute sadece .Expires metodundan farklı olarak, bizden bir değer ister. Bu değerin zaman olarak verilmesi gerekir. Burada VBScript’in o andaki zamanı belirten Now() fonksiyonu ile yapıyoruz ve bu fonksiyonun verdiği değerden (yani o andaki saatten) 1 saat çıkartıyoruz. Böylece sayfanın geçerliği çoktan dolmuş oluyor. Browser, bu ifadeyi gördüğü anda sayfanın daha sonra başvurulmak üzere bir kopyasını saklamayacaktır. Bunu neden yapıyoruz? Diyelim ki parolayı doğru bilen bir ziyaretçi kullandığı bilgisayarın başından kalktı ve yerine başka bir kullanıcı geçti. Bu kişinin Browser’ın Yenile düğmesini tıklaması halinde bizim özene-bezene gizlediğimiz sayfa yeniden görüntülenecektir. Oysa Browser’a bu sayfanın artık geçerli olmadığını bildirmekle, yenilenme işleminin Cache bellekten (ziyaretçinin bilgisayarında sabit diskte kaydedilen kopyadan) değil de, mutlaka Server’dan yapılmasını istiyoruz.
Sayfamız açılırken, (kodumuzun dört ve beşinci satırında) kendi içerdiği formda bilgi olup olmadığını sınıyor. Bunu formdaki formParola isimli INPUT alanının değerini atadığımız değişkenin içeriğini parola olarak seçtiğimiz kelime karşılaştırarak yapıyoruz. Eğer bu değişken (buradaki örnekte “PAROLA” kelimesine) eşit değilse, yani parola yanlış veya boşsa If sorgusu olumlu sonuç verecek ve program devam edecektir. If sorgusu yanlış sonuç vermiş olsaydı, yani ziyaretçi Form’a bilgi girmiş ve bu bilgi bizim karşılaştırmayı yaptığımız kelimeye eşit olmuş olsaydı, program ELSE ifadesine atlayacaktı. Programın devamı formu oluşturmaktadır; ELSE ifade ise formu atlamakta ve ziyaretçinin Browser penceresine “Şimdi ana sayfaya girmiş oldunuz” cümlesini yazdırmaktadır. Tabiî gerçek bir uygulamada bu cümlenin yerinde gerçek bir sayfanın ögeleri yer alacaktı. Bu yöntemi uygularken sayfanın VBScript’nin End If ifadesiyle bittiğine dikkat edin.
Dinamik İçindekiler Sayfası
Internet sitemizin sayfaları genellikle çok özenilmiş, cicili-bicili, albenisi olan, görsel odak noktalarının oluşmasına dikkat edilmiş tasarımlar olur. Fakat bazen, önemli olan sadece bir dizindeki bütün HTML ve ASP belgelerinin adlarını ve başlıklarını liste halinde ziyaretçiye sunmaktır. Böyle bir sayfada da tasarımın görsel ilkelerine dikkat edilebilir. Fakat burada önemli olan, sayfanın kendi kendisini inşa etmesi ve sayfanın bir dizinin içindeki tüm dosyaları zyaretçiye listeyen bölümünün otomatik olarak güncellenmesidir.
Bunu, bir HTML sayfası oluşturan ASP programı olarak tasarlayabiliriz. Aşağıdaki biraz uzunca kodu, menu.asp adıyla kaydedin veya bu kitapçığın örnek dosyaları arasında bulun:
<%@ LANGUAGE=VBSCRIPT %>
<%
Server.ScriptTimeOut = 300  'Server'a daha çok zaman tanımak için
strMenuSayfaURL = "/menu.htm" 'oluşturacağımız sayfanın yolu
strListKlasor = "/"      'içindekileri bulacağımız dizin
%>
<HTML>
<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ı oluşturuluyor: " & strMenuSayfaURL & " ...</P>"

'menü sayfası olacak düz yazı dosyasını oluşturalım
Set objFSO = CreateObject("Scripting.FileSystemObject")
strDosyaAdi = Server.MapPath(strMenuSayfaURL)
Set objMenuSayfa = objFSO.CreateTextFile(strDosyaAdi, True) 'dosyanın üstüne yaz

'menü sayfasının başlık bölümünü yazalım
objMenuSayfa.WriteLine "<HTML><BODY><P><B>Dosyaların listesi</B></P>"

'belirtilen dizindeki dosyaların listesini içeren kolleksiyonu oluşturalım
Set objKlasor = objFSO.GetFolder(Server.MapPath(strListKlasor))
Set kolDosyalar = objKlasor.Files

'Her bir dosyanın başlığını okuyarak listemizi yapalım
   For Each objDosya in kolDosyalar

'dosya adının uzantısı ASP ve HTM olanları ayıralım
   strDosyaTuru = objFSO.GetExtensionName(objDosya.Name)
   If (strDosyaTuru = "asp") Or (Left(strDosyaTuru, 3) = "htm") Then

'dosyanın tümünü okuyup bir String'de tutalım
   Set objOku = objDosya.OpenAsTextStream(1) 'okumak için
   strIcerik = objOku.ReadAll
   objOku.Close

'içinden başlık bölümünü alalım
   strBaslik = ""
   intBaslangic = Instr(UCase(strIcerik), "<TITLE>") + 7
   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 = "Adsız sayfa '" & objDosya.Name & "'"

'Menü sayfası için metni oluşturalım
strBuDosyaURL = strListKlasor & objDosya.Name
strKopru="<A HREF=" & Chr(34) & strBuDosyaURL & Chr(34) & ">" & strBaslik & "[/url]<BR>"
objMenuSayfa.WriteLine(strKopru)
End If
Next

'Menü sayfasının son bölümünü yazalım
   objMenuSayfa.WriteLine "</BODY></HTML>"
   objMenuSayfa.Close
   Response.Write "<P>Menü sayfası oluşturuldu.</P>"
%>
<P><A HREF="<% = strMenuSayfaURL %>">Menü sayfasını aç[/url]</P>
</BODY>
</HTML>
Programın daha öncekilere göre uzun oluşu, Dosya Sistemi (FileObject) Nesnesini kullanarak oluşturacağı menu.htm dosyasının içeriğini sağlamak için verdiğiniz dizinde bulunan ve dosya adı uzatması .htm ve .asp olan bütün dosyaların içinde <TITLE>..</TITLE> etiketini aramasından kaynaklanıyor. Programın yazarı Alex Homer’in bütün değişken adlarının önünde, değişkenin türünü belirten ön-ekler kullandığına dikkat edin. Böylece nesneleri (obj), sayısal (int) ve kolleksiyon (kol) değerlerden ayırmamız kolaylaşıyor.
<asp0016.tif>
Programı çalıştırdığımız zaman, Browser penceresinde menü sayfasının oluşturulduğuna ilişkin mesaj belirliyor; ve işlem tamamlandığında da oluşturulan menu.htm sayfasının köprüsü veriliyor. Bu köprüyü tıkladığımızda ise programın beşinci satırında strListKlasor = "/" ifadesiyle verdiğimiz dizinin içindeki bütün HTML ve ASP dosyalarının başlığını, bu dosyalara köprü verilmiş olarak görürüz.
<asp0017.tif>
İsterseniz, strListKlasor değişkeninin değeri olarak, sözgelimi “/html/” gibi, kendi Web Server’ınızdaki diğer herhangi bir dizinin adını da verebilirsiniz. Bunu yaparken dizin adının sonuna bölü işareti koymayı unutmamak gerekir. Bu program böyle bağımsız olarak çalıştırılabileceği gibi, bir çerçevenin (Frame) içinde çalıştırılabilir ve sonuçları, başka bir çerçevenin içinde görüntülenebilir. Bu programın “İçindekiler” sayfasını hazırladığı dizine ne kadar yeni dosya koyarsanız koyun veya mevcut dosyaları çıkartırsanız çıkartın, ne zaman bu programı çalıştırırsanız, İçindekiler listesi dinamik olarak mevcudu yansıtacaktır.
Gecikme Bildirme Sayfası
Yukarıdakı örneği birlikte uyguladıysak, ASP programına İçindekiler listesini çıkartması için verdiğimiz dizinin içerdiği dosya sayısına bağlı olarak, programın çalışması epey uzun süre alacaktır. 20 saniyenin üzerinde beklemenin bir yüzyıla yakın etki yaptığı günümüz Internet ziyaretçisi için bu süre çok uzun görünebilir. Ziyaretçimize, sözgelimi Browser programının donmadığını, veya Internet bağlantısının kesilmediğini belirtebilmek için, “Lütfen bekleyiniz!” mesajı vermek yerinde olabilir. Yukarıdaki örnekte bunu aynı sayfa içinde yapma imkanımız vardı; çünkü programımız tabir yerinde ise ziyaretçiyi bu sayfadan alıp, başka bir sayfaya götürmüyordu.
Oysa Web uygulamamızın akış planı öyle gerektirebilir ki, ziyaretçimizin bir talebini karşılayabilmek için ona “Lütfen bekleyiniz!” mesajını ne hareket ettiği, ne de gittiği sayfada veremeyiz. Bunun için bir “ara” sayfa gerekebilir; bir tür “Lütfen bekleyiniz!..” sayfası.
Bu örnekte böyle bir sayfa yapacağız; ancak bu amacımızı tek sayfa karşılamayacağı için, ortaya iki sayfa çıkartacağız. Şimdi şu kodu bekle01.asp adıyla kaydedin:
<% Response.Buffer = True %>
<HTML>
<% mesaj = Server.URLEncode("Arzu ettiğiniz iş yapılıyor.. Lütfen 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 tümü işlemeden, ortaya çıkan HTML’in ziyaretçinin Browser’ına parça parça gönderilmesini önlemek amacıyla Response nesnesinin .Buffer metodunun True (doğru) olarak belirlendiğini görüyorsunuz. Programın kullanacağı mesajın, mesaj adlı değişkene atandığına dikkat edin. Bu sayfanın tek işlevi ise Response nesnesinin .Redirect metodu ile bekle02.asp sayfasını çağırmaktan ibaret. Başka bir deyişle bekle01.asp, gerçekte Browser’ın yüzünü bile göremeyecektir!
Biraz sonra kendisine üç değişken verilmesini bekleyen bekle02.asp programı yazacağız. Nitekim bekle01.asp’nin içinde üç değişken değeri belirleniyor; ve bunlar bekle02.asp’ye URL-GET metodu ile “yazılıyor.” Burada GET metodu ile bir bir sayfaya veri gönderme tekniğini hatırlayalım. Bir Form’un Server’a veri gönderme metodu GET ise, Form’dan (veya sayfadan URL yoluyla) derlenen verilerin “değişken=değer” çiftleri halinde ve çiftlerin arasında & işareti konularak gönderilir. Bu yöntemi, HTTP yoluyla Browser nasıl kullanıyorsa, biz de istediğimiz anda kullanabiliriz. Burada;
bekle02.asp?BEKLE_SURE=3&BEKLE_MESAJ=" & mesaj & _ "&GONDER_URL=index.htm”
şeklindeki ifade de sayfa adından sonra konan soru işareti, Server’a bu bilgi kümesinin bu sayfaya iletilmesi komutunu vermenizi sağlar; bir bakıma Server’a “Şu bilgileri al; bekle02.asp sayfasına ver!” demiş oluyoruz. Bu bilgiler hatırlayacaksınız, Server’da Request nesnesinde tutulur; eşittir işaretinin önündeki kısım değişken, arkasındaki kısım ise değer sayılır.
Dedik ki: bekle02.asp kendinise üç değişken verilmesi beklemektedir. Bunu sağlayan nedir? Resquest nesnesinden alınıp, bu sayfanın içindeki değişkenlere atanan üç değer bulunması. bekle02.asp’yi de yazalım:
<%@ 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 yazdığımız bekle01.asp, ziyaretçiyi bekle02.asp’ye yönlendirirken ona üç “değişken=değer” çiftti gönderiyor; bekle02.asp bunları Request nesnesinden alarak, kendi değişkenlerine atıyor. Bu üç değişkenini inceleyelim.
•   Ziyaretçinin bekleme süresince Browser penceresinde göreceği mesaj, BEKLE_MESAJ değişkeninde yer alıyor;
•   Bu mesajı görüntülendiği sayfanın ziyaretçinin Browser’ında kalacağı süreyi BEKLE_SURE değişkenin değeri belirliyor:
•   Bu sayfanın yerini alacak olan hedef sayfa veya ziyaretçinin Browser’ına gönderilecek yeni sayfanın adresini, GONDER_URL değişkeni belirliyor.
Bu programları çalıştırdığınızda ziyaretçinin Browser’ında üç saniye süreyle “Arzu ettiğiniz iş yapılıyor.. Lütfen bekleyiniz!” yazısı görüntülenecek; daha sonra Browser’a index.htm sayfası gönderilecektir. Bu iki programı kendi ihtiyaçlarınıza uyarlamak isterseniz, sözgelimi bir veritabanının güncellenmesi sırasında veya benzeri bir muhtemel gecikme durumunda, ziyaretçiye durumu bildirmek için, köprüyü bekle01.asp’e verebilirsiniz; asıl hedef URL’i ise bekle01.asp’de verebilirsiniz.
Form Değerlerini Yakalayalım
Bir veritabanından çektiğimiz verilerle, Form etiketi içinde kullanabileceğimiz ve ziyaretçinin ya metin girmesine ya da seçim yapmasına imkan veren kutuları, seçenekleri nasıl doldurabileceğimize ilişkin bir örneği birinci kitapçıkta görmüştük. Burada şimdi bir Form’dan gelen verileri nasıl değişkenlere atayacağımızı ve bunları nasıl kullanacağımızı ele alalım.
Bu amaçla iki sayfa hazırlayacağız: birincisi içinde bir çok tercihler bulunan formlar olan bir HTML dosyası, diğeri ise bu Formun değerlerini alarak, kullanılır 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="Mesajınızı buraya yazınız" 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 istediğiniz yazıyı yazabilirsiniz...</TEXTAREA><P>
<INPUT TYPE="Submit" VALUE="Gönder">&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 Düğmesi Tercih 1<BR>
<INPUT TYPE="Radio" NAME="Radyo" VALUE="Tercih2">Radyo Düğmesi Tercih 2<BR>
<INPUT TYPE="Radio" NAME="Radyo" VALUE="Tercih3">Radyo Düğmesi 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>
<INPUT TYPE="Checkbox" NAME="IsaretKutusu" VALUE="Isaret3">İşaret Kutusu 3</TD>
</TR></TABLE><BR>
<INPUT TYPE="Submit" VALUE="Gönder">&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 Seçme Kutusu 1
<OPTION VALUE="ListeKutu2">Çoklu Seçme Kutusu 2
<OPTION VALUE="ListeKutu3">Çoklu Seçme Kutusu 3
</SELECT><P>
<INPUT TYPE="Submit" VALUE="Gönder">&nbsp;&nbsp;<INPUT TYPE="RESET" VALUE="Sil">
</FORM>
</BODY>
</HTML>
Daha sonra belirlediğimiz değişkenlerin Form’un hangi öğelerinden geldiğinin rahat anlaşılması için burada Form unsurlarının değeri olarak unsurun adına yakın kelimeleri kullandığımıza dikkat edin. Sayfada üç ayrı Form bulunduğu, ilk iki formun POST, üçüncüsünün ise GET metoduyla Server’a bilgi gönderdiği de dikkatinizi çekmiş olmalı. POST metodunda Server’a giden bilgiler, talep edilen sayfanın adına URL kodlama yöntemiyle (ve dolayısıyla Browser’ınızın URL kutusuna yazılarak) gönderilmez; Fakat ilk iki Form’da POST metodu kullanmış olmamıza rağmen, formu işleyecek programa bilgilerin hangi formdan gittiği sanki GET metodu kullanılmış gibi bildiriliyor. Bu yöntemi, Request.Form kolleksiyonuna yazılmasını istemediğimiz bilgiler için kullanabibiliriz. Üçüncü Form ise bilgilerini GET yoluyla gönderiyor ve kendisinin hangi form olduğuna ilişkin bilgiyi ise gizli bir değişkene yazıyor. Her üç durumda da HagiForm değişkeninin değeri olarak, ASP programına formun sıra numarası anlamına gelen sayı gönderiliyor. Birinci form 1, ikinci form 2, üçüncü form ise 3 değerini yolluyor. Bu HTML dosyasını Browser’da açarsanız, üç ayrı formu göreceksiniz.
<asp0018>
Her üç formun gönderdiği bilgiler aşağıdaki programa ulaşıyor. Bu programı FormOrnek.asp adıyla kaydedebilirsiniz:
<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ı sonuçları<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 Düğmesi ve İşaret Kutusu Sonuçları<P>
<TABLE BORDER=1 CELLPADDING=5 width=25%>
<TR><TD>Seçilen Radyo Düğmesi</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>
<HR>
<%
Case 3
%>
Seçme Alanları sonuçları<P>
<TABLE BORDER=1 CELLPADDING=5 width=35%>
<TR><TD>Seçilen Liste Ögesi</TD><TD><B><%= Request("SecmeListesi") %></B></TD></TR>
<TR><TD>Seçilen Ç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 değişkeninin değerine göre, Select Case döngüsü ile üç ayrı bölümde işleniyor. İlk iki formda, bilgiler POST metodu ile geldiği için Request.Form nesnesinin içinde, değişken adıyla aranabilir. Üçüncü Formda ise bilgiler Request.QueryString nesnesinde bulunuyor. Burada bu bilgilerin daha önce görmediğimiz kısaltma yöntemiyle alınıp, sayfaya aktarıldığını görüyorsunuz; <%=Request("SecmeListesi")>, aslında;
Response.Write Request.QueryString(“SecmeListesi”)
ifadesinin kısaltılmışıdır.
FormOrnek.htm’in her üç formunda da bazı tercihler yaparak Gönder düğmesini tıkladığınızda, FormOrnek.asp’ye gönderilen URL bilgisine dikkat edin. İlk ikisinde sadece seçilen formun HangiForm değeri yer aldığı halde. üçüncüsünde formdaki bütün bilgiler burada URL-kodlanmış olarak yer alacaktır.
<asp0019>
<asp00208>
<asp0021>
Programın bilgi işleyen bölümünü kendiniz irdeleyebilir misiniz?
Konuk Defteri Uygulaması
Bu bölümde ilk tam ASP sitesini adım adım birlikte oluşturacağız; daha önce teorik veya kısaca uygulamalı gördüğümüz komutları, metodları ve ifadeleri toplu halde kullanma imkanı bulacağız.
Konuk Defteri, Internet sitemizi ziyaret edenlerle en kolay bilgi alışverişi yöntemidir; konuklarımız defterimize kendileri hakkında bazı bilgiler girerler. Burada yapacağımız örnekte, ziyaretçimize önce konuk defterimize bilgi girmek isteyip istemediğini soran bir sayfa sunacağız; burada konuk defteri bilgilerinin yer aldığı bir Form sayfasına gitmesini sağlayan köprü olacak. Form sayfamızdaki Gönder düğmesi tıklandığında bir ASP sayfası, Form’un yolladığı bilgileri ziyaretçimize gösterecek ve arzu ederse defterde yer alan diğer bilgileri okuma imkanı verecek. Ziyaretçimiz defterdeki diğer bilgileri okumak isterse, bir diğer ASP sayfası, bu bilgileri dosyadan okuyarak ziyaretçimize sunacak.
Birinci sayfamız burada basit bir HTMLsayfası ancak siz bunu isterseniz kendi ana sayfanızla bütünleştirebilirsiniz. Diyelim ki aşağıdaki kodu, konuk01.htm adıyla 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>Hoşgeldiniz!</CENTER></H1>
Konuk Defterimi imzalamak ister misiniz?
Çok teşekkürler
<p><A HREF="konuk02.htm">Deftere Git[/url]
</BODY>
</HTML>
Burada konuk defterini izmalamak isteyenler için konuk defterini içeren dosyaya bir köprü var. Aşağıdaki form da konuk defterimiz olsun! Bunu da konuk02.htm adıyla 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>
<H1><CENTER>Konuk Defteri!</CENTER></H1>
Konuk defteri sayfama hoşgeldiniz. Buraya kaydedeceğiniz bilgilerle birbirimizi daha iyi tanıma imkanı bulabiliriz.
<p>Çok teşekkürler</p>
<FORM ACTION="konuk_isle.asp" METHOD="post">
<p>Adınız: <INPUT TYPE="Text" SIZE="20" NAME="Adi"></p>
<p>Soyadınız: <INPUT TYPE="Text" SIZE="20" NAME="Soyadi"></p>
<p>E-Posta Adresiniz: <INPUT TYPE="Text" SIZE="20" NAME="Email"></p>
<p>Düşünceleriniz:
<TEXTAREA NAME="Mesaj" COLS="40" ROWS="4">Sitem hakkındaki düşünceleriniz</TEXTAREA></p>
<INPUT TYPE="Submit" NAME="Gonder" VALUE="Gönder!">&nbsp;<INPUT TYPE="Reset" NAME="Sil" VALUE=" Sil! ">
</BODY>
</HTML>
Burada oluşturduğumuz HTML alanlarından dördü, daha sonra işlenmek üzere, bize dört değişken verecek: Adi, Soyadi, Email ve Mesaj.
<asp0015.tif>
Aşağıdaki kod ile bu verileri işleyeceğiz. Bu kodları da konuk_isle.asp adıyla 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>Verdiğiniz Bilgiler:</h2>
Adınız: <%=Request.Form("Adi")%><BR>
Soyadınız: <%=Request.Form("Soyadi")%><BR>
E-Posta Adresiniz: <%=Request.Form("Email")%><BR>
Düşünceleriniz: <%=Request.Form("Mesaj")%><BR>
<p>
<%
Dim DosyaSistemi, KonukDosyasi
Set DosyaSistemi = CreateObject("Scripting.FileSystemObject")
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 teşekkür ederim.</H3>
<A HREF="konuk_oku.asp">Konuk Defterini Oku![/url]&nbsp;&nbsp;&nbsp;<A HREF="index.htm">Ana Sayfaya Dön![/url]
</BODY>
</HTML>
Burada biraz duralım ve konuk_isle.asp’yi irdeleyelim. Form’u oluşturan sayfamızda dikkat ettiğiniz gibi, verileri POST metodu ile alıyoruz; dolayısıyla Form’dan gelen bilgiler, Request nesnesinin Form kolleksiyonunda yer alıyor; ve önce bu bilgileri ziyearetçimizin Browser penceresine yazdırıyoruz. Ziyaretçimiz böylece ne bilgi verdiğini ber kere daha görmüş oluyor. Sonra, FileSystem nesnesini kullanarak, bu bilgileri Web Server’ın kök dizininde konuklar.txt adlı dosyaya eklettiriyoruz. Bu işlemi yapan WriteLine metodu, her bir değişkenin değerini yazdıktan sonra satır sonuna yeni satır karakteri girecektir. Yine Bu bilgilerin kaydedildiğini ziyaretçiye bildirdikten sonra, kendisine defterimizdeki diğer girdileri okuma veya ana sayfaya dönme seçeneğini veriyoruz. Ziyaretçi, defterdeki diğer bilgileri okuma seçeneğini seçecek olursa gideceği sayfanın kodları ise aşağıda. Bu kodları da konuk_oku.asp adıyla 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>
Bugüne kadar konuk defterimi imzalayan bütün dostlarıma teşekkür ederim.
<p>
<%
Dim DosyaSistemi, KonukDosyasi, Adi, Soyadi, Email, Mesaj
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 Dön![/url]
</BODY>
</HTML>
Şimdi de bu kodun üzerinde duralım: Yine FileSystem nesnesinin OpenTextFile metodu ile, mevcut konuk girdileri dosyasını açıyoruz; ve içeriğini Do döngüsü ile, dosya sonuna varıncaya kadar ReadLine metodu ile okutuyoruz. ReadLine, dosyayı satır –satır okuyacaktır; burada ”satır” ölçüsü, dosya başı ile satırsonu-yeni satır (CRLF veya enter/Return) karakteri, iki satırsonu arası, veya bir satırsonu ve dosya sonu işareti arasında kalan metindir. Dosyamızın her bir satırı bir değişkenin değeri olarak yazıldığına göre, okunan her satır sırasıyla, Adi, Soyadi, Email ve Mesaj değişkenlerine değer olarak kaydedilecek ve ziyaretçininin Brıowser penceresine yazılacaktır.
Bu ana kodun etrafında sayfalarını görsel olarak zenginleştirmek, tabiî sizin elinizde!
Veri Yönlendirmeli Web Uygulaması
Birinci kitapçıkta, ADO nesnesini tanıdık ve ne işe yaradığını gördük. Bu bölümde ADO nesnesinin nasıl kullanıldığını ele alacağız; bu amaçla veritabanına dayanan, HTML etiketlerinin içeriğini bir veritabanından alan ve ziyaretçinin girdilerini bir veritabanına yazan örnek uygulama oluşturacağız. Bunu yaparken ADO’yu tanıtırken ele almadığımız bazı SQL komutları ile tanışacağız.
Örnek uygulamamız, ünlü bir Web Tasarımcısının müstakbel müşterilerine randevu verdiği bir site olacak. Müstakbel müşterilerimiz, Web sitemize bağlanacaklar, nasıl bir Web sitesi oluşturmak istediklerini onlara sunacağımız bir listeden seçecekler; sitelerinin özelliklerini ve bizimle ilk görüşmeyi yapmak istedikleri zamanı belirtecekler; Web programımız, bütün bu bilgileri bir veritabanındaki veri tablolarına dayanarak müstakbel müşterimize seçenek olarak sunacak; ziyaretçinin kabul ettiği randevu zaman dilimini veritabanındaki tabloda başka müşterilere verilmemek üzere, kapatacak. Fakat bu işe başlamadan önce hızlı bir bir veritabanı oluşturma kursu görelim.
Veri için hazırlık
Kullanacağımız veritabanını burada MS Access ile oluşturacağız. Fakat siz istediğiniz herhangi bir programı, örneğin FileMaker Pro veya Paradox’u kullanabilirsiniz. Elinizin altında Oracle veya MS SQL Server varsa, onları kullanmanızdan daha tabiî bir şey olamaz.
İlişkilendirilmiş Veritabanı (Relational Database) deyimini daha öce duymuş olmalısınız. Web Programımızda, böyle bir veritabanı kullanacağız. İlişkilendirilmiş Veritabanı, bir dosya içinde tabloların en az bir sütunundaki kaydın diğer tablolardaki en az bir sütunla aynı olduğu ve bu iki sütun birbirine bağlanmış veritabanı demektir. (Bu örnekte kullanacağımız veritabanının Microsoft Access ile oluşturulmuş örneğini, bu kitapçığın kod örnekleri arasında bulabilir ve bilgisayarınızda kurulu bir veritabanı işleme programı ile inceleyebilirsiniz. Bu tabloları kendi programınızda oluşturmak isterseniz, kayıt alanları ve özelliklerini buradaki örneklere uygun olarak oluşturmalısınız.)
Veritabanı tablolarının ilişkilendirilme durumunu, oluşturacağımız veritabanının iki tablosu üzerinde gösterelim:
<musteri_tablo.jpg>
Bu tabloda, müşterinin kurmak istediği site türünü belirten bir endeks sütunu var: TurNO. (Daha sonra bu veritabanını yükleyeceğimiz Web Server’ın işletim sistemini bilmediğimiz için, Türkçe alfabeyi desteklemeyen bir Server’ın “Tablo veya Alan Bulunamadı” hatası vermesini önlemek için alan adlarında Türkçe karakter kullanmamaya özen göstermemiz gerekir.) Bu kayıt, Site Türleri tablosunda da var:
<tur_tablo.jpg>
Veritabanını oluştururken bu iki tabloyu TürNO sütunlarından ilişkilendirir ve ilerde veritabanına, “Bana, Müşteriler ve Site Türleri tablolarından TürNo sütunundaki veri aynı olan bütün kayıtları bul” şeklinde bir sorgulama emri (SQL JOIN komutu) verecek olursanız, Windows’un ODBC programı, veritabanını inceleyecek ve ortaya çıkartacağı verilerden biri şöyle olacaktır:
ADI   SOYADI   EMAIL   SİTENO   GRAFNO   TURNO   TURADI   TURRAYİÇ
Abdullah   Can   acan@sirket.com.tr   1   1   2   Intranet      4
Şimdi diyebilirsiniz ki, daha sonra iki tabloyu birleştirmek yerine, neden baştan tek tablo yapmadık da, ilişkilendirme ve bir bir yığın SQL komutu yazma (ve tabiî öğrenme) külfetine girdik? Bunun çeşitli sebepleri var: Bir kere veritabanı uzmanları, birden fazla tabloda aynen tekrar eden değerleri, ayrı bir tabloda toplamayı bilgisayarın bellek yönetimi açısından daha etkin bir çalışma tarzı sayarlar. İkincisi, fiyat belirlerken Intranet türü Web siteleri için uygulayacağımız katsayıyı ilerde değiştirmek zorunda kalırsak, (bu iş tutarsa, en kısa zamanda fiyatlara zam yapacağımız şüphesiz olduğuna göre!) ve elimizde içinde 1500 kayıt bulunan bir tablo varsa, herbirinde türRayiç sütundaki veriyi tek-tek güncelleştirmek çok zor olabilir. Oysa bu tür ilişkilendirilmiş bir veritabanında bir tabloda bir kaydı değiştirmekle, bir diğer tablodaki binlerce, hatta milyonlarca kaydı güncelleştirmiş oluruz. Siz kendi veritabanınızı oluştururken, hangi verilerin hangi tabloda toplanacağına ve hangilerinin ayrı tablolara konulacağına şu kriterle karar verebilirsiniz: Bir tablonun birincil endeksine bağımlı olmayan bütün bilgiler o tablonun dışına çıkmalıdır. (Bu kriter size bir ölçüde şifreli görünüyorsa, veritabanı oluşturma ve yönetme konusunda bir kitap edinmeniz yerinde olur!)
Veritabanı konularına aşina olmayanlar için bir iki noktaya daha açıklık getirmek gerekir. Tablolarımızın alan adlarını ve alanlardaki verilerin türlerini gösteren tabloya bakarsanız, bütün tablolarda bir sütunun “Birincil endeks” diye işaretlendiğini göreceksiniz. Bu alan, biri dışında bütün tablolarda otomatik sıra numarası şeklinde; Müşteri tablosunda ise müşterinin elektronik posta adresi şeklinde tayin edilmiş bulunuyor. Bu alanın varlık sebebi, kayıtlarımızda diğer bütün alanlardaki verileri aynı bile olsa her bir müşterinin ayrı bir varlık olarak korunmasını sağlar. (Tabiî, burada, iki müşterinin aynı elektronik posta adresine sahip olmayacağını varsayıyoruz!)
<randevu_tablo.jpg>
<siteler_tablo.jpg>
<olcu_tablo.jpg>
<graf_tablo.jpg>
İnşaata Başlarken
Biraz daha teknik olarak ifade edersek, inşa ettiğimiz programın (Web sitesinin) fonksiyonu, müşteriden bazı temel bilgileri alıp, bu bilgileri müşteri tablosuna işlemek, müşteriye bizim randevu defterimize (veri tabanındaki Randevu tablosuna) bakarak, boş bir zaman önermek, müşterinin kabul ettiği zaman dilimini Randevu tablosuna işlemek, ve bu zaman dilimini
BilX.Net

Çevrimiçi administrator

  • Administrator
  • General
  • *****
  • İleti: 24515
  • Karma: +3/-1
    • Profili Görüntüle
    • Toplist Ekle Site Ekle
Ynt: ASP KİTAP 2
« Yanıtla #2 : Nisan 30, 2009, 04:00:55 ÖS »
başkasına vermemek üzere kapatmak olacak. Biz, Web sitesi tasarımcısı olarak, sürekli, veritabanı dosyasını açarak, yeni randevu alan olup olmadığını kontrol etmek zorundayız. Yine arada bir, Randevu tablosuna yeni müşteri kabul edebileceğimiz boş zamanlarımızı eklememiz gerekir. Bu işlemi, örneğin Access programını kullanarak yapabiliriz.
Bu amaçla kullanacağımız tabloların ilişkilerini şöyle gösterebiliriz:
<relation.jpg>
Bu şemada görülen ilişkiler şu anda bir anlam ifade etmiyorsa, biraz sonra tablo çok daha aydınlanacaktır. Şimdilik, ya bu tablolara ve ilişkilere sahip bir veritabanı oluşturun; ya da örnek veritabanı dosyasını Kişisel Web Server’ın dizini içine kopyalayın.
ODBC’e Veritabanımızı Bildirelim
Windows’un Denetim Masası’nı açtığınızda, ya ODBC Data Sources, ya da ODBC(32 Bit) adlı bir simge göreceksiniz.
<DATA00001.TIF>
İkinci sekme olan System DSN’i açın ve Add (Ekle) düğmesini tıklayın. Açılacak kutuda, veritabanı dosyanıza uygun sürücüyü seçin. Bu kitapçığın örnek kodları arasında bulacağınız web.mdb adlı dosyayı kullanıyorsanız, Microsoft Access Driver adlı sürücüyü seçin) ve Son düğmesini tıklayın.
<DATA00002.TIF>
Açılacak kutuda Data Source Name (Veri kaynağının adı) kutusuna Web (veya kendi veritabanınızın adını) yazın, isterseniz Description kutusuna veritabanını tanımlayan bir kaç kelime yazabilirsiniz. Database bölümünde Select (Seç) düğmesini tıklayarak veritabanı dosyanızı bulun.
<DATA00003.TIF>
Şimdi, bilgisayarınızın ODBC arayüzü, Kişisel Web Server’ınız (vereceğimiz ASP komutları dolayısıyla) talep ettiği anda Browser’ınıza Web adlı veritabanından arzu edilen verileri seçip verecek veya bu dosyadaki tablolarda (yine ASP komutları ile talep edeceğiniz) güncelleştirmeleri yapacaktır.
<DATA00004.TIF>
Sıra Web Programı’nda
Kuracağımız sitenin işleyiş tarzını veya stratejisini bir kere daha belirtelim: Sitemize ev sahipliği yapan Web Server’da bir veritabanı dosyamız var ve elimizdeki iş durumuna göre randevu verebileceğimiz, serbest olduğumuz günleri bu veritabanındaki Randevu tablosuna işliyoruz. Ziyaretçilerimiz, ana sayfadan geçtikten sonra, bir Web sitesi yaptğrmek için bizimle görüşmek istiyorlarsa, bazı bilgiler veriyorlar ve bu bilgilere göre, Web programımız, müşteriye tanımladığı siteyi kaça yapacağımızı bildiriyor ve boş olduğumuz zamanların bir listesini sunuyor. Müşteri adayı, bu listeden kendisi için elverişli zamanı seçiyor. Web programımız müşterinin verdiği bilgileri veritabanına işliyor; ve müşterinin seçtiği zamanı randevu tablosunda kapalı hale getiriyor, ki aynı zaman aralığı başka bir müşteriye daha önerilmesin! (Aşağıda, sayfalarımızı adım-adım oluştururken, oluşturduğmuz bazı değişkenlerin ne işe yarayacağı o anda belli olmayabilir. Bunları anlamadan geçmemek için önerim, bu kitapçığın kodlarını edindiyseniz, veritabanını sisteminize tanıtarak, ilgili ASP programını index.htm’den başlayarak bir kaç kere çalıştırmanızdır.)
Önce index.htm sayfamızı yapalım. Bu basit bir “Hoşgeldiniz!” sayfası olacak. aşağıdaki kodu index.htm adıyla kaydedin:
<HTML>
<HEAD>
<TITLE>Web Sitesi Yapılır</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">






<center>
<table width="250">
<tr><td><font face="arial" size="6">Web Sitenize Sahip Olmak İstiyorsunuz?
</font>
<p><p><p><font face="arial" size="3">Ama nasıl? HTML, ASP, ADO, ODBC ve daha bir çok alfabe çorbası öğrenmek zorundasınız
<p>Ama bunları öğrenmeye zamanınız yok. Aslında öğrenirsiniz öğrenmeye, fakat zaman meselesi.
<p>Biz çook siteler yaptık, ve size de yardıma hazırız. Bizim işimiz Web sitesi yapmak!
<p>Sizin de sitenizi yapalım.
<p><p><center><a href="sayfa1.asp">Size de yardımcı olalım[/url]</center></font>
</td></tr></table></center>
</BODY></HTML>
<veriuyg0001.tif>
Bu sayfamızda verdiğimiz mesajı beğenen müstakbel müşterilerimiz, sayfadaki köprüyü tıklayarak, nereye gidecekler? Şu aşağıdaki kodun yer aldığı sayfaya. Bunu da sayfa1.asp adıyla 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>





<center><table width="250"><tr><td>
<font face="arial" size="6">Arzu ettiğiniz siteyi sür'atle oluşturabiliriz.<p>Önce
nasıl bir site istediğinizi 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"-->
Kullanılacak grafik malzemenin durumu: <!--#include file="grafikler.inc"-->




<p><input type="submit" value="Gönder" align="left"></p>   
</td></tr></form></TBODY></table></center>
</BODY>
</HTML>
“Bu sayfada ASP tekniği kullanmayı gerektiren hemen hemen hiç bir öge yok!” diyebilirsiniz; ama demeyin. İki haricî dosyayı #include yoluyla sayfaya eklediğimizi göruyor musunuz? Bu sayfanın bütün işlevi işte bu iki dosyada gizli!
siteler.inc ve grafikler.inc, veritabanından veri çeken ve bunu getirip yukarıdaki yerlere yazmakla görevli olacaklar. Önce siteler.inc’i yapalım:
<%
'Siteler tablosundan siteAdi sütunundaki 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 için su isi yap. %>
<% Do while Not siteler.eof %>
   <Option value = "<%= siteler(1) %>"><%= siteler(0) %></Option>
   <%siteler.MoveNext
Loop%>
</select>
<% siteler.close %>
Hatırlarsanız, #include yoluyla sayfaya eklenen dosyanın içeriği ne ise aynen bu komutun olduğu yere yazılmış gibi olur, demiştik. sayfa1.asp’ye bakın; ve yukarıdaki kodu tam siteler.inc’in olduğu yerde düşünün. Şimdi siteler.inc, tek bir iş yapıyor: web isimli DSN’in verdiği bilgiler arasından Siteler tablosundan siteAdi ve siteNo sütunlarındaki bütün bilgileri çekiyor ve bunu HTML’in SELECT etiketinin içini doldurmakta kullanıyor. OPTION’ın nasıl yazıldığını hatırlıyorsunuz değil mi?
Şimdi siteler.inc’in içine bakabiliriz. Önce “SELECT siteAdi, siteNO FROM Siteler” ifadesini ele alalım. Bu, yukarıda sözünü ettiğimiz SQL dili ile, Windows’un ODBC arayüzüne vereceğimiz VBScript komutudur. Peki, bu edindiğimiz veriler nerede duruyor? ASP’nin çalıştığı Web Server’ın bulunduğu işletim sisteminin RAM’inde (veya sanal belleğinde) oluşturulan geçici bir tabloda duruyor. Veritabanındaki Siteler tablosunda birinci sütunda siteNo, ikinci sütunda ise siteAdi alanları var. Burada önce siteAdi’ni okutuyoruz; yani dizi değişkenin siteler(0) adlı birinci ögesi site türü adını, siteler(1) adlı ikinci ögesi ise bu türün numarasını tutuyor. Nitekim, bir Do döngüsü ile bu değerleri SELECT’in ögeleri olarak kullandığımızda önce OPTION’ın VALUE özelliğini siteNo, metnini ise siteAdi ile dolduruyoruz. Ve tabiî açtığımız veri bağlantısını kapatıyoruz: “siteler.close”.
Şimdi sayfa1.asp’nin ikinci haricî dosyası olan grafikler.inc’i yazalım:
<%
'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 seçenek kutusu yap. %>
   <Option value = "<%= graf(0) %>"><%= graf(1) %></Option>
   <%graf.movenext
loop%>
<% graf.close %>   
</select>
Bu dosya üzerinde uzun uzadıya durmaya gerek yok; yine aynı DSN’den, fakat bu kez veritabanıın Grafik tablosundan iki alandaki verileri çekiyoruz; Do döngüsü ile yeni bir SELECT’in içini dolduruyoruz. include dosyaları ile birlikte bu sayfa şu görüntüyü veriyor:
<veriuyg0002.tif>
sayfa1.asp’deki formun Gönder düğmesi tıklandığında bu bilgilerin GET metoduyla sayfa2.asp’ye gönderileceğini hatırlayacaksınız. O halde, bu HTML kodunu, sayfa2.htm adıyla 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")
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">




<center>
<table width="250"><tr><td>
<font face="arial" size="6">Arzu ettiğiniz <%= siteadi(0) %> sitesini tasarlamaya hazırız.
<p>Bu sitenin kullanım amacı hakkında 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 Tür tablosundan bilgi seç. %>
<!--#include file="turler.inc"--> &nbsp;
<input type="Submit" value="Gönder" align="LEFT">
</form></td></tr></table></center>
</BODY>
</HTML>
sayfa1.asp, ziyaretçimizin Form’da yaptığı iki seçimin değerini sayfa2.asp’ye gönderdiğinde, sayfa2.asp bunları otomatik olarak kullanamaz; bilgiler GET yoluyla geldiği için QueryString değişkeninin içine yazılacak bu bilgileri bizim kullanılır hale getirmemiz gerekir. Yukarıdaki kodun şu satırları bu işi yapıyor:
siteNO=Request.Querystring("siteNO")
grafNO=Request.Querystring("grafNO")
sayfa1.asp’nin gönderdiği siteNo ve grafNo değişkenlerinin değerleri (bu kez bu sayfanın aynı isimdeki) değişkenlerine değer olarak atanıyor. sayfa2.asp’de yapacağımız veri işlemlerinde bu değerleri ölçüt olarak kullanacağız:
SQLSITEADI="SELECT siteAdi FROM Siteler "
SQLSITEADI=SQLSITEADI & "WHERE siteNO= " & siteNO
Burada aslında tek sorgu deyimi oluşturduğumuz halde, derdimizi neden iki ayrı satırda anlatıyoruz? Daha önce yazdığımız sorgu deyimlerine bakın? Tümü çift tırnak içinde değil mi? Peki, burada siteNo değişkenini tırnak içine alırsak ne olur? Değişken, değişken olmaktan çıkar; metin olur; oysa biz burada siteNo değişkeninin vereceği değeri kullanmak istiyoruz. Bu yolla veritabanından çekeceğimiz değeri hemen aşağıda metnin içinde kullanacağız:
Arzu ettiğiniz <%= siteadi(0) %> sitesini tasarlamaya hazırız.
Sadece bir değer istediğimiz ve bu değiri ihtiyacımıza uygun seçtiğimiz için veri okutma işini döngüyle yapmıyoruz bu kez; okunan ilk değeri Response.Write metodunun kısaltmasıyla, sayfaya gönderiyoruz. Bu arada ziyaretçimizden ek bilgi almaya devam ediyoruz; yeni bir haricî dosya ile bu kez size tasarlatmak istedikleri sitenin türünü soruyoruz; bu bilgileri ise turler.inc sağlıyor:
<%
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 alanlarındaki değerleri alıyoruz ve OPTION etiketinin içini dolduruyoruz. Devam etmeden önce sayfa2.asp’de dikkatinizi çekmiş olması gereken şu iki satıra dönelim:
<input type="Hidden" name="siteNO" value="<%= siteNO %>">
<input type="Hidden" name="grafNO" value="<%= grafNO %>">
HTML’den hatırlayacaksınız, Form’un içinde Server’a “gizli” (HIDDEN) türü değişken ve değer gönderebiliriz. Buradaki “gizli” kelimesi sizi aldatmasın; Form bir HTML ögesidir ve ziyaretçi Browser’ının kaynağı görüntüleme aracı vasıtasıyla gizli-açık herşeyi görebilir. Buradaki gizlilik sadece bu değişkenlerin sayfada görüntülenmemesinden ibarettir. Bu iki sözüm-ona gizli değişkene, taa kodumuzun başında elde ettiğimiz siteNo değişkeni ile biraz önce veritabanından çektiğimiz grafNo değişkenlerini atıyoruz. (Merak etmeyin! Hepsini daha sonra kullanacağız.)
<veriuyg0003.tif>
Ve bu kullanımı, Form’umumuzun ACTION özelliğinde adı yazılı olan icra.asp yapacak. Şu uzunca kodu bu isimle kaydedin:
<%@ Language = VBscript %>
<%
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
%>

<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">




<center>
<table width="250"><tr><td>
<font face="arial" size="6">Çok güzel!<p>Grafik malzemesi <%= grafdurum %> olan <%= siteadi %> ve <%= turadi %> amaçlı bir Web sitesi, için ücret US$<%= bedel %> olacaktır.</font></td></tr></table>




<table width="500"><tr><td width="150" valign="top"><font face="arial" size="5">İlk görüşme için iki saatlik randevu almanız gerekir.</font>
<p><font face="arial" size="3">(Açık olan randevu tarihi ve saatinden beğendiğinizi tıklayınız)</font></td>
<td width="50"></td>
<td width="300" valign="top"><!--#include file="rand.inc"--></td></tr></table>
</center>
</BODY>
</HTML>
Adı icra.asp olduğuna göre, bu sayfa çok iş icra ediyor olsa gerek! Gerçekten de bu sayfa, daha önceki sayfalarda elde ettiğimiz bütün bilgileri kullanarak ziyaretçi sitesini kaç paraya yapacağımızı hesap edecektir. icra.asp, önce Querystring’den alacağı bilgileri, kendi işine yarayacak değişkenlere yerleştirecek ve bunlarla üç katsayı hesaplayacak ve bu katsayıları kullanarak müşterinin sitesi için bir bedel çıkartacak (“bedel = 100 * turkatsayi * grafkatsayi * sitekatsayi”). Sonra “bedel” değişkeninin içindeki değeri müşteriye Dolar olarak bildirecek (Bedel formülünde 100 yerine mesela 600000 rakamını, veya bu işi yaptığınız andaki Dolar’ın TL cinsinden kurunu gösteren rakamı, kullanarak, fiyatı Dolar yerine TL olarak da bildirebilirsiniz). icra.asp daha sonra rand.inc’in yardımıyla veritabanından boş saatlerimizi seçerek müşteriye randevu alması için sunacaktır. rand.inc, veritabanımızın Randevu tablosundan serbest zaman dilimlerini okumak ve elde edeceği sonucu icra.asp programına vermektedir. Şu kodu rand.inc adıyla 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)
%>
<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) %>[/url]

<%rand.movenext
loop%>
</font>
<% connrand.close
SET connrand = Nothing
%>
Bu haricî dosyamız, öncekilerden farklı: bir OPTION etiketini değil; fakat bir Anchor etiketinin içini dolduruyor. Bu etikete dikkat edersek, HREF özelliğinin değeri olan rezerv.asp’ye aslında bir çok bilginin gönderilmesine de yaradımcı oluyor, Herhangi bir ziyaretçinin seçimleri sonucu oluşacak bir örnek şu olabilirdi:
<a href="rezerv.asp?siteNO=1&grafNO=1&turNO=1&randNO=10&randRayic=500"> 05.05.2000 14:00:00[/url]

<veriuyg0004.tif>
Bu, rezervasyon yaptıracak olan sayfaya, siteNo, grafNo, randNo ve biraz önce hesapladığımız randRayic değişkenlerini gönderiyor. Bu sayfa ise, aşağıdaki kodlarla kaydedeceğimiz 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)
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">




<center>
<table width="250"><tr><td>
<font face="arial" size="6">Lütfen elverişli randevu zamanı olan<font color="blue"><%= randzaman %></font> için 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">Adınız
<p><input type="Text" name="soyadi" size="20">Soyadınız
<p><input type="Text" name="email" size="20"> e-adresiniz
<p><input type="Submit" value="Gönder">
</form>
</td></tr></table>
<p><p></center>
</BODY>
</HTML>
Gerçi bu sayfanın sadece ziyaretçiye seçtiği randevu tarih ve saatini bildirdiğini ve ziyaretçiden bize adını, soyadını ve elektronik mektup adresini vermesi istediğini göreceksiniz, ama gerçekte bu sayfa şu ana kadar oluşturduğumuz veri kümesini veritabanına yazmak üzere hazırlık yapmaktadır. Gizlenmiş (HIDDEN) değişkenlerin görevi bu.
<veriuyg0005.tif>
Derlenen bu değişkenlerin tümü, ziyaretçinin gireceği bilgiler dahil, guncelle.asp’ye gönderilecek. O halde o kodu yazalım:
<%@ 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

connupdate.execute(SQLUPDATE)
connupdate.close
SET connupdate = Nothing

URL="son.asp?adi=" & adi
Response.Redirect (URL)
%>
Programı çalıştırdıysanız, guncelle.asp’nin Browser’ın yüzünü bile görmediğini farketmiş olmalısınız; Yukarıdaki kodun, ziyaretçiye kendi yerine başka bir sayfayı gönderdiğini nereden anlıyoruz? En sondaki “Response.Redirect” komutundan. Bu komut ziyaretçiye, son.asp sayfasını yolluyor. Fakat bu sayfaya geçmeden önce yaptığımız güncelleme işleminin üzerinde duralım. Bu programda uzunca bir SQL INSERT deyimi hazırlıyoruz:
INSERT INTO Musteriler (adi, soyadi, email, siteNO, grafNO, turNO) VALUES (adi, soyadi, email, siteNO, grafNO, turNO)
Daha önce SQL dilinin SELECT deyimini öğrenmiştik. INSERT de bir veritabanına veri ekleme işini yapan SQL deyimidir. Deyimin INTO bölümüne tablonun adını ve hangi alanların bulunduğunu; VALUES bölümüne ise bu alanlara atayacağımız değerleri yazarız. Bizim programımızda değerler, değişkenlerden alınacağı için dikkatli bir yazma işlemi gerekiyor. Bu yüzden değişken adları ile & (ve) işareti ve virgülü birbirinden kolayca ayırt etmek için uzunda bir yazma yöntemi kullanıyoruz. Hazırladığımız bu deyimle yeni müşteriyi müşteriler tablosuna ekliyoruz. Programımızda bir de SQL UPDATE deyimi var. Bu deyimle, mevcut Randevu tablomuzda müşterinin seçtiği zaman aralığına ait girdiyi, SERBEST’ten DOLU’ya çeviriyoruz ve bu zamanı kime ayırdığımızı, bu görüşmenin saat ücreti olan rayici tabloya işliyoruz. Bu amaçla oluşturduğumuz SQL UPDATE deyimi şöyle gösterilebilir:
UPDATE Randevu SET email = "email", randNezaman = "simdi", randDurum = "DOLU", randRayic = "randRayic" WHERE randNO = "randNO"
SQL’in UPDATE deyiminin de bölümleri vardır. SET bölümünde hangi alana ne değeri gireceğimizi belirtiriz. Normal bir SQL deyiminde alan adının kanşısına bu alana yazılacak değer girerken, burada olduğu gibi değerleri değişkenlerden de alabiliriz. Burada gösterilen kelimeler değişken adı ise tırnak dışında yazılmalıdır. Bunu sağlamak ve aralarına gereken virgülleri koyabilmek için, yine uzunca bir deyim yazıyoruz.
Şimdi, aşağıdaki kodu son.asp adıyla kaydedelim:
<%@ Language = VBscript %>
<%
adi=Request.Querystring("adi")
%>
<html>
<head>
<title>Randevunuz Kesinlesti</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">





<center>
<table width="250">
<tr><td><font face="arial" size="6"><%= adi %>, sizinle verimli bir işbirliği yapacağımızdan eminiz. Çok teşekkürler. Görüşmek üzere.</font></td></tr>
</table>
</BODY>
</html>
Bu sayfa, ziyaretçimize bir önceki sayfada kaydettiğimiz adi değişkenin değeri alarak, yani müşteriye adıyla hitabediyor ve randevusunun kesinleştiğini bildiriyor; ve veri-yönlendirmeli Web uygulamamızın da sonu oluyor.
<veriuyg0006.tif>
İşte hepsi bu. Ziyaretçimizden veri aldık; veritabanından veri çektik; bunları sayfalarımızda kullandık ve veritabanına işledik. Fakat bu ASP programlarında, veritabanıyla ilgili unsurların dikkatten kaçmaması için, güvenlikle ilgili önlemler alınmadığına, ziyaretçinin girdiği değerlerin denetlenmediğine dikkat etmiş olmalısınız. Normal olarak Internet’e koyacağımız ASP programlarımızda güvenlikle ilgili bölümler olması gerekir. Bu ve diğer program-konulu unsurları son bölümde ele alacağız.
ASP’de Güvenlik
Internet’te iyiniyetli olunmaz. Acı, ama gerçek. Internet’e içine zararlı kod yerleştirilebilecek bir Form koyarsanız, emin olmalısınız ki, birisi bu zararlı kodu koyacaktır. Sadece kötüniyetli kişilerin size söz gelimi elektronik posta adresi veya mesaj görünümünde zararlı kod göndermesini önlemek için değil, fakat normal kullanıcıların yapabilecekleri sıradan hataları yakalamak ve düzeltmek için de önlem almanız gerekir.
Server güvenliği son derece önemli bir konu olmakla birlikte, bunu sağlamak genellikle tasarımcının sorumluluğunda değildir. Bununla birlikte sayfalarımızın ve veritabanımızın güvenliği ve Web uygulamalarımızın doğru işlemesi bizden sorulur.
Bir form ile sizin sayfalarınıza veya veritabanınıza ne gibi zararlar verilebilir? Bu zararların başında, en hafifinden sizin sayfanızı başka yere yönlendirmek gelebilir. Kötüniyetin ölçüsü arttıkça bu, Server programının açıklarından yararlanarak, Server’daki dosyaları değiştirmeye veya tahrip etmeye kadar gidebilir. Normal ziyaretçi hataları arasında ise sözgelimi elektronik posta adresini iki @ işaretiyle yazmaktan tutun, bu işareti koymamaya, metktubun gideceği bilgisayarın adresini eksik yazmaya kadar uzanan bir dizi yanlışlık bulunabilir. Ziyaretçiler formu eksik doldurabilirler. Bu gibi eksiklikler ve yanlışlıkları daha sonra düzeltmek zaman kaybına yol açar. Kimi zaman eksik doldurulmuş bir Form, bu bilgilerin ulaştırılacağı ASP programında hataya yol açabilir. Bu sebeple, özellikle Form yoluyla alınan bilgilerin denetimi ve doğrulatılması şarttır.
Bir Form’un içerdiği bilgilerin denetimi ve doğrulanması iki yerde yapılabilir: istemci-tarafında, sunucu-tarafında. İstemci tarafında, yani ziyaretçiye göndereceğimiz HTML sayfasının içinde yer alan kodlarla yapacağımız denetim-doğrulama, hızlı çalışır; ve ziyaretçi ile sunucu arasında iletişim kurulmadan önce yapılır; böylece ziyaretçinin sözgelimi gönder düğmesini tıkladıktan sonra çok beklemesi gerekmez. Ne var ki bu yöntemde denetim-doğrulama kodu ziyaretçiye gönderilmiştir; kötü niyetli kişi neyi denetlediğinizi görecek ve isterse bu denetimi kaldıracak size zararlı kod parçacıkları gönderebilecektir. Denetimin sunucu tarafında yapılması, belki biraz daha fazla zaman harcamayı gerektirir, fakat güvenlik açısından daha etkili olabilir.
Bu bölümde ASP programlarınızın güvenliği ve etkinliği açısından almanız gereken bir çok önlemden ikisini, elektronik posta adresi doğırulama ile mesajların içinden zararlı kodları ayıklama yöntemlerini görelim.
Elektronik Adres Doğrulama
Ziyaretçimizin doğru adres verdiğini, bu adresin geçerli bir elektronik posta alıcısına ait olduğunu doğrulamamız mümkün değil, ama en azından adresin doğru yazılıp yazılmadığını denetleyebiliriz. Bunu yapmanın bir yolu elektronik adresin içinde @ karakteri ile en az bir adet nokta bulunduğunu garantilemek olabilir.
Bunu denetleyecek kodu içeren aşağıdaki örnek kodu email.asp adıyla kaydedin:
<% @Language = VBscript %>
<HTML>
BilX.Net

Çevrimiçi administrator

  • Administrator
  • General
  • *****
  • İleti: 24515
  • Karma: +3/-1
    • Profili Görüntüle
    • Toplist Ekle Site Ekle
Ynt: ASP KİTAP 2
« Yanıtla #3 : Nisan 30, 2009, 04:01:11 ÖS »
<HEAD>
<TITLE>E-Mail Form’u</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 aldık; teşekkür ederiz.<BR>"
'   .....[BURAYA DIĞER KODLAR GİRECEK]........................
 Else   
  Response.Write strEmail & " adresi doğru görünmüyor.<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 diğer unsurları girecek - - >
<INPUT Type=Submit Value="Gönder">
</FORM>
<SCRIPT RUNAT=SERVER LANGUAGE=VBScript>
Function dogruMu (byval adres)
 AtIsareti=0          'sayaç olarak kullanacağımız
 Nokta=0         'değişkenleri sıfırlayalım
 dogruMu=false        'Fonksiyonun değerini yanlış olarak belirleyelim
 KacKarakter=len(adres)     'adresin boyutunu bir değişkene atayalım
 For i=1 to KacKarakter    'döngüyü başlatalım
  karakter=mid(adres, i, 1)    'sayacın gösterdiği karakteri alalım
  if karakter="@" then      '@ işareti olup olmadığına bakalım
   AtIsareti=AtIsareti + 1    '@ işareti ise sayacı bir arttıralım
  End If
  if karakter="." Then        'nokta işaretini arayalım
   Nokta=Nokta + 1     'nokta ise nokta sayasını bir arttıralım
  End if
 Next               'bir sonraki karaktere geçelim
If AtIsareti=1 and Nokta >0 Then   'Bir @ ve en az bir nokta olduysa
dogruMu=true         'Fonksiyonun değerini doğru yapalım
End If
End Function
</SCRIPT>
</HTML>
Bu programı, bu şekliyle sınama amacıyla çalıştırabilirsiniz. Fakat daha sonra programlarınızda kullanmanız gerekirse, bazı değişiklikler yapmanız gerekir. Bu değişiklikleri kodu inceledikten sonra ele alalım.
Sayfamızda tek elemanlı bir Form var ve sınama amacıyla buraya elektronik posta adresimizi yazabiliriz. Sayfa açıldığında çalışan VBScript’in kendi-içinde varolan isEmpty fonksiyonunu bir If döngüsü içinde çağırarak, kendi içindeki formdan kendisine bir değer gelip gelmediğine bakacak; değer olmadığını görünce formu sunacaktır. Forma herhangi bir şey yazıp, Gönder düğmesini tıkladığımız zaman ASP kodumuz, bu kez dogruMu adlı fonksiyona formdan gelen Email değişkeninin değerini vererek sonucu bekleyecektir.
<aspguv0001.tif>
dogruMu fonksiyonu güvenlik kaygısıyla Server’da çalışan sunucu-tarafı Script’tir; metni ve sonuçları kesinlikle kullanıcıya gönderilmeyecektir. Bu fonksiyon, kendisine aktarılan değişken değerinde, içiçe iki If döngüsü ile @ ve nokta işaretlerini arayarak sayacaktır. Bu sayımın sonucu iki değişkenin değerleri arzu ettiğimiz sayıda (AtIsareti bire eşit ve Nokta sıfırdan büyük) ise kendisini çağıran satıra True (doğru), değilse False (yanlış) değerini gönderecektir. Biliyoruz ki, bir fonksiyon doğru sonuç verirse, If döngüsü birinci komuttan, yanlış sonuç verirse Else bölümünden yoluna devam eder. Bu örnekte, dogruMu fonksiyonu doğru sonuç verirse Response.Write metoduyla Browser penceresine elektronik posta adresinin alındığına ilişkin teşekkür mesajı yazdırılacak; yanlış sonuç verirse, adresin yanlış olduğu bildirilecektir.
Gerçek Internet uygulamasında bu tür bir sınama yapacağınız zaman, yukardaki programın fonksiyonu içeren SERVER SCRIPT (“<SCRIPT RUNAT=SERVER....>” diye başlayan ve “</SCRIPT>” diye biten) bölümünü aynen sayfanızın herhangi bir yerine koyabilirsiniz. Daha sonra ziyaretçiden gelecek elektronik posta adresine göndermede bulunduğunuz ilk yerde ve bu adresi tutan değişken ile herhangi bir işlem yapmadan, örneğin veri tabanına yazmadan veya programın içinde bir başka şekilde kullanmadan önce, sadece şuna benzer bir kod bölümü yazmanız yeter:
strEmail = Request.Form("Email")
 If dogruMu(strEmail) Then
.....[BURAYA KODLAR GİRECEK]........................
 Else   
  Response.Write strEmail & " adresi doğru görünmüyor.<BR>"
 End If
Programınızın gereği olarak döngünün ELSE bölümünü değiştirebilirsiniz.
Zararlı Kod Temizleme
ASP-uyumlu Server dendiği zaman akla ilk gelen Microsoft Internet Information Server, site güvenliği açısından sürekli sınanan ve açığı bulunduğu taktirde MS’un yama programları ile bu açığı giderilen bir sunucu programı olarak bilinir. Bu, IIS’in ve diğer MS ürünü Web sunucu programlarının (MS Site Server ve MS Transaction Server ürünlerinin) “kurşun geçirmez” olduğu anlamına gelmez. Fakat sunucu program üreticisi ne kadar önlem alırsa alsın, sizin sitenize, kulllanıcıların yollayacağı zararlı kodları önlemeye çalışmayacaktır. Bu bir zorunluktur. Sizin için zararlı kod sayılan metin, bir başka Internet sitesi için normal kullanıcı girdisi olabilir. Server programını geliştirenler sizin ne tür girdiyi zararlı sayacağını bilemezler. Bunu siz bilmek zorundasınız.
Son yılların deneyimleri gösteriyor ki, başka yollarla Internet sitenizin kök dizinine ulaşmaya çalışan Hacker tiplerin dışında kalan zararlı kullanıcılar (Hacker özentisi kişiler!), genellikle bir veritabanına gittiğini anladıkları Form bilgilerinin içine Server Side Include (sunucu tarafında çalışacak haricî dosya) içeriği görevini yapacak kod parçacıkları katabilirler. Bu amaçla kullanılabilecek 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 bütün zararı, içerdiği veritabanını ASP sayfasının herhangi bir etiketi içinde kullanıldığı taktirde ziyaretçiyi burada yazılı URL’e götürmesi ve buradaki sayfayı Browser’ınızda görüntülemek olacaktır. Acemi Hacker’ın ziyaretçinizi zorla götürdüğü yeni Internet sitesi, sadece içerik bakımından sakıncalı olmayabilir; ziyaretçiniz açısından gerçekten tehlikeli bir alan olabilir; göndereceği çerezlerle (cookie) ziyaretçinin bilgisayarında zararlı işler yapabilir. Ziyaretçi bu tuzağa sizin sitenizde bulunduğu sırada düştüğü için, sorumluluk, en azından manevi olarak, size ait demektir.
Zararlı kodlar genellikle bu örnekte olduğu gibi büyüktür-küçüktür işaretleri, düz ve ters bölü ile kesme işareti içerir. Örneğin bir konuk defterinde ziyaretçimizden ne gibi bilgi istersek isteyelim, yazacağı metinde “<” ve “>” işaretlerinin bulunmaması gerekir. Normal bir mesajda, ancak kod yazarken kullanılan bu işaretlerin yeri olamaz. Hatta daha hassas bir düşünceyle, normal ve kısa bir konuk defteri mesajında tek ve çift tırnak, noktalı virgül satır başı (CR) ve yeni satır (LF) işaretleri de bulunmamalıdır. Eğer normal bir ziyaretçi bu gibi işaretlerle dolu bir mesaj yazmışsa, kötü niyetli kişilere karşı alacağımız önlemlerle bu iyiniyetli mesaj da yazarının verdiği biçimi kaybedecektir. Bir kaç ziyaretçimizin konuk defterine fiyakalı yazılar yazmasını sağlamak için, güvenlikten vaz geçmemek gerektiğine göre, “Kurunun yanı sıra yaş da yanar!” demekten başka bir çare düşünmek kolay değil!)
Daha önceki bölümlerde yazdığımız kodları hatırlıyorsanız (veya kimse bakmazken o sayfaları çevirir bakarsanız!), ziyaretçilerimizin Form yoluyla gönderdikleri verileri iki yolla alır ve bir değişkene yazarız: QueryString ve Request.Form. İşte size bir Internet’te gerçekten kullanılan bir konuk defterinin konuk girdilerini veritabanına işleyen bölümü:
<%
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)
%>
Tasarımcı, Form’dan gelen üç değişkenin (Isim, MailAdr ve Mesaj) değerini, yeni üç değişkene atamakta ve bunları oluşturduğu SQL INSERT deyimi yoluyla “misdefter” adlı veriye yazdırmaktadır. Tasarımcının dünyayı sadece iyi insanlardan oluşan bir cennet sandığı, kendisini tanımasanız bile, bu koddan anlaşılıyor. Dünyayı cennet yapmak elimizde olmakla birlikte, henüz bütün insanlar bu konuda görüşbirliği içinde olmadığına göre, ziyaretçiden gelen Form değişkenlerini atadığımız yeni değişkenlerin değerlerini elden geçirmeli ve içindeki zararlı kodları ayıklamalıyız, ki sonra misafir defteriniz kevgire dönmesin!
Bu işlemi, sözgelimi yukarıdaki kodun sadece birinci değişkeni (Ad) için yapalım. Buradaki Ad = Request.Form("Isim") satırını atacağız ve yerine şu 14 satırı koyacağız:
Ad = Trim(Request.Form("Isim"))'önündeki sonundaki boşluklari atalım
If Len(ad) Then
'**************** BURADA ISTENMEYEN KARAKTERLERI AYIKLIYORUZ ******************
 Ad = Replace(Ad, Chr(10) , "") 'satır başı
 Ad = Replace(Ad, Chr(34) , "") 'çift tıarnak
 Ad = Replace(Ad, "'" , "")   'tek tırnak
 Ad = Replace(Ad, Chr(13) , " ") 'yeni satır
 Ad = Replace(Ad, "<" , " ")   'küçüktür
 Ad = Replace(Ad, ">" , " ")   'büyüktür
 Do While Instr(Ad, " ")    'iki aralık
  ad = Replace(Ad, " " , " ")
 Loop
 Ad = Trim(Ad)  'önündeki sonundaki boşlukları da attık mı tamam
 End If
Bu kod, Ad değişkenini, VBScript’in kullanılmaya hazır Replace() fonksiyonundan geçirerek, içindeki istenmeyen karakterleri ya yok edecek ya da aralıkla değiştirecektir. Böylece eğer kötüniyetli bir kişi, Form bilgisi olarak bize kod olarak kullanılacak bir takım metinler yollamışsa, kodun ana içeriği yerinde kalmakla birlikte, kod olarak kullanılmasını sağlayacak işaretler yok olacağı için kod düz yazıya dönmüş olacaktır.
ADO Güvenliği ve Hata Mesajları
MS Internet Information Server (IIS) ve diğer Web Server programları, istemcinin siteye gönderebileceği talepleri hem kendi açılarından, hem de işletim sistemi açısından belirleme ve sınırlama imkanı sağlarlar. Windows NT işletim sistemi bakımından Internet ziyaretçisi herhangi bir ağ kullanıcısından farksızdır ve ulaşabileceği sayfalar (dosyalar) ve bu dosyalarla yapabileceği işler, “Internet Kullanıcı Hesabı” denen kullanıcının haklarına bağlıdır. IIS’i kuran Web Yöneticisi, bu hesaba istediği gibi haklar kazandırabilir veya sınırlamalar getirebilir. Burada iki noktayı birbirinden dikkatle ayırmak gerekir:
Web ziyaretçisinin bir Web Sitesi’nde kullanabileceği haklar HTTP kaynakları ile sınırlıdır. İşletim sistemi ile ilgili haklar bunun dışındadır. Fakat ikisinin çakıştığı nokta, özellikle veritabanına dayanan Web sitelerinde, veritabanı dosyasının güncelleştirilmesi sırasında ortaya çıkar. HTTP’nin ziyaretçiye sağlayabileceği bütün okuma-yazma hakları tanınsa bile, işletim sistemi bir veritabanı dosyasının yeniden yazılmasına izin vermeyebilir.
Bunu, önceki bölümlerde veritabanı dosyasını güncelleştirme örneklerini yeniden çalıştırarak sınayabilirsiniz. Kullandığınız veri tabanını sözgelimi Windows Gezgini’nde bulun ve sağ tıklayarak “Salt okunur” hale getirin ve ilgili ASP programını çalıştırın; ODBC hata mesajı verecektir.
Bu noktada Web Tasarımcısı olarak akılda tutacağımız ilke şudur: HTTP izinleri ne olursa olsun, eğer işletim sisteminin izinleri daha kısıtlayıcısı ile, işletim sisteminin dediği olur.
Tasarımcı olarak bunun bize etkisi, genellikle Web sitemize evsahipliği yapan Server işletmecisinin veritabanı dosyalarımıza yazma-okuma izni vermesini sağlamaktır. Web sitesi evsahibi (Hosting) firması, veritabanı dosyasına DSN ayarı yaparken bu izni verecektir. Ancak DSN kaydı yaptırıldığı halde veritabanınız ziyaretçilerinize ODBC hata mesajı veriyorsa evsahibi firmanın yönetimine, veritabanı dosyasının “haklarını” yeniden belirlemesini hatırlatmanız gerekebilir.
Veritabanı ile yönlendirilmiş Web sayfalarımızda en sık aldığımız hata mesajı:
[Microsoft] [ODBC Driver Manager] Data source name not found
olsa gerek. Bu mesaj, veritabanının ODBC’ye tanıtılması ile ilgili işlemde arıza olduğunu gösterir. Ya veritabanı dosyasının sürümü, ODBC sürücülerinin kapsamı dışındadır, ya da ODBC sürücüleri eksik kurulmuştur. Bunu, Windows’un Denetim Masası’nda ODBC Yönieticisi’ni çalıştırarak ve sürücüler sekmesini seçerek denetleyebilirsiniz.
Bir diğer sık alınan hata türü ise 80004005’dir. Bu hatanın bir kaç türü 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 mesajına bir kaç farklı durum sebep olabilir:
1. Internet kullanıcısına veritabanının işletim sistemi düzeyinde yazma-okuma yetkisi verilmemiş olabilir.
2. Veritabanının bulunduğu dizinin işletim sistemi açısından dosya oluşturma ve silme yetkileri yoktur.
3. Veritabanının bulunduğu dizin bir ağ sabit diskinde ise Internet kullanıcısının bu diske erişim hakkı yoktur.
4. DSN oluşturulurken veritabanı salt okunur veya Exclusive olarak işaretlenmiş olabilir.
5. O anda dosyaya Server tarafında InterDev gibi bir Web Tasarım Programı erişiyor olabilir.
6. Sözkonusu Access dosyası, bulunduğu ağda yerel kullanıcıların hizmetine açık olabilir.
Bu sorunların çözümü için ODBC yapılandırma işleminin dikkatle yeniden tekrarı ve özellikle sabit disk izinlerinin gözden geçirilmesi gerekir. Bu hata mesajını evsahibi firmanın bilgisayarından alıyorsanız; Web Server yönetimine yeniden başvurmanız şarttır.
Microsoft OLE-DB Provider for ODBC Driver error ‘80004005’ [Microsoft][ODBC Microsoft Access 97 Driver] Couldn’t use the file ‘(unknown)’; the file already in use
Bu hata mesajının tek sebebi veritabanı dosyasının birden fazla kullanıcı tarafından kullanılmasını önleyen kilit deyimlerinin kullanılmış olmasıdır. Çözümü, dosya ile ilgili .Recordset deyiminin kilidi önleyecek şekilde yazılmasından 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 bağlantısı kuracak Connection komutu, Global.asa dosyasından alınmak isteniyorsa ve IIS Global.asa dosyasını çalıştıramıyorsa bu hata mesajıyla karşılaşırsınız. Global.asa dosyasında şu kodun bulunup bulunmadığını 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 almalıdır. Global.asa’da bu ifadelerin bulunmasına rağmen yine de çalışmıyorsa, Web Server programına, global.asa’nın içinde bulunduğu kök dizin için çalıştır (execute) izni verilmemiş olabilir. Bu kişisel Web Server’da veya yerel IIS’te oluyorsa, bütün yapacağınız şey kök dizin olan klasörü sağ tıklayarak izinlerini değiştirmektir. Bu hata evsahibi firmanın sitesinde oluyorsa, Web Sitesi yönetimi ile temasa geçmeniz gerekir.
Microsoft OLE-DB Provider for ODBC Driver error ‘80004005’ [Microsoft][ODBC Microsoft Access 97 Driver] Data source name not ??
Web Server’ın bulunduğu bilgisayarda MDAC (Microsoft Data Access Component) dosyaları ya bozulmuş ya da yanlış kurup kaldırma yüzünden bazı bileşenleri arasında sürüm farkı doğmuş demektir. MDAC’ın güncellenmesi çözüm sağlayabilir.
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 kayıt anahtarı (Key) için verilen izinlerikontrol etmelisiniz. Bunun için Regedt32.exe programını kullanabilirsiniz.
Microsoft OLE-DB Provider for ODBC Driver error ‘80004005’ [Microsoft][ODBC SQL Server Driver] [dbnmpntw] ConnectionOpen (CreateFile()).
Aynı bilgisayarda bile olsa SQL Server izinleri yeterli değilse, ODBC sürücüleri veritabaına ulaşamazlar. Sorunu çözmek için SQL Server yönetimiyle görüşmek ve izinleri değiştirmek gerekir.
Bu ve diğer 80004005 hata mesajları için Microsoft’un sitesinde Q189408, Q174943, Q173742, ve Q175671 numaralı bilgi notlarına (Knowledgebase articles) başvurabilirsiniz.
ASP Hatası Arama
ASP teknolojisi, Internet’in kendisine göre nisbeten eski HTTP protokolü ile işbirliği yapmak zorundadır ve bazen ASP sayfalarımızda oluşan hatalar, bizden (yazdığımız VBScript veya diğer Script kodlarından) değil, bu iki teknolojinin Server’daki uyumsuzluğundan kaynaklanıyor olabilir.
ASP teknolojisi üç adımda çalışır:
1. Ziyaretçi bir ASP sayfası talep eder
2. Server talep edilen belgenin bir ASP programı olduğunu belirler ve bunu ziyaretçiye göndermeden önce ASP.DLL aracılığıyla çalıştırır.
3. Ortaya çıkacak olan HTML belgesi ziyaretçiye gönderilir.
Bu bakımdan ASP hatasını ararken sorulacak birinci soru hatanın nerede olduğu olmalıdır. Hata istemci tarafında ise ASP sayfamız muhtemelen ziyaretçinin Browser’ı ile uyumlu olmayan HTML kodu üretiyor olabilir. Ayrıca hatanın hangi aşamada olduğunu yakalamamız gerekir.
Sık alacağımız bir ASP hatası, Server’ın vereceği “VBS Script Error:” şeklinde başlayan mesajlar olacaktır. Bu, gerçekten de sayfamızdaki VBScript kodlarında hata olduğunu gösterir. Yapılacak tek şey, iyi bir programcı gibi, biraz açık havada gezdikten sonra kodu baştan sonra yeniden gözden geçirmek veya en iyisi başka bir programcının yardımını istemektir. Bir süre sonra insan kendi yazdığı kodlardaki hataları göremez hale gelir!
Nesne oluşturma hataları ise “Failed to create ...” diye başlar ve hemen hemen daima ASP sayfanızdaki Server.CreateObject.. diye başlayan deyimin icra edilemediğini gösterir. Bu sizin yanlış nesneye yanlış metod kullandırmaya kalkmanızdan olabileceği gibi, Web Server’ın size bazı bileşen dosyalarına (.dll ve .exe) erişim hakkı vermiyor olmasından kaynaklanabilir. Ücretsiz ASP desteği veren sitelerde çoğu zaman bu tür komutlar içeren Script’lere izin verilmez.
İleri ASP Konuları
ASP’ye giriş niteliğindeki bu iki kitapçığın kapsamı dışında bırakılan bazı ASP konularını burada sıralayarak, bundan sonraki adımlarınıza yardımcı olabiliriz. Server izin verdiği ve gerekli yazılımı sağladığı taktirde, ASP sayfalarınızdan elektronik posta gönderebilirsiniz. Bunun bir Form’un Server’ın CreateObject metodu ile Server’ın SMTP protokülünü kullanan mesaj gönderme programına (IIS’te “CDONTS.Mail” nesnesine) ulaşması ve bu nesneye alıcı ve gönderenin adresleri ile konu ve mesaj bölümlerini iletmesi gerekir. Bunun için gerekli program (veya nesne) adını ve ASP sayfalarınızdan mektup gönderme izniniz olup olmadığını Web Server yönetiminden öğrenmeniz gerekir.
Bir diğer ileri ASP tekniği ise COM bileşenlerini kullanarak, ASP sayfalarınızı VBScript veya JavaScript yerine daha hızlı ve daha güvenli binary (program) dosyaları ile birleştirmek olabilir. C++, Visual Basic, Borland Delphi gibi bir dille yazılmış ve derlenmiş olan COM bileşenleri, kendilerine ASP sayfası tarafından gönderilen çağrı üzerine harekete geçerler ve büyük bir ihtimalle Server dışında yapmaları gereken işi yaparak sonucunu ASP sayfasına ulaştırılmak üzere Server’a bildirirler. Derlenmiş (program haline getirilmiş) oldukları için COM bileşenleri daha hızlı çalışırlar ve Server’ın kaynaklarını kullanmadıkları için de Web iletişimini yavaşlatmazlar. Bu tür bileşenlere çoğu zaman ADODB nesnesinin .Command metodu ile erişiriz. Microsoft ve diğer firmalar, ASP sayfalarımızla birlikte kullanılmak üzere COM programları üretmeye ve pazarlamaya başlamış bulunuyorlar. Bu tür bileşenleri gerçek Internet Server ortamında kullanabilmek için, programın Server’ın bulunduğu bilgisayarda Registry kaydının yapılması gerekir. Bunu Web Server yönetimi ile görüşmeniz şarttır.
BilX.Net