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ı

Sayfa1  Sayfa 2

Web sayfalarında ASP ile veritabanı işlemlerinin nasıl yapıldığını bu yazıdan öğrenebilirsiniz. İlk makalesini okuduğunuz bu yazı dizisinde ASP tekniklerini bulacaksınız. Web sayfanızda ASP ile veritabanı işlemlerinin nasıl yapıldığını öğrenmek için yazıyı okumaya devam edin.
 

SADECE BU YAZIDA

ASP ile daha önce çalışmamız okurlarımızın, sadece bu yazıda yer alacak bazı ön bilgilere ihtiyacı olacaktır.

Öncelikle ASP uygulamalarını kendi bilgisayarınızda çalıştırmak isteyebilirsiniz. Windows 95 ve Windows 98’de ASP uygulamalarını çalıştırmak istiyorsanız Personal Web Server (PWS) programını kurun. Windows 2000’de ise Program Ekle/Kaldır bölümündeki Windows Bileşenleri sayfasını kullanın. Buradan Internet Information Services’i (IIS) yükleyin.

ASP kodları sadece sunucu tarafında çalışır ve ziyaretçiye hiçbir şekilde ASP kodlarının kendisi gitmez. Peki sayfadaki bir kodun ASP için olduğu nasıl anlaşılır?

Web sayfanızda <% ile %> arasında kalan blokların tamamı ASP koduna dahildir. Bu bölgeler işlenir ve kullanıcıya gönderilir. ASP’nin ana görevlerinden biri ziyaretçilerin istediği web belgelerine metin üretmektir.

ASP belgelerini standart HTML belgelerinden ayıran temel kurallar vardır. Bir ASP sayfasını yaparken şu iki şartın yerine getirilmesi yeterlidir. Dosyanın uzantısını ASP yapın ve ilk satırı aşağıdaki şekilde düzenleyin:

<%@LANGUAGE=VBSCRIPT %>

Sonrasında, çalışmasını istediğiniz kodları <% ile %> arasına yerleştirmeniz yeterli. Bunların dışındaki bölgeler ise doğrudan HTML kodlarına aittir. Fakat ASP sadece HTML belgeleri üretmek için kullanılmaz. İçeriğinde HTML etiketleri olmayan herhangi bir çıktı da üretilebilir. Veyahut XML, Javascript, VBScript gibi kodlar da üretmek mümkün.

ASP sayfalarının içeriği şu şekilde olabilir:

SUNUCU DOSYASINDAKİ KOD
 
<%@LANGUAGE=VBSCRIPT %>
<html>
<head>
<title>Sayfama Hoşgeldiniz - <% =Now() %></title>
</head>
<body>

Merhaba.<br>
Sayfama hoşgeldiniz.<br>
Şu an <% response.write Now() %><br>

</body>
</html>

Bu ASP sayfası çalıştırıldığında üretilen belgenin içeriği şu şekilde olacaktır:

ZİYARETÇİYE GÖNDERİLEN KOD

<html>
<head>
<title>Sayfama Hoşgeldiniz - 10/6/2001 6:05:04 PM</title>
</head>
<body>

Merhaba.<br>
Sayfama hoşgeldiniz.<br>
Şu an 10/6/2001 6:05:04 PM<br>

</body>
</html>

ASP kodunu ve üretilen sonuç metnini karşılaştırın. Gördüğünüz gibi ziyaretçiye, ASP kodlarını ayıran işaretler arasında kalan kısımların kendisi değil, bunların çalıştırılmasından elde edilen sonuç metinleri ve HTML kısmı gönderildi.

ASP bloğu içinde sayfaya yazdırmak için Response.Write deyimi kullanılıyor. Bununla birlikte kimilerince “eşittir metodu” diye adlandırıldığı üzere ayıraçlar içindeki deyimin tamamı eşittir işareti ile başlatılıyor.

Bu durumda aşağıdaki iki deyim aynı sonucu üretecektir.

<% response.write Now() %>

<% =Now() %>

1. Response nesnesine Now değerini yazdır!
2. Bloğu Now değerine eşitle!

Bu deyimler sonuç belgesine metin ekliyor. ASP kodlarını ayıran işaretler arasına isterseniz sayfalarca kod yerleştirebilir ve sonuç metni üretmeyen kodlar da çalıştırabilirsiniz.

Windows 2000 ile çalışıyorsanız Yönetim Araçları içindeki Bilgisayar Yönetimi bileşeninin Hizmetler dizini altında bulunan Internet Information Services (IIS) hizmetini sıkça kullanmanız gerekebilir.

