BilgiTeknoloji.net    
b i l g i   t e k n o l o j i   y a z ı l ı m

Ana Sayfa

Marjinal XML Access Pratik Uygulamalar Projeler Ekonometri Dilimiz Editörden Çetrefil İletişim
 
- asp teknikleri-
ASP ile Web'de Veritabanı


Sayfa 1  Sayfa2
 

ÜRÜN ARAMA

Ürün arama sayfasının en önemli özelliği arama isteğinde, arama türünün belirtilebilmesi. Genel arama yapılabilmesi dışında, marka ve grup adına göre arama isteği gönderilebiliyor.

Request koleksiyonuna dahil edebileceğimiz iki değişkenle bunu sağlayabiliyoruz. Yontem ve Deger parametrelerini sayfanın başında değerlendirmek gerekiyor.

Yontem parametresi en fazla üç değer alabilir. Aşağıdaki üç değer dışında bir değer verildiğinde geçerli olarak “Ara” değerinin işlenmesi gerekiyor.

Yontem = “Ara”
Yontem = “Marka”
Yontem = “Grup”

Deger parametresi ise Yontem’e bağlı olarak herhangi bir değer alabiliyor. Fakat Yontem‘in varlık amacı bu olduğu için bu boş olduğunda diğerinin işlenmesinin bir anlamı olmayacaktır.

Önce aşağıdaki kod bloğunu inceleyin.

dim yontem, deger
deger=request("deger")
yontem=request("yontem")
if deger="" then
yontem=""
else
if yontem="marka" then
'''gerekli kodlar
elseif yontem="grup" then
'''gerekli kodlar
else
'''yontem="ara" ya da yontem=(herhangi bir şey) ise
yontem="ara"
'''gerekli kodlar
end if
end if

Koddaki Dim deyimi değişken tanımlama görevi yapar. Değişkenlerin yazımında hata yapma riskini azaltmak için sayfanın başında Option Explicit ifadesi kullandıysanız değişken kullanmadan önce Dim ile tanımlama yapmak gereklidir.

Option Explicit ifadesi kullanmayacaksanız üstteki kodun başında Dim ile başlayan satırı yazmanıza gerek yok. Doğrudan değişkeni kullanmaya geçin.

Bu sayfada Request koleksiyonundaki “yontem” ve “deger” parametrelerini kabul edebileceğimize göre sayfayı açmak için çalıştırılan şu tür bir adres kabul görecek demektir:

default.asp?yontem=grup&deger=televizyon

Bu adresin devamında başka parametre uzantıları da olabilir. Sonuçta bunların hiçbirini kullanmak zorunda değilsiniz. Ama ne kadar parametre gelirse gelsin, bunlara Request koleksiyonundan ulaşabiliyorsunuz.


REQUEST VE ALT KOLEKSİYONLAR

Yeri gelmişken Request koleksiyonuna eklenen tüm paramerelere nasıl ulaşacağınızı söyleyeyim. Request’in 5 alt koleksiyonu vardır ve bunlar belli bir öncelik sırasındadırlar.

- QueryString
- Form
- Cookies
- ClientCertificate
- ServerVariables

Bir form ve kalabalık metin kutularının olduğu bir sayfadan Submit işleviyle yöneldiğiniz ikinci sayfadaki (Action sayfası) Request.Form koleksiyonuna önceki sayfadaki formdan elde edilen değerler yerleştirilir.

Fakat default.asp?yontem=grup&deger=televizyon gibi komut satırında belirtilen parametreler varsa bunlar Request.QueryString’e dahil edilirler.

Biraz önceki kodda yaptığımız gibi doğrudan Request(deyim) şeklinde kullandığımızda Request nesnesi önce QueryString alt koleksiyonunu araştırır ve sonra Form koleksiyonuna bakar. Üstte yazdığım beş alt koleksiyonu aynı sırayla araştırıp değeri bulmaya çalışır. O yüzden parametrelerin komut satırından mı, yoksa form nesnesinden mi geldiğini bilmemize gerek kalmaz.

Bunu küçük bir deney yaparak görebilirsiniz. Kabul.asp dosyası oluşturup Request.Form ve Request.QueryString alt koleksiyonlarındaki parametreleri listeleyin.

