25 Ekim 2011 Salı

ASP Haber Sistemi

ASP ile basitçe hazırladığım bir haber sistemini sizlerle paylaşıyorum.
Sistemde kategori ve alt kategorili haber ekleme olanağı var. 
Mesela Kültür ve Sanat kategorisine alt olarak Sinema, Tiyatro gibi bölümler ekleyip bunlara kayıt girmeyi sağlayan basit bir sistem. 
Sistemdeki tüm kodlamaları kendim hazırladım. En az kod ile anlayacağınız şekilde izah ederek ilk versiyonu yayına hazırladım. 
Umarım güzel işler yapmanız için bir başlangıç olur. 

dosyayı indireceğiniz adres: http://ozturkce.com/abm/ornekler/isHaber.rar
demo olarak sistemi test edeceğiniz adres: 
Admin Panelini test için ozturkce.com/isHaber/isAdmin 
Kullanıcı adı: test
Şifre: test

Not sistemde virüs yoktur ama içiniz rahat olsun diye indirdikten sonra virüs  taramasından geçirirsiniz. 

18 Ekim 2011 Salı

SQL COUNT() fonksiyonu ile raporlama yapmak

Bir veritabanında kayıtlarımız olsun ve bu kayıtlardan bizim istediğimiz şekilde raporlama yapmasını isteyelim.
Örnek tablo aşağıdaki gibi olsun Tabloda bilmek istediğimiz illerden kaç tane üyemiz var onu göreceğiz.

Tablomuzun adı: uyeler

id isim sehir
1 ismail Öztürk istanbul
2 Ali Ankara
3 Mehmet istanbul
4 Selim Trabzon
5 Mustafa Ankara
6 Ayşe Ankara
7 Fikret Trabzon
8 Gökhan istanbul

Şimdi bu tablodan hangi ilde kaç üyemiz var diye bir sorgu yapalım ve bu sorguyu da bir seferde çalıştıralım.
Bunun için COUNT() kullanacağız.

sql = "Select (Select COUNT(*) from uyeler WHERE sehir='istanbul') as toplamistanbullu,"
sql = sql & " (Select COUNT(*) from uyeler WHERE sehir='Ankara') as toplamAnkarali,"
sql = sql & " (Select COUNT(*) from uyeler WHERE sehir='Trabzon') as toplamTrabzonlu "
sql = sql & " from uyeler "

Set rs = conn.execute(sql)

Sonuçta çıktı alırken mavi ile işaretlediğimiz alanları kullanacağız. 
<%
Response.write("<br>İstanbullu: " & rs("toplamistanbullu"))
Response.write("<br>Ankaralı: " & rs("toplamAnkarali"))
Response.write("<br>Trabzonlu: " & rs("toplamTrabzonlu "))
%>

Şu şekilde de tam çıktımız olacakÇ
İstanbullu: 3
Ankaralı: 3
Trabzonlu: 2 

Burada Select içinde select kullandık buna dikkat etmek gerekiyor. dikkat ederseniz içteki select lerden önce ve sorgudan sonra parantez var parantezden sonra da o select'e bir isim veriyoruz. yani onu bir field gibi işliyoruz. 

17 Ekim 2011 Pazartesi

Zararlı kodları temizlemek fonksiyonu, html kodları temizlemek

Bir formdan aldığını bilgilerde siteniz için zararlı olan kodlardan temizlemek ve olası sql saldırılarına karşı korumak için aşağıdaki fonksiyonu kullanabilirsiniz.

Önce fonksiyonu tanımlayalım


'requestten gelen değişkenleri temizleme
function fnTemizle(gelen)

'gelen değer boşsa fonksiyonumuz düzgün çalışsın diye kontrol
if isnull(gelen) then gelen = " "
'sonra her satırda istediğimiz zararlı kodları temizliyoruz, bunları istediğimiz kadar çoğaltabiliriz.
gelen=replace(gelen, ">" , "", 1, -1, 1 )
gelen=replace(gelen, "<" , "", 1, -1, 1 )
gelen=replace(gelen, "" , "", 1, -1, 1 )
gelen=replace(gelen, "*" , "", 1, -1, 1 )
gelen=replace(gelen, "'" , "", 1, -1, 1 )
gelen=replace(gelen, " drop " , "", 1, -1, 1 )
gelen=replace(gelen, " select " , "", 1, -1, 1 )
gelen=replace(gelen, " delete " , "", 1, -1, 1 )
gelen=replace(gelen, "--" , "", 1, -1, 1 )
gelen=replace(gelen, " = " , "", 1, -1, 1 )
gelen=replace(gelen, " or " , "", 1, -1, 1 )
gelen=replace(gelen, " and " , "", 1, -1, 1 )
gelen =trim(gelen)

