12. Et større ASP-eksempel. 12.1. Innledning. 12.2. Beskrivelse av nett-butikken. Innhold



Like dokumenter
9. ASP med databasekopling, del II

10. ASP og SQL Innledning Recordset-objektet. Innhold. Referanse til læreboka Kapittel Se detaljer nedenfor.

8. ASP med databasekopling, del I

HØGSKOLEN I SØR-TRØNDELAG

HØGSKOLEN I SØR-TRØNDELAG

Innføring i bruk av CGI4VB

Transaksjonshåndtering. Skalerbarhet.

HTML5. Skjemaer på nettsider. Skjemaer med. Informasjonsteknologi 1 og 2. Gløer Olav Langslet Sandvika VGS

HØGSKOLEN I SØR-TRØNDELAG

1. Relasjonsmodellen Kommentarer til læreboka

Bygg et Hus. Steg 1: Prøv selv først. Sjekkliste. Introduksjon. Prøv selv

7. Datafiler på tjenersiden

Miniverden og ER- modell

Innføring i bruk av CGI4VB

Datamodellering og databaser SQL, del 2

EKSAMEN. Emne: Webprogrammering med PHP (kont.) Webprogrammering 1 (kont.) Eksamenstid:

5XQH.MHOYLN )URQW3DJHRJGDWDEDVHU

Oppgaver Oppgave a: Sett opp mulige relasjoner

Brukermanual til Domenia Norges webshop

JavaScriptbibliotek. Introduksjon MVVC. Informasjonsteknologi 2. Gløer Olav Langslet Sandvika VGS

1. Tilstandsinformasjon på klientsiden

HØGSKOLEN I SØR-TRØNDELAG

Oppdatering av person/studentforekomster i FS mot folkeregisteret

HØGSKOLEN I SØR-TRØNDELAG

Administrasjon Nettbutikk: Bruk brukernavn og passord som er sendt på e-post.

if-tester Funksjoner, løkker og iftester Løkker og Informasjonsteknologi 2 Læreplansmål Gløer Olav Langslet Sandvika VGS

Datamodellering og databaser SQL, del 2

Web-programmering med JSP Løsningsforslag leksjon 3

Videregående programmering 6

Datamodellering og databaser SQL, del 2

1. Innføring i bruk av MySQL Query Browser

praktiske eksempler DOM Document Object Model DOM og Høst 2013 Informasjonsteknologi 2 Læreplansmål Gløer Olav Langslet Sandvika VGS

Utvikling av dynamiske nettsteder med PHP og databaser, høsten 2006

Første bestilling av kurs

HØGSKOLEN I SØR-TRØNDELAG

Bestilling av nye kurs

Lotus Traveler - Manual for installasjon

Utplukk og sortering. Innhold

HØGSKOLEN I SØR-TRØNDELAG

1. SQL datadefinisjon og manipulering

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

Her er eksamenssett fra Vår '09. Av Robin Sværen og Simen Arvesen.

KOM I GANG MED WORDPRESS En enkel guide for å hjelpe deg gjennom det grunnleggende i Wordpress

Opprette local electronic collection med local portfolios manuelt

Brødrene Dahls Assistent BDA

notater Gule lapper Mine Et praktisk eksempel med objekter IT2 Læreplansmål Gløer Olav Langslet Sandvika VGS

Labquality/NKK ELEKTRONISK RESULTATSKJEMA VIA INTERNET. Åpning av skjemaet. Logg inn på Participant services. Velg resultatskjemaet

Brukerveiledning for Intelligent Converters MySQL Migration Toolkit IKA Trøndelag IKS 2012

1. SQL spørringer mot flere tabeller

SQL 3: Opprette tabeller, datainnsetting og utsnitt

E-post: Tel.: Hurtigkurs for nybegynnere

shop.wj.no Brukermanual

Velkommen BRUKERMANUAL. som bruker i W&J s nettbutikk. med en profesjonell innkjøpsløsning med enkelt brukergrensesnitt!!


Hvordan bli opprettet som kunde og registre ordrene på nett

Huldt & Lillevik Ansattportal Ansattportal. Versjon

HØGSKOLEN I SØR-TRØNDELAG

Learning Online. DataPower. Registrering. for administratorer. Versjon 2.x

Tilkobling og Triggere

SVARFORSLAG : Eksamen i IBE102 Webutvikling Våren 2017.

Bruksanvisning. Royal Canin webshop