Form nesnesinin olduğu Form.htm dosyasını oluşturup Kabul.asp dosyasına ulaşmayı deneyin. Daha sonra Kabul.asp dosyasını komut satırında parametre göndererek açmaya çalışın. Kabul.asp dosyasında olması gereken basit kod aşağıda.

<% Dim gelen %>

Request.Form ile Gelenler<br>
<%
For Each gelen in Request.Form
Response.Write gelen & " = " & Request.Form(gelen) & "<br>"
Next
%>

<br>

Request.QueryString ile Gelenler<br>
<%
For Each gelen in Request.QueryString
Response.Write gelen & " = " & Request.QueryString(gelen) & "<br>"
Next
%>

 

Request’in altında bulunan diğer üç alt koleksiyondaki değerleri de bu şekilde listeleyebilirsiniz. Fakat parametrelerin listesine ulaşmak için bu yöntemi Request nesnesine uygulamayın. Zira Request’in altında aslında parametreler değil, alt koleksiyonlar bulunuyor ve bir parametrenin değerine ulaşılırken üstteki beş koleksiyon sırayla araştırılıyor. Bu durumda beş alt koleksiyonu ayrı ayrı incelemeniz gerekecek.

Aşağıda kabul.asp dosyasının resimlerine bakın. Formdan bilgi gönderildiğinde Gönder düğmesinin değeri de Form kayıtlarına dahil edilir. Buradan aynı hedef sayfasına ulaşan birden fazla komut düğmesinin bulunduğu formlar oluşturabileceğinizi çıkarabilirsiniz. Evet-Hayır-İptal komutları içeren düğmeler koyabilirsiniz örneğin.

Default.asp dosyasında iken gerekli parametreleri komut satırında yani link (bağlantı) olarak göndermiştim. Bu yüzden bu sayfada Request yerine Request.QueryString koleksiyonunu kullanmam sorun değildi. Tahmin ettiğiniz gibi Request.Form kullanmamalıyım.

Request ve alt koleksiyonları hakkında daha ayrıntılı bilgileri sonraki yazılarımda bulabilirsiniz.

Koddaki Response.Write deyiminin sonunda sayfaya “<br>” yazdırmaya çalıştığıma dikkat edin. Bunu asp bloğundan çıkarıp doğrudan HTML bölgesinde yazmak mümkündü.

Bu arada bunun HTML dilinde alt satıra geçmek için kullanıldığını bilmeyen kalmamıştır, değil mi? Zira HTML kodunda ne kadar satır koymaya çalışsanız da, bunu ya da başka bir paragraf belirtecini kullanmadan alt satıra geçilemiyor.


ÜRÜNLERİ LİSTELEYİN

Default.asp dosyasında veri tablosundaki bütün kayıtları nasıl listelediğimizi hatırlıyor musunuz? Okumaya devam etmeden önce oraya bir bakın ve ürünler tablosu için aynı yöntemi kafanızda oluşturmaya çalışın.

- Connection nesnesi oluştur.
- RecordSet nesnesi oluşturup bu Connection nesnesine bağla.
- Do-Loop döngüsü oluştur. RecordSet’in sonu olana kadar tabloyu gez.
- Döngü içinde gerekli veri alanlarının değerlerini yaz.
- Tablo kullanmak istiyorsan döngünün dışına tablo etiketlerini koy. Döngü içinde ise satır ve sutunları oluşturmak için <tr> ve <td> etiketleri olsun.

<%

dim conn
set conn = Server.CreateObject("ADODB.Connection")
conn.open "Driver={Microsoft Access Driver (*.mdb)}; dbq=" & _
Server.MapPath("/_private/urunler.mdb")

set rst=CreateObject("ADODB.RecordSet")
rst.open "SELECT * FROM Urunler", conn,1,3

%>

<table border="0" width="550">

<%
‘Döngü başlıyor.
do while not rst.eof
if sayac>=rst.pagesize then exit do
sayac=sayac+1
%>
<tr>
<td width="500">
<% =rst("urunadi") %><br>
<% =rst("detay") %>
</td>
<td width="50">
<img border="0" src="resimler/<% =rst("resim") %>">
</td>
</tr>
<%
rst.movenext
loop
‘Döngü bitti.
%>