fnTemizle = gelen

end function


fonksiyonun kullanımı şu şekilde

<%
degisken =" bu deneme bir yazıdır. bu da html kodudur -- <br> ' gibi karakterler"
response.write(fnTemizle(degisken))

%>
çıktı: bu deneme bir yazıdır. bu da html kodudur br  gibi karakterler 
Dikkat ederseniz kodumuzdaki < > tagları içindeki değerler olduğu gibi kaldı. bu bizim işimizi görmede yetersiz kaldı. 
O halde biz önce HTML taglarını temizleyelim. ardından da sql hacklerine karşı koruyalım. 
Şöyle bir fonksiyonumuz olsun:

<%

Function htmlTemizle(strVeri)

If strVeri = "" Then Exit Function
   strVeri =  Replace(strVeri, "<br>", VBCRLF)
Set objRegExp = New Regexp
With objRegExp
.Pattern = "<.*?>"
.IgnoreCase = False
.Global = True
End With
strVeri =  objRegExp.Replace(strVeri,"")
strVeri=replace(strVeri, "'" , "", 1, -1, 1 )
strVeri=replace(strVeri, " drop " , "", 1, -1, 1 )
strVeri=replace(strVeri, " select " , "", 1, -1, 1 )
strVeri=replace(strVeri, " delete " , "", 1, -1, 1 )
strVeri=replace(strVeri, "--" , "", 1, -1, 1 )
strVeri=replace(strVeri, " = " , "", 1, -1, 1 )
strVeri=replace(strVeri, " or " , "", 1, -1, 1 )
strVeri=replace(strVeri, " and " , "", 1, -1, 1 )

htmlTemizle = strVeri

End Function
%>

şimdi tekrar örneği ele alalım:
<%
degisken =" bu deneme bir yazıdır. bu da html kodudur -- <br> ' gibi karakterler"
response.write(htmlTemizle (degisken))

%>
çıktı: bu deneme bir yazıdır. bu da html kodudur
gibi karakterler 

Şimdi oldu.
Bu şekilde hem html kodlarını ayıkladık hem de zararlı sql saldırılarına karşı da veritabanımızı güvene aldık.

Not: Bu yazı sadece bilgi amaçlıdır. 

Form kontrolleri İnput Dolu mu kontrolü

Formda en çok kullanılan ve aranılan kontrol istediğimiz alanların doldurulmasını sağlamak. Bunun için basit bir kod hazırlayalım.
Bunun için biraz javascript bilmemiz gerekiyor. Merak etmeyin ben size bunu anlatacağım :)

ilk olarak bir formumuz olsun.

Form Kontrolü Zorunlu Alanlar
Adınız
Soyadınız

Şimdi bu formda alanları doldurmak zorunlu olsun. Eğer alanlar doldurulmadıysa uyarı verdirelim.

Kodlar şu şekilde olacak.

<script language="javascript">
//Form kontrolü için javascript fonksiyon yazıyoruz.
function formKontrol(){
//inputlar için değişken tanımlıyoruz.
var adi = document.getElementById("adiniz").value;
var soyadi = document.getElementById("soyadiniz").value;
// eğer alanlar boş değilse sayfada uyarı vermiyoruz ve post ediyoruz (return true)
if(adi!="" && soyadi!="")
{
return true;
//Eğer boş alan bırakılmışsa uyarı veriyoruz ve sayfayı post etmiyoruz. ( return false)
}else{
alert("alanları doldurmalısınız.");
return false;}
}

</script>

