INTERNET: workshop - udost pnianie bazy danych w Internecie
Płytoteka Wst p
1. Instalacja Personal Web...
2. Przygotowujemy tabele
3. Konfigurujemy ODBC
4. Najpierw projekt
5. Poł czenie z baz
6. Dodawanie nowej płyty
7. Przeszukiwanie bazy
8. Modyfikacja informacji
Marcin Nowak
Jeszcze niedawno udost pnianie baz danych przez Internet było sztuk zarezerwowan dla nielicznych. Dzi , dzi ki
darmowym narz dziom, mo e to zrobi ka dy, kto zna podstawy HTML-a oraz Visual Basica.
W CHIP-ie 1/98 przedstawili my ASP - technologi umo liwiaj c łatwe tworzenie aktywnych witryn WWW.
Poka emy, jak za jej pomoc udost pni mał baz danych, przechowuj c informacje o płytach b d cych w
posiadaniu kilku osób, na przykład kolegów z bloku czy akademika. Do tego celu wykorzystamy Personal Web Server
firmy Microsoft. Posiadacze Windows 98 maj ten program na płycie instalacyjnej systemu - u ytkowników
poprzedniej wersji "okienek" odsyłamy do kr ka doł czonego do CHIP-a 3/98, gdzie zamieszczono Option Pack.
Zarówno wersja znajduj ca si na płycie instalacyjnej Windows 98, jak i b d ca cz ci pakietu Option Pack zawieraj
ju ASP. Oczywi cie, aby udost pnia baz danych, trzeba j mie - my posłu ymy si danymi przechowywanymi w
dokumencie programu Microsoft Access.
Info
Strona po wi cona standardowi j zyka SQL: http://www.jcc.com/sql_stnd.html
Na CD w dziale CHIP-offline | Internet | Workshop:ASP znajduj si filmy ilustruj ce wybrane fragmenty artykułu oraz
pliki witryny zrealizowanej wg wskazówek zawartych w artykule
1.
Instalacja Personal Web Servera
Je li posiadamy płyt instalacyjn Windows 98, proces instalacji Personal Web Servera trzeba rozpocz
od uruchomienia odpowiedniego programu z kr ka. W tym celu nale y z menu Start wybra pozycj
Uruchom i w okienku, które si pojawi, napisa x:\add-ons\pws\setup.exe, gdzie x jest liter
oznaczaj c nap d CD.
W przypadku Option Packa rozpocz cie instalacji jest jeszcze łatwiejsze - wystarczy wło y płyt do
nap du, a po uruchomieniu aplikacji do jej obsługi przej do kategorii Software | Wersje pełne, wybra
Windows NT 4.0 Server Option Pack i klikn przycisk Instaluj. Wbrew temu, co sugeruje nazwa
programu, zawiera on wersj PWS dla Windows 95.
Kolejnym krokiem jest podanie miejsca, w którym b d si znajdowały serwowane przez nas pliki.
Mo emy zostawi warto domy ln i przej do nast pnego ekranu. Tutaj instalator zapyta si o folder,
w którym ma by zainstalowany
Microsoft Transaction Server
. W tym miejscu równie nie musimy niczego zmienia - aby rozpocz
proces instalowania programu, kliknijmy tylko przycisk Dalej.
2.
Przygotowujemy tabele
W naszej bazie b dziemy udost pnia dane przechowane w plikach Accessa. Pierwsz czynno ci , jak
musimy wykona , jest przygotowanie odpowiedniej tabeli, w której b dziemy przechowywa informacje.
Po uruchomieniu Access zapyta, co chcemy zrobi . Z grupy polece Tworzy now baz danych
u ywaj c wybieramy pustej bazy danych, naciskamy OK i podajemy nazw pliku, np. CD. Po wybraniu
przycisku OK pojawi si okno z nasz baz , nie zawieraj c jeszcze adnych tabel. Nast pnie klikamy
przycisk Nowy i tworzymy odpowiednie pola. Ich nazwy oraz typy znajduj si w ramce obok. Trzy pola
s kluczami, co oznacza, e nie mog istnie rekordy maj ce identyczny tytuł płyty, artyst i wła ciciela -
jedna osoba nie mo e mie dwu takich samych płyt.
Przy próbie zamkni cia projektu Access zapyta o nazw tabeli - wpisujemy słowo "CD" i klikamy przycisk
OK. Mo emy tak e wprowadzi do tabeli kilka rekordów - kolejne b dziemy mogli doda z formularza
znajduj cego si na stronach naszego serwisu WWW.
W podobny sposób tworzymy drug tabel , która b dzie zawiera spis wła cicieli płyt oraz ich hasła
sprawdzane przy próbie modyfikacji bazy.
Plik z baz znajduje si w folderze Moje Dokumenty. Bezpieczniej jest go jednak przenie tam, gdzie
jest przechowywana reszta udost pnianych plików. Po zamkni ciu Accessa w katalogu Inepub na dysku
C: tworzymy folder DB i tam umieszczamy plik cd.mdb.
3.
Konfigurujemy ODBC
PWS, podobnie jak wi kszo programów korzystaj cych z baz danych, nie odwołuje si do nich
bezpo rednio - wszystkie operacje odbywaj si za po rednictwem ODBC. Open DataBase Connectivity
to specjalne sterowniki, umo liwiaj ce komunikowanie zarówno z profesjonalnymi serwerami baz danych,
jak i z informacjami zgromadzonymi w plikach Accessa, Excela czy nawet zbiorach tekstowych. Nie
musimy si martwi o zdobycie odpowiednich driverów - zostan zainstalowane razem z Personal Web
Serverem.
Aby skonfigurowa ODBC, otwieramy Panel sterowania i wybieramy ikon 32-bitowe ODBC. W oknie
Administrator ródeł danych ODBC, w zakładce DSN u ytkownika, klikamy Dodaj, uaktywniamy
pozycj Microsoft Access Driver (*.mdb) i naciskamy klawisz [Enter]. Na ekranie pojawi si okno
Konfiguracja ODBC Microsoft Access. Tutaj dokonujemy wła ciwej konfiguracji naszego ródła
danych. Jako Nazwa ródła danych podajemy CD, a w polu Opis wpisujemy komentarz, np. Baza CD
udost pniana przez Internet. Ostatni czynno ci jest wybranie pliku, który zawiera dane. W tym celu
klikamy Wybierz i wskazujemy zbiór o nazwie cd.mdb, który znajduje si w katalogu c:\inetpub\db.
4.
Najpierw projekt
Przed przyst pieniem do tworzenia stron musimy zaplanowa struktur naszej witryny. Na stronie
głównej (default.htm), oprócz informacji wyja niaj cej co to za serwis, umie cimy trzy odno niki.
Pierwszy b dzie prowadził do strony wy wietlaj cej cał zawarto bazy (pokaz.asp), za pomoc
drugiego przejdziemy do dokumentu umo liwiaj cego przeszukiwanie zgromadzonych informacji
(szukaj.asp). Z ostatniego b d korzysta osoby, które kupiły now płyt i chc , by odpowiednie dane
znalazły si w bazie (dodaj.asp). Umo liwimy tak e usuwanie płyt z bazy (usun.asp) oraz modyfikacj
istniej cych wpisów (zmien.asp).
tabela CD:
tabela CD
Klucz
Nazwa
Typ
tak
Artysta
znakowe, 100 znaków
tak
Tytuł
znakowe, 100 znaków
tak
Wła ciciel
znakowe, 30 znaków
Wypo yczona
Tak/Nie
Rodzaj
znakowe, 20 znaków
tabela hasła:
tabela hasła
Klucz
Nazwa
Typ
tak
Imie
znakowe, 30 znaków
Hasło
znakowe, 20 znaków
5.
Poł czenie z baz
Pierwsza strona, któr przygotujemy, b dzie wy wietlała wszystkie płyty znajduj ce si w bazie. Musimy
j oczywi cie zaprojektowa , a pó niej napisa w HTML-u. Kurs tego j zyka był publikowany w CHIP-ie w
numerach 5/98 - 7/98, 9/98 i 10/98. My skupimy si na ASP (patrz: CHIP 1/98), które umo liwia
stworzenie aktywnego serwisu, pozwalaj cego odczytywa informacje z bazy, zapisywa oraz
przeszukiwa jej zawarto .
W j zyku VBScript, którego b dziemy u ywali do pisania stron ASP, otwarcie poł czenia z baz danych
jest realizowane za pomoc nast puj cych polece :
Set Conn = Server.CreateObject( "ADODB.Connection")
'On Error Resume Next
Conn.Open "DSN=CD;UID=;PWD="
Wywoływana jest metoda CreateObject obiektu Server. Jej argumentem jest nazwa innego obiektu,
umiej cego nawi zywa poł czenie z baz danych. Stworzona w rezultacie zmienna Conn zawiera
metod Open, która otwiera wła ciwe poł czenie. Aby nowo powstały obiekt Conn "wiedział", do jakiej
bazy ma si odwoła oraz aby został tam "wpuszczony", musimy poda nazw ródła ODBC,
u ytkownika oraz hasło. rodkow linijk wzi to w komentarz - chwilowo nie b dzie nam potrzebna, ale
pó niej zrobimy z niej u ytek.
Podczas
konfigurowania ródła
danych ODBC musimy
wskaza plik
zawieraj cy baz
Pami tajmy o tym, eby wszystkie polecenia VBScriptu oddziela od pozostałej zawarto ci strony
znakami <% oraz %> .
Aby odczyta co z bazy lub do niej zapisa , musimy korzysta z j zyka SQL. Jego opanowanie nie jest
trudne, ale sprawne posługiwanie si wymaga wprawy. My ograniczymy si do kilku prostych polece ,
konfigurowanie
umo liwiaj cych manipulowanie naszymi danymi.
Do wydobycia wszystkich rekordów z naszej bazy, uporz dkowanych alfabetycznie po polu artysta oraz
tytul, skorzystamy z nast puj cego zapytania:
SELECT * FROM CD ORDER BY Artysta, Tytul
Takie polecenie zapiszemy w zmiennej sql, której u yjemy przy odwoływaniu si do bazy danych:
sql = "SELECT * FROM CD ORDER BY Artysta, Tytul"
Set rst = Conn.Execute(sql)
W wyniku wykonania powy szych polece zostanie zadane zapytanie, a jego wyniki znajd si w
zmiennej rst. Zawiera ona wszystkie odczytane z bazy rekordy, ale w danej chwili pozwala na
odwoływanie si tylko do jednego z nich. Chc c odczyta kolejne, musimy wywoła polecenie rst.Move-
Next, które przewija "okienko" w zbiorze rekordów na nast pny. Istnieje tak e mo liwo poruszania si
wstecz - aby to zrobi , nale y u y innej metody - rst.MovePrevious. Rst to kolekcja - zawiera wiele
zmiennych, w tym przypadku poszczególne pola rekordu, do których mo emy odwoływa si przez
nazwy. Po odczytaniu danych mo na zamkn poł czenie, wywołuj c metod Close. Je li tego nie
zrobimy, zostanie ono zamkni te automatycznie po zako czeniu wykonywania zawarto ci strony WWW.
Wypisanie na ekran tabeli z wszystkimi odczytanymi z bazy rekordami oraz zamkni cie poł czenia
realizowane jest nast puj c grup polece :
<TABLE><TR><TH>Artysta</TH>
<TH>Tytuł</TH><TH>Wła ciciel</TH>
<TH>Rodzaj muzyki</TH>
</TR>
<%Do While not rst.eof%>
<TR><TD><%=rst("Artysta")%></TD>
<TD><%=rst("Plyta")%></TD>
<TD><%=rst("Wlasciciel")%></TD>
<TD><%=rst("Rodzaj")%></TD>
<TD>
<% if rst("wypozyczona") = "1" then response.write "wypo yczona"
else response.write " "
end if%>
</TD></TR>
<%rst.movenext Loop Conn.Close%>
</TABLE>
W p tli wy wietlaj cej tabel ze spisem zgromadzonych przez nas płyt u yli my EOF: wła ciwo ci zbioru
rekordów umo liwiaj cej sprawdzenie, czy dotarli my do ostatniej porcji danych. Aby by pewnym, e na
tworzonej wła nie stronie nie wyst puje aden bł d, musimy zrobi to samo zaraz po zadaniu zapytania.
Gdyby bowiem w bazie danych nie było adnych informacji, wy wietliliby my pust tabel - znacznie
bardziej elegancko b dzie wygl dał komunikat Baza jest pusta.
Do umieszczenia czego na ekranie u yli my funkcji
Response.Write, ale je li na stronie jest du o statycznego tekstu i w niewielu miejscach wypisujemy
warto ci zmiennych, zamiast konstrukcji
<%Response.write Request("imie")%>
mo emy u ywa
<%=Request("imie")%>
Wszystkie informacje przechowywane w bazie maj polskie "ogonki" w standardzie CP-1250, tymczasem
w Internecie obowi zuje norma ISO-8859-2. Oznacza to, e przed wy wietleniem czegokolwiek musi by
dokonana konwersja. Gdyby my przechowywali dane na serwerze SQL, odpowiedni sterownik ODBC
dokonywałby jej automatycznie. Poniewa u ywamy plików Accessa, musimy robi to samodzielnie - w
tym celu napiszemy własn funkcj . U yjemy w niej funkcji Replace, która potrafi zamieni dowolny
fragment ła cucha znaków na inny, np.: test = Replace(test, " ","Q"). Nie konwertujemy wszystkich
znaków, gdy tylko literki , , , , , maj ró ne kody w obydwu standardach. Za ka dym razem, gdy
b dziemy odczytywa jakie dane z bazy, zamiast rst("nazwa_pola") b dziemy pisa
w2i(rst("nazwa_pola")). Przy zapisywaniu u yjemy funkcji wykonuj cej czynno odwrotn .
6.
Dodawanie nowej płyty
Nasza witryna ma umo liwia dodawanie płyt do bazy. W tym celu na stronie WWW musimy umie ci
formularz, w którym posiadacz nowego tytułu b dzie mógł poda dotycz ce go informacje. Elementom
formularza nadamy takie nazwy, jakie maj odpowiadaj ce im pola w bazie. Znajdzie si tam równie
pole, w którym trzeba b dzie wpisa swój identyfikator oraz hasło, co uniemo liwi postronnym osobom
dokonywanie zmian. Poniewa hasła znajduj si w osobnej tabeli, na stronie wy wietlanej po wysłaniu
formularza musimy zada dwa zapytania - jedno o hasło oraz drugie, umieszczaj ce informacje w bazie.
Dane do naszej bazy
mo emy dodawa z
poziomu Accesa
Dane wysłane przez formularz znajduj si w kolekcji o nazwie Request. Odwołujemy si do nich,
podaj c nazwy pól formularza, tak samo, jak robili my to w przypadku zmiennej rst. Polecenie
konstruuj ce zapytanie o hasło b dzie wi c wygl da nast puj co (cało to jedna linia):
sql = "SELECT Imie FROM Hasla WHERE Imie = '" & Request("Wlasciciel") & "' AND haslo = '" &
Request("haslo") & "'"
Je eli po jego zadaniu wła ciwo EOF zbioru danych b dzie równa FALSE, oznacza to, e został
zwrócony jaki rekord. Istnieje wi c u ytkownik z takim hasłem i ma prawo do umieszczenia w naszej
bazie nowej płyty.
Dotychczas tylko wyci gali my informacje z bazy - aby w niej co zapisa , musimy skonstruowa nowe
zapytanie, oparte na słowie INSERT.
sql = "INSERT INTO Plyty VALUES ('"
sql = sql & Request("Artysta") & "', '"
sql = sql & Request("Tytul")
sql = sql & "', " & Request("Rodzaj")
sql = sql & ", '" & Request("Wlasciciel")
sql = sql & "', "
sql = sql & Request("Wypozyczona") & ")
Zwró my uwag , e pole Wypozyczona nie jest uj te w apostrofy. W przeciwie stwie do warto ci
pozostałych, b d cych typu tekstowego, jest ono liczb .
Mo e si zdarzy , e z jakiego powodu, na przykład usuni cia pliku z informacjami o płytach, na
naszych stronach wyst pi bł d. Mo e by on spowodowany wieloma czynnikami, których nie jeste my w
stanie przewidzie . W przypadku napotkania nieprawidłowo ci ASP przerywa wykonywanie zawarto ci
strony i wy wietla komunikat o bł dzie. Nie wygl da to zbyt profesjonalnie, tym bardziej e jest on
niezrozumiały dla typowego u ytkownika i zawiera dziwne liczby, nie mówi ce wiele zaskoczonemu
go ciowi naszej witryny. Ponadto, je li całe zdarzenie zajdzie podczas tworzenia tabeli z informacjami o
płytach, nie zostanie ona zako czona prawidłowo i jej zawarto nie b dzie widoczna - tak e komunikat o
bł dzie. Mo emy jednak go "przechwyci " i wypisa na ekranie informacj , która nikogo nie wprawi w
osłupienie.
Na stronie wy wietlaj cej zawarto naszej bazy znajduje si , wzi te w komentarz, polecenie On Error
Resume Next. Je li usuniemy pocz tkowy apostrof, wszystkie pojawiaj ce si pó niej bł dy zostan
zignorowane. Nie oznacza to jednak, e nie b dziemy o nich wiedzie i przegapimy je. Istnieje obiekt Err,
który zawiera informacje o ostatnim bł dzie. Niestety, sami musimy sprawdza , czy co si stało. Dlatego
po poleceniu, które zadaje zapytanie, umie cimy nast puj cy fragment kodu:
<% If (Err.Number <> 0) then
Response.Write "Wyst pił bł d, informacje nie zostały zapisane."
Else Response.Write "Informacje o płycie zostały zapami tane."
End if% >
Wła ciwo Number obiektu Err zawiera informacje o nu-merze bł du, który wyst pił podczas
wykonywania ostatniego polecenia. Je li nic złego si nie zdarzyło, jest ni 0. Pami tajmy o tym, e je li
w jednym miejscu wył czyli my sygnalizowanie bł dów, obowi zuje to w całym dokumencie i mo emy
nie zauwa y naszych kolejnych pomyłek. Dlatego polecenie On Error Resume Next powinno by
wzi te w komentarz, dopóki nie przekonamy si , e nasza strona działa poprawnie.
7.
Przeszukiwanie bazy
Nasz serwis nie byłby w pełni funkcjonalny, gdyby nie miał mo liwo ci przeszukiwania zgromadzonych w
nim informacji. Pierwsz czynno ci jest przygotowanie odpowiedniego formularza. B dzie on umo liwiał
przeszukiwanie bazy po dowolnym polu. Jego przykładowy kod znajduje si w ramce na poprzedniej
stronie.
Pierwsz czynno ci , która zostanie wykonana po wysłaniu formularza, powinno by sprawdzenie, czy
był on wypełniony. Je li nie, u ytkownika ode lemy do strony, która wy wietla cał zawarto bazy.
U yjemy tzw. przekierowania, czyli komendy protokołu HTTP, wysyłaj cej informacj o nowej lokalizacji
strony.
Poniewa wszystkie nagłówki HTTP (równie ten o przekierowaniu) s wysyłane przed zawarto ci
strony, odpowiednie polecenia VBScriptu musz znale si na samym pocz tku pliku ASP.
Nasza baza umo liwia
przeszukiwanie
zgromadzonych w niej
danych
Po sprawdzeniu, e formularz nie został wypełniony, wysyłamy przekierowanie i ko czymy wykonywanie
strony:
If Request("artysta")="" AND Request("tytul")="" AND Request("wlasciciel")=""
then Response.Redirect ("http://" & Request.ServerVariables("SERVER_NAME") & "pokaz.asp")
Response.End
Gdyby my nie wykonali ostatniego polecenia, zawarto strony zupełnie niepotrzebnie byłaby dalej
przetwarzana.
Je li formularz został wypełniony, musimy skonstruowa zapytanie, które "wydob dzie" z bazy
odpowiednie informacje. B dzie si ono zaczyna nast puj co:
sql = "SELECT * from Płyty WHERE "
Tre zapytania oznacza: "Wybierz z tabeli Płyty takie całe rekordy, w których...". Teraz po słowie
WHERE musz nast pi polecenia okre laj ce, jakie warunki musz spełnia wyszukane rekordy.
Poniewa zakładamy, e go naszej witryny mo e zna tylko cz
nazwy płyty albo zespołu, zamiast
znaku =, do porównywania u yjemy operatora SQL-a LIKE i znaków %. Te ostatnie działaj podobnie jak
gwiazdki przy listowaniu zawarto ci katalogu w DOS-ie - zast puj dowolny ci g znaków. Dzi ki temu po
podaniu słowa "blue" w ród odpowiedzi znajd si zarówno "Kind of blue", jak i "Still got the blues".
Zakładamy, e je li które z trzech pól formularza nie zostało wypełnione, mo e mie dowoln warto .
Cz
zapytania dotycz c artysty formułujemy nast puj co:
<%
If Request("artysta") <> ""
then sql = sql & "artysta LIKE '%"
sql = sql &
Request("artysta") & "%' "
end if
%>
Podobnie post pujemy w przypadkach pozostałych dwu pól. Je li nasze zapytanie jest nieprawidłowe i
wywołuje bł d, dobrze jest, bezpo rednio przed jego zadaniem, wypisa na ekranie warto zmiennej
sql; pozwoli nam to przeanalizowa zapytanie. Najcz stsz przyczyn bł dów s nie domkni te
apostrofy lub operator AND znajduj cy si na ko cu.
Formularz do przeszukiwania zawarto ci bazy
Podaj kryteria wyszukiwania:
<FORM ACTION="szukaj.asp">
Artysta: <INPUT TYPE="TEXT" NAME="artysta"> <BR>
Tytuł: <INPUT TYPE="TEXT" NAME="tytul"> <BR>
Wła ciciel: <INPUT TYPE="TEXT" NAME="wlasciciel"> <BR>
wyszukiwanie w naszej bazie
Wypo yczona:
<SELECT NAME="wypozyczona">
<OPTION VALUE=""> oboj tnie
<OPTION VALUE="0"> nie
<OPTION VALUE="1"> tak
</SELECT>
<INPUT TYPE="Submit" VALUE="Szukaj"
</FORM>
8.
Modyfikacja informacji
Ostatnimi funkcjami, w jakie wyposa ymy nasz baz , jest mo liwo modyfikowania wpisów oraz ich
usuwania. Najlepiej, na li cie płyt, obok ka dej pozycji zrobi odno niki prowadz ce do dokumentów
wykonuj cych odpowiednie operacje. Musimy to wykona tak, by na wywołanej stronie było wiadomo,
który rekord chcemy usun lub zmodyfikowa . W tym celu do tego dokumentu przekazujemy parametry,
które pó niej odczytamy z kolekcji Request. Umie cimy je w odno niku prowadz cym do omawianej
strony, by wygl dał on np. tak (całe polecenie musi by w jednej linii):
<A HREF="usun.asp?tytul=Cisza & artysta=Budka+Suflera">usu </A>
Zwró my uwag na + zast puj cy spacje. Jest wiele znaków, które nie mog wyst pi w URL-u i dlatego
ASP ma specjaln funkcj - Server.URLEncode - która zamienia spacje na plusy, a pozostałe
niechciane znaki na ci g %nn, gdzie nn to kod znaku w systemie szesnastkowym. Niestety, nie istnieje
aden gotowy mechanizm wykonuj cy czynno odwrotn - nale y napisa własn funkcj . W projekcie
serwisu umieszczonym na płycie CD doł czonej do magazynu, znajduje si ona w pliku drequest.inc.
Aby zmodyfikowa informacje o wybranej płycie, najpierw musimy je odczyta , nast pnie wy wietli w
formularzu i po naci ni ciu przez u ytkownika przycisku Zapisz zapisa w bazie. Oczywi cie, za ka dym
razem musimy pami ta o sprawdzaniu hasła, by tylko wła ciciel mógł dokona zmian.