</table>
 

RST.Open deyiminde doğrudan tablo ya da sorgu nesnesinin adını kullanmak yerine SQL kodu yazdığımı farkettiniz mi? Çoğu zaman sizin de bu şekilde kullanmayı tercih edeceğinize eminim.

Bu yüzden en basit de olsa SQL kodu yazmayı biraz bilmeniz gerekiyor. Bu yazının konusu bu olmasa da bazı ayrıntıları bilmenizde fayda var.
 

SORGULAMA SEÇENEKLERİ

Üstteki kodu kullandığınızda veri tablonuzdaki bütün kayıtlar listelenecektir. Buna bir sınır getirmek için arama süzgeci koyabilirsiniz, ilk baştaki belli sayıda kaydı listeleyebilirsiniz ya da bütün kayıtları sayfalar halinde listeleyebilirsiniz.

Arama süzgeci koymak için birkaç yol mevcut. SQL kodunda SELECT ve FROM deyimlerinden sonra WHERE ile koşul belirtebiliyorsunuz.

SELECT * FROM Urunler WHERE Grup= ‘Televizyon’

Bunu ASP kodunda nasıl yazacağınızı hatırlıyor musunuz?

Rst.Open “SELECT * FROM Urunler WHERE Grup= ‘” & Deger & “’”

Burada Grup adlı alan metin türünde olduğu için tırnak işareti kullanılmalı. Sayı alanlarında ise buna gerek yok.

Rst.Open “SELECT * FROM Urunler WHERE ID=” & Deger

Rst.Open “SELECT * FROM Urunler WHERE ID=16”

Ek olarak TOP deyimi ile kayıt kümesinin başından itibaren belli sayıdaki kaydı listelersiniz. İlk 50 kayıt için şu şekilde kullanın:

SELECT TOP 50 * FROM Urunler WHERE Grup= “Televizyon”

TOP deyimini kullanmaya başladıktan sonra birçok kişinin soracağı soruyu tahmin edebiliyorum. “İlk baştaki kayıtları buluyor ama istenen sırada gelmiyor ki!”. Öyleyse ORDER BY deyiminden sonra sıralamak istediğiniz alanları yazın.

SELECT TOP 50 * FROM Urunler WHERE Grup= “Televizyon” ORDER BY Marka, UrunAdi

Ters sıralama yapmak için ORDER BY deyiminden sonraki istediğiniz alan adının sonuna DESC deyimini ekleyin. (Descending)

... ORDER BY Marka DESC, UrunAdi

Ana sayfada ürünlerin grup ve marka bilgilerini gruplandırarak adetlerini göstermiştim. Bu tür bir sorguyu yapmak için SQL’de GROUP BY deyimi devreye giriyor. Resimdeki qMarka_Adet ve qGrup_Adet sorgularını inceleyin. Normalde sorgu tasarımında Total (Toplamlar) adlı satır geçerli olarak görüntülenmez. Bunun için View\Totals (Görünüm\Toplamlar) menüsünü çalıştırın.
 

KRİTERLERİ BELİRTİN

Ürün Arama konusunda arama sayfasının Yontem ve Deger adlı parametreleri kabul ettiğini söylemiştim. Bunun için gereken SQL bilgisini de verdikten sonra arama işini yapmak için gerekli kodları yazmaya sıra geldi.

- Yöntem= “marka” ise değer sadece marka alanında aranacak.
- Yöntem= “grup” ise değer sadece grup (GrupID) alanında aranacak.
- Yöntem başka bir şey ise gelen değer tüm alanlarda aranacak.

dim yontem, deger, sqlwhere

deger=request("deger")
yontem=request("yontem") 'marka grup ara

if yontem="marka" then
sqlwhere=" WHERE marka = '" & deger & "'"
elseif yontem="grup" then
sqlwhere=" WHERE grupID = " & deger
elseif yontem="ara" then 'grup urunkodu urunadi marka detay
sqlwhere=" WHERE ( (Grup LIKE '%" & deger & "%') OR " & _
"(UrunKodu LIKE '%" & deger & "%') OR " & _
"(UrunAdi LIKE '%" & deger & "%') OR " & _
"(Marka LIKE '%" & deger & "%') OR " & _
"(Detay LIKE '%" & deger & "%') )"
else
sqlwhere=""
end if