HØGSKOLEN I SØR-TRØNDELAG

Bruk av NetBeans i JSP-delen av Web-applikasjoner med JSP og JSF

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

Oblig 5 Webutvikling. Av Thomas Gitlevaag

En enkel innføring i ASP

Utvikling av dynamiske nettsteder med PHP og databaser, høsten 2006

OKOK DataPower Learning AS Administrasjon 1

Øverst på siden har man denne menylinjen, merk at handlekurven er tom siden det ikke er noe symbol for antall varer ved den.

Bygg et Hus. Introduksjon. Steg 1: Prøv selv først. Skrevet av: Geir Arne Hjelle

Guide til system for flervalgsprøver

RUTEPLANLEGGINGSSYSTEM BRUKERVEILEDNING

Sprettball Erfaren ComputerCraft PDF

Brukerdokumentasjon Prosjekt nr PayEx Logistics

1. Profiler og variabler

Åsveien 9, 3475 Sætre Telefon: Mobiltelefon: Faks: E-post:

Brukermanual. System for oversiktslister. Entreprenører

Høgskolen i Telemark EKSAMEN 6102 DATABASER Tid: Hjelpemidler: Vedlegg: Eksempeldata til oppgave 1

HØGSKOLEN I SØR-TRØNDELAG

TDT4102 Prosedyre og Objektorientert programmering Vår 2014

Når en bruker skriver sitt navn ("Ole") i et form-element med name="fornavn" som attributt. klikker på submit-knappen

BAAN IVc. BAAN Data Navigator - Brukerhåndbok

Bli Kjent med Datamaskinen Introduksjon ComputerCraft PDF

HØGSKOLEN I SØR-TRØNDELAG

Spøkelsesjakten. Steg 1: Lag et flyvende spøkelse. Sjekkliste. Introduksjon

Mamut Enterprise Telefonkatalogen Online

Mammut Bokskred. Instruks for oppdatering av mammutfil og tilhørende mammut-rutiner i CS-Web.

EKSAMEN. Emne: Webprogrammering med PHP (kont.) Webprogrammering 1 (kont.) Eksamenstid:

Kjøre Wordpress på OSX

Kapittel 3. The fun starts

2. Beskrivelse av mulige prosjektoppgaver

BDA Proff på prosjekt!

HØGSKOLEN I SØR-TRØNDELAG

Vanlige spørsmål. GallupPanelet. TNS Panel-app. TNS Juni 2015 v.1.3

Brukerveiledning for 3M Online Center

Klikk her for å åpne søkeverktøyet.

Pekere og referanser.

</html> </head> <form action= rtkst.php > <p> Fornavn? <input type= text name= fornavn <input type= submit />

Entobutikk 5.BRUKERMANUAL VÅR 2011

Transkript:

Else Lervik 20.04.2004 Opphavsrett: Forfatter og Stiftelsen TISIP Lærestoffet er utviklet for faget LV192D Web-programmering med ASP 12. Resymé: Vi skali denne leksjonen se litt på hva vi må ta hensyn til ved utvikling av profesjonelle løsninger. Med utgangspunkt i at de aller fleste web-applikasjonene jobber mot databaser, skal vi se på: 1. hva som ligger i begrepet databasetransaksjon, og hvorfor det er viktig. 2.hvordan vi med relativt enkle midler kan lage raskere databaseapplikasjoner.endelig tar vi med et par ord om sikkerhet. Innhold 12.1. INNLEDNING... 1 12.2. BESKRIVELSE AV NETT-BUTIKKEN... 1 12.3. Å KJØRE EKSEMPLET... 3 12.4. HVORDAN DATABASEN ER BYGGET OPP... 3 12.5. DICTIONARY-OBJEKTET... 6 12.6. ASP-FILENE... 7 12.1. Innledning Vi skal lage en enkel nett-bokhandel, og øvingen denne gangen går ut på å forbedre funksjonaliteten i dette systemet. Vi gjennomgår Dictionary-objektet som er velegnet når data knyttet til en nøkkelverdi skal lages i minnet. 12.2. Beskrivelse av nett-butikken Kunden velger de bøkene han/hun vil bestille. Navn, adresse og epost-adresse må legges igjen. Bøkene sendes pr postoppkrav til kunden. Ingen bruk av passord eller annen form for sikkerhet er lagt inn i systemet. En kan derfor risikere useriøse bestillinger. Det betyr at pakkene ikke blir hentet på posthuset med de utgiftene til porto og returporto som bokhandelen dermed selv må dekke. Dette kan forhindres ved å sende passord til kundens postadresse. Det er ikke nok å sende passordet til e-postadressen, den kan jo godt tilhøre en annen enn den som er oppgitt som kunde. For å sikre oss at kunden virkelig vil motta pakker fra oss på sin postadresse, må vi sende passordet dit. Imidlertid blir dette en relativt omstendelig løsning for kundene, og det er ikke sikkert de er så tålmodige at de orker å vente på dette. Alternativt kan en forlange at kundene oppgir kredittkortnummeret sitt ved bestilling, men da må en legge inn nødvendig sikkerhet knyttet til dette.