Formumuz da bu şekilde olacak. formda input id lerine dikkat edin. onlar üzerinden javascript kodumuz çalışacak. 
<table width="400" border="1" cellspacing="0" cellpadding="5">
 <form action="kaydet.asp" method="post" name="frm1" onsubmit="return formKontrol()">
  <tr>
    <td colspan="2" bgcolor="#e5e5e5"><strong>Form Kontrol&uuml; Zorunlu Alanlar</strong></td>
  </tr>
  <tr>
    <td width="98">Adınız</td>
    <td width="282"><input type="text" name="adiniz" id="adiniz" /></td>
  </tr>
  <tr>
    <td>Soyadınız</td>
    <td><input type="text" name="soyadiniz" id="soyadiniz" /></td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td><input type="submit" name="button" id="button" value=" kaydet " /></td>
  </tr></form>
</table>

15 Ekim 2011 Cumartesi

Veritabanında alfabetik arama yapmak

veritabanımızdaki bir tablodan A B C D gibi alfabetik olarak verileri harf harf almak istiyorsak değişik yöntemlerle bunu yapabiliriz. Bunlardan ikisini anlatacağım.

ilki left fonksiyonu ile
sql = "Select * from tabloAdi where left(sutunAdi,1)='" & harf & " ' "
Bu sql cümleciğinde tablomuzdaki sutunAdi sütunundaki verilerin baş harfi istediğimiz harf olanı çağırdık.

ikincisi like fonksiyonu ile
sql = "Select * from tabloAdi where sutunAdi like'%"  & harf & "' "
Bu sql cümleciğinde de sutunAdi sütunundaki başlangıcı aradığımız harf olan kayıtları getirecektir.

ASP Admin panelinde yetkilendirme yapmak

Web sayfamızın yönetim paneli (admin paneli) için üyelerin yazı ekleme, silme gibi yetkilerini vermeyi kısaca anlatalım.

İlk olarak bir  veritabanımızın var olduğunu varsayıyorum. Çünkü admin panelimiz varsa bir de veritabanı olmalı.
veritabanımıza bir tablo ekliyoruz. Bu tabloda aşağıdaki alanları oluşturacağız.

Tablomuzun adı: yetkiler olsun elemanları da:
id
uyeID (sayı)
menuID (sayı)
silme (sayı)
ekleme (sayı)
düzeltme (sayı)

şeklinde olsun. siz bunları istediğiniz gibi çoğaltabilirsiniz.

Şimdi üyelerimiz olduğuna göre üyelerimizin gösterildiği sayfaya yeni bir sütun açalım.
Üyeler listemiz aşağıdaki gibi olabilir.

uyeler.asp
Üye Adı Email Yetkileri İncele Sil
iismail ismail@ozturkce.com Gör düzenle sil

Üyelerin yetkilerini gör diye bir link oluştururuz. Şimdi buraya kadar olan kısmı biraz bekleteceğiz. 

Şimdi sırada sayfamızda bulunan menülere geldi. Örneğin sayfamızda Haberler, Ziyaretçi Defteri, Ürünler, Duyurular, Resimler gibi başlıklar olsun. Biz bu başlıkları da bir tabloda toplayacağız. Bu tabloya da menuler tablosu diyelim ve elemanları kısaca şunlar olsun:

menuID
menuAdi (metin)
sira (sayi)
Şimdi tablomuzda menüleri oluşturalım. Her menünün bir id değeri olmalı ki işimiz kolay olsun.

menuler.asp
menuID menuAdi
1 Haberler
2 Ziyaretçi Defteri
3 Ürünler
4 Duyurular
5 Resimler

Şimdi sıra menü  yetkilerini vermeye geldi.

Üyelerin sayfasında her üye için yetkiler bölümü var. Bir üyenin yetkilerini görmek için gör linkine tıklayıp bu sayfadan yetkiler sayfasına bağlanırız. Yetkiler sayfasına üyenin id'sini querystringten göndeririz. Yani gör linki yetkiler.asp?uyeID=1 gibi bir değerle yetkiler sayfasına gelir.

Şimdi yetkiler sayfasını inceleyelim.

yetkiler.asp
iismail adlı kullanıcının yetkileri.
Sıra Menü Adı Ekle Düzelt Sil
1 Haberler
2 Ziyaretçi Defteri
3 Ürünler
4 Duyurular
5 Resimler