dim rst
set rst=CreateObject("ADODB.RecordSet")
rst.open "SELECT * FROM qUrunler" & sqlwhere, conn,1,3
 

KAYITLARI SAYFA SAYFA LİSTELEME

Özellikle arama sitelerinde, bulunan kayıtlar yirmişer sayfalık listeler halinde gelir. Bu, bilgileri incelerken ziyaretçinin fazla vakit harcamamasını sağlar. Ayrıca tüm kayıtları göstermek genelde gereksizdir.

ADO’daki RecordSet nesnesinin kayıtları sayfa halinde göstermek için gerekli özellikleri mevcut. PageSize özelliği ile her sayfada kaç kayıt gösterileceği ayarlanır. AbsolutePage özelliği ile de konumlanmak istenen sayfa numarası belirtilir. Toplam sayfa sayısı ise PageCount özelliği ile öğreniliyor.

rst.open "Urunler", conn, 1, 3
rst.pagesize=10
rst.absolutepage=2

Bu özelliği kullanırken Open deyiminin sonundaki 1 ve 3 parametrelerini şimdilik sürekli bulundurun.

ASP sayfasında bunun işe yaraması için hangi sayfaya geçileceğine dair bir parametrenin sağlanması gerekiyor. Bu parametre, komut satırında gönderilebilir ya da Form nesnesi içinde Hidden olarak belirtilmiş bir değer olabilir.

Altavista’daki gibi 1’den 10’a kadar yazılı sayfa numaralarının üzeri tıklatıldığında ilgili sayfaya gidilebilmeli. PageCount değerini öğrendikten sonra, ekrana o kadar sayfa numarası yazdırmalı ve bunların herbirinin bağlantı dizesine ilgili sayfa numarasını ve diğer parametreleri eklenmeli.

AbsolutePage değeri ayarlandıktan sonra her zamanki gibi Do-Loop döngüsü ile bu sayfaya dahil tüm kayıtları listemek gerekiyor.

Aslında AbsolutePage özelliğinin asıl yaptığı şey sayfayı oluşturmak değil, sayfanın başına tekabül eden kayda gitmektir. Bu durumda, oluşturacağınız Do-Loop döngüsünde kaydın sonunu kontrol etmekle beraber PageSize değerinden daha fazla sayıda kayıt okunmamasını da sağlamalısınız. Döngü içinde bir sayaç tutmak yeterli.


dim yontem, deger, sqlwhere

deger=request("deger")
yontem=request("yontem") 'marka grup ara

if yontem="marka" then
sqlwhere=" WHERE marka = '" & deger & "'"
elseif yontem="grup" then
sqlwhere=" WHERE grupID = " & deger
elseif yontem="ara" then 'grup urunkodu urunadi marka detay
sqlwhere=" WHERE ( (Grup LIKE '%" & deger & "%') OR " & _
"(UrunKodu LIKE '%" & deger & "%') OR " & _
"(UrunAdi LIKE '%" & deger & "%') OR " & _
"(Marka LIKE '%" & deger & "%') OR " & _
"(Detay LIKE '%" & deger & "%') )"
else
sqlwhere=""
end if

dim rst
set rst=CreateObject("ADODB.RecordSet")
rst.open "SELECT * FROM qUrunler" & sqlwhere, conn,1,3


Üstteki kodu sayfanın altındaki </body> işaretinin öncesine ekleyin. Ürün listesinin hem üst hem de alt tarafında numaraların yazması için ilgili yerlere

<% Call SayfalariYaz %>

ifadesini yazmanız yeterli.

Gelecek sayıda Ürün sitesini geliştireceğiz. Bu arada gizli bilgilerimin güvenli olup olmadığını test etmek için http://www.eskdiefterler.com/asp/_private/urunler.mdb adresine ulaşmayı deneyin.

 

Sayfa 1  Sayfa2


Dosya:
aspkasim2001.zip
 

Serkan Şahinoğlu
PC Magazine, Kasım 2001


http://BilgiTeknoloji.net