Kundene blir møtt med siden vist på figur 1. Her kan kunden begrense bokutvalget til bøker innenfor sitt interesseområde. En kan skrive inn mer enn ett stikkord, da vil det kreves at bøkene tilfredsstiller alle disse stikkordene. Figur 1: Åpningssiden nett-bokhandelen Figur 2 viser en liste over aktuelle bøker. Boktitlene er linker til ytterligere informasjon om bøkene. Kunden skriver antall bøker i feltene til venstre for titlene. Knappene nederst på siden gir muligheten til å nullstille ordren eller fortsette. Figur 2: Kunden oppgir de bøkene han/hun vil bestille Dersom en trykker på Fortsett vil registrering av kundedata være neste punkt. Se figur 3. Til slutt får man kvitteringen på figur 4. En åpenbar mangel ved dette systemet er at kunden må skrive inn navn og adresse hver eneste gang. Dette er også uheldig for butikken, ettersom hver eneste ordre gir et nytt kundenummer, selv om kunden er registrert fra før. Noe av dette skal du ordne opp i ved å gjøre øving 12. side 2 av 14

Figur 3: Kundedata Figur 4: Kvittering på at ordren er mottatt 12.3. Å kjøre eksemplet Vedlagt finner du filene som hører til dette programsystemet. Du må først ha databasen på plass. Access-databasen finner du i vedlagte fil bokhandel.mdb. For andre databasesystemer kjører du scriptet butikk.sql. Dette scriptet gir en database med færre data enn vist på figurene lenger ut i leksjonen. Det er også mulig å kjøre en og en SQLsetning for å generere databasen i Access, se kap. 3 i leksjon 10. Da skal det være mulig å laste ned Velkommen.asp i nettleseren. Det er denne filen som genererer åpningssiden. 12.4. Hvordan databasen er bygget opp Databasen består av fire tabeller. Vi bruker skjermbildene foran som utgangspunkt når vi skal lage databasen. Bildet på figur 2 er det viktigste. Her ser vi bøkene. Om hver bok lagrer vi forfatter, tittel, url, pris og isbn. For å kunne søke på stikkord må vi i tillegg lagre stikkord knyttet til hver bok. Eksempler på stikkord kan være asp, ASP, java, etc. side 3 av 14

Men hva viser venstre kolonne? Det er antall eksemplarer en bestemt kunde bestiller av ei bok. Vi får en ordrelinje for hver bok kunden bestiller. Figur 3 viser en ordre som består av to linjer: 1 eksemplar av boka med nr 1-861003-92-7 2 eksemplarer av boka med nr 1-56592-843-1 Figur 4 viser at denne ordren får nr. 5, mens kunden får nr. 16. La oss se på tabelloppbyggingen og eksempler på databaseinnhold. Figur 5 viser bøkene. Denne tabellen har konstant innhold når ASP ene kjøres. Figur 6 viser kundene. Slik systemet er bygget opp nå, registreres hver eneste kunde som ny kunde. Vi har ikke lagt inn noe kontroll på at kunden eksisterer fra før. (Å gjøre dette er øving 12.) Her er altså Anne Lise Jensen lagt inn som kunde nr 16. Figurene 7 og 8 viser ordren. Dette er nok den vanskeligste delen av databasen. Hver enkelt ordre har en linje i tabellen Ordre (figur 7), og en eller flere linjer i tabellen Ordrelinje (figur 8). Vi finner vår ordre som nederste linje i tabellen Ordre. Ordren identifiseres ved ordrenummer og kundenummer. Dersom vi slår opp i tabellen Ordrelinje finner vi to linjer med ordrenr lik 5. Og vi ser at antall og ISBN-nummer stemmer med ordren på figur 2. Figur 5: Tabellen Bok Figur 6: Tabellen Kunde Figur 7: Tabellen Ordre side 4 av 14

