17 Mart 2007, 20:41 | #11 |
Çevrimdışı
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Sayısı: (0) | Cevap: ASP Anlatımı (Dökümandır) KONUK DEFTERİ UYGULAMASI 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</A> </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: <br><TEXTAREA NAME="Mesaj" COLS="40" ROWS="4">Sitem hakkındaki düşünceleriniz</TEXTAREA></p> <INPUT TYPE="Submit" NAME="Gonder" VALUE="Gönder!"> <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. 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\ Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir. klar.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!</A> <A HREF="index.htm">Ana Sayfaya Dön!</A> </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\ Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir. klar.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!</A> </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! |
|
17 Mart 2007, 20:41 | #12 |
Çevrimdışı
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Sayısı: (0) | Cevap: ASP Anlatımı (Dökümandır) VERİ YÖNLENDİRMELİ WEB UYGULAMASI 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.) 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: 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 Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir. 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!) İ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 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. Ş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. İ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. 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ç Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir. düğmesini tıklayarak veritabanı dosyanızı bulun. Ş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. 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 Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir. arkOrange text="white"> <br><br><br><br><br> <center> <table width="250"> <tr><td><font face="arial" size="6">Web Sitenize Sahip Olmak İstiyorsunuz?<br></font> <p><p><p><font face="arial" size="3">Ama 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</a></center></font> </td></tr></table></center> </BODY></HTML> 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> <br><br><br><br><br><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"--><br> <br><br><br><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 %> |
|
17 Mart 2007, 20:42 | #13 |
Çevrimdışı
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Sayısı: (0) | Cevap: ASP Anlatımı (Dökümandır) 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: 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 Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir. arkOrange text="white"><br><br><br><br><br><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"--> <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.) 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 Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir. arkOrange text="white"><br><br><br><br><br><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><br><br><br><br> <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) %></a><br> <%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</a><br> 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 Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir. arkOrange text="white"><br><br><br><br><br><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"><i>Adınız</i> <p><input type="Text" name="soyadi" size="20"><i>Soyadınız </i> <p><input type="Text" name="email" size="20"> <i>e-adresiniz</i> <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. 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 Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir. arkOrange text="white"> <br><br><br><br><br><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.< Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir. 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. İş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. |
|
17 Mart 2007, 20:43 | #14 |
Çevrimdışı
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Sayısı: (0) | Cevap: ASP Anlatımı (Dökümandır) ASP’DE GÜVENLİK 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> <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. 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 |
|
17 Mart 2007, 20:43 | #15 |
Çevrimdışı
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Sayısı: (0) | Cevap: ASP Anlatımı (Dökümandır) ZARARLI KOD TEMİZLEME 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 = "[Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] } 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. |
|
17 Mart 2007, 20:44 | #16 |
Çevrimdışı
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Sayısı: (0) | Cevap: ASP Anlatımı (Dökümandır) ASP KAYNAKLARI asp.superexpert.com/ aspwire.com/ [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] [Üye Olmadan Linkleri Göremezsiniz. Üye Olmak için TIKLAYIN...] arkadaslar bu iş sabır ve zaman isteyen bir iştir ve bıkmadan okuduğunuz için tesekkurler Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir. telNET 2007 |
|
Etiketler |
anlatimi, anlatımı, asp, dokumandir, dökümandır |
Konuyu Toplam 1 Üye okuyor. (0 Kayıtlı üye ve 1 Misafir) | |
| |
Benzer Konular | ||||
Konu | Konuyu Başlatan | Forum | Cevaplar | Son Mesaj |
Exsbans anlatımı | LimiT | Eğitim Dünyası | 0 | 16 Nisan 2020 20:33 |
Who Konu Anlatımı | Mylife | IRCd | 0 | 29 Temmuz 2019 13:11 |
Who Konu Anlatımı | ichi | IRCd | 7 | 17 Nisan 2019 10:11 |
Who Konu Anlatımı | vioLeta | IRCd | 11 | 10 Nisan 2019 20:39 |
C# for ( for loop ) anlatımı | jquery | C# | 0 | 11 Ekim 2012 15:15 |