Bu sayfanın kodları şöyle olabilir.

<table width="400" border="1" cellspacing="0" cellpadding="5">
  <tr>
    <td colspan="5" bgcolor="#e5e5e5"><strong>iismail</strong> adlı kullanıcının yetkileri.</td>
  </tr>
 <form action="yetkilerSave.asp" method="post" name="frmYetki">
  <tr>
    <td width="68" bgcolor="#e5e5e5"><strong>Sıra</strong></td>
    <td width="169" bgcolor="#e5e5e5"><strong>Menü Adı</strong></td>
    <td width="31" bgcolor="#e5e5e5"><strong>Ekle</strong></td>
    <td width="40" bgcolor="#e5e5e5"><strong>D&uuml;zelt</strong></td>
    <td width="30" bgcolor="#e5e5e5"><strong>Sil</strong></td>
  </tr>

  <%
  'ÜyeID'sini alıyoruz.
  uyeID = request.QueryString("uyeID")
  'Yetki vereceğimiz menüleri çağırıyoruz
  Set rsMenu = conn.execute("Select * from menuler")
  while not rsMenu.eof
  menuID  = rsMenu("menuID")
  'Daha önce bu üyeye yetki verip vermediğimizi kontrol ediyoruz. Eğer verdiysek checkbox seçili gelsin diye işlem yapıyoruz.
  Set rsYetki = conn.execute("Select * from yetkiler where uyeID=" & uyeID & " and menuID=" & menuID & "")
  'Eğer yetki verilmediyse daha önce tüm yetkiler boş gelecek.
  if rsYetki.eof then 
  'Buradaki değerler default ayarlarınız olabilir.
  ekle = 0
duzelt = 0
sil = 0
  else
  'yetkileri alıyoruz Yetki değeri Eğer 1 ise yetki var anlamına gelecek.
  ekle = rsYetki("ekle")
  duzelt = rsYetki("duzelt")
  sil = rsYetki("sil")

  end if
  Set rsYetki = nothing

'Aşağıda checkboxların isimlerini çok dikkat edin. her birinde menuID'yi ekliyoruz. işimiz daha kolay olsun diye
  %>
  <tr>
    <td align="center"><%=rsMenu("sira")%></td>
    <td> <%=rsMenu("menuAdi")%></td>
    <td align="center"><input type="checkbox" name="ekle-<%=menuID%>" <%if ekle="1" then response.Write("checked=""checked""")%> value="1" /></td>
    <td align="center"><input type="checkbox" name="duzelt-<%=menuID%>" <%if duzelt="1" then response.Write("checked=""checked""")%> value="1"   /></td>
    <td align="center"><input type="checkbox" name="sil-<%=menuID%>" <%if sil="1" then response.Write("checked=""checked""")%> value="1"  /></td>
  </tr>
  <%rsMenu.movenext
  wend
  Set rsMenu = nothing%>

  <tr>
    <td colspan="5" align="center"><input name="uyeID" type="hidden" id="uyeID" value="<%=uyeID%>">      <input type="submit" name="button" id="button" value=" kaydet "></td>
  </tr></form>
</table>


Şimdi yetkiSave.asp sayfasını yapalım.

'önce Üye id'sini alıyoruz.
uyeID = request.Form("uyeID")

'yetkiler tablosundaki bu üyeye ait tüm yetkileri kaldırıyoruz. Çünkü yeni yetkiler verdik.
conn.execute("Delete * from yetkiler where uyeID="& uyeID)

'sonra menuler tablosu kadar döngü kurup formdaki verileri çağırıyoruz.
Set rsMenu = conn.execute("Select * from menuler")
while not rsMenu.eof
menuID = rsMenu("menuID")

'Eğer checkbox seçili gelmezse değerin sıfır (0) olacağını belirtiyoruz.
ekle = request("ekle-"& menuID)
if ekle = "" then ekle = 0

duzelt = request("duzelt-"& menuID)
if duzelt = "" then duzelt = 0

sil = request("sil-"& menuID)
if sil = "" then sil = 0
'Şimdi değerleri aldık yetkiler tablosuna kayıtları ekliyoruz.
conn.execute("insert into yetkiler(uyeID,menuID,ekle,duzelt,sil) Values(" & uyeID & "," & menuID & "," & ekle & "," & duzelt & "," & sil & ")")


