Toplist ve Download Sayfası
Aug 07,2007 00:00 by dragon111

 Pek çok sitede gördüğümüz download sayfalarında verilen dosya veya programlara ait download edilme miktarına göre toplist bölümleri hazırlanır. Bizde bu ay ki uygulamamızda bu konuyu irdeleyeceğiz. Bunun için öncelikle her zaman olduğu gibi veritabanımızı aşağıdaki gibi hazırlayalım. Ben bunun için dbdownload adında bir access veritabanı ve bunun içerisine de tbldownload adından ki bir tabloyu oluşturuyorum.

tbldownload
Alan AdıVeri TürüAçıklama
idOtomatik SayıPrimary Key
hitSayıDownload edilme sayısı
adMetinİndirilecek dosyanı adı
pathMetinİndirilecek dosyaların bulunduğu klasör
prog_adiMetinİndirilecek dosyanın açıklaması

Veritabanı yapımızdan da kısmen anlaşıldığı gibi indirilecek dosyaları download adında bir klasör içerisine koyuyoruz. Bundan sonra bu sayfa içerisinde download edilmesini istediğimiz tüm dosyalarımızı bunun içerisinden yapabileceğiz. Hit alanımız programın kaç kez indirildiğine dair bilginin tutulmuş olduğu alan. Bu alan içerisinde ki değer her dosya için ayrı ayrı güncellenecek ve en sonunda görmek istediğimiz toplist' imizin temelini oluşturacak.

Uygulamamız içerisinde index.asp, download.asp, hit_isle.asp adında üç dosya kullanacağız. İlk iş olarak download sayfamızı oluşturacak download.asp dosyasını oluşturalım.

download.asp