Windows 98 kullanıyorsanız PWS’yi çalışır halde bırakmanız gerekir. PWS’nin NT tabanlı sistemlerdeki karşılığı biraz önce bahsettiğim IIS hizmetidir. IIS, Windows NT ve Windows 2000’de arka planda çalışır halde bekletilir.

Hazırladığınız ASP sayfalarını test etmek için PWS’de belirlenen Web adını (örneğin myweb1) , Localhost adını ya da 127.0.0.1 adresini kullanabilirsiniz.

Web hizmeti çalışır iken Web tarayıcınızda http://myweb1, http://localhost, http://127.0.0.1 gibi adreslere ulaşmayı deneyin. Bu adresler sizin bilgisayarınızda o an geçerli Web servisine ait olabilir.

Bu adreslerin üçüne de ulaşamıyorsanız;
  • Web hizmeti (PWS ya da IIS) çalışmıyor olabilir.
  • Web hizmeti seçeneklerinde belirtilen giriş dizini ya da bu dizindeki açılış dosyalarına ulaşılamıyor olabilir. Hizmet seçeneklerinde Documents (giriş dosyaları) sayfasındaki dosya adlarından birinin giriş dizininde olup olmadığını kontrol edin.
  • Açılış dosyasındaki hatalı bazı kodlar uygulamanın çalışmasını yarıda kesebilir. Önce küçük bir HTML belgesini açmayı deneyin. Bu çalışıyorsa basit kodlu başka bir ASP belgesini açmaya çalışın. ASP belgesi açılmıyorsa geçerli web sitesinin giriş dizini sayfasında Application (Uygulama) oluşturun. Küçük ASP belgesi açılıyor fakat daha önce denediğiniz ASP belgesi açılmıyorsa, önceki belgedeki kodlar hataya neden oluyor demektir.

 

Localhost ve 127.0.0.1 adresleri bilgisayarın kendisini ifade eder. Bu kural sadece bu yazıdaki uygulamalarda değil, hemen her yerde geçerlidir.

ASP sayfalarını açarken dosyanın bilgisayarda varolan yolunu (c:\myweb1\dosya.asp gibi) değil, Web servisindeki yolunu belirtin. http://localhost/dosya.asp gibi.
 

INTERNETTE VERİTABANI

Bu dizide veritabanı işlemleri için çoğunlukla ADO kullanacağız. ADO’nun son sürümünü Microsoft’un sitesinde ya da bazı programların kurulum dosyaları arasında bulabilirsiniz.

ADO, ücretsiz dağıtılan Microsoft Data Access Components (MDAC) paketine dahil bir üründür. Windows 2000 üzerinde 2.5 sürümü çoğu zaman geçerli olarak kuruludur. ADO yüklü değilse 8 MB.’lik MDAC_TYP.EXE dosyasını bir yerlerden bulup yükleyebilirsiniz.

ADO her platformda aynı şekilde kullanılabilir. VB’de, Access’te ya da başka bir yerde ADO’yu kullandıysanız ASP’de daha önce aşina olduğunuz bu kodları benzer şekilde rahatlıkla kullanabilirsiniz.

Bilgisayarınızda ADO’nun yüklü olup olmadığını öğrenmek için Access’teki ya da VB’deki başvurular listesini inceleyin. Listeden Microsoft ActiveX Data Objects 2.x Library’yi arayın. Bunlar yoksa Microsoft’un sitesinde bulunabilen küçük ADOVER.EXE programını indirin.

ADO ile veritabanı kayıtlarına erişirken çoğunlukla iki bileşenden yararlanılıyor. ADO’daki Connection nesnesi kayıt tablolarının bulunduğu veritabanına bir bağlantı oluşturur ve Recordset nesnesi bu bağlantı üzerinden içerideki tablolara erişir.

Bu yazıdaki örnek uygulamada ürün veritabanına ulaşılıp ürünler belli kategorilere göre listeleniyor ve ürün bilgileri içinde arama yapılıyor.
 

ÜRÜNLER

Önce default.asp resmindeki bilgileri inceleyin.

Ürün kayıtları gruplara ve markalara göre listelenmiş. Ürün veritabanı ürünlerin ve ürün gruplarının bulunduğu iki tablodan oluşuyor. İyi sorgulama yapabilmek için ürün gruplarının ayrı bir tabloda tutulması gerekiyordu. Grupların herbiri için özel bir ID numarası tanımlayıp bu numaraları ürünler tablosundaki ürünlerle eşleştirmek bazı açılardan kolaylaştırıcı oluyor.