Figur 8: Tabellen Ordrelinje 12.5. Dataflyt i nett-butikken Velkommen.asp figur 1 søkekriterium via INPUT-felt (NAVNSOEKEFELT) select-setning basert på søkekrit Bokliste.asp figur 2 tabell med utvalgte bøker PRISLISTE via Session-objektet ordrelinjer via INPUT-felt med ISBN som navn database Kundedata.asp figur 3 insert into kunde insert into ordre insert into ordrelinje SendOrdre.asp ORDRE via Session-objektet kundedata via INPUT-felt figur 4 Figur 9: Dataflyt i nett-butikken. Figuren viser en sesjon. Figur 9 viser dataflyten i dette systemet. Kunden begynner med å laste ned siden basert på filen Velkommen.asp. Her skrives søkekriteriet inn. Søkekriteriet overføres til Bokliste.asp via et vanlig INPUT-felt. Denne ASP en henter utvalgte data fra databasen. Nå vil vi også trenge bokprisene i Kundedata.asp. For at vi skal slippe å hente dem enda en gang lagrer vi dem i Session-objektet. Kunden skriver som sagt inn det antall bøker han/hun vil bestille i venstre kolonne på figur 2. Dette er INPUT-felt med de enkelte ISBN-nummer som navn. Kundedata.asp mottar ordren via disse INPUT-feltene. Vi vil trenge ordren i SendOrdre.asp, og derfor lagrer vi den i Session-objektet. Kundedata.asp beregner og viser fram hva bøkene vil koste. Den ber videre kunden legge inn navn. adresse og e-post-adresse. side 5 av 14

SendOrdre.asp mottar kundedata via INPUT-feltene og ordren via Session-objektet. Nå først lagres bestillingen i databasen. For å hindre dobbeltlagring (ved at kunden for eksempel trykker Oppdater) slettes Session-objektet umiddelbart etter at dataene er lagret i databasen. 12.6. Dictionary-objektet I leksjon 7 brukte vi Scripting-komponenten fil å lage ASP er som jobbet mot datafiler. Denne komponenten inneholder et objekt som heter Dictionary. Dette er noe helt annet enn datafiler, og det er dessverre ikke nevnt i læreboka. Det er imidlertid svært viktig, spesielt nå som vi trenger å lagre mer sammensatte data i Session-objektet. I Session-objektet lagrer vi: prislisten. Det er en liste med ISBN-nummer og tilhørende bokpris. ordren som består av en rekke ordrelinjer. Det er en liste med ISBN-nummer og antall eksemplarer. I begge tilfellene fungerer ISBN-nummeret som nøkkel. Den brukes til å identifisere henholdsvis prisen og antall eksemplarer. Dictionary-objektet lar oss registrere data av denne typen, og hente dem ut ved å oppgi nøkkelverdien. Eksempel: Dim dctkatalog ' telefonkatalog Set dctkatalog = CreateObject("Scripting.Dictionary") dctkatalog. Add 123, "Ole" dctkatalog.add 124, "Per" dctkatalog.add 125, "Kari" Her oppretter vi objektet og fyller dem med data. Nummeret er nøkkelen, navnet er verdien. Så kan vi hente ut verdien på et gitt nummer: Dim strnavn strnavn = dctkatalog(124) Response.Write "Medlem med nr 124 er " & Vi kan også gå gjennom hele listen: strnavn & "<BR>" Dim inr, strnavn For Each inr In dctkatalog strnavn = dctkatalog(inr) Response.Write "Medlem med nr " & inr & " er " & strnavn & "<BR>" Next Her blir utskriften slik: Medlem med nr 123 er Ole Medlem med nr 124 er Per Medlem med nr 125 er Kari Så må vi huske å rydde opp: Set dctkatalog = Nothing Vi vil bruke Dictionary-objekter med ISBN-nummeret som nøkkel. side 6 av 14