rsMenu.movenext
Wend
set rsMenu = nothing

'işlem tamam geri dönüşü yapıyoruz.

Yetkilendirme işlemi bu kadar.
Şimdi son olarak da yetki kontrol işlemini yapalım.

Diyelim ki bir haberler.asp sayfamız var. Üyemiz admin paneline girdiğinde biz onun uyeID'sini almışız.
haberler.asp sayfasına giren bir üye ilk olarak yetki kontrolünden geçecek.


Set rsYetki = conn.execute("Select * from yetkiler where uyeID=" & uyeID & " and menuID=" & menuID & "")
if rsYetki.eof then 
'Eğer yetkili değilse üyeyi uyarı sayfasına gönderiyoruz. 
else
ekle = rsYetki("ekle")
duzelt  = rsYetki("duzelt")
sil = rsYetki("sil")
if ekle=1 or duzelt = 1 or sil=1 then 
'Eğer 3 yetkiden biri varsa sayfayı görecek Değilse yine uyarı sayfasına gidecek.
else
'Eğer hiç yetkisi yoksa üyeyi uyarı sayfasına gönderiyoruz. 

end if

end if

'Buraya geldiğine göre 3 yetkiden en az birinde yetkili bu üye.

Bundan sonrasında şöyle bir uygulama yapabiliriz. 
Haberler sayfamızdaki butonları kontrol altına alırız. Bu Butonlar sayfamızda gerekli yerlerde kullanabilirsiniz.
<%if ekle="1" then %> <a href="#">Yeni Haber Ekle</a><%end if%>
<%if duzelt="1" then %> <a href="#">Düzelt</a><%end if%>
<%if sil="1" then %> <a href="#">Sil</a><%end if%>

Bu kadar bir kodla istediğiniz menüye istediğiniz kadar yetki verebilirsiniz. Hem yetki türlerini çoğaltabilirsiniz hem de menü sayısını çoğaltabilirsiniz. Böylece istediğiniz menüye istediğiniz üyeyi istediğiniz yetkili atayabilirsiniz. 












ASP for döngüsü

Klasik ASP sayfaları oluştururken kullandığımız döngülerden birisi de FOR döngüsüdür. 

degisken: değişken tanımlayarak bunu for içinde kullanacağız.
baslangicDegeri : döngünün başlayacağı değer, bu rakamsal bir ifade olmalı.
varilacakDeger: döngünün bu değere kadar gelmesi ve sonra da bitmesi gerekir. Bu da rakamsal değer olmalı. 
adimSayisi: Eğer istersen döngümüzü atlatarak saydırabiliriz. Mesela 3'er 3'er artan bir şekilde döngü yapabiliriz. bu değeri kullanmadık mı varsayılan olarak 1'er 1'er artarak devam eder döngümüz.

Kullanım şekli
for degisken = baslangicDegeri to varilacakDeger step adimSayisi

next

Örnek 1:
a değişkenini 1 den 10'a kadar döngüye sokalım ve bunu satır satır yazdıralım:

for a=1 to 10
response.write("<br>"& a)
next

bu işlemin çıktısı şöyle olur:
1
2
3
4
5
6
7
8
9
10

Örnek 2:
Şimdi de 2005 yılından 2010 yılına kadar döngü yapalım ve ekrana yazdıralım

for a = 2005 to 2010
 response.write("<br>" & a)
next

Çıktışı şu şekilde olmalı:
2005
2006
2007
2008
2009
2010
Örnek 3:
Şimdi bir de adım (step) kullanarak bir örnek çözelim. 
Bir a değişkenine 2'den başlayarak 10'a kadar ekrana yazdıralım.

for a = 2 to 10 step 2
 response.write("<br>" & a)
next

Ekran çıktısı şu şekilde olacak:
2
4
6
8
10
Örnek 4:
Bir Selectbox içinde kullanım şekli gösterelim.
Bir a değişkenini bir ayın günleri kadar döngüye sokalım. 
<select name="ay" >
<%for a=1 to 30%>
<option value="<%=a%>"><%=a%></option>
<%next%>
</select>