Gruplar tablosunun ID alanı ile Urunler tablosunun GrupID alanı birbirine bağlı.

Access’te RelationShips (İlişkiler) kurallarını tanımlamadan önce veri alanlarında bazı değişiklikler yapmak gerekiyor. Zira ilişkilerde kullanılan bir veri alanı için bazı özellikler daha sonra değiştirilemeyebilir.

 
İYİ DÜZENLENMİŞ VERİTABANI

Sorgu işlemlerinin hızlı olması için indeks tanımlamaları da gerekli. Özellikle JOIN kullanılan sorgularda, ilişki tanımlı alanlar birbirine kolay ulaşacağı için bu sorgular yeterince hızlı çalışırlar. JOIN sorguları tablolardaki veri alanlarının birbirine bağlanması ile oluşuyor. Access’te iken ya da herhangi bir SQL kodunda iki tablodaki alanların birbirlerine eşitlenmesi, kriterler kısmında (WHERE) değil de JOIN kısmında yapılmalıdır.

Farklı tablolardaki alanların WHERE cümlesinde birbirlerine eşitlenmesi iki tablonun birbiri ile çarprazlanmasına neden olur ki, bu yeterince uzun sürer. JOIN deyimi ise tüm kayıtların birbirleri ile çarprazlanmasını önler.

Resimdeki Query1 ve Query2 sorgularının tasarımlarına göz atın. Farklı tabloları bağlamak için genelde Query1’deki gibi hatalı sorgular yapılıyor. Bunun için en iyi yol Query2’deki gibi veri alanlarını bağlamaktır. Aynı türdeki bu alanlardan birini tutup diğerinin üzerine sürükleyin.

Ürünler tablosunda gruplara ait GrupID bilgisi tutuluyor. Bu, daha kolay yönetmeyi sağlıyor. Sürükledikten sonra oluşan çizgiyi çift tıklatıp bu bağlantının özelliklerini ayarlayın.

Bu bağlantıdaki amacımız ürünler tablosundaki tüm kayıtları liseleyip bunlarla eşleşen grup bilgilerini diğer tablodan getirmek. Bunun için JOIN Properties penceresindeki ikinci seçeneği seçtim.

Birçok sorgulama işleminde GROUP BY ve JOIN deyimleri beraber iyi iş çıkarıyorlar. Bağlı veri alanlarında gelişmiş sorgulama ile ilgili bazı ipuçlarını sonraki yazılarımda bulabilirsiniz.

 
ÜRÜNLER SAYFASINA HOŞGELDİNİZ

Web’de veritabanı işlemleri yapmadan önce veritabanının iyi programlanması önemlidir. Bundan sonrasında ürün bilgilerinin veritabanından alınıp listelendiğini göreceksiniz.

Ürün sayfaları

Ürünler ana sayfa
* Ürün gruplarını ve adetlerini göster.
* Markaları ve adetleri göster.
* Arama kutusu koy.

Ürün listeleme sayfası
*
Aranacak kelimeyi ilgili tüm alanlarda ara.
* Marka ve grup araması da burada olsun.
* Kayıtları sayfa sayfa göster.
* Sayfa numaralarında bağlantı tanımlayıp (link) bunları üst ve alt tarafta göster.

Yöntem
* Ürün arama sayfasında marka listeleme, grup listeleme ve genel arama olacağı için bu sayfaya “yöntem” ve “değer” parametreleri gönderilebilmeli.
* Kayıtlar birden çok sayfada listeleneceği için bu sayfa “sayfa” adlı bir parametreyi de kabul etmeli.
* Liste sayfasında sayfa adedi 1 ise sayfa numaralarını yazma. Aktif sayfa numarasına bağlantı verme, numarasını koyu göster.
* Sayfa numaralarını listelemek için bir kod bloğu (sub yordamı) yaz.
* Listeleri Access dosyasının içindeki Query (sorgu) nesnelerinden al.

Başlamadan önce veritabanı dosyasının ziyaretçilerin ulaşamayacağı bir yerde bulundurulması gerekiyor. Ben şimdilik Frontpage’nin oluşturduğu _Private dizini altında bulunduruyorum. Frontpage bazı durumlarda FPDB dizinini de kullanıyor. Bendeki _Private dizini güvenli mi? Yazının sonundaki testi yapıp görebilirsiniz.

 

_Private içindeki Urunler.mdb dosyasında sorgu nesneleri oluşturdum. Her seferinde uzun sql kodları yazmamak için böyle yaptım. SQL Server’daki View nesnelerinde olduğu gibi Access’in sorgu nesneleri yeni bir sql cümlesi içinde kullanılabiliyor. Buradaki örnekte bu sorgu nesnesinin adını belirterek kullandım. Resimdeki qGrup_Adet, qMarka_Adet, qUrunler sorgularını inceleyin.

 