12.7. ASP-filene Vi har fire ASP-filer. Eller egentlig fem. Noe som er litt lurt når du jobber med et så stort system som dette er å navngi konstanter. Ja, det har du sikkert lært en gang at du skal gjøre. Men nytteverdien så du kanskje ikke i de små øvingsprogrammene du gjorde den gangen. Derfor har det kanskje gått i glemmeboka. Vi lagrer en del aktuelle konstanter på denne femte ASP-filen: ' BokhandelKonstanter.asp E.L. 2001-11-18 ' Denne filen inneholder en del tekstkonstanter (og noen andre konstanter) som ' brukes i dette ASP-systemet. Ved å inkludere denne filen der disse brukes, og ' så bruke det navnet som er gitt nedenfor, sikrer man konsistens mellom filene, ' og sjansen for feilskriving avtar. (Dersom man skriver navnet nedenfor feil, ' protesterer kompilatoren (forutsatt at Option Explicit (s. 63) er på), ' mens ingen protesterer dersom en skriver en av tekstene feil.) ' ' Her er i hovedsak tatt med konstanter som brukes i flere filer, da risikoen ' for feil er størst der, men listen kunne gjerne vært enda lenger. ' Navn på inputfelt Const NAVNSOEKEFELT = "soekekriterium" Const NAVN_KUNDENAVNFELT = "navn" Const NAVN_ADRESSEFELT = "adresse" Const NAVN_EPOSTFELT = "epost" ' Navn på databasen og på filer Const DATABASENAVN = "dsn=minbokhandel" Const VELKOMMENFIL = "Velkommen.asp" Const KUNDEDATAFIL = "kundedata. asp" Const BOKLISTEFIL = "bokliste.asp" Const SENDORDRE_FIL = "sendordre.asp" ' Navn på variabler i Session-objektet Const PRISLISTE = "prisliste" Const ORDRE = "ordre" ' Navn på knapper Const SENDORDREKNAPP = "send" ' Navn på maks-feltlengder i databasen Const MAKS_KUNDENAVN = 50 Const MAKS_KUNDEADRESSE = 50 Const MAKS_KUNDEEPOST = 50 Det er en konvensjon å skrive slike konstantnavn med bare store bokstaver. Dette er en ganske kjedelig fil. Men den er nyttig. Jeg antar at du i løpet av dette kurset har opplevd omtrent følgende: Du gir et input-felt et navn i en ASP-fil. Verdien til dette feltet henter du fram i en annen (eller samme) ASP-fil (Request.Form()). Men så skriver du navnet feil, bare en bitteliten trykkfeil. Resultatet er at du ikke får ut noe som helst. Dette er en ganske vanlig feil å gjøre. Denne feilen unngår du ved å navngi de tekstene som utgjør slike navn. Og så bruker du navnet og ikke teksten. Eksempel: Feltet for kundenavn i figur 3 har navnet navn. Som du ser over, dette navnet er lagret i variabelen side 7 av 14

NAVN_KUNDENAVNFELT. I ASP-filen som viser fram dette feltet for innskriving, skriver vi følgende: Navn:<INPUT NAME="=NAVN_KUNDENAVNFELT" TYPE="text" SIZE=30> Og der vi skal tolke dette skriver vi: strnavn = Request.Form(NAVN_KUNDENAVNFELT) Dersom vi skriver NAVN_KUNDENAVNFELT feil, får vi kompileringsfeil (forutsatt Option Explicit!). Det gjør vi ikke dersom vi skriver tekstkonstanten navn feil. Håper du ser poenget! Og hva gjør vi så i dette systemet av ASP-filer? Dataflyten er vist i figur 9 og gjennomgått i tilknytning til denne figuren. Filen Velkommen.asp ser slik ut: ' Velkommen.asp E.L. 2001-11-18 ' Første side i vår enkle nett-butikk. Option Explicit <!-- #include file = "BokhandelKonstanter. asp" --> <HTML><HEAD><TITLE>Bokhandel</TITLE></HEAD> <BODY BGCOLOR="wheat" TEXT="darkgreen" LINK="brown" VLINK="steelblue" ALINK="darkblue"> <H1>Velkommen til oss!</h1> <FORM ACTION="=BOKLISTEFIL" METHOD="post"> <P>Dersom du ønsker at bokutvalget skal begrenses til bestemte interesseområder, <BR>sett opp stikkord her: <BR> <BR><INPUT NAME="=NAVNSOEKEFELT" TYPE="text" SIZE=50> <P> <INPUT TYPE="submit" VALUE=" Send data"> <INPUT TYPE="reset" VALUE="Blank ut feltet"> </FORM> </BODY></HTML> Neste fil er Bokliste.asp: ' Bokliste.asp E.L. 2001-11-18 Option Explicit <!-- #include file = "BokhandelKonstanter.asp" --> <!-- #include virtual = "/adovbs.inc" --> <HTML><HEAD><TITLE>Bokhandel</TITLE></HEAD> side 8 av 14