<% set conn=server.createobject("adodb.connection") conn.Open ("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("db/dbdownload.mdb")) 
sql = "SELECT * FROM tbldownload;"
Set ege = conn.execute(sql)
%> 
<% Do While not ege.eof %> 
<tr><td width="3%" valign="middle" align="center">
<img src="images/ok.gif" width="7" height="8">
</td><td width="65%" valign="middle" align="left">
<font face="Verdana" size="1">
<a href="hit_isle.asp?id=<%=ege("id")%>">                      
<%=ege("prog_adi")%></a> </font></td>
<td width="32%" valign="middle" align="center">
<font face="Verdana " size="1">
<%=ege("hit")%> 
</font></td></tr>
<tr><td colspan="3"><hr size="1"> </td></tr>
<% ege.movenext loop %>                    

Bu sayfamızda öncelikle veritabanı bağlantımızı oluşturuyoruz. Ardından da tbldownload tablomuzdaki kayıtları sayfa içerisine dizdiriyoruz. Ben burada bütün kayıtları her hangi bir kriter olmaksızın dizdirdim. Sizler download sayfanızın daha kullanılabilir olması amacıyla sql cümlemizde yapılacak küçük değişiklikler ve küçük program parçacıkları ile bunu geliştirebilirsiniz. Örneğin; download sayısı başlığına basıldığında download sayısına göre dizdirme yapabilirsiniz. Sayfamızda dikkat edilecek tek husus program adı başlığına link verilme olayıdır.

download.asp

<a href="hit_isle.asp?id=<%=ege("id")%>"><%=ege("prog_adi")%></a>

Yukarıda görüldüğü gibi hit_isle.asp sayfamıza tıklanan kaydın id numarasını gönderiyoruz. Daha sonra bu sayfada tıklanan kaydın hit sayısını arttırmada bu id numarasından faydalanacağız. Şimdiye kadar yapmış olduğumuz bölüme bakacak olursak aşağıdaki gibi bir görüntü oluşacaktır.

Şimdi gelelim uygulamamızın asıl önemli olan bölümü olan hit_isle.asp dosyamıza.

hit_isle.asp

<% set conn=server.createobject("adodb.connection") 
conn.Open ("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("db/dbdownload.mdb"))
sql = "UPDATE tbldownload SET hit=hit+1 WHERE [id] = " & request("id") &";"
conn.execute(sql)
sql= "SELECT path, ad FROM tbldownload WHERE id=" & request("id") &";"
set ege = conn.execute(sql)
url=(ege("path") & "/" & ege ("ad"))
ege.close conn.close
set rs=nothing
set conn=nothing
response.redirect(url) %>

Yine ilk iş olarak bu sayfamız için veritabanı bağlantımızı kuruyoruz. Önceki sayılarımızda da belirttiğim gibi veritabanı bağlantılarınızı her sayfada yapmamak için bir bağlantı dosyası oluşturup, diğer tüm sayfalara bu dosyayı include edebilirsiniz.

Hit_isle.asp sayfamızda ilk olarak gelen id değeri alınıyor. Alınan bu değer ile veri tabanındaki bu değere eşit olan kayıt bulunuyor ve bu kayda ait olan hit alanındaki değer bir arttırılıyor. Örneğin gelen id değerinin 3, bu id numarasına ait olan kaydın hit değeri 21 olsun. Ziyaretçimiz o kayıt üzerinde download linkine tıkladığında id değeri 3 olan kaydımızın hit değeri 22 olacaktır. Update için kısa bir SQL kursu yapalım.

Kısa SQL Kursu

UPDATE komutunun temel kullanımı aşağıdaki gibidir;

Genel Kullanım:

UPDATE [Tablo Adı] SET [Sütun Adı] = [Yeni Değer] WHERE [Seçilen Kriter]

Örnek:

UPDATE tbldownload SET hit=hit+1 WHERE [id] = " & request("id") &";"

İlk sql cümlemizde hit alanını güncelledik. Şimdi ikinci bir sql cümlesi ile dosyamız bulunduğu klasörden o dosya gitmeliyiz ki download ekranı karşımıza çıkabilsin. Bunun için veritabanımız içerisinde istenilen kaydın id' sine göre klasör adını ve program adını (ad alanı) alıyoruz ve bunları url değişkeni içerisinde birleştirip, o adrese Response.Redirect kullanarak gönderiyoruz. Peki neden böyle bir yöntem seçtik? Bundaki amacım şuydu. Eğer daha sonra download adını verdiğimiz klasörün adını değiştirmek istersek bunu program kodu içerisinden yapmak zorunda kalacaktık. Oysa ki sitemiz için yapacak olduğumuz bir yönetim bölümü ile (Bkz. BYTE Temmuz 2002) buranın adını kolaylıkla değiştirebiliriz.

Bu işlemimiz bittikten sonra beklenecek doğal sonuç download.asp sayfamızdaki tıklanmış olan kaydın hit' inin 1 artmış olması gerekir. Buna göre uygulamamızın ekran görüntüsü aşağıdaki gibi oluşacaktır.

Şimdi gelelim toplist' imiz hazırlamaya. Bu bölümde yapacağımız küçük bir SQL cambazlığından başka bir şey değil aslında. Kuracağımız SQL cümlesi ile bilgilerimizi hit miktarına göre en büyükten en küçüğe doğru sıralatacağız.

index.asp

<% set conn=server.createobject("adodb.connection") 
conn.Open ("DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("db/dbdownload.mdb"))
sql = "UPDATE tbldownload SET hit=hit+1 WHERE [id] = " & request("id") &";"
conn.execute(sql)
sql= "SELECT path, ad FROM tbldownload WHERE id=" & request("id") &";"
set ege = conn.execute(sql)
url=(ege("path") & "/" & ege ("ad"))
ege.close conn.close
set rs=nothing
set conn=nothing
response.redirect(url) %>

                                                                                                          

Dikkat ettiğinizde neredeyse download.asp dosyamızla sql cümleleri hariç neredeyse aynı değil mi? Burada kullanıcıya toplist' imizden de download yapabilmesi için hit_isle.asp sayfamıza giden linkide kaldırmıyoruz. Programları listelemeye gelince TOP 10 ifadesi ile veritabanımız içerisindeki ilk 10 kaydı seçiyoruz ve hit miktarına göre dizdiriyoruz. Bu dizilim varsayılan olarak ASC' dir. Yani küçükten büyüğe sıralama yapar. Biz bu sıralamayı büyükten küçüğe olarak dize bilmemiz içinde seçili kayıtları tersten seçmeye yarayan DESC komutunu da ekliyoruz. Böylece toplist' imizin görüntüsüde aşağıdaki gibi oluşuyor.

Kısa SQL Kursu

ORDER BY, tablolardan seçtiğimiz kayıtları sıralamak için kullanılır. Komutun temel kullanımı aşağıdaki gibidir;

Genel Kullanım:

SELECT * veya [Alan Adı] FROM [Tablo adı] ORDER BY [Alan Adı]

Örnek:

SELECT * FROM tbldownload ORDER BY hit;"

Bu ay içerisinde bir arkadaşımızdan gelen postada ASP içerisinde kullanabilmesi için nereden SQL öğrenebileceğini sormuş. Bizde bundan sonraki yazılarımızda uygulamalarımız içerisinde geçen SQL cümleleri için kısa SQL kursları oluşturacağız. Umarım faydalı bir uygulama olur.

Böylece bir uygulamamızın sonuna daha geldik. Yazımızın da mı? Elbette ki hayır. Bu ay uygulamamız dışında birkaç ip ucuna da göz atacağız.

İp uçları:

1- ASP kodlarınızı yazmadan önce;

komutunu mutlaka kullanın. Böylece ISS' inizin Script dili başka dillerde olmuş olsa, sizin kodunuzu VBScript olarak derler.

2-

Bir ASP sayfasının birinci satırı olarak yazarsanız VBScript Dim komutu ile belirlenmemiş değişken kullanmanıza izin vermez. Bu komut, kodda değişken adını yazarken hata yapmanızı önler.

3- Response.Expires: Kullanıcı tersine bir ayar yapmadıysa, browser genellikle görüntülediği sayfaları "Geçici Internet Dosyaları" dizinine (cache) eder. Tekrar ayni sayfayı görüntülemek istediğinizde sayfayı Internet yerine kendi sabit diskinden alır. Eğer haber gibi süreli bilgilerin sunulduğu bir web siteniz varsa bunu engellemek için Response nesnesinin Expires metoduna "0" değerini verin. "Response.Expires=0"

4- Response.Buffer: True(doğru) olarak ayarlandığında ziyaretçiye gönderilecek sayfanın bütün unsurları bir tampon bölgede toplanır, script' in çalışması beklenir ve HTML sayfa toptan gönderilir. Kimi zaman ASP kodumuz sonuna kadar çalıştığında ziyaretçiyi başka bir sayfaya ve siteye yönlendirebilir. Bu gibi sebeplerden dolayı, özellikle çok işlem gerektiren ASP sayfalarının baş tarafına bunu sağlayan Response.Buffer=TRUE kodunu eklemeliyiz.

5- Response.Flush: Eğer sitenizin gelmesi uzun sürüyorsa, Response nesnesinin Flush metodunu kullanarak sitenizin daha hızlı gelmesini sağlayabilirsiniz. Çünkü bu metot kullanıldığında o ana kadar icra edilmiş kodun sonucu olan HTML' i browser' ınıza gönderir.

6- Response.ExpiresAbsolute: Sayfalarınızın yedeklenmesini önlemek için;

Response.ExpiresAbsolute = now()-1

ifadesini kullanın.

7- Eğer ASP sayfalarınızın içerisinde menüleriniz gibi sık sık kullandığınız bölümleriniz varsa bunu kolaylıkla halledebilirsiniz. Yapmanız gereken tek şey kullanacağınız alana; gibi bir kod yarleştiriniz.

İşte yazımızın da sonuna geldik.