ASP İLE VERİYE ULAŞMAK

Verilere ulaşmak için ADO’nun Connection ve RecordSet nesnelerinden oluşturun.

<%
dim conn
set conn = Server.CreateObject("ADODB.Connection")
conn.open "Driver={Microsoft Access Driver (*.mdb)}; dbq=Urunler.MDB"

dim rst
set rst=CreateObject("ADODB.RecordSet")
rst.open "qGrup_Adet", conn
%>

C:\Urunler.MDB dosyasına bir bağlantı oluşturuldu. Rst.Open deyiminin sonundaki Conn parametresi Rst nesnesinin Conn üzerinden “qGrup_Adet” sorgusuna bağlanacağını gösteriyor.

Veritabanı dosyasını ziyaretçilerin ulaşamayacağı bir dizine yerleştirmek gerekiyor. Web sunucusunda, özellikle Internet’ten üye olunan Web servislerinde dosyayı güvenli bir dizine yerleştirdikten sonra dosyanın tam yolunu bulmak için Server.MapPath deyimini kullanın. Herhangi bir dizin belirtmeyip doğrudan dosyanın adını yazdığınızda dosyanın yolu belirsiz kalabilir.

Server.MapPath("/_private/urunler.mdb")

deyimi “e:\webs\myweb.com\_private\urunler.mdb” gibi bir yol adı üretebilir. Conn.Open deyiminin aşağıdaki gibi olmasını sağlayın.

Conn.Open "Driver={Microsoft Access Driver (*.mdb)}; dbq=" & _
Server.MapPath("/_private/urunler.mdb")

Bu deyimin sonucu şöyle olacaktır:

Conn.Open "Driver={Microsoft Access Driver (*.mdb)}; dbq=e:\webs\myweb.com\_private\urunler.mdb"

Server.MapPath deyimini birçok yerde kullanmanız gerekebilir.

& işareti iki yanındaki elemanları metin (string) türünde birleştiriyor. Al çizgi (_) ise satırın aşağıdan devam ettiğini belirtiyor. Tırnak içine alınmış metinleri alt satıra kaydırmak istiyorsanız doğrudan alt çizgi kullanmayıp iki ayrı metinmiş gibi tırnak içindeki parçalara ayırıp bunların arasında alt çizgi ve & işaretini kullanın.

Verilerin nasıl listelendiğini görmek için aşağıdaki bloğu çalıştırın.

<table>
<tr>
<td>Grup</td>
<td>Adet</td>
</tr>

<% do while not rst.eof %>
<tr>
<td><% =rst("Grup") %></td>
<td><% =rst("Adet") %></td>
</tr>
<%
rst.movenext
loop
%>

</table>

Bu örneği anlıyorsanız bundan sonraki veri listeleme işlemlerinde zorluk çekmeyeceksiniz demektir. Do-Loop döngüsü NOT RST.EOF şartı sağlandığı, yani kayıt kümesinin sonu gelmediği sürece devam ediyor. Do-Loop döngüsünün amacı <tr> ile belirtilen tablo satırları (table row) oluşturmak.

Tabii döngü içindeki MoveNext deyimi RST kümesini her seferinde bir sonraki kayda konumlandırıyor. Kayıt kümesinin sonu geldiği anda döngüden çıkılıyor ve </table> ile tablo sonlandırılıyor.

Yukarıdaki kod aşağıdaki tabloyu üretti.

Grup Adet
Küçük Ev Aletleri 7
Buzdolabı 11
Televizyon 5
Çamaşır Makinesi 5
bulaşık Makinesi 2

Marka bilgilerini listelemek için Rst.Open deyiminde “qGrup_Adet” sorgusu yerine “qMarka_Adet” sorgusunu açıp aynı işlemleri bunun için tekrarlayın. Bizim örneğimizdeki sonuçları ürün ana sayfasının resminde görüyorsunuz.

 
KODLAR VE AYRINTILAR

Yazıyı okurken bir yandan da kutu içindeki default.asp dosyasının basitleştirilmiş kodunu inceleyebilirsiniz. Kodun üst tarafındaki Option Explicit ifadesini bu yazıda ilk kez görüyorsunuz. Bu deyim ASP içindeki VBA kodlarında, değişkenlerin tanımlanmadan kullanılmaması gerektiğine işaret ediyor. Bu durumda

Dim deger