<BODY BGCOLOR="wheat" TEXT="darkgreen" LINK="brown" ALINK="darkblue"> VLINK="steelblue" <H1>Bøker</H1> <P> ' Behandler søkekriteriet. Setter opp SQL select-setning som krever ' at alle ordene i kriteriet er oppfylt for de dataene som hentes ut. Dim strkriterium, strord, arrord, strselect, iindeks strselect = "select * from bok" strkriterium = Request.Form(NAVNSOEKEFELT) If strkriterium <> "" Then Response.Write "Boklisten er basert på følgende søkekriterium: " & strkriterium strord = LCase(strKriterium) arrord = Split(strOrd) 'Bruker LIKE, se tabell 19.5 side 604 strselect = strselect & " where stikkord like '%" & arrord(0) & "%'" For iindeks = 1 to UBound(arrOrd) strselect = strselect & "and stikkord like '%" & arrord(iindeks) & "%'" Next Else Response.Write "Her er alle bøkene. Listen er ikke begrenset av søkekriterium" End If 'Kopierer inn hele eller deler av boktabellen fra databasen Dim objdbforb, objres Set objdbforb = Server.CreateObject("ADODB.Connection") objdbforb.open DATABASENAVN Set objres = Server.CreateObject("ADODB.Recordset") objres.open strselect, objdbforb,,,adcmdtext 'Viser fram bokdataene i en HTML-tabell 'Venstre tabellkolonne er inputfelt der kunden skal skrive inn antall bøker Dim strisbn, strtittel, strforfatter, dblpris, strurl, strstikkord, dctpriser If objres.eof Then Response.Write "<BR>Ingen bøker som tilfredsstiller dette kriteriet.<br>" Else <P> <FORM ACTION="=KUNDEDATAFIL" METHOD="POST"> <TABLE BORDER= 1> <TR><TH>Antall</TH><TH>Forfatter</TH><TH>Tittel</TH><TH>Pris</TH><TH>ISBN</TH> ' Vi trenger prislisten senere. ' Lagrer prislisten i et Dictionary-objekt. Se leksjonen. ' Dette objektet lagres så i Session-objektet. Set dctpriser = CreateObject("Scripting.Dictionary") Do While Not objres.eof side 9 av 14

strstikkord = objres("stikkord") strisbn = objres("isbn") dblpris = objres("pris") dctpriser.add strisbn, dblpris <TR><TD><INPUT TYPE= "text" NAME="=strIsbn" VALUE=0 SIZE=5></TD> <TD>=objRes("forfatter")</TD> <TD><A HREF="=objRes("url")">=objRes("tittel")</A></TD> <TD>kr. =FormatNumber(dblPris)</TD> <TD>=strIsbn</TD> </TR> objres.movenext() Loop Set Session(PRISLISTE) = dctpriser ' Lagrer prislisten i Session-objektet </TABLE> ' Opprydding objres.close() objdbforb.close() Set objres = Nothing Set objdbforb = Nothing <P> <INPUT TYPE="submit" VALUE= "Fortsett"> <INPUT TYPE="reset" VALUE="Blank ut bestillingen"> End If <P>< A HREF="=VELKOMMENFIL">Ønsker å sette opp ny liste over stikkord </A> </FORM>< /BODY></HTML> Søkekriteriet brukeren skriver inn splittes opp, slik at vi får en tabell med ord: arrord = Split(strOrd) Vi bruker så disse ordene select-setning kan være: select * from bok where til å konstruere en SQL select-setning. Et eksempel på en konstruert stikkord like %asp% and stikkord like %vbscript% % foran og bak betyr at et vilkårlig antall tegn aksepteres både foran og bak. Dette kan føre til irrelevente søkeresultater, på grunn av at det er nok at vi har bokstavsekvensen asp etter hverandre i den strengen som utgjør stikkordene. I eksemplet kreves det at vi i tillegg skal ha vbscript i strengen. Data hentes fra databasen på standard måte: objres.open strselect, objdbforb,,,adcmdtext Her inneholder strselect den konstruerte select-setningen. Vi går gjennom Resultset-objektet og for hver rad gjør vi to ting: side 10 av 14