gibi bir tanımlama yapmadan “deger” adlı bir değişken kullanılamıyor. Bu, çoğu zaman iyi bir hata kontrolü sağlıyor. Aksi halde “deger” adlı değişkeni yanlışlıkla “değer” olarak okumak istediğinizde bu ikisinin farklı olduğunu göremeyebilirsiniz. Gerektiğinde Option Explicit ifadesi kullanılmayıp, tanımlama yapmadan değişkenler doğrudan kullanılabiliyor.

Kodun sonundaki Form nesnesi içindeki üç farklı INPUT elemanından ikisi ekrandaki metin kutusu ve düğme nesneleri.

<input type="hidden" name="yontem" value="ara">

şeklinde gösterilen “yontem” bilgisi gizli olarak (hidden) tanımlanmış ve değeri (value) “ara” olarak belirtilmiş.

Form nesnesi içinde gizli olarak belirtilen değerler formun çalıştıracağı dosyaya parametre olarak gönderilirler. Forma ait Action özelliği formdaki bilgilerin gönderileceği dosyanın adını belirtiyor.

<form method="POST" action="urunara.asp">

Form nesnesi içinden gönderilen bilgiler karşı tarafta Request koleksiyonu ile karşılanırlar. Ara düğmesine basıldığında urunara.asp sayfası açılır. Bu sayfada iken Request(“yontem”) deyimi ile “ara” değeri elde edilebilir.

Request koleksiyonuna ait Request.QueryString ve Request.Form alt koleksiyonları arasındaki farkları sonraki yazımda bulabilirsiniz.

Buradan sonrası ürün kayıtlarının listelenmesi ile ilgili.

Bir ürün grubu ve marka adı tıklatıldığında ilgili tüm ürünlerin listelenmesi gerekiyor. Arama kutusu için de aynı şey geçerli. Arama kutusunun yer aldığı form nesnesinin hedeflediği urunara.asp dosyası “yontem” ve “deger” parametrelerini kabul ediyor.

Form içindeki bilgiler düğmeye basılıp gönderilebiliyor. Bu bilgileri düğme olmaksızın doğrudan bir bağlantı (link) ile göndermek de mümkün.

<a href="urunara.asp?yontem=Marka&deger=Profil">
Profil Markasını Göster
</a>

Dosya adından sonraki soru işaretinden sonra parametreler yazılmalı. Üstteki bağlantı (link) kodunda urunara.asp dosyasına yönlendirme yapılıyor, “yontem” parametresi “Marka” değerine, “deger” parametresi “Profil” değerine eşitleniyor. Parametreler & işareti ile birbirinden ayrılıyorlar.

Üstteki kodun veritabanı kullanılan karşılığı aşağıdaki gibi:

<a href="urunara.asp?yontem=Marka&deger=<% =rst("Marka") %>">
<% =rst("Marka") %> Markasını Göster
</a>

 

default.asp

<%@ LANGUAGE=VBSCRIPT %>
<% Option Explicit %>

<html>

<head>
<title>Ürünler</title>
</head>

<body>

<font size="5">Ürünler</font>
<br>

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

dim rst
set rst=CreateObject("ADODB.RecordSet")
rst.open "qGrup_Adet", conn
%>

<!-- GRUPLAR LISTELENIYOR -->

<table border="1">
<tr>
<td>Grup</td>
<td>Adet</td>
</tr>
<% do while not rst.eof %>
<tr>
<td>
<a href="urunara.asp?yontem=grup&deger=<% =rst("GrupID") %>">
<% =rst("Grup") %>
</a>
</td>
<td><% =rst("Adet") %></td>
</tr>
<%
rst.movenext
loop
%>
</table>

<br>

<!-- MARKALAR LISTELENIYOR -->

<%
rst.close
rst.open "qMarka_Adet", conn
%>

<table border="1">
<tr>
<td>Marka</td>
<td>Adet</td>
</tr>
<% do while not rst.eof %>
<tr>
<td>
<a href="urunara.asp?yontem=marka&deger=<% =rst("Marka") %>">
<% =rst("Marka") %>
</a>
</td>
<td><% =rst("Adet") %></td>
</tr>
<%
rst.movenext
loop
%>
</table>

<br>

<!-- ARAMA FORMU -->
<form method="POST" action="urunara.asp">
<input type="text" name="deger" size="16">
<input type="submit" name="AraButon" value="Ara">
<input type="hidden" name="yontem" value="ara">
</form>


</body>

</html>


Sayfa1 
Sayfa 2

 
Dosya: aspkasim2001.zip
 

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


http://BilgiTeknoloji.net