Vi lagrer ISBN-nummer og pris i Dictionary-objektet dctpriser. strisbn = objres("isbn") dblpris = objres("pris") dctpriser.add strisbn, dblpris Vi skriver ut en rad i tabellen ( figur 2): <TR><TD><INPUT TYPE= "text" NAME="=strIsbn" VALUE=0 SIZE=5></TD> <TD>=objRes("forfatter")</TD> <TD><A HREF="=objRes("url") ">=objres("tittel")</a></td> <TD>kr. =FormatNumber(dblPris)</TD> <TD>=strIsbn</TD> </TR> Legg merke til at vi lar den ruten brukeren skal skrive inn tall i få navn lik ISBNhvilken bok han/hun ønsker, når vi i neste omgang skal nummeret. Da vet vi med en gang analysere bruker-input en. Bak tittelen legger vi URL en slik at den blir klikkbar. Etter gjennomgang lagrer vi prislisten i Session-objektet: Set Session(PRISLISTE) = dctpriser Neste fil er Kundedata.asp: ' Kundedata.asp E.L. 2001-11-18 ' Denne filen behandler en ordre som kommer fra Bokhandel.asp Option Explicit <HTML><HEAD><TITLE>Bokhandel - Kundedata</TITLE></HEAD> <BODY BGCOLOR="wheat" TEXT="darkgreen" LINK="brown" VLINK="steelblue" ALINK="darkblue"> <H1> Kundedata</H1> <!-- #include file = "BokhandelKonstanter.asp" --> Dim dctordre, dctprisliste, dbltotpris, itotantall, iant, strisbn If (not IsEmpty(Session(PRISLISTE))) Then 'Henter prislisten fra Session-objektet Set dctprisliste = Session(PRISLISTE) ' Henter ordren fra Request-objektet og lagrer den i et Dictionary-objekt. ' Se leksjonen. ' Vi trenger ordren senere, derfor legges den i Session-objektet. ' Vi regner også ut totalt antall bøker og totalpris. Set dctordre = CreateObject("Scripting.Dictionary") dbltotpris = 0.0 itotantall = 0 ' Request-objektet inneholder alle ordrelinjene. Og ingenting annet. For Each strisbn In Request.Form iant = Request.Form(strISBN) If iant > 0 Then side 11 av 14

itotantall = itotantall + iant dbltotpris =dbltotpris + (iant * dctprisliste(strisbn)) dctordre.add strisbn, iant End If Next 'Lagrer ordren i Session-objektet Set Session(ORDRE) = dctordre <P><STRONG>Du bestiller =itotantall bøker til en total pris av kr. _ =FormatNumber(dblTotpris) <STRONG> <FORM ACTION="=SENDORDRE_FIL" METHOD = "post"> <TABLE> <TR><TD>Navn:</TD><TD> <INPUT NAME="=NAVN_KUNDENAVNFELT" TYPE="text" SIZE=30></TD> <TR><TD>Adresse:</TD><TD> <INPUT NAME="=NAVN_ADRESSEFELT" TYPE="text" SIZE=30></TD> <TR><TD>E-post:</TD><TD> <INPUT NAME="=NAVN_EPOSTFELT" TYPE="text" SIZE=30></TD> </TABLE> <BR> <INPUT TYPE="reset" VALUE="Blank ut felt"> <INPUT TYPE="submit" NAME="=SENDORDREKNAPP" VALUE="Send ordre"> </FORM> Else <P>Har ikke lagret prislisten.<br> Gå < A HREF==BOKLISTEFIL>tilbake</A> og trykk Oppdater. End If <P><A HREF==VELKOMMENFIL>Tilbake til startsiden</a> </BODY></HTML> Det første som gjøres her er å regne ut hva kunden har bestilt bøker for. Bokbestillingen hentes fra Request-objektet, mens prisene hentes fra Session-objektet: For Each strisbn In Request.Form iant = Request.Form(strISBN) If iant > 0 Then itotantall = itotantall + iant dbltotpris =dbltotpris + (iant * dctprisliste(strisbn)) dctordre.add strisbn, iant End If Next Vi går gjennom alle INPUT-feltene som er registrert i Request-objektet. Disse har alle navn lik det aktuelle ISBN-nummeret, og verdi lik det antall eksemplarer kunden ønsker å bestille. I kodesnutten over inneholder variabelen strisbn ISBN-nummeret, mens iant inneholder antallet. Legg merke til hvordan vi bruker variabelen strisbn til å slå opp i dctprislisteobjektet. Etter at alle ordrelinjene er lagret i dctordre, lagrer vi dette objektet i Session-objektet: side 12 av 14

Set Session(ORDRE) = dctordre Resten av Kundedata.asp inneholder skjema der kunden kan legge inn navn, adresse og e- postadresse. Den siste filen heter SendOrdre.asp: ' SendOrdre.asp E.L. 2001-11-19 ' Denne filen behandler en ordre som kommer via Kundedata.asp fra Bokliste.asp ' Ordren ligger lagret i Session-objektet Option Explicit <HTML><HEAD><TITLE>Bokhandel - Kundedata</TITLE></HEAD> <BODY BGCOLOR="wheat" TEXT="darkgreen" LINK=" brown" VLINK="steelblue" ALINK="darkblue"> <H1>Ordrebekreftelse</H1> <!-- #include file = "BokhandelKonstanter.asp" --> ' Denne funksjonen skal generere et nytt id.nr til bruk i databasen. ' Som utgangspunkt brukes største verdi til kolonnen strkolonne ' i tabellen strtabell. Det nye tallet blir 1 større. Function ifinnnyttnr(objdbforb, strkolonne, strtabell) Dim objres, inyttnr, strsql strsql = "select max(" & strkolonne & ") as maks from " & strtabell Set objres = objdbforb.execute(strsql) If (objres.eof) Then inyttnr = 1 Else inyttnr = objres("maks") + 1 End If ifinnnyttnr = inyttnr End Function If (not IsEmpty(Session(ORDRE))) and Request.Form(SENDORDREKNAPP) <> "" Then ' Først henter vi ut kundedata Dim dctordre, strnavn, stradresse, strepost strnavn = Request.Form(NAVN_KUNDENAVNFELT) stradresse = Request.Form(NAVN_ADRESSEFELT) strepost = Request.Form(NAVN_EPOSTFELT) ' Dersom dataene er for lange til å få plass i databasen, kuttes de strnavn = Left(strNavn, MAKS_KUNDENAVN) stradresse = Left(strAdresse, MAKS_KUNDEADRESSE) strepost = Left(strEpost, MAKS_KUNDEEPOST) '--- Her begynner oppdatering av databasen ---- Dim objdbforb, objres, inyttkundenr, inyttordrenr, bolok, strisbn Set objdbforb = Server.CreateObject("ADODB.Connection") objdbforb.open DATABASENAVN side 13 av 14

objdbforb.begintrans ' TRANSAKSJON STARTER ' Legger inn kundedata (tar ikke hensyn til at kunden kan ' før, det er det øving 12 handler om) inyttkundenr = ifinnnyttnr(objdbforb, "kundenr", "kunde") være registrert fra objdbforb.execute "insert into kunde values(" & inyttkundenr & ", '" & strnavn _ & "', '" & stradresse & "', '" & strepost & "')" Response.Write "<P>Ditt kundenr er " & inyttkundenr inyttordrenr = ifinnnyttnr(objdbforb, "ordrenr", "ordre") objdbforb.execute "insert into ordre values(" & inyttordrenr & ", '" & Now & _ "', 'Ny', " & inyttkundenr & ")" ' Henter ordreinformasjon fra Session-objektet Set dctordre = Session(ORDRE) For Each strisbn In dctordre objdbforb.execute "insert into ordrelinje values(" & inyttordrenr & _ ", '" & strisbn & "', " & dctordre(strisbn) & ")" Next Response.Write "<P>Ditt ordrenummer er " & inyttordrenr objdbforb.committrans ' TRANSAKSJON SLUTT Session.Abandon Else Response.Write "<P>Ingen ordre er registrert" End If <P><A HREF==VELKOMMENFIL>Tilbake til startsiden</a> Dette er kjernen i systemet. Her lagres dataen i databasen. Vi begynner med å hente ut kundedata fra Request-objektet. Deretter starter en databasetransaksjon (kap. 2, leksjon 11). Det er viktig at oppdateringene gjennomføres som en helhet. Dersom problemer underveis skal oppdateringer utført hittil angres. I praksis lagres oppdateringene i et mellomlager inntil objdbforb.committrans utføres. Legg merke til at vi sletter Session-objektet dersom dataene er lagret i databasen: Session.Abandon side 14 av 14