{"id":521,"date":"2011-11-18T08:35:45","date_gmt":"2011-11-18T06:35:45","guid":{"rendered":"http:\/\/www.kristiansborg.dk\/bibliotek\/?page_id=521"},"modified":"2011-11-18T09:03:02","modified_gmt":"2011-11-18T07:03:02","slug":"kapitel-7-prototype-pa-en-asp-applikation","status":"publish","type":"page","link":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/kapitel-7-prototype-pa-en-asp-applikation\/","title":{"rendered":"Kapitel 7 Prototype p\u00e5 en ASP-applikation"},"content":{"rendered":"<p>De foreg\u00e5ende kapitler har beskrevet al den teori, der ligger bag udvikling af en ASP-applikation. I dette kapitel bliver det vist, hvordan man kan anvende ASP i praksis.<\/p>\n<p>Kapitlet er bygget op omkring et eksempel p\u00e5 en e-handelsbutik, der s\u00e6lger cd&#8217;er. For at kunne referere til butikken har den f\u00e5et navnet Compact Discount \u2013 eventuelle ligheder med eksisterende e-handelsbutikker er naturligvis tilf\u00e6ldig og ganske utilsigtet.<\/p>\n<p>Det er imidlertid ikke udvikling af hele applikationen, der bliver beskrevet i dette eksempel. For at lave en komplet e-handelsbutik er der mange ting, man skal tage h\u00f8jde for. Det g\u00e6lder for eksempel integration med lagersystemer, \u00f8konomisystemer og lignende. Disse omr\u00e5der vil ikke blive beskrevet. Vi vil koncentrere os om web-delen af butikken.<\/p>\n<p>&nbsp;<\/p>\n<div style=\"border: 1px solid red; color: red;\">\n<p><strong>Du l\u00e6ser en gammel bog<\/strong><\/p>\n<p>Den bog, du l\u00e6ser her, er fra 1999, og mange ting kan have \u00e6ndret sig siden da.<\/p>\n<p>Vi h\u00e5ber, at du stadig kan finde relevant information i den.<\/p>\n<p>Hvis du vil l\u00e6se aktuelle oplysninger om den aktuelle version af ASP.NET, anbefaler vi<\/p>\n<p>bogen <a onclick=\"javascript:pageTracker._trackPageview('\/outbound\/article\/http:\/\/clk.tradedoubler.com\/click?p(197229)a(2029446)g(19172914)url(http:\/\/www.adlibris.com\/dk\/product.aspx?isbn=0735643385)');\" href=\"http:\/\/clk.tradedoubler.com\/click?p(197229)a(2029446)g(19172914)url(http:\/\/www.adlibris.com\/dk\/product.aspx?isbn=0735643385)\" target=\"_blank\">Programming ASP.NET 4.0<\/a><img decoding=\"async\" src=\"http:\/\/impdk.tradedoubler.com\/imp?type(inv)g(19172914)a(2029446)\" alt=\"\" \/><\/p>\n<\/div>\n<h2>Funktionalitet<\/h2>\n<p>I dette afsnit bliver det beskrevet, hvilken funktionalitet web-stedet skal have. Disse krav vil i store tr\u00e6k svare til de sider, web-stedet skal indeholde. De enkelte emner bliver beskrevet separat senere i dette kapitel.<\/p>\n<p>Bem\u00e6rk, at dette eksempel kun koncentrerer sig om den del af web-stedet, der er tilg\u00e6ngeligt for brugeren. Web-stedets administratorer vil naturligvis have brug for yderligere funktioner \u2013 eksempelvis til at vedligeholde albumdatabasen.<\/p>\n<p>En analyse har afgjort, at web-stedet skal have f\u00f8lgende funktionalitet:<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li>Bestilling af varerne i indk\u00f8bskurven<\/li>\n<li>S\u00f8gning<\/li>\n<li>Tilf\u00f8jelse af et album til indk\u00f8bskurven<\/li>\n<li>Visning af de mest solgte album.<\/li>\n<li>Visning af detaljer om et enkelt album<\/li>\n<li>Visning af kategorier<\/li>\n<li>Visning af oversigt over varerne i indk\u00f8bskurven.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>For at forst\u00e5 beskrivelsen af web-stedets funktionalitet er det n\u00f8dvendigt at forst\u00e5 begrebet indk\u00f8bskurv. En indk\u00f8bskurv i en e-butik svarer til en indk\u00f8bskurv i en almindelig butik. Kunder i e-butikken f\u00f8jer varer til indk\u00f8bskurven ved at klikke p\u00e5 en knap p\u00e5 informationssiden om den p\u00e5g\u00e6ldende vare. N\u00e5r alle de \u00f8nskede varer er bestilt, v\u00e6lger kunden at afsende sin ordre, og indk\u00f8bskurven t\u00f8mmes.<\/p>\n<p>&nbsp;<\/p>\n<h2>Databasen<\/h2>\n<p>De oplysninger, der skal v\u00e6re tilg\u00e6ngelige p\u00e5 web-stedet, skal naturligvis gemmes i en database. Opbygningen af denne database er imidlertid ikke en helt triviel opgave \u2013 databasens opbygning vil derfor blive beskrevet i detaljer i dette afsnit. Afsnittet vil ogs\u00e5 beskrive, hvordan man foretager DSN-registrering af databasen, der bliver udviklet i Microsoft Access.<\/p>\n<p>&nbsp;<\/p>\n<h3>Opbygning af databasen<\/h3>\n<p>F\u00f8rste skridt i at designe en database er at definere, hvilke oplysninger der skal gemmes i databasen. Af hensyn til overskueligheden bliver databasen beskrevet i to dele: kundedelen og administratordelen.<\/p>\n<p>De centrale elementer i e-butikken er cd&#8217;er (her kaldet album) , ordrer og kunder. Om det enkelte album skal man vide titel, udgivelsestidspunkt, pris, kategori, kunstner og hvilket pladeselskab, det er udgivet p\u00e5. Derudover skal der ogs\u00e5 v\u00e6re en beskrivelse af albummet, s\u00e5 kunderne kan l\u00e6se om cd&#8217;en, f\u00f8r de k\u00f8ber den. Databasen skal ogs\u00e5 indeholde en reference til en fil, der indeholder et billede af coveret \u2013 coveret skal vises, n\u00e5r kunden ser oplysninger om albummet. Der skal ogs\u00e5 v\u00e6re en forventet leveringstid tilknyttet albummet, s\u00e5 kunden kan se, om det er en cd, der er p\u00e5 lager, eller om man kan forvente en l\u00e6ngere leveringstid. Endeligt skal der \u2013 af hensyn til kategorioversigten \u2013 v\u00e6re en angivelse af, hvilken kategori albummet tilh\u00f8rer.<\/p>\n<p>Det skal ogs\u00e5 v\u00e6re muligt at se, hvilke numre der er p\u00e5 albummet. For hvert nummer p\u00e5 albummet skal der v\u00e6re albummets titel samt navnet p\u00e5 den kunstner, der har indspillet det p\u00e5g\u00e6ldende nummer. Det kan m\u00e5ske virke overfl\u00f8digt, at der b\u00e5de er kunstner p\u00e5 albummet og p\u00e5 nummeret, men det beh\u00f8ver ikke at v\u00e6re den kunstner, som st\u00e5r for albummet, der har indspillet alle numre p\u00e5 albummet.<\/p>\n<p>N\u00e5r en kunde bestiller album i butikken, skal ordren registreres i databasen. En ordre kan naturligvis best\u00e5 af et eller flere album, og for hvert album skal det registreres, hvilket album, der er k\u00f8bt, og i hvor mange eksemplarer. For hver ordre skal det naturligvis angives, hvilken kunde der har foretaget ordren. Om kunden skal man kende navn, adresse, postnummer, by og e-mail. For at g\u00f8re det muligt at genkende kunden, s\u00e5 denne er fri for at indtaste sin adresse hver gang, der foretages bestillinger, b\u00f8r det ogs\u00e5 v\u00e6re muligt at lade brugeren angive et kodeord.<\/p>\n<p>Dette kunne umiddelbart tyde p\u00e5, at man skulle have to eller tre tabeller til at opbevare oplysninger om henholdsvis album, ordrer og kunder. Denne l\u00f8sning har dog nogle ulemper. Hvis man samler album og numre i \u00e9n tabel, bliver man n\u00f8dt til at gentage albummets navn, kunstner, pris og s\u00e5 videre, for hvert nummer p\u00e5 albummet. Opdeler man i stedet album og numre i to tabeller og giver hvert album en unik identifikation, kan man n\u00f8jes med at gentage albummets identifikation for hvert nummer.<\/p>\n<p>Problematikken er stort set den samme ved kunstnere i forhold til numre og album. En kunstner har typisk udgivet flere album og medvirker n\u00e6sten med garanti p\u00e5 mere end et nummer. I stedet for at skulle indtaste kunstnerens navn for hvert nummer og album, er det lettere blot at indtaste kunstneren en gang, tildele denne en unik identifikation og fremover bruge denne identifikation til at identificere kunstnere i album- og nummer-tabellerne. Denne l\u00f8sning g\u00f8r det ogs\u00e5 muligt at kende forskel p\u00e5 to kunstnere, der har det samme navn.<\/p>\n<p>Problemet gentager sig ved ordrerne. Som n\u00e6vnt kan en ordre best\u00e5 af flere album, og der skal gemmes oplysninger om de enkelte album og samlet om ordren. Derfor kan man med fordel opdele ordrelinierne \u2013 de enkelte album \u2013 fra selve ordren, og blot lade hver linie indeholde en reference til selve ordren. I ordrelinierne gemmes de oplysninger, der kan optr\u00e6de flere gange i hver ordre: albummet og antallet. I selve ordren gemmes de oplysninger, der kun optr\u00e6der en gang: kundeoplysningerne.<\/p>\n<p>Det blev stillet som et \u00f8nske tidligere, at kunden kun beh\u00f8vede at indtaste sine oplysninger f\u00f8rste gang, der blev handlet i e-butikken. Derfor skal kundeoplysningerne gemmes selvst\u00e6ndigt og ikke sammen med ordrerne. Hvis kundeoplysningerne var gemt sammen med ordrerne, ville man v\u00e6re n\u00f8dt til at g\u00e5 gennem samtlige ordrer for at genfinde kunden.<\/p>\n<p>Ud over beskrivelserne af de centrale elementer i butikken er der nogle tabeller, det er rart at have af hensyn til web-designet. For eksempel vil e-butikkens forside blive brugt til at promovere s\u00e6rligt udvalgte album. Til disse album skal der v\u00e6re tilknyttet en s\u00e6rlig, salgsvenlig tekst, der skal vises p\u00e5 forsiden sammen med albummets cover.<\/p>\n<p>Ovenst\u00e5ende beskrivelse giver nedenst\u00e5ende tabeller.<\/p>\n<p>&nbsp;<\/p>\n<h3>Album<\/h3>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td width=\"230\" valign=\"top\">Feltnavn<\/td>\n<td width=\"230\" valign=\"top\">Felttype<\/td>\n<td width=\"230\" valign=\"top\">Kommentarer<\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">ID<\/td>\n<td width=\"230\" valign=\"top\">Tal<\/td>\n<td width=\"230\" valign=\"top\">Unik identifikation af albummet<\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">Titel<\/td>\n<td width=\"230\" valign=\"top\">Tekst<\/td>\n<td width=\"230\" valign=\"top\"><\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">Udgivelse<\/td>\n<td width=\"230\" valign=\"top\">Dato og klokkesl\u00e6t<\/td>\n<td width=\"230\" valign=\"top\"><\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">Pris<\/td>\n<td width=\"230\" valign=\"top\">Tal<\/td>\n<td width=\"230\" valign=\"top\"><\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">Forside<\/td>\n<td width=\"230\" valign=\"top\">Tekst<\/td>\n<td width=\"230\" valign=\"top\">Adresse p\u00e5 billedfil af forsiden<\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">Beskrivelse<\/td>\n<td width=\"230\" valign=\"top\">Notat<\/td>\n<td width=\"230\" valign=\"top\"><\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">Kategori<\/td>\n<td width=\"230\" valign=\"top\">Tal<\/td>\n<td width=\"230\" valign=\"top\">Reference til kategoritabellen<\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">Leveringstid<\/td>\n<td width=\"230\" valign=\"top\">Tal<\/td>\n<td width=\"230\" valign=\"top\">Leveringstid i date<\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">Kunstner<\/td>\n<td width=\"230\" valign=\"top\">Tal<\/td>\n<td width=\"230\" valign=\"top\">Reference til kunstnertabellen<\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">Pladeselskab<\/td>\n<td width=\"230\" valign=\"top\">Tekst<\/td>\n<td width=\"230\" valign=\"top\"><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<h3>Nummer<\/h3>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td width=\"230\" valign=\"top\">Feltnavn<\/td>\n<td width=\"230\" valign=\"top\">Felttype<\/td>\n<td width=\"230\" valign=\"top\">Kommentarer<\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">ID<\/td>\n<td width=\"230\" valign=\"top\">Tal<\/td>\n<td width=\"230\" valign=\"top\">Unik identifikation af albummet<\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">Titel<\/td>\n<td width=\"230\" valign=\"top\">Tekst<\/td>\n<td width=\"230\" valign=\"top\"><\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">Kunstner<\/td>\n<td width=\"230\" valign=\"top\">Tal<\/td>\n<td width=\"230\" valign=\"top\">Reference til kunstnertabellen<\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">Album<\/td>\n<td width=\"230\" valign=\"top\">Tal<\/td>\n<td width=\"230\" valign=\"top\">Reference til albumtabellen<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<h3>Kunstner<\/h3>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td width=\"230\" valign=\"top\">Feltnavn<\/td>\n<td width=\"230\" valign=\"top\">Felttype<\/td>\n<td width=\"230\" valign=\"top\">Kommentarer<\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">ID<\/td>\n<td width=\"230\" valign=\"top\">Tal<\/td>\n<td width=\"230\" valign=\"top\">Unik identifikation af albummet<\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">Navn<\/td>\n<td width=\"230\" valign=\"top\">Tekst<\/td>\n<td width=\"230\" valign=\"top\"><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong> <\/strong><\/p>\n<h3>Kategori<\/h3>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td width=\"230\" valign=\"top\">Feltnavn<\/td>\n<td width=\"230\" valign=\"top\">Felttype<\/td>\n<td width=\"230\" valign=\"top\">Kommentarer<\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">ID<\/td>\n<td width=\"230\" valign=\"top\">Tal<\/td>\n<td width=\"230\" valign=\"top\">Unik identifikation af albummet<\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">Kategori<\/td>\n<td width=\"230\" valign=\"top\">Tekst<\/td>\n<td width=\"230\" valign=\"top\"><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong> <\/strong><\/p>\n<h3>Ordrelinie<\/h3>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td width=\"230\" valign=\"top\">Feltnavn<\/td>\n<td width=\"230\" valign=\"top\">Felttype<\/td>\n<td width=\"230\" valign=\"top\">Kommentarer<\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">ID<\/td>\n<td width=\"230\" valign=\"top\">Tal<\/td>\n<td width=\"230\" valign=\"top\">Unik identifikation af ordrelinien<\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">Album<\/td>\n<td width=\"230\" valign=\"top\">Tal<\/td>\n<td width=\"230\" valign=\"top\">Reference til album-tabellen<\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">Antal<\/td>\n<td width=\"230\" valign=\"top\">Tal<\/td>\n<td width=\"230\" valign=\"top\"><\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">Ordre<\/td>\n<td width=\"230\" valign=\"top\">Tal<\/td>\n<td width=\"230\" valign=\"top\">Reference til ordre-tabellen<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong> <\/strong><\/p>\n<h3>Ordre<\/h3>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td width=\"230\" valign=\"top\"><strong>Feltnavn<\/strong><\/td>\n<td width=\"230\" valign=\"top\"><strong>Felttype<\/strong><\/td>\n<td width=\"230\" valign=\"top\"><strong>Kommentarer<\/strong><\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">ID<\/td>\n<td width=\"230\" valign=\"top\">Tal<\/td>\n<td width=\"230\" valign=\"top\">Unik identifikation af ordren<\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">Kunde<\/td>\n<td width=\"230\" valign=\"top\">Tal<\/td>\n<td width=\"230\" valign=\"top\">Reference til kundetabellen<\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">Dato<\/td>\n<td width=\"230\" valign=\"top\">Dato og klokkesl\u00e6t<\/td>\n<td width=\"230\" valign=\"top\"><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<h3>Kunde<\/h3>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td width=\"230\" valign=\"top\"><strong>Feltnavn<\/strong><\/td>\n<td width=\"230\" valign=\"top\"><strong>Felttype<\/strong><\/td>\n<td width=\"230\" valign=\"top\"><strong>Kommentarer<\/strong><\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">ID<\/td>\n<td width=\"230\" valign=\"top\">Tal<\/td>\n<td width=\"230\" valign=\"top\">Unik identifikation af kunden<\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">Navn<\/td>\n<td width=\"230\" valign=\"top\">Tekst<\/td>\n<td width=\"230\" valign=\"top\"><\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">Adresse<\/td>\n<td width=\"230\" valign=\"top\">Tekst<\/td>\n<td width=\"230\" valign=\"top\"><\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">Postnummer<\/td>\n<td width=\"230\" valign=\"top\">Tal<\/td>\n<td width=\"230\" valign=\"top\"><\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">Postdistrikt<\/td>\n<td width=\"230\" valign=\"top\">Tekst<\/td>\n<td width=\"230\" valign=\"top\"><\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">Email<\/td>\n<td width=\"230\" valign=\"top\">Tekst<\/td>\n<td width=\"230\" valign=\"top\"><\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">Kodeord<\/td>\n<td width=\"230\" valign=\"top\">Tekst<\/td>\n<td width=\"230\" valign=\"top\"><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<h3>Forside<\/h3>\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td width=\"230\" valign=\"top\"><strong>Feltnavn<\/strong><\/td>\n<td width=\"230\" valign=\"top\"><strong>Felttype<\/strong><\/td>\n<td width=\"230\" valign=\"top\"><strong>Kommentarer<\/strong><\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">ID<\/td>\n<td width=\"230\" valign=\"top\">Tal<\/td>\n<td width=\"230\" valign=\"top\">Unik identifikation af albummet p\u00e5 forsiden.<\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">Album<\/td>\n<td width=\"230\" valign=\"top\">Tal<\/td>\n<td width=\"230\" valign=\"top\">Reference til album-tabellen<\/td>\n<\/tr>\n<tr>\n<td width=\"230\" valign=\"top\">Tekst<\/td>\n<td width=\"230\" valign=\"top\">Notat<\/td>\n<td width=\"230\" valign=\"top\">Beskrivelse af albummet, der skal vises p\u00e5 forsiden.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>Som det fremg\u00e5r af ovenst\u00e5ende tabelbeskrivelser indeholder tabellerne en lang r\u00e6kke referencer til andre tabeller. Disse referencer kaldes ogs\u00e5 relationer, og nedenst\u00e5ende figur 10.1 viser relationerne i databasen.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/10011.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-medium wp-image-531\" title=\"1001\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/10011-300x186.png\" alt=\"\" width=\"300\" height=\"186\" srcset=\"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/10011-300x186.png 300w, https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/10011.png 738w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><em>Figur 10.1<\/em>. Relationer i databasen.<\/p>\n<p>&nbsp;<\/p>\n<h3>Registrering af DSN<\/h3>\n<p>Som n\u00e6vnt i kapitel 5 er det n\u00f8dvendigt at registrere databasen for at den kan tilg\u00e5s fra ASP-siderne.<\/p>\n<p>Registreringen foretages i Kontrolpanelet under det punkt, der hedder 32-bit ODBC. Under fanen System-DSN\u00a0v\u00e6lges tilf\u00f8j, hvorefter databasen v\u00e6lges. Databasens ODBC-navn skal ogs\u00e5 angives. I dette tilf\u00e6lde bruges navnet compactdiscount.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/10021.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-medium wp-image-530\" title=\"1002\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/10021-300x191.png\" alt=\"\" width=\"300\" height=\"191\" srcset=\"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/10021-300x191.png 300w, https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/10021.png 489w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><em>Figur 10.2.<\/em> Registrering af System-DSN.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h2>Udvikling af ASP-siderne<\/h2>\n<p>I dette afsnit bliver udviklingen af de mest interessante sider af e-butikken beskrevet. De overvejelser, der ligger bag udviklingen af siderne, bliver beskrevet, ligesom sidernes kildetekst vil blive vist.<\/p>\n<p>&nbsp;<\/p>\n<h3>Generelt om designet<\/h3>\n<p>Det er altid god web-design-skik at holde siderne p\u00e5 det samme sted nogenlunde ens. I dette tilf\u00e6lde er designet to hvide omr\u00e5der i hver side af sk\u00e6rmen samt butikkens logo \u00f8verst p\u00e5 siden. Det betyder, at en blank side kommer til at se s\u00e5ledes ud:<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1003.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-medium wp-image-529\" title=\"1003\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1003-300x143.png\" alt=\"\" width=\"300\" height=\"143\" srcset=\"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1003-300x143.png 300w, https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1003.png 910w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><em>Figur 10.3.<\/em> Blank side p\u00e5 web-stedet.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Da der s\u00e5ledes vil v\u00e6re en del kode, der skal bruges i alle siderne, vil det v\u00e6re en god ide at l\u00e6gge denne kode ud i en selvst\u00e6ndig fil, som kan inkluderes i alle filerne. Denne fil kaldes header.html.<\/p>\n<p>Generelt bliver der brugt en del include-filer for at minimere den m\u00e6ngde kode, der skal v\u00e6re i de enkelte sider. Dette g\u00f8res dels for at g\u00f8re eksemplerne mere overskuelige, men ogs\u00e5 fordi det er spild af tid at gentage den samme kode i flere forskellige sider. Indholdet af de anvendte include-filer vil blive vist i de f\u00f8lgende afsnit.<\/p>\n<p>&nbsp;<\/p>\n<h3>Sidehovedet (<em>header.html<\/em>)<\/h3>\n<p>Filen header.html bliver inkluderet i alle siderne i e-butikken. Siden s\u00f8rger for at lave de hvide felter i h\u00f8jre og venstre side af sk\u00e6rmen og vise e-butikkens logo. Derudover oprettes menubj\u00e6lken \u00f8verst i sk\u00e6rmen. Filen ser s\u00e5ledes ud:<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;style type=&#8221;text\/css&#8221;&gt;<\/p>\n<p>&lt;!&#8211;<\/p>\n<p>.headlink {<\/p>\n<p>color: ffffff;<\/p>\n<p>text-decoration: none;<\/p>\n<p>font-size: smaller;<\/p>\n<p>}<\/p>\n<p>&#8211;&gt;<\/p>\n<p>&lt;\/style&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;p&gt;<\/p>\n<p>&lt;table width = 100%&gt;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td width = 100 rowspan=2&gt;&amp;nbsp;&lt;\/td&gt;<\/p>\n<p>&lt;td align=center&gt;&lt;a href=index.asp&gt;&lt;img src=logo.gif alt=&#8221;Compact Discount&#8221; border=0&gt;&lt;\/a&gt;<\/p>\n<p>&lt;table width=100% &gt;&lt;tr&gt;<\/p>\n<p>&lt;td bgcolor=Gray align=center width=33%&gt;&lt;a href=kurv.asp&gt;Se indk\u00f8bskurv&lt;\/a&gt;&lt;\/td&gt;<\/p>\n<p>&lt;td bgcolor=Gray align=center width=33%&gt;&lt;a href=afsend.asp&gt;Afsend ordre&lt;\/a&gt;&lt;\/td&gt;<\/p>\n<p>&lt;td bgcolor=Gray align=center width=33%&gt;&lt;a href=help.asp&gt;Hj\u00e6lp&lt;\/a&gt;&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;&lt;\/table&gt;<\/p>\n<p>&lt;p&gt;<\/p>\n<p>&lt;\/td&gt;<\/p>\n<p>&lt;td width = 100 rowspan=2&gt;<\/p>\n<p>&amp;nbsp;<\/p>\n<p>&lt;\/td&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&nbsp;<\/p>\n<h2>Databaseadgang (<em>database.js<\/em>)<\/h2>\n<p>Hovedparten af siderne i web-stedet skal tilg\u00e5 databasen. Derfor er den kode, der skal bruges til at tilg\u00e5 databasen, lagt ud i en selvst\u00e6ndig fil ved navn database.js. Denne fil indeholder en enkelt metode \u2013 createDatabaseConnection \u2013 der opretter og returnerer en forbindelse til databasen. Udover den pladsm\u00e6ssige fordel ved kun at have denne kode \u00e9t sted, opn\u00e5r man ogs\u00e5 en fordel, hvis man p\u00e5 et tidspunkt skifter database \u2013 s\u00e5 beh\u00f8ver man kun at \u00e6ndre databasens navn et enkelt sted.<\/p>\n<p>Filen database.js indeholder ogs\u00e5 en metode, der konverterer en JavaScript-dato til en SQL-dato.<\/p>\n<p>Kildeteksten til database.js ser s\u00e5ledes ud:<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>function createDatabaseConnection() {<\/p>\n<p>con = Server.CreateObject(&#8220;ADODB.Connection&#8221;);<\/p>\n<p>con.Open(&#8220;compactdiscount&#8221;);<\/p>\n<p>return con;<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>function toSqlDate(date) {<\/p>\n<p>return &#8220;&#8216;&#8221; + date.getDate() + &#8220;-&#8221; + (date.getMonth() + 1) + &#8220;-&#8221; + date.getYear() + &#8220;&#8216;&#8221;;<\/p>\n<p>}<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<h3>Strengh\u00e5ndtering (<em>string.js<\/em>)<\/h3>\n<p>JavaScript er som udgangspunkt ikke s\u00e6rligt godt til at h\u00e5ndtere tekststrenge. Der er derfor behov for nogle metoder, som kan arbejde p\u00e5 tekststrenge. Disse metoder findes i inkluderingsfilen string.js. Kildeteksten til denne fil er som f\u00f8lger:<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>function strcmp(s1, s2) {<\/p>\n<p>if (s1.length != s2.length) {<\/p>\n<p>return false;<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>for (i = 0; i &lt; s1.length; i++) {<\/p>\n<p>if (s1[i] != s2[i]) {<\/p>\n<p>return false;<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>return true;<\/p>\n<p>}<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<h3>Forsiden (<em>index.asp<\/em>)<\/h3>\n<p>Form\u00e5let med forsiden er at byde kunden velkommen til web-stedet. Forsiden skal ogs\u00e5 give brugeren et overblik over web-stedets opbygning. Endeligt skal man ikke glemme form\u00e5let med hele web-stedet: at f\u00e5 kunden til at k\u00f8be noget. Derfor skal forsiden ogs\u00e5 indeholde reklamer for s\u00e6rligt udvalgte album.<\/p>\n<p>Forsiden opdeles ved hj\u00e6lp af en tabel i to dele. Den venstre del af forsiden bruges til henvisninger til andre sider p\u00e5 web-stedet. Det drejer sig blandt andet om kategorioversigt og s\u00f8gning. Kategorioversigten laves naturligvis p\u00e5 baggrund af de oplysninger, der ligger i kategoritabellen i databasen.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1004.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-medium wp-image-528\" title=\"1004\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1004-300x210.png\" alt=\"\" width=\"300\" height=\"210\" srcset=\"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1004-300x210.png 300w, https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1004.png 849w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><em>Figur 10.4.<\/em> Forsiden.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Den h\u00f8jre side af forsiden indeholder selve teksten. Her startes med at kontrollere, om kunden har en cookie sat. I s\u00e5 fald er vedkommende logget ind. Cookien indeholder kundens kundenummer. Dette kundenummer kan man bruge til at finde kundens navn i databasen.<\/p>\n<p>Hvis kunden ikke har en cookie, er vedkommende ikke logget ind, og vi ved ikke, hvem det er. Hvis kunden tidligere har handlet i e-butikken, kan vedkommende identificere sig selv ved at logge ind.<\/p>\n<p>Dern\u00e6st vises der reklamer for s\u00e6rligt udvalgte album. Reklamen skal indeholde albummets cover, titel, kunstner, pris samt beskrivelse. Beskrivelsen \u2013 samt albummets id \u2013 hentes fra forsidetabellen, mens de \u00f8vrige oplysninger hentes fra albumtabellen. For at kunne hente disse oplysninger ud af databasen p\u00e5 den letteste m\u00e5de, er der blevet oprettet en foresp\u00f8rgsel (et <em>view<\/em>) i databasen. Denne foresp\u00f8rgsel indeholder netop de oplysninger, der skal bruges. Dette view kaldes forsideview.<\/p>\n<p>Kildeteksten til forsiden ser s\u00e5ledes ud:<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;% @Language=JavaScript %&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;!&#8211; #include file=&#8221;database.js&#8221; &#8211;&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>con = createDatabaseConnection();<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;html&gt;<\/p>\n<p>&lt;head&gt;<\/p>\n<p>&lt;title&gt;Velkommen til Compact Discount&lt;\/title&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;\/head&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;!&#8211; #include file=&#8221;header.html&#8221; &#8211;&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;td&gt;<\/p>\n<p>&lt;table&gt;<\/p>\n<p>&lt;td width = 110&gt;<\/p>\n<p>&lt;font size = -1&gt;<\/p>\n<p>&lt;b&gt;Kategorier:&lt;\/b&gt;&lt;br&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>\/\/ lav kategorioversigt<\/p>\n<p>res = con.Execute(&#8220;SELECT * FROM Kategori ORDER BY Kategori&#8221;);<\/p>\n<p>&nbsp;<\/p>\n<p>while (!res.EOF) {<\/p>\n<p>Response.Write(&#8220;&lt;a href = search.asp?kategori=&#8221;);<\/p>\n<p>Response.Write(res.Fields(&#8220;ID&#8221;));<\/p>\n<p>Response.Write(&#8220;&gt;&#8221;);<\/p>\n<p>Response.Write(res.Fields(&#8220;kategori&#8221;));<\/p>\n<p>Response.Write(&#8220;&lt;\/A&gt;&lt;BR&gt;&#8221;);<\/p>\n<p>res.move(1);<\/p>\n<p>}<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;p&gt;<\/p>\n<p>&lt;b&gt;S\u00f8g&lt;\/b&gt;&lt;br&gt;<\/p>\n<p>&lt;form action=search.asp method=get&gt;<\/p>\n<p>Indtast s\u00f8geord:&lt;br&gt;<\/p>\n<p>&lt;input type=text name=tekst size=12&gt;&lt;br&gt;<\/p>\n<p>&lt;center&gt;&lt;input type=submit value=&#8221;S\u00f8g&#8221;&gt;&lt;\/center&gt;<\/p>\n<p>&lt;\/form&gt;<\/p>\n<p>&lt;b&gt;Statistik&lt;\/b&gt;&lt;br&gt;<\/p>\n<p>&lt;a href=mestsolgt.asp&gt;Mest solgte album&lt;\/a&gt;<\/p>\n<p>&lt;\/td&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;!&#8211; slut p\u00e5 oversigt i venstre side af billedet &#8211;&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;td valign=top&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>\/\/ Kontroll\u00e9r om brugeren har en cookie (= er logget ind)<\/p>\n<p>&nbsp;<\/p>\n<p>if (Request.Cookies(&#8220;kundeid&#8221;) != &#8220;&#8221;) {<\/p>\n<p>kundeid = Request.Cookies(&#8220;kundeid&#8221;);<\/p>\n<p>Session(&#8220;kundeid&#8221;) = kundeid;<\/p>\n<p>res = con.execute(&#8220;SELECT navn FROM kunde WHERE id=&#8221; + kundeid);<\/p>\n<p>kundenavn = res.Fields(&#8220;navn&#8221;);<\/p>\n<p>%&gt;<\/p>\n<p>Velkommen\u00a0 &lt;%=kundenavn%&gt;.<\/p>\n<p>&lt;%<\/p>\n<p>} else {<\/p>\n<p>%&gt;<\/p>\n<p>Velkommen til Computer Discount. Hvis du er registreret som kunde hos os, kan du<\/p>\n<p>&lt;a href=login.asp&gt;logge ind&lt;\/a&gt; her.<\/p>\n<p>&lt;%<\/p>\n<p>}<\/p>\n<p>%&gt;<\/p>\n<p>&lt;p&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;!&#8211; vis udvalgte cd&#8217;er &#8211;&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;table width = 100% &gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>&nbsp;<\/p>\n<p>res = con.execute(&#8220;SELECT * FROM forsideview&#8221;);<\/p>\n<p>&nbsp;<\/p>\n<p>while (!res.EOF) {<\/p>\n<p>Response.write(&#8220;&lt;tr&gt;&lt;td valign=top&gt;&#8221;);<\/p>\n<p>Response.write(&#8220;&lt;img src=&#8221;);<\/p>\n<p>Response.write(res.Fields(&#8220;forside&#8221;));<\/p>\n<p>Response.write(&#8220;&lt;\/td&gt;&lt;td valign=top&gt;&lt;b&gt;&#8221;);<\/p>\n<p>Response.write(res.Fields(&#8220;Navn&#8221;));<\/p>\n<p>Response.write(&#8220;: &#8220;);<\/p>\n<p>Response.write(res.Fields(&#8220;Titel&#8221;));<\/p>\n<p>Response.write(&#8220;&lt;\/b&gt;&lt;br&gt;&#8221;);<\/p>\n<p>Response.write(res.Fields(&#8220;tekst&#8221;));<\/p>\n<p>Response.write(&#8220;&lt;p&gt;&#8221;);<\/p>\n<p>Response.write(&#8220;&lt;i&gt;K\u00f8b den her for kun &#8220;);<\/p>\n<p>Response.write(res.Fields(&#8220;pris&#8221;));<\/p>\n<p>Response.write(&#8220;&lt;p align=right&gt;&#8221;);<\/p>\n<p>Response.write(&#8220;&lt;font size=-1&gt;&#8221;);<\/p>\n<p>Response.write(&#8220;&lt;a href=info.asp?album=&#8221;);<\/p>\n<p>Response.write(res.Fields(&#8220;ID&#8221;));<\/p>\n<p>Response.write(&#8220;&gt;Yderligere oplysninger&lt;\/a&gt;&lt;\/font&gt;&#8221;);<\/p>\n<p>Response.write(&#8220;&lt;\/td&gt;&lt;\/tr&gt;&#8221;);<\/p>\n<p>res.Move(1);<\/p>\n<p>}<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;\/table&gt;\u00a0 &lt;!&#8211; udvalgte cd&#8217;er &#8211;&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;\/td&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;\/table&gt; &lt;!&#8211; midtersektion &#8211;&gt;<\/p>\n<p>&lt;\/table&gt;<\/p>\n<p>&lt;\/body&gt;<\/p>\n<p>&lt;\/html&gt;<\/p>\n<p>&nbsp;<\/p>\n<h3>Informationssiden (<em>info.asp<\/em>)<\/h3>\n<p>Det skal naturligvis v\u00e6re muligt at se flere oplysninger om et album end de, der vises p\u00e5 kategorioversigterne og i s\u00f8geresultaterne. N\u00e5r en bruger klikker p\u00e5 et album, bliver han pr\u00e6senteret for en informationsside, der indeholder alle relevante oplysninger om albummet. Fra informationssiden skal det naturligvis ogs\u00e5 v\u00e6re muligt at tilf\u00f8je albummet til indk\u00f8bskurven.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1005.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-medium wp-image-527\" title=\"1005\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1005-300x210.png\" alt=\"\" width=\"300\" height=\"210\" srcset=\"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1005-300x210.png 300w, https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1005.png 849w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><em>Figur 10.5.<\/em> Informationssiden.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Siden info.asp starter med at hente de relevante oplysninger ud af albumtabellen. Dern\u00e6st hentes oplysninger fra kunstnertabellen, s\u00e5 kunstnerens navn ogs\u00e5 kan blive vist p\u00e5 siden.<\/p>\n<p>Siden indeholder ogs\u00e5 en oversigt over de numre, der er p\u00e5 cd&#8217;en. For hvert nummer skal nummerets titel vises, samt kunstneren. Hvis man klikker p\u00e5 kunstneren, skal man sendes til s\u00f8gesiden og f\u00e5 en oversigt over alle de album, kunstneren har indspillet numre p\u00e5. Oplysningerne om nummeret ligger i nummertabellen, mens navnene p\u00e5 kunstnerne findes i kunstnertabellen. For at kombinere disse oplysninger vil man f\u00f8rst skulle hente alle oplysningerne om albummet ud af nummertabellen, og derefter \u2013 for hvert nummer p\u00e5 albummet \u2013 hente kunstnerens navn ud af kunstnertabellen. Dette vil medf\u00f8re en lang r\u00e6kke foresp\u00f8rgsler til databasen, og det vil v\u00e6re forholdsvis langsommeligt. Derfor er der blevet oprettet endnu et view \u2013 kunstnerview \u2013 som kombinerer kunstnerne med numrene. Nummeroversigten p\u00e5 informationssiden bliver lavet ud fra dette view.<\/p>\n<p>Muligheden for at k\u00f8be albummet er implementeret ved hj\u00e6lp af en formular med en knap. Formularen indeholder et skjult felt med albummets id. N\u00e5r brugeren klikker p\u00e5 knappen, indsendes formularens data til siden tilfoj.asp, der s\u00f8rger for at f\u00f8je albummet til indk\u00f8bskurven.<\/p>\n<p>Kildeteksten til informationssiden ser s\u00e5ledes ud:<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;% @Language=JavaScript %&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;!&#8211; #include file=&#8221;database.js&#8221; &#8211;&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>con = createDatabaseConnection();<\/p>\n<p>album_id = Request.QueryString(&#8220;album&#8221;);<\/p>\n<p>res = con.Execute(&#8220;SELECT * FROM Album WHERE id=&#8221; + album_id);<\/p>\n<p>titel = res.Fields(&#8220;Titel&#8221;);<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;html&gt;<\/p>\n<p>&lt;head&gt;<\/p>\n<p>&lt;title&gt;Compact Discount [&lt;%=titel%&gt;]&lt;\/title&gt;<\/p>\n<p>&lt;\/head&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;!&#8211; #include file=&#8221;header.html&#8221; &#8211;&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;td&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;table width = 100%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td&gt;<\/p>\n<p>&lt;table&gt;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td valign=top&gt;<\/p>\n<p>&lt;img src=&lt;%=res.Fields(&#8220;forside&#8221;)%&gt; alt=&lt;%=titel%&gt;&gt;<\/p>\n<p>&lt;\/td&gt;<\/p>\n<p>&lt;td valign=top&gt;<\/p>\n<p>&lt;%<\/p>\n<p>kunstner_id = res.Fields(&#8220;Kunstner&#8221;);<\/p>\n<p>kunstner_res = con.Execute(&#8220;SELECT Navn FROM Kunstner WHERE id=&#8221; + kunstner_id);<\/p>\n<p>kunstner = kunstner_res.Fields(&#8220;Navn&#8221;);<\/p>\n<p>%&gt;<\/p>\n<p>&lt;b&gt;&lt;%=kunstner%&gt;: &lt;%=titel%&gt;&lt;\/b&gt;&lt;br&gt;<\/p>\n<p>&lt;font size=-1&gt;<\/p>\n<p>Udgivet: &lt;%=res.Fields(&#8220;Udgivelse&#8221;)%&gt;&lt;br&gt;<\/p>\n<p>Pris: &lt;%=res.Fields(&#8220;Pris&#8221;)%&gt; kr.&lt;br&gt;<\/p>\n<p>Leveringstid: ca. &lt;%=res.Fields(&#8220;Leveringstid&#8221;)%&gt; dag(e).&lt;br&gt;<\/p>\n<p>Kategori:<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>kategori_id = res.Fields(&#8220;Kategori&#8221;);<\/p>\n<p>kategori_res = con.Execute(&#8220;SELECT Kategori FROM kategori WHERE id=&#8221; + kategori_id);<\/p>\n<p>kategori = kategori_res.Fields(&#8220;Kategori&#8221;);<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;a href=search.asp?kategori=&lt;%=kategori_id%&gt;&gt;&lt;%=kategori%&gt;&lt;\/a&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;\/font&gt;<\/p>\n<p>&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;\/table&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%=res.Fields(&#8220;Beskrivelse&#8221;)%&gt;&lt;P&gt;<\/p>\n<p>Albummet indeholder f\u00f8lgende numre:<\/p>\n<p>&lt;ol&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>nummer_res = con.Execute(&#8220;SELECT Titel, Navn, Kunstner FROM Kunstnerview WHERE album=&#8221; + album_id);<\/p>\n<p>&nbsp;<\/p>\n<p>while (!nummer_res.EOF) {<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;li&gt;&lt;%=nummer_res.Fields(&#8220;Titel&#8221;)%&gt; (&lt;i&gt;&lt;a href=search.asp?kunstner=&lt;%=nummer_res.Fields(&#8220;Kunstner&#8221;)%&gt;&gt;&lt;%=nummer_res.Fields(&#8220;Navn&#8221;)%&gt;&lt;\/a&gt;&lt;\/i&gt;)<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>nummer_res.Move(1);<\/p>\n<p>}<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;\/ol&gt;<\/p>\n<p>&lt;\/td&gt;<\/p>\n<p>&lt;td width=100&gt;<\/p>\n<p>&lt;form action=tilfoj.asp method=post&gt;<\/p>\n<p>&lt;input type=hidden name=album value=&lt;%=album_id%&gt;&gt;<\/p>\n<p>&lt;center&gt;&lt;input type=submit value=&#8221;Bestil album&#8221;&gt;&lt;\/center&gt;<\/p>\n<p>&lt;font size=-1&gt;<\/p>\n<p>Klik p\u00e5 ovenst\u00e5ende knap for at tilf\u00f8je albummet til din indk\u00f8bskurv.<\/p>\n<p>Du kan altid fjerne den fra indk\u00f8bskurven senere.<\/p>\n<p>&lt;\/font&gt;<\/p>\n<p>&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;\/table&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;\/table&gt;<\/p>\n<p>&nbsp;<\/p>\n<h3>Tilf\u00f8jelsessiden (<em>tilfoj.asp<\/em>)<\/h3>\n<p>Tilf\u00f8jelsessiden er en af de sider, der lever en skjult tilv\u00e6relse p\u00e5 web-stedet. Det vil sige, at den ikke indeholder oplysninger, der skal vises til brugeren. Det eneste, siden g\u00f8r, er at tilf\u00f8je et album til indk\u00f8bskurven, og derefter sende brugeren videre til indk\u00f8bskurvsoversigten.<\/p>\n<p>Indk\u00f8bskurven gemmes i en r\u00e6kke sessionsvariable. Dette giver mening, fordi indk\u00f8bskurven tilh\u00f8rer den bruger, der har den p\u00e5g\u00e6ldende session. Sessionsvariablerne er opdelt i to kategorier: de, der angiver albumnumrene, og de, der angiver antallet af bestilte album. Albummene opbevares i variable med navnene Album0, Album1, Album2 osv. Antallene ligger i variable med navnene Antal0, Antal1, Antal2 osv. Det vil sige, at Album1 indeholder identifikationen af det antal, der skal k\u00f8bes, mens Antal1 angiver, hvor mange eksemplarer der skal k\u00f8bes af det p\u00e5g\u00e6ldende album. Bem\u00e6rk, at oplysningerne i indk\u00f8bskurven endnu ikke er ordrer, og derfor ikke opbevares i databasen.<\/p>\n<p>Til at registrere, hvor mange forskellige album, der er k\u00f8bt, bruges sessionsvariablen AlbumAntal.<\/p>\n<p>Siden tilfoj.asp f\u00e5r det album, der skal k\u00f8bes, med som parameter fra bestillingsformularen. Dern\u00e6st kontrolleres det, ved hj\u00e6lp af sessionsvaraiblerne, om kunden i forvejen har bestilt et \u2013 eller flere \u2013 eksemplarer af albummet. Er det tilf\u00e6ldet bliver den p\u00e5g\u00e6ldende antal-variabel talt op, s\u00e5 kunden nu har bestilt et eksemplar mere.<\/p>\n<p>Har kunden ikke eksemplarer af albummet liggende i indk\u00f8bskurven, bliver albummet tilf\u00f8jet, og sessionsvariablen albumantal bliver talt op.<\/p>\n<p>N\u00e5r dette er gjort, omdirigeres brugeren til siden kurv.asp, der viser indholdet af indk\u00f8bskurven. Kildeteksten til tilfoj.asp ser s\u00e5ledes ud:<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;% @language=javascript %&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>\/\/ hent variable<\/p>\n<p>album = Request.Form(&#8220;album&#8221;);<\/p>\n<p>&nbsp;<\/p>\n<p>albumantal = Session(&#8220;albumantal&#8221;);<\/p>\n<p>if (!(albumantal &gt; 0)) {<\/p>\n<p>albumantal = 0;<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/ kontroller om kunden allerede har bestilt et eksemplar af denne cd<\/p>\n<p>&nbsp;<\/p>\n<p>found = false;<\/p>\n<p>for (i = 0; i &lt; albumantal; i++) {<\/p>\n<p>&nbsp;<\/p>\n<p>if (Session(&#8220;album&#8221;+i) == album) {<\/p>\n<p>antal = Session(&#8220;antal&#8221;+i);<\/p>\n<p>antal++;<\/p>\n<p>Session(&#8220;antal&#8221;+i) = antal;<\/p>\n<p>found = true;<\/p>\n<p>break;<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>if (!found) { \/\/ tilf\u00f8j et nyt album til indk\u00f8bskurven<\/p>\n<p>Session(&#8220;album&#8221;+albumantal) = &#8220;&#8221; + album;<\/p>\n<p>Session(&#8220;antal&#8221;+albumantal) = 1;<\/p>\n<p>albumantal++;<\/p>\n<p>Session(&#8220;albumantal&#8221;) = albumantal;<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Response.Redirect(&#8220;kurv.asp&#8221;);<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<h3>Indk\u00f8bskurven (<em>kurv.asp<\/em>)<\/h3>\n<p>Indk\u00f8bskurven viser de album, kunden har tilf\u00f8jet til sin indk\u00f8bskurv. For hvert album vises antallet af bestilte eksemplarer, albummets titel, pris samt den samlede pris for de bestilte eksemplarer. Den samlede pris p\u00e5 alle albummene i indk\u00f8bskurven vises ogs\u00e5.<\/p>\n<p>Kunden skal naturligvis have mulighed for at \u00e6ndre antallet af bestilte eksemplarer og for at fjerne et eller flere album fra indk\u00f8bskurven. I dette eksempel stilles denne funktionalitet til r\u00e5dighed ved, at antallet af bestilte eksemplarer vises i et tekstfelt i en formular. For hvert album er der en knap, der hedder opdater, og ved at \u00e6ndre p\u00e5 antallet i tekstfeltet og klikke p\u00e5 knappen, bliver antallet \u00e6ndret. Hvis man vil fjerne et album fra indk\u00f8bskurven, skal man skrive 0 i antalfeltet og klikke p\u00e5 opdater.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1006.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-medium wp-image-526\" title=\"1006\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1006-300x210.png\" alt=\"\" width=\"300\" height=\"210\" srcset=\"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1006-300x210.png 300w, https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1006.png 849w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><em>Figur 10.6.<\/em> Indk\u00f8bskurven.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Siden starter med at kontrollere, om der overhovedet er album i indk\u00f8bskurven. Er der ikke det, skrives teksten &#8220;Din indk\u00f8bskurv er tom&#8221;, og siden afsluttes.<\/p>\n<p>Er der noget i indk\u00f8bskurven, oprettes der en formular for hvert album i indk\u00f8bskurven. Formularen indeholder et tekstfelt, hvor antallet af bestilte eksemplarer skrives, samt en knap. N\u00e5r der klikkes p\u00e5 knappen, sendes oplysningerne fra formularen til rediger.asp, der s\u00f8rger for at redigere antallet af bestilte eksemplarer.<\/p>\n<p>For hvert album i indk\u00f8bskurven beregnes den samlede pris, og denne pris adderes til den samlede pris for hele indk\u00f8bskurven. Den samlede pris vises efter listen over albums i indk\u00f8bskurven.<\/p>\n<p>Siden indeholder naturligvis ogs\u00e5 en henvisning til siden, der foretager afsendelsen af ordren.<\/p>\n<p>Kildeteksten til kurv.asp ser s\u00e5ledes ud:<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;% @Language=JavaScript %&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;!&#8211; #include file=&#8221;database.js&#8221; &#8211;&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>con = createDatabaseConnection();<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;html&gt;<\/p>\n<p>&lt;head&gt;<\/p>\n<p>&lt;title&gt;Compact Discount [Indk\u00f8bskurv]&lt;\/title&gt;<\/p>\n<p>&lt;\/head&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;!&#8211; #include file=&#8221;header.html&#8221; &#8211;&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;td&gt;<\/p>\n<p>&lt;h1&gt;Indk\u00f8bskurv&lt;\/h1&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>&nbsp;<\/p>\n<p>albumantal = Session(&#8220;albumantal&#8221;);<\/p>\n<p>undefined = Session(&#8220;garbage&#8221;);<\/p>\n<p>totalpris = 0;<\/p>\n<p>&nbsp;<\/p>\n<p>if (albumantal == undefined || albumantal == 0) {<\/p>\n<p>Response.write(&#8220;Din indk\u00f8bskurv er tom.&#8221;);<\/p>\n<p>Response.end();<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>Din indk\u00f8bskurv indeholder f\u00f8lgende album:&lt;br&gt;<\/p>\n<p>&lt;table width=100%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>for (i = 0; i &lt; albumantal; i++) {<\/p>\n<p>if (Session(&#8220;antal&#8221;+i) == 0) {<\/p>\n<p>continue;<\/p>\n<p>}<\/p>\n<p>%&gt;<\/p>\n<p>&lt;form action=rediger.asp method=post&gt;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;input type=hidden name=album value=&lt;%=i%&gt;&gt;<\/p>\n<p>&lt;input type=text name=antal value=&lt;%=Session(&#8220;antal&#8221;+i)%&gt; size=3&gt;<\/p>\n<p>&lt;\/td&gt;<\/p>\n<p>&lt;td&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;a href=info.asp?album=&lt;%=Session(&#8220;album&#8221;+i)%&gt;&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>res = con.execute(&#8220;SELECT Titel, Pris FROM Album WHERE id=&#8221; + Session(&#8220;album&#8221;+i));<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%=res.Fields(&#8220;Titel&#8221;)%&gt;&lt;\/a&gt;<\/p>\n<p>&lt;\/td&gt;<\/p>\n<p>&lt;td align=right&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>albumpris = res.Fields(&#8220;Pris&#8221;);<\/p>\n<p>%&gt;<\/p>\n<p>&lt;%=albumpris%&gt; kr. pr. stk<\/p>\n<p>&lt;\/td&gt;<\/p>\n<p>&lt;td align=right&gt;<\/p>\n<p>&lt;%=Math.round(albumpris * Session(&#8220;antal&#8221;+i) * 100) \/ 100%&gt; kr.<\/p>\n<p>&lt;%<\/p>\n<p>totalpris += Math.round(albumpris * Session(&#8220;antal&#8221;+i) * 100) \/ 100;<\/p>\n<p>%&gt;<\/p>\n<p>&lt;\/td&gt;<\/p>\n<p>&lt;td&gt;<\/p>\n<p>&lt;input type=submit value=&#8221;Opdater&#8221;&gt;<\/p>\n<p>&lt;\/td&gt;<\/p>\n<p>&lt;\/form&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>}<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td&gt;&amp;nbsp;&lt;\/td&gt;<\/p>\n<p>&lt;td&gt;&lt;b&gt;Total&lt;\/b&gt;&lt;\/td&gt;<\/p>\n<p>&lt;td&gt;&amp;nbsp;&lt;\/td&gt;<\/p>\n<p>&lt;td align=right&gt;&lt;b&gt;&lt;%=totalpris%&gt; kr.&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;\/table&gt;<\/p>\n<p>&lt;p&gt;<\/p>\n<p>Hvis du vil \u00e6ndre antallet af bestilte album, s\u00e5 indtast det \u00f8nskede antal i feltet ved albummet og klik p\u00e5 knappen &#8220;Opdater&#8221;.<\/p>\n<p>&lt;p&gt;<\/p>\n<p>&lt;b&gt;Klikker du ikke p\u00e5 knappen &#8220;Opdater&#8221; bliver din opdatering ikke registreret!&lt;\/b&gt;<\/p>\n<p>&lt;p&gt;Hvis du vil fjerne et album fra indk\u00f8bskurven, skal du indtaste 0 i feltet, og klikke p\u00e5 knappen &#8220;Opdater&#8221;.<\/p>\n<p>&lt;p&gt;<\/p>\n<p>Klik &lt;a href=afsend.asp&gt;her&lt;\/a&gt; for at afsende ordren.<\/p>\n<p>&lt;\/td&gt;<\/p>\n<p>&lt;\/table&gt;<\/p>\n<p>&nbsp;<\/p>\n<h3>Redigeringssiden (<em>rediger.asp<\/em>)<\/h3>\n<p>Ligesom tilf\u00f8jelsessiden er redigeringssiden ikke synlig for brugeren. Siden \u00e6ndrer antallet af k\u00f8bte eksemplarer af et album, og returnerer til indk\u00f8bskurven. Siden kontrollerer dog ogs\u00e5, om alle album er blevet fjernet fra indk\u00f8bskurven. I s\u00e5 fald s\u00e6ttes albumantal til 0. Bem\u00e6rk, at en sletning ikke medf\u00f8rer, at albumantal t\u00e6lles ned. En sletning medf\u00f8rer blot, at antallet af eksemplarer af det p\u00e5g\u00e6ldende album s\u00e6ttes til 0. Indk\u00f8bskurvsoversigten s\u00f8rger for kun at vise de album, der er bestilt eksemplarer af.<\/p>\n<p>Fordelen ved denne fremgangsm\u00e5de er, at man er fri for at flytte rundt p\u00e5 elementerne i indk\u00f8bskurven, hvis brugeren v\u00e6lger at slette et element i midten.<\/p>\n<p>Kildeteksten til redigeringssiden ser s\u00e5ledes ud:<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;% @language=javascript %&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>album = Request.Form(&#8220;album&#8221;);<\/p>\n<p>antal = Request.Form(&#8220;antal&#8221;);<\/p>\n<p>&nbsp;<\/p>\n<p>Session(&#8220;antal&#8221;+album) = &#8220;&#8221; + antal;<\/p>\n<p>&nbsp;<\/p>\n<p>if (antal == 0) { \/\/ kontroller om alle varer er slettet<\/p>\n<p>albumantal = Session(&#8220;albumantal&#8221;);<\/p>\n<p>found = false;<\/p>\n<p>for (i = 0; i &lt; albumantal; i++) {<\/p>\n<p>if (Session(&#8220;antal&#8221;+i) != 0) {<\/p>\n<p>found = true;<\/p>\n<p>break;<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>if (!found) {<\/p>\n<p>Session(&#8220;albumantal&#8221;) = 0;<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>Response.redirect(&#8220;kurv.asp&#8221;);<\/p>\n<p>%&gt;<br \/>\n<script type=\"text\/javascript\">\/\/ <![CDATA[\n google_ad_client = \"ca-pub-3400894606969585\"; \/* Bibliotek - ASP *\/ google_ad_slot = \"2386722770\"; google_ad_width = 336; google_ad_height = 280;\n\/\/ ]]><\/script><br \/>\n<script src=\"http:\/\/pagead2.googlesyndication.com\/pagead\/show_ads.js\" type=\"text\/javascript\">\n<\/script><\/p>\n<h3>Afsendelsessiden (<em>afsend.asp<\/em>)<\/h3>\n<p>P\u00e5 afsendelsessiden skal brugeren have mulighed for at afsende sin ordre. Inden brugeren f\u00e5r mulighed for dette, kontrollerer siden dog, at der rent faktisk er varer i indk\u00f8bskurven. Er indk\u00f8bskurven tom, f\u00e5r brugeren dette at vide, og der sker ikke yderligere. Hvis der er varer i indk\u00f8bskurven, bliver brugeren pr\u00e6senteret for en oversigt over dem efter samme system som p\u00e5 siden med indk\u00f8bskurven, dog med den forskel at brugeren ikke har mulighed for at \u00e6ndre antallet af bestilte album. Dette kan kun ske fra indk\u00f8bskurven, s\u00e5 derfor er der en henvisning til denne side.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1007.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-medium wp-image-525\" title=\"1007\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1007-300x261.png\" alt=\"\" width=\"300\" height=\"261\" srcset=\"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1007-300x261.png 300w, https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1007.png 849w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><em>Figur 10.7.<\/em> Afsendelse af ordre.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>Som n\u00e6vnt tidligere h\u00e5ndterer web-stedet tilbagevendende kunder. Dette sker ved hj\u00e6lp af cookies, som enten gemmes p\u00e5 brugerens harddisk eller s\u00e6ttes, n\u00e5r brugeren logger ind. P\u00e5 afsendelsessiden beh\u00f8ver tilbagevendende kunder ikke at udfylde felterne med navn, adresse og s\u00e5 videre \u2013 dette skal ske automatisk ved hj\u00e6lp af oplysningerne fra databasen. Derfor kontrollerer siden, om cookien kundeid er sat. Er dette tilf\u00e6ldet, bruges v\u00e6rdien af cookien til at sl\u00e5 oplysninger om kunden op i databasen. Er cookien ikke sat, bliver kunden behandlet som en ny kunde og f\u00e5r mulighed for at blive registreret. For at blive dette skal kunden indtaste et kodeord.<\/p>\n<p>Kildeteksten til afsendelsessiden ser s\u00e5ledes ud:<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;% @Language=JavaScript %&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;!&#8211; #include file=&#8221;database.js&#8221; &#8211;&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>con = createDatabaseConnection();<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;html&gt;<\/p>\n<p>&lt;head&gt;<\/p>\n<p>&lt;title&gt;Compact Discount [Afsend ordre]&lt;\/title&gt;<\/p>\n<p>&lt;\/head&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;!&#8211; #include file=&#8221;header.html&#8221; &#8211;&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;td&gt;<\/p>\n<p>&lt;h1&gt;Afsend ordre&lt;\/h1&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>&nbsp;<\/p>\n<p>albumantal = Session(&#8220;albumantal&#8221;);<\/p>\n<p>undefined = Session(&#8220;garbage&#8221;);<\/p>\n<p>totalpris = 0;<\/p>\n<p>&nbsp;<\/p>\n<p>if (albumantal == undefined || albumantal == 0) {<\/p>\n<p>Response.write(&#8220;Din indk\u00f8bskurv er tom &#8211; der er derfor ingen ordre at afsende.&#8221;);<\/p>\n<p>Response.end();<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>Du er ved at afsende en ordre p\u00e5 f\u00f8lgende album:<\/p>\n<p>&lt;table width=100%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>for (i = 0; i &lt; albumantal; i++) {<\/p>\n<p>if (Session(&#8220;antal&#8221;+i) == 0) {<\/p>\n<p>continue;<\/p>\n<p>}<\/p>\n<p>%&gt;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td&gt;<\/p>\n<p>&lt;%=Session(&#8220;antal&#8221;+i)%&gt;<\/p>\n<p>&lt;\/td&gt;<\/p>\n<p>&lt;td&gt;<\/p>\n<p>&lt;%<\/p>\n<p>res = con.execute(&#8220;SELECT Titel, Pris FROM Album WHERE id=&#8221; + Session(&#8220;album&#8221;+i));<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%=res.Fields(&#8220;Titel&#8221;)%&gt;<\/p>\n<p>&lt;\/td&gt;<\/p>\n<p>&lt;td align=right&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>albumpris = res.Fields(&#8220;Pris&#8221;);<\/p>\n<p>%&gt;<\/p>\n<p>&lt;%=albumpris%&gt; kr. pr. stk<\/p>\n<p>&lt;\/td&gt;<\/p>\n<p>&lt;td align=right&gt;<\/p>\n<p>&lt;%=Math.round(albumpris * Session(&#8220;antal&#8221;+i) * 100) \/ 100%&gt; kr.<\/p>\n<p>&lt;%<\/p>\n<p>totalpris += Math.round(albumpris * Session(&#8220;antal&#8221;+i) * 100) \/ 100;<\/p>\n<p>%&gt;<\/p>\n<p>&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>}<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td&gt;&amp;nbsp;&lt;\/td&gt;<\/p>\n<p>&lt;td&gt;&lt;b&gt;Total&lt;\/b&gt;&lt;\/td&gt;<\/p>\n<p>&lt;td&gt;&amp;nbsp;&lt;\/td&gt;<\/p>\n<p>&lt;td align=right&gt;&lt;b&gt;&lt;%=totalpris%&gt; kr.&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;\/table&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>Hvis du ikke vil afsende denne ordre, skal du klikke &lt;a href=kurv.asp&gt;her&lt;\/a&gt; for at g\u00e5 tilbage til din indk\u00f8bskurv og \u00e6ndre indholdet.<\/p>\n<p>&lt;p&gt;<\/p>\n<p>Hvis du vil afsende ordren, skal du udfylde nedenst\u00e5ende felter og trykke p\u00e5 knappen nederst p\u00e5 denne side.<\/p>\n<p>&lt;p&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>\/\/ kontroll\u00e9r om kunden er logget ind.<\/p>\n<p>kundeid = Request.Cookies(&#8220;kundeid&#8221;);<\/p>\n<p>if (kundeid == &#8220;&#8221;) {<\/p>\n<p>navn = &#8220;&#8221;;<\/p>\n<p>adresse = &#8220;&#8221;;<\/p>\n<p>postnummer = &#8220;&#8221;;<\/p>\n<p>by = &#8220;&#8221;;<\/p>\n<p>email = &#8220;&#8221;;<\/p>\n<p>} else {<\/p>\n<p>res = con.execute(&#8220;SELECT navn, adresse, postnummer, by, email FROM kunde WHERE id = &#8221; + kundeid);<\/p>\n<p>navn = res.Fields(&#8220;navn&#8221;);<\/p>\n<p>adresse = res.Fields(&#8220;adresse&#8221;);<\/p>\n<p>postnummer = res.Fields(&#8220;postnummer&#8221;);<\/p>\n<p>by = res.Fields(&#8220;by&#8221;);<\/p>\n<p>email = res.Fields(&#8220;email&#8221;);<\/p>\n<p>}<\/p>\n<p>%&gt;<\/p>\n<p>&lt;form name=afsend action=modtag.asp method=post&gt;<\/p>\n<p>&lt;table&gt;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td&gt;Navn&lt;\/td&gt;<\/p>\n<p>&lt;td&gt;&lt;input type=text name=navn value=&#8221;&lt;%=navn%&gt;&#8221;&gt;&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td&gt;Adresse&lt;\/td&gt;<\/p>\n<p>&lt;td&gt;&lt;input type=text name=adresse value=&#8221;&lt;%=adresse%&gt;&#8221;&gt;&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td&gt;Postnummer&lt;\/td&gt;<\/p>\n<p>&lt;td&gt;&lt;input type=text name=postnummer value=&#8221;&lt;%=postnummer%&gt;&#8221;&gt;&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td&gt;By&lt;\/td&gt;<\/p>\n<p>&lt;td&gt;&lt;input type=text name=by value=&#8221;&lt;%=by%&gt;&#8221;&gt;&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td&gt;Email&lt;\/td&gt;<\/p>\n<p>&lt;td&gt;&lt;input type=text name=email value=&#8221;&lt;%=email%&gt;&#8221;&gt;&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>if (kundeid == &#8220;&#8221;) {<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td colspan=2&gt;<\/p>\n<p>Hvis du vil registreres som kunde hos os, skal du v\u00e6lge et kodeord, og indtaste det i de nedenst\u00e5ende felter.<\/p>\n<p>&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td&gt;Kodeord&lt;\/td&gt;<\/p>\n<p>&lt;td&gt;&lt;input type=password name=kodeord1&gt;&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td&gt;Gentag kodeord&lt;\/td&gt;<\/p>\n<p>&lt;td&gt;&lt;input type=password name=kodeord2&gt;&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>}<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;\/td&gt;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td&gt;&amp;nbsp;&lt;\/td&gt;<\/p>\n<p>&lt;td&gt;&lt;input type=submit value=&#8221;Afsend ordre&#8221;&gt;&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;\/table&gt;<\/p>\n<p>&lt;\/form&gt;<\/p>\n<p>&lt;\/body&gt;<\/p>\n<p>&lt;\/html&gt;<\/p>\n<p>&nbsp;<\/p>\n<h3>Modtagelsessiden (<em>modtag.asp<\/em>)<\/h3>\n<p>Modtagelsessiden bliver kaldt, n\u00e5r brugeren v\u00e6lger at afsende sin ordre. Det er modtagelsessiden, der st\u00e5r for at registrere ordren i databasen. Modtagelsessidens opgaver kan opdeles i f\u00f8lgende:<\/p>\n<ul>\n<li>Kontrol af, om kunden er logget ind.\n<ul>\n<li>I bekr\u00e6ftende fald skal kundens registrering i databasen opdateres med eventuelle nye oplysninger fra afsendelsessiden.<\/li>\n<li>Er kunden ikke logget ind, skal kunden oprettes.\n<ul>\n<li>Hvis der allerede eksisterer en kunde med den samme e-mail-adresse, skal kunden bedes om at logge ind.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<li>Registrering af ordren.\n<ul>\n<li>Oprettelse af en ny ordre.<\/li>\n<li>Registrering af de enkelte ordrelinier.<\/li>\n<\/ul>\n<\/li>\n<li>Visning af resultat til brugeren.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Kontrollen af, om brugeren er logget ind, sker ved at teste, om cookien kundeid er sat. Er den det, konkluderes det, at brugeren er logget ind. Hvis kunden er logget ind, bliver oplysningerne opdateret. P\u00e5 denne m\u00e5de registreres eventuelle \u00e6ndringer i brugerens adresse automatisk. Oplysningerne opdateres ukritisk \u2013 det vil sige, at alle oplysningerne opdateres, ogs\u00e5 selvom de ikke er \u00e6ndrede. P\u00e5 denne m\u00e5de bliver man fri for at bruge tid p\u00e5 at sammenligne alle oplysningerne.<\/p>\n<p>N\u00e5r en ny kunde skal oprettes, bliver hans kodeord f\u00f8rst kontrolleret. Kunden skal v\u00e6lge et kodeord og indtaste det to gange \u2013 hvis de to kodeord ikke er ens, f\u00e5r kunden det at vide, og modtagelsessiden afbrydes.<\/p>\n<p>Det kontrolleres ogs\u00e5, om der allerede er registreret en kunde med den indtastede e-mail-adresse. E-mail-adresserne skal v\u00e6re unikke, og det kan derfor ikke tillades, at flere kunder bruger den samme adresse. F\u00f8lgelig bliver brugeren bedt om enten at indtaste en anden e-mail-adresse, eller at logge ind.<\/p>\n<p>N\u00e5r kunden er opdateret eller oprettet, kan ordren registreres. Dette er imidlertid ikke helt trivielt. Som det blev beskrevet tidligere i dette kapitel, er ordrerne opdelt i en ordretabel og en ordrelinietabel. Ordretabellen best\u00e5r af kolonnerne id, kunde og dato, hvor id er et autonummereringsfelt, hvilket vil sige, at databasen selv udfylder feltet. Ordrens id bruges i ordrelinietabellen, hvor album, antal og ordre skal angives.<\/p>\n<p>Problemet er blot, at det som n\u00e6vnt er databasen, der bestemmer denne v\u00e6rdi \u2013 det vil sige, at den ikke kendes i ASP-programmet. V\u00e6rdien kan ikke hentes ved hj\u00e6lp af en SQL-foresp\u00f8rgsel, da netop id&#8217;et er den eneste n\u00f8gle i ordretabellen. Den samme kunde kan sagtens afsende flere ordrer den samme dag, og hvordan kan man s\u00e5 vide, hvilket id der h\u00f8rer til den ordre, man netop har registreret?<\/p>\n<p>Den bedste fremgangsm\u00e5de er tilsyneladende at v\u00e6lge det h\u00f8jeste id, og bruge dette. Denne fremgangsm\u00e5de er desv\u00e6rre ikke helt sikker. Hvis der er flere brugere p\u00e5 web-stedet samtidigt, kan man ikke v\u00e6re sikker p\u00e5, hvilken bruger der har f\u00e5et det h\u00f8jeste ordrenummer. Denne problematik er imidlertid blevet beskrevet tidligere, og her var l\u00f8sningen at bruge Application.Lock. Dette er ogs\u00e5 l\u00f8sningen i dette tilf\u00e6lde. Ved at lave en l\u00e5s p\u00e5 applikationsvariablerne sikres det, at der ikke er andre, der kan l\u00e5se dem. Det vil sige, at to samtidige brugere p\u00e5 web-stedet ikke vil f\u00e5 lov til at oprette en ordre samtidigt. Dermed er det sikkert at antage, at det h\u00f8jeste ordrenummer er det aktuelle.<\/p>\n<p>Herefter er der blot tilbage at registrere de enkelte ordrelinier, som er gemt i applikationsvariablene. Det skal dog kontrolleres, at der ikke bliver tilf\u00f8jet ordrelinier med antallet 0 \u2013 dette angiver som n\u00e6vnt tidligere, at albummet er fjernet fra indk\u00f8bskurven.<\/p>\n<p>Som denne gennemgang har vist, er der tilf\u00e6lde, hvor ordren ikke kan modtages. I disse tilf\u00e6lde skal brugeren naturligvis have besked om det. Denne besked skal gives p\u00e5 en web-side, der selvf\u00f8lgelig skal v\u00e6re designm\u00e6ssigt magen til de \u00f8vrige sider p\u00e5 web-stedet. Hvis der skulle v\u00e6re en side for hver situation, ville der v\u00e6re en del gentagen kode. Derfor indeholder modtagelsessiden en metode, der viser resultatet til brugeren. Denne metode kan h\u00e5ndtere s\u00e5vel fejlsituationer som en succesfuld modtagelse af ordren.<\/p>\n<p>Kildeteksten til modtagelsessiden ser s\u00e5ledes ud:<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;% @language=JavaScript %&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;!&#8211; #include file=&#8221;database.js&#8221; &#8211;&gt;<\/p>\n<p>&lt;!&#8211; #include file=&#8221;string.js&#8221; &#8211;&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>OK = 0;<\/p>\n<p>FORKERT_KODEORD = 1;<\/p>\n<p>KUNDE_EKSISTERER = 2;<\/p>\n<p>&nbsp;<\/p>\n<p>con = createDatabaseConnection();<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/ kontroll\u00e9r f\u00f8rst, om kunden er logget ind<\/p>\n<p>id = -1;<\/p>\n<p>if (Request.Cookies(&#8220;kundeid&#8221;) != &#8220;&#8221;) {<\/p>\n<p>id = opdaterKunde(Request.Cookies(&#8220;kundeid&#8221;));<\/p>\n<p>} else {<\/p>\n<p>id = tilfojKunde();<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/ registrer ordren<\/p>\n<p>Application.Lock();<\/p>\n<p>con.execute(&#8220;INSERT INTO ordre (kunde, dato) VALUES (&#8221; + id + &#8220;, &#8221; + toSqlDate(new Date()) +&#8221;)&#8221;);<\/p>\n<p>res = con.execute(&#8220;SELECT id FROM ordre WHERE kunde=&#8221; + id + &#8221; ORDER BY id DESC&#8221;);<\/p>\n<p>ordrenummer = res.Fields(&#8220;id&#8221;);<\/p>\n<p>Application.Unlock();<\/p>\n<p>&nbsp;<\/p>\n<p>albumantal = Session(&#8220;albumantal&#8221;);<\/p>\n<p>for (i = 0; i &lt; albumantal; i++) {<\/p>\n<p>sql = &#8220;INSERT INTO ordrelinie (album, antal, ordre) VALUES (&#8220;;<\/p>\n<p>sql += Session(&#8220;album&#8221;+i);<\/p>\n<p>sql += &#8220;, &#8220;;<\/p>\n<p>sql += Session(&#8220;antal&#8221;+i);<\/p>\n<p>sql += &#8220;, &#8220;;<\/p>\n<p>sql += ordrenummer;<\/p>\n<p>sql += &#8220;)&#8221;;<\/p>\n<p>con.execute(sql);<\/p>\n<p>}<\/p>\n<p>printResult(OK);<\/p>\n<p>&nbsp;<\/p>\n<p>function opdaterKunde(id) {<\/p>\n<p>sql = &#8220;UPDATE kunde SET &#8220;;<\/p>\n<p>sql += &#8220;Navn='&#8221; + Request.Form(&#8220;Navn&#8221;) + &#8220;&#8216;, &#8221;<\/p>\n<p>sql += &#8220;Adresse='&#8221; + Request.Form(&#8220;Adresse&#8221;) + &#8220;&#8216;, &#8220;;<\/p>\n<p>sql += &#8220;Postnummer=&#8221; + Request.Form(&#8220;Postnummer&#8221;) + &#8221; , &#8220;;<\/p>\n<p>sql += &#8220;Postdistrikt='&#8221; + Request.Form(&#8220;By&#8221;) + &#8220;&#8216;, &#8220;;<\/p>\n<p>sql += &#8220;Email='&#8221; + Request.Form(&#8220;Email&#8221;) + &#8220;&#8216;&#8221;;<\/p>\n<p>sql += &#8221; WHERE id=&#8221; + id;<\/p>\n<p>con.execute(sql);<\/p>\n<p>return id;<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>function tilfojKunde(id) {<\/p>\n<p>\/\/ kontroller, at de to kodeord er ens<\/p>\n<p>if (!strcmp(Request.Form(&#8220;kodeord1&#8221;),Request.Form(&#8220;kodeord2&#8221;))) {<\/p>\n<p>printResult(FORKERT_KODEORD);<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/ kontroll\u00e9r, at der ikke allerede eksisterer en kunde med den email-adresse<\/p>\n<p>res = con.execute(&#8220;SELECT id FROM kunde WHERE email='&#8221; + Request.Form(&#8220;Email&#8221;) + &#8220;&#8216;&#8221;);<\/p>\n<p>if (!res.EOF) { \/\/ kunden eksisterer<\/p>\n<p>printResult(KUNDE_EKSISTERER);<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>sql = &#8220;INSERT INTO kunde (Navn, Adresse, Postnummer, By, Email, Kodeord) VALUES (&#8220;;<\/p>\n<p>sql += &#8220;&#8216;&#8221; + Request.Form(&#8220;Navn&#8221;) + &#8220;&#8216;, &#8220;;<\/p>\n<p>sql += &#8220;&#8216;&#8221; + Request.Form(&#8220;Adresse&#8221;) + &#8220;, &#8220;;<\/p>\n<p>sql += Request.Form(&#8220;Postnummer&#8221;) + &#8220;, &#8220;;<\/p>\n<p>sql += &#8220;&#8216;&#8221; + Request.Form(&#8220;By&#8221;) + &#8220;&#8216;, &#8220;;<\/p>\n<p>sql += &#8220;&#8216;&#8221; + Request.Form(&#8220;Email&#8221;) + &#8220;&#8216;, &#8220;;<\/p>\n<p>sql += &#8220;&#8216;&#8221; + Request.Form(&#8220;Kodeord&#8221;) + &#8220;&#8216;)&#8221;;<\/p>\n<p>&nbsp;<\/p>\n<p>con.execute(sql);<\/p>\n<p>res = con.execute(&#8220;SELECT id FROM kunde WHERE Email='&#8221; + Request.Form(&#8220;Email&#8221;) + &#8220;&#8216;&#8221;);<\/p>\n<p>return res.Fields(&#8220;id&#8221;);<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>function printResult(status) {<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;html&gt;<\/p>\n<p>&lt;head&gt;<\/p>\n<p>&lt;title&gt;Compact Discount [Indk\u00f8bskurv]&lt;\/title&gt;<\/p>\n<p>&lt;\/head&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;!&#8211; #include file=&#8221;header.html&#8221; &#8211;&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;td&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>if (status == OK) {<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;h1&gt;Ordrebekr\u00e6ftelse&lt;\/h1&gt;<\/p>\n<p>Din ordre er nu blevet afsendt. Den har f\u00e5et ordrenummer &lt;%=ordrenummer%&gt;. Opgiv venligst dette nummer, hvis du har sp\u00f8rgsm\u00e5l ang\u00e5ende din ordre.&lt;p&gt;<\/p>\n<p>Eventuelle sp\u00f8rgsm\u00e5l og kommentarer kan sendes til &lt;a href=mailto:ordrer@compactdiscount.dk&gt;ordrer@compactdiscount.dk&lt;\/a&gt;.<\/p>\n<p>&lt;p&gt;<\/p>\n<p>Tak fordi du handlede hos Compact Discount.<\/p>\n<p>&lt;p&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>} else if (status == FORKERT_KODEORD || status == KUNDE_EKSISTERER) {<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;h1&gt;Fejl&lt;\/h1&gt;<\/p>\n<p>Der opstod en fejl i forbindelse med afsendelse af din ordre. Din ordre er ikke afsendt!<\/p>\n<p>&lt;p&gt;<\/p>\n<p>&lt;%<\/p>\n<p>if (status == FORKERT_KODEORD) {<\/p>\n<p>%&gt;<\/p>\n<p>De to indtastede kodeord var ikke ens. Hvis du vil registreres som kunde og blive genkendt, n\u00e5r du vender tilbage til Compact Discount, skal du v\u00e6lge et kodeord og gentage dette p\u00e5 afsendelsessiden. Hvis du ikke vil registreres, skal du lade begge felter v\u00e6re blanke.<\/p>\n<p>&lt;p&gt;<\/p>\n<p>Klik &lt;a href=afsend.asp&gt;her&lt;\/a&gt; for at komme tilbage til afsendelssiden.<\/p>\n<p>&lt;%<\/p>\n<p>} else {<\/p>\n<p>%&gt;<\/p>\n<p>Der er allerede registreret en kunde med den angivne email-adresse (&lt;%=Request.Form(&#8220;Email&#8221;)%&gt;).<\/p>\n<p>Hvis du har indtastet email-adressen korrekt, skal du &lt;a href=login.asp&gt;logge ind&lt;\/a&gt; ved at angive din email-adresse og dit kodeord. Hvis du ikke kan huske dit kodeord, kan du f\u00e5 det tilsendt i en email fra &lt;a href=login.asp&gt;log ind-siden&lt;\/a&gt;.<\/p>\n<p>&lt;p&gt;<\/p>\n<p>Hvis du vil indtaste en anden email-adresse, kan du g\u00f8re det p\u00e5 &lt;a href=afsend.asp&gt;afsendelsessiden&lt;\/a&gt;.<\/p>\n<p>&lt;%<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>}<\/p>\n<p>%&gt;<\/p>\n<p>&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;\/table&gt;<\/p>\n<p>&lt;\/body&gt;<\/p>\n<p>&lt;\/html&gt;<\/p>\n<p>&lt;%<\/p>\n<p>Response.End();<\/p>\n<p>}<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<h3>Log ind-siden (<em>login.asp<\/em>)<\/h3>\n<p>Log ind-siden skal give brugeren mulighed for at tilkendegive, at vedkommende allerede er en registreret kunde, selvom der ikke er en cookie p\u00e5 maskinen. Dette kan v\u00e6re tilf\u00e6ldet, hvis brugeren bruger en anden maskine end vanligt, eller hvis brugeren har slettet sine cookies.<\/p>\n<p>Hvis brugeren har glemt sit kodeord, kan han f\u00e5 dette tilsendt ved at angive sin email-adresse og markere feltet Send kodeord.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1008.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-medium wp-image-524\" title=\"1008\" src=\"http:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1008-300x182.png\" alt=\"\" width=\"300\" height=\"182\" srcset=\"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1008-300x182.png 300w, https:\/\/www.kristiansborg.dk\/bibliotek\/wp-content\/uploads\/2011\/11\/1008.png 849w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><em>Figur 10.8.<\/em> Log ind.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>N\u00e5r indholdet af formularen p\u00e5 log ind-siden indsendes, bliver siden checklogin.asp aktiveret. Denne side behandler log-in-proceduren.<\/p>\n<p>Kildeteksten til login.asp ser s\u00e5ledes ud:<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;% @Language=JavaScript %&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;!&#8211; #include file=&#8221;database.js&#8221; &#8211;&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>con = createDatabaseConnection();<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;html&gt;<\/p>\n<p>&lt;head&gt;<\/p>\n<p>&lt;title&gt;Compact Discount [Log ind]&lt;\/title&gt;<\/p>\n<p>&lt;\/head&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;!&#8211; #include file=&#8221;header.html&#8221; &#8211;&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;td&gt;<\/p>\n<p>&lt;h1&gt;Log ind&lt;\/h1&gt;<\/p>\n<p>Hvis du er en registreret kunde, kan du logge ind her p\u00e5 siden ved at indtaste din e-mail-adresse og dit kodeord. Du bliver automatisk registreret som kunde, f\u00f8rste gang du bestiller hos os.<\/p>\n<p>&lt;p&gt;<\/p>\n<p>&lt;form action=checklogin.asp method=post&gt;<\/p>\n<p>&lt;table&gt;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td&gt;E-mail-adresse&lt;\/td&gt;<\/p>\n<p>&lt;td&gt;&lt;input type=text name=email&gt;&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td&gt;Kodeord&lt;\/td&gt;<\/p>\n<p>&lt;td&gt;&lt;input type=password name=kodeord&gt;&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;tr&gt;<\/p>\n<p>&lt;td&gt;&amp;nbsp;&lt;\/td&gt;<\/p>\n<p>&lt;td&gt;&lt;input type=submit value=&#8221;Log ind&#8221;&gt;&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;\/table&gt;<\/p>\n<p>&lt;\/form&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;\/td&gt;<\/p>\n<p>&lt;\/table&gt;<\/p>\n<p>&lt;\/body&gt;<\/p>\n<p>&lt;\/html&gt;<\/p>\n<p>&nbsp;<\/p>\n<h3>Oversigten over mest solgte album (<em>mestsolgt.asp<\/em>)<\/h3>\n<p>En god inspiration til de, der ikke ved, hvad de skal k\u00f8be, er en oversigt over de mest solgte album. Oversigten kan ogs\u00e5 v\u00e6re en kilde til at f\u00e5 flere bes\u00f8gende p\u00e5 web-stedet, da nogle gerne vil f\u00f8lge med i, hvilke album der s\u00e6lges for tiden.<\/p>\n<p>Oversigtssiden er forholdsvis let at lave \u2013 den baseres p\u00e5 en SQL-foresp\u00f8rgsel, der udv\u00e6lger de mest solgte album i rigtig r\u00e6kkef\u00f8lge \u2013 herefter beh\u00f8ver albummene blot at blive pr\u00e6senteret for brugeren.<\/p>\n<p>Kildeteksten til siden mestsolgt.asp ser s\u00e5ledes ud:<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;% @Language=JavaScript %&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;!&#8211; #include file=&#8221;database.js&#8221; &#8211;&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>con = createDatabaseConnection();<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;html&gt;<\/p>\n<p>&lt;head&gt;<\/p>\n<p>&lt;title&gt;Compact Discount [Mest solgte album]&lt;\/title&gt;<\/p>\n<p>&lt;\/head&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;!&#8211; #include file=&#8221;header.html&#8221; &#8211;&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;td&gt;<\/p>\n<p>&lt;h1&gt;Mest solgte album&lt;\/h1&gt;<\/p>\n<p>P\u00e5 denne side kan du se en oversigt over de mest solgte album p\u00e5 Compact Discount. Listen er altid aktuel og opdateres, hver gang der placeres en ordre!<\/p>\n<p>&lt;p&gt;<\/p>\n<p>&lt;ol&gt;<\/p>\n<p>&lt;%<\/p>\n<p>res = con.Execute(&#8220;SELECT Sum(Antal) AS TotalAntal, Album FROM Ordrelinie GROUP BY Album ORDER BY Sum(Antal) DESC&#8221;);<\/p>\n<p>antal = 0;<\/p>\n<p>while (!res.EOF) {<\/p>\n<p>album = res.Fields(&#8220;Album&#8221;);<\/p>\n<p>res2 = con.Execute(&#8220;SELECT Titel FROM album WHERE id = &#8221; + album);<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;li&gt;&lt;a href=info.asp?album=&lt;%=album%&gt;&gt;&lt;%=res2.Fields(&#8220;Titel&#8221;)%&gt;&lt;\/a&gt;&lt;\/li&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>res.MoveNext();<\/p>\n<p>antal++;<\/p>\n<p>if (antal &gt; 10) {<\/p>\n<p>break;<\/p>\n<p>}<\/p>\n<p>}<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;\/ol&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;\/table&gt;<\/p>\n<p>&nbsp;<\/p>\n<h3>S\u00f8gesiden (<em>search.asp<\/em>)<\/h3>\n<p>S\u00f8gesiden kaldes, n\u00e5r brugeren foretager en s\u00f8gning. Det kan ske p\u00e5 tre forskellige m\u00e5der. Friteksts\u00f8gning foretages, n\u00e5r brugeren indtaster et ord i s\u00f8gefeltet p\u00e5 forsiden. Denne type s\u00f8gning vil s\u00f8ge efter det p\u00e5g\u00e6ldende ord i titler p\u00e5 s\u00e5vel numre som album samt kunstnernavne.<\/p>\n<p>S\u00f8gesiden kaldes ogs\u00e5, n\u00e5r brugeren klikker p\u00e5 en kategori fra kategorioversigten \u2013 dette medf\u00f8rer en s\u00f8gning p\u00e5 alle album i den p\u00e5g\u00e6ldende kategori.<\/p>\n<p>Den sidste s\u00f8gemulighed er at klikke p\u00e5 et nummers kunstner p\u00e5 albuminformationssiden. Dette medf\u00f8rer en s\u00f8gning p\u00e5 alle de album, der indeholder numre med den p\u00e5g\u00e6ldende kunstner.<\/p>\n<p>Alle disse former for s\u00f8gning h\u00e5ndteres af den samme side for at give brugeren et ensartet s\u00f8geresultat uafh\u00e6ngigt af, hvilken s\u00f8gning der foretages. S\u00f8gesiden er opbygget, s\u00e5 den adskiller kode, der er generel for alle s\u00f8geformer, fra kode der er specifik for en enkelt s\u00f8gemetode.<\/p>\n<p>De generelle elementer er eksempelvis udseendet af siden. B\u00e5de opbygningen af siden og den m\u00e5de, resultatet af s\u00f8gningen pr\u00e6senteres for brugeren p\u00e5, er generel, og det er derfor den samme ASP-kode, der styrer disse elementer uafh\u00e6ngigt af s\u00f8geform. Ligegyldigt hvilken s\u00f8gning, der foretages, skal brugeren pr\u00e6senteres for navnene p\u00e5 de album, der opfylder s\u00f8gekriterierne, samt albummenes kunstnere. Disse oplysninger skal naturligvis v\u00e6re henvisninger til yderligere oplysninger om de n\u00e6vnte album.<\/p>\n<p>Til geng\u00e6ld er de SQL-foresp\u00f8rgsler, der skal foretages, meget specifikke, og der er derfor behov for tre forskellige programstumper til at definere disse.<\/p>\n<p>Den f\u00f8rste SQL-foresp\u00f8rgsel skal h\u00e5ndtere s\u00f8gning p\u00e5 kunstnere \u2013 dette sker som n\u00e6vnt, hvis man klikker p\u00e5 kunstnerens navn i albuminformationssiden. Parameteren til kunstners\u00f8gningen er kunstner, og denne parameter angiver det unikke id, der identificerer kunstneren i databasen. Kunstners\u00f8gning skal foretages b\u00e5de p\u00e5 album og numre \u2013 resultatet skal v\u00e6re de album, der har den p\u00e5g\u00e6ldende kunstner som hovedkunstner, og de album, kunstneren har numre p\u00e5. For at kunne foretage denne s\u00f8gning, er det n\u00f8dvendigt b\u00e5de at s\u00f8ge i album- og nummertabellerne. Derudover skal kunstnertabellen bruges for at kunne pr\u00e6sentere brugeren for kunstnerens navn. Da s\u00f8gningen s\u00e5ledes skal kombinere flere forskellige tabeller, er der oprettet en foresp\u00f8rgsel (et <em>view<\/em>) i databasen. Denne foresp\u00f8rgsel kaldes kunstnersearch og er defineret s\u00e5ledes:<\/p>\n<p>&nbsp;<\/p>\n<p>SELECT Album.Titel, Album.Kunstner, Nummer.Kunstner, Album.ID, Kunstner.Navn<\/p>\n<p>FROM Kunstner INNER JOIN (Album INNER JOIN Nummer ON Album.ID = Nummer.Album) ON (Album.ID = Kunstner.ID) AND (Kunstner.ID = Nummer.Kunstner)<\/p>\n<p>GROUP BY Album.Titel, Album.Kunstner, Nummer.Kunstner, Album.ID, Kunstner.Navn;<\/p>\n<p>&nbsp;<\/p>\n<p>Den n\u00e6ste SQL-foresp\u00f8rgsel skal kunne s\u00f8ge p\u00e5 kategorier. Denne s\u00f8gning skal p\u00e5 baggrund af et kategori-id, der gives med som parameter, kunne finde alle album i en bestemt kategori. Dette betyder, at der skal s\u00f8ges i album- og kunstnertabellerne. For at g\u00f8re denne s\u00f8gning lettere er der oprettet en foresp\u00f8rgsel i databasen \u2013 denne foresp\u00f8rgsel har navnet kategorisearch og er defineret ved f\u00f8lgende SQL-foresp\u00f8rgsel:<\/p>\n<p>&nbsp;<\/p>\n<p>SELECT Album.ID, Album.Titel, Kunstner.Navn, Album.Kategori<\/p>\n<p>FROM Kunstner INNER JOIN Album ON Kunstner.ID = Album.Kunstner<\/p>\n<p>GROUP BY Album.ID, Album.Titel, Kunstner.Navn, Album.Kategori;<\/p>\n<p>&nbsp;<\/p>\n<p>Den sidste SQL-foresp\u00f8rgsel skal foretage friteksts\u00f8gningen. Friteksts\u00f8gningen skal foretages i album-, kunstner- og nummertabellerne, og derfor er der blevet oprettet en foresp\u00f8rgsel, der g\u00f8r denne s\u00f8gning lettere. Denne foresp\u00f8rgsel kaldes tekstsearch og kan beskrives ved denne SQL-foresp\u00f8rgsel:<\/p>\n<p>&nbsp;<\/p>\n<p>SELECT Album.ID, Album.Titel, Kunstner.Navn, Nummer.Titel<\/p>\n<p>FROM Kunstner INNER JOIN (Album INNER JOIN Nummer ON Album.ID = Nummer.Album) ON (Kunstner.ID = Nummer.Kunstner) AND (Kunstner.ID = Album.Kunstner)<\/p>\n<p>GROUP BY Album.ID, Album.Titel, Kunstner.Navn, Nummer.Titel;<\/p>\n<p>&nbsp;<\/p>\n<p>Efter udf\u00f8rslen af den korrekte SQL-foresp\u00f8rgsel er der kun tilbage at pr\u00e6sentere s\u00f8geresultatet. Kildeteksten til hele search.asp ser s\u00e5ledes ud:<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;% @Language=JavaScript %&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;!&#8211; #include file=&#8221;database.js&#8221; &#8211;&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>con = createDatabaseConnection();<\/p>\n<p>garbage = Request.QueryString(&#8220;xxx&#8221;);<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;html&gt;<\/p>\n<p>&lt;head&gt;<\/p>\n<p>&lt;title&gt;Compact Discount [S\u00f8geresultat]&lt;\/title&gt;<\/p>\n<p>&lt;\/head&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;!&#8211; #include file=&#8221;header.html&#8221; &#8211;&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;td&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>&nbsp;<\/p>\n<p>sql = &#8220;&#8221;;<\/p>\n<p>if (Request.QueryString(&#8220;kunstner&#8221;) != garbage) {<\/p>\n<p>\/\/ S\u00f8gning p\u00e5 kunstner fra en anden side.<\/p>\n<p>\/\/ Kunstnerens id er angivet i kunstner.<\/p>\n<p>\/\/ Dette er det eneste s\u00f8gekriterium.<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/ Find de album, kunstneren har numre p\u00e5.<\/p>\n<p>&nbsp;<\/p>\n<p>kunstnerid = Request.QueryString(&#8220;kunstner&#8221;);<\/p>\n<p>&nbsp;<\/p>\n<p>sql = &#8220;SELECT * FROM kunstnersearch WHERE nummer.kunstner = &#8220;;<\/p>\n<p>sql += kunstnerid;<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>if (Request.QueryString(&#8220;kategori&#8221;) != garbage) {<\/p>\n<p>\/\/ S\u00f8gning p\u00e5 kategori. Kategori angiver ikke kategoriens<\/p>\n<p>\/\/ navn, men dens id. Dette er det eneste s\u00f8gekriterium.<\/p>\n<p>&nbsp;<\/p>\n<p>\/\/ Find alle album i denne kategori.<\/p>\n<p>&nbsp;<\/p>\n<p>kategori = Request.QueryString(&#8220;kategori&#8221;);<\/p>\n<p>&nbsp;<\/p>\n<p>sql = &#8220;SELECT * FROM kategorisearch WHERE kategori= &#8221; + kategori;<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>if (Request.QueryString(&#8220;tekst&#8221;) != garbage) {<\/p>\n<p>\/\/ s\u00f8gning p\u00e5 fritekst (fra hovedsiden).<\/p>\n<p>\/\/ s\u00f8g p\u00e5 kunstner, nummer- og albumtitel<\/p>\n<p>&nbsp;<\/p>\n<p>tekst = Request.QueryString(&#8220;tekst&#8221;);<\/p>\n<p>&nbsp;<\/p>\n<p>sql = &#8220;SELECT DISTINCT album.titel, album.id, kunstner.navn FROM tekstsearch WHERE nummer.titel LIKE &#8216;%&#8221; + tekst + &#8220;%&#8217; OR kunstner.navn LIKE &#8216;%&#8221; + tekst + &#8220;%&#8217; OR album.titel LIKE &#8216;%&#8221; + tekst + &#8220;%'&#8221;;<\/p>\n<p>}<\/p>\n<p>&nbsp;<\/p>\n<p>res = con.Execute(sql);<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;h1&gt;S\u00f8geresultat&lt;\/h1&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>if (res.EOF) {<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>Der er ingen album, der opfylder s\u00f8gekriterierne.<\/p>\n<p>&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;\/table&gt;<\/p>\n<p>&lt;\/body&gt;<\/p>\n<p>&lt;\/html&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>Response.End();<\/p>\n<p>}<\/p>\n<p>%&gt;<\/p>\n<p>Der er fundet f\u00f8lgende album, der opfylder s\u00f8gekriterierne:<\/p>\n<p>&lt;p&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>while (!res.EOF) {<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;a href=info.asp?album=&lt;%=res.Fields(&#8220;id&#8221;)%&gt;&gt;&lt;%=res.Fields(&#8220;Navn&#8221;)%&gt;: &lt;%=res.Fields(&#8220;Titel&#8221;)%&gt;&lt;\/a&gt;&lt;br&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;%<\/p>\n<p>res.Move(1);<\/p>\n<p>}<\/p>\n<p>%&gt;<\/p>\n<p>&nbsp;<\/p>\n<p>&lt;\/td&gt;<\/p>\n<p>&lt;\/tr&gt;<\/p>\n<p>&lt;\/table&gt;<\/p>\n<p>&lt;\/body&gt;<\/p>\n<p>&lt;\/html&gt;<\/p>\n<p>&nbsp;<\/p>\n<h2>Afrunding<\/h2>\n<p>I dette kapitel er der blevet givet et st\u00f8rre eksempel p\u00e5, hvordan man kan benytte ASP til at lave et web-sted med e-handel. Selvom der er en lang r\u00e6kke aspekter af komplet udvikling af web-steder, der ikke er medtaget i dette eksempel, er der benyttet en lang r\u00e6kke af de teknikker, som er blevet beskrevet tidligere i denne bog.<\/p>\n<div style=\"border: 1px solid red; color: red;\">\n<p><strong>Du l\u00e6ser en gammel bog<\/strong><\/p>\n<p>Den bog, du l\u00e6ser her, er fra 1999, og mange ting kan have \u00e6ndret sig siden da.<\/p>\n<p>Vi h\u00e5ber, at du stadig kan finde relevant information i den.<\/p>\n<p>Hvis du vil l\u00e6se aktuelle oplysninger om den aktuelle version af ASP.NET, anbefaler vi<\/p>\n<p>bogen <a onclick=\"javascript:pageTracker._trackPageview('\/outbound\/article\/http:\/\/clk.tradedoubler.com\/click?p(197229)a(2029446)g(19172914)url(http:\/\/www.adlibris.com\/dk\/product.aspx?isbn=0735643385)');\" href=\"http:\/\/clk.tradedoubler.com\/click?p(197229)a(2029446)g(19172914)url(http:\/\/www.adlibris.com\/dk\/product.aspx?isbn=0735643385)\" target=\"_blank\">Programming ASP.NET 4.0<\/a><img decoding=\"async\" src=\"http:\/\/impdk.tradedoubler.com\/imp?type(inv)g(19172914)a(2029446)\" alt=\"\" \/><\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>De foreg\u00e5ende kapitler har beskrevet al den teori, der ligger bag udvikling af en ASP-applikation. I dette kapitel bliver det vist, hvordan man kan anvende ASP i praksis. Kapitlet er bygget op omkring et eksempel p\u00e5 en e-handelsbutik, der s\u00e6lger cd&#8217;er. For at kunne referere til butikken har den f\u00e5et navnet Compact Discount \u2013 eventuelle [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":452,"menu_order":70,"comment_status":"closed","ping_status":"open","template":"","meta":{"_monsterinsights_skip_tracking":false,"footnotes":""},"class_list":["post-521","page","type-page","status-publish","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"I dette kapitel er der blevet givet et st\u00f8rre eksempel p\u00e5, hvordan man kan benytte ASP til at lave et web-sted med e-handel. Selvom der er en lang r\u00e6kke aspekter af komplet udvikling af web-steder, der ikke er medtaget i dette eksempel, er der benyttet en lang r\u00e6kke af de teknikker, som er blevet beskrevet tidligere i denne bog.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"keywords\" content=\"asp,eksempel,bog,e-handdel,butik,webbutik\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/kapitel-7-prototype-pa-en-asp-applikation\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Biblioteket | Samling af artikler og b\u00f8ger\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Prototype p\u00e5 en ASP-applikation | Active Server Pages | Biblioteket\" \/>\n\t\t<meta property=\"og:description\" content=\"I dette kapitel er der blevet givet et st\u00f8rre eksempel p\u00e5, hvordan man kan benytte ASP til at lave et web-sted med e-handel. Selvom der er en lang r\u00e6kke aspekter af komplet udvikling af web-steder, der ikke er medtaget i dette eksempel, er der benyttet en lang r\u00e6kke af de teknikker, som er blevet beskrevet tidligere i denne bog.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/kapitel-7-prototype-pa-en-asp-applikation\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2011-11-18T06:35:45+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2011-11-18T07:03:02+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Prototype p\u00e5 en ASP-applikation | Active Server Pages | Biblioteket\" \/>\n\t\t<meta name=\"twitter:description\" content=\"I dette kapitel er der blevet givet et st\u00f8rre eksempel p\u00e5, hvordan man kan benytte ASP til at lave et web-sted med e-handel. Selvom der er en lang r\u00e6kke aspekter af komplet udvikling af web-steder, der ikke er medtaget i dette eksempel, er der benyttet en lang r\u00e6kke af de teknikker, som er blevet beskrevet tidligere i denne bog.\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/active-server-pages\\\/kapitel-7-prototype-pa-en-asp-applikation\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/#listItem\",\"name\":\"B\\u00f8ger\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/#listItem\",\"position\":2,\"name\":\"B\\u00f8ger\",\"item\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/active-server-pages\\\/#listItem\",\"name\":\"Active Server Pages\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/active-server-pages\\\/#listItem\",\"position\":3,\"name\":\"Active Server Pages\",\"item\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/active-server-pages\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/active-server-pages\\\/kapitel-7-prototype-pa-en-asp-applikation\\\/#listItem\",\"name\":\"Kapitel 7 Prototype p\\u00e5 en ASP-applikation\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/#listItem\",\"name\":\"B\\u00f8ger\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/active-server-pages\\\/kapitel-7-prototype-pa-en-asp-applikation\\\/#listItem\",\"position\":4,\"name\":\"Kapitel 7 Prototype p\\u00e5 en ASP-applikation\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/active-server-pages\\\/#listItem\",\"name\":\"Active Server Pages\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/#organization\",\"name\":\"Biblioteket\",\"description\":\"Samling af artikler og b\\u00f8ger\",\"url\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/active-server-pages\\\/kapitel-7-prototype-pa-en-asp-applikation\\\/#webpage\",\"url\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/active-server-pages\\\/kapitel-7-prototype-pa-en-asp-applikation\\\/\",\"name\":\"Prototype p\\u00e5 en ASP-applikation | Active Server Pages | Biblioteket\",\"description\":\"I dette kapitel er der blevet givet et st\\u00f8rre eksempel p\\u00e5, hvordan man kan benytte ASP til at lave et web-sted med e-handel. Selvom der er en lang r\\u00e6kke aspekter af komplet udvikling af web-steder, der ikke er medtaget i dette eksempel, er der benyttet en lang r\\u00e6kke af de teknikker, som er blevet beskrevet tidligere i denne bog.\",\"inLanguage\":\"da-DK\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/b%c3%b8ger\\\/active-server-pages\\\/kapitel-7-prototype-pa-en-asp-applikation\\\/#breadcrumblist\"},\"datePublished\":\"2011-11-18T08:35:45+02:00\",\"dateModified\":\"2011-11-18T09:03:02+02:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/#website\",\"url\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/\",\"name\":\"Biblioteket\",\"description\":\"Samling af artikler og b\\u00f8ger\",\"inLanguage\":\"da-DK\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.kristiansborg.dk\\\/bibliotek\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Prototype p\u00e5 en ASP-applikation | Active Server Pages | Biblioteket","description":"I dette kapitel er der blevet givet et st\u00f8rre eksempel p\u00e5, hvordan man kan benytte ASP til at lave et web-sted med e-handel. Selvom der er en lang r\u00e6kke aspekter af komplet udvikling af web-steder, der ikke er medtaget i dette eksempel, er der benyttet en lang r\u00e6kke af de teknikker, som er blevet beskrevet tidligere i denne bog.","canonical_url":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/kapitel-7-prototype-pa-en-asp-applikation\/","robots":"max-image-preview:large","keywords":"asp,eksempel,bog,e-handdel,butik,webbutik","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BreadcrumbList","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/kapitel-7-prototype-pa-en-asp-applikation\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek#listItem","position":1,"name":"Home","item":"https:\/\/www.kristiansborg.dk\/bibliotek","nextItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/#listItem","name":"B\u00f8ger"}},{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/#listItem","position":2,"name":"B\u00f8ger","item":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/#listItem","name":"Active Server Pages"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/#listItem","position":3,"name":"Active Server Pages","item":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/kapitel-7-prototype-pa-en-asp-applikation\/#listItem","name":"Kapitel 7 Prototype p\u00e5 en ASP-applikation"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/#listItem","name":"B\u00f8ger"}},{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/kapitel-7-prototype-pa-en-asp-applikation\/#listItem","position":4,"name":"Kapitel 7 Prototype p\u00e5 en ASP-applikation","previousItem":{"@type":"ListItem","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/#listItem","name":"Active Server Pages"}}]},{"@type":"Organization","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/#organization","name":"Biblioteket","description":"Samling af artikler og b\u00f8ger","url":"https:\/\/www.kristiansborg.dk\/bibliotek\/"},{"@type":"WebPage","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/kapitel-7-prototype-pa-en-asp-applikation\/#webpage","url":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/kapitel-7-prototype-pa-en-asp-applikation\/","name":"Prototype p\u00e5 en ASP-applikation | Active Server Pages | Biblioteket","description":"I dette kapitel er der blevet givet et st\u00f8rre eksempel p\u00e5, hvordan man kan benytte ASP til at lave et web-sted med e-handel. Selvom der er en lang r\u00e6kke aspekter af komplet udvikling af web-steder, der ikke er medtaget i dette eksempel, er der benyttet en lang r\u00e6kke af de teknikker, som er blevet beskrevet tidligere i denne bog.","inLanguage":"da-DK","isPartOf":{"@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/#website"},"breadcrumb":{"@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/kapitel-7-prototype-pa-en-asp-applikation\/#breadcrumblist"},"datePublished":"2011-11-18T08:35:45+02:00","dateModified":"2011-11-18T09:03:02+02:00"},{"@type":"WebSite","@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/#website","url":"https:\/\/www.kristiansborg.dk\/bibliotek\/","name":"Biblioteket","description":"Samling af artikler og b\u00f8ger","inLanguage":"da-DK","publisher":{"@id":"https:\/\/www.kristiansborg.dk\/bibliotek\/#organization"}}]},"og:locale":"da_DK","og:site_name":"Biblioteket | Samling af artikler og b\u00f8ger","og:type":"article","og:title":"Prototype p\u00e5 en ASP-applikation | Active Server Pages | Biblioteket","og:description":"I dette kapitel er der blevet givet et st\u00f8rre eksempel p\u00e5, hvordan man kan benytte ASP til at lave et web-sted med e-handel. Selvom der er en lang r\u00e6kke aspekter af komplet udvikling af web-steder, der ikke er medtaget i dette eksempel, er der benyttet en lang r\u00e6kke af de teknikker, som er blevet beskrevet tidligere i denne bog.","og:url":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/kapitel-7-prototype-pa-en-asp-applikation\/","article:published_time":"2011-11-18T06:35:45+00:00","article:modified_time":"2011-11-18T07:03:02+00:00","twitter:card":"summary","twitter:title":"Prototype p\u00e5 en ASP-applikation | Active Server Pages | Biblioteket","twitter:description":"I dette kapitel er der blevet givet et st\u00f8rre eksempel p\u00e5, hvordan man kan benytte ASP til at lave et web-sted med e-handel. Selvom der er en lang r\u00e6kke aspekter af komplet udvikling af web-steder, der ikke er medtaget i dette eksempel, er der benyttet en lang r\u00e6kke af de teknikker, som er blevet beskrevet tidligere i denne bog."},"aioseo_meta_data":{"post_id":"521","title":"Prototype p\u00e5 en ASP-applikation | Active Server Pages | #site_title","description":"I dette kapitel er der blevet givet et st\u00f8rre eksempel p\u00e5, hvordan man kan benytte ASP til at lave et web-sted med e-handel. Selvom der er en lang r\u00e6kke aspekter af komplet udvikling af web-steder, der ikke er medtaget i dette eksempel, er der benyttet en lang r\u00e6kke af de teknikker, som er blevet beskrevet tidligere i denne bog.","keywords":[{"label":"ASP","value":"ASP"},{"label":"eksempel","value":"eksempel"},{"label":"bog","value":"bog"},{"label":"e-handdel","value":"e-handdel"},{"label":"butik","value":"butik"},{"label":"webbutik","value":"webbutik"}],"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[],"defaultGraph":"","defaultPostTypeGraph":""},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"location":null,"local_seo":null,"breadcrumb_settings":null,"limit_modified_date":false,"ai":null,"created":"2020-12-21 06:59:15","updated":"2025-06-04 02:19:25","seo_analyzer_scan_date":null,"focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.kristiansborg.dk\/bibliotek\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/\" title=\"B\u00f8ger\">B\u00f8ger<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/\" title=\"Active Server Pages\">Active Server Pages<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tKapitel 7 Prototype p\u00e5 en ASP-applikation\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.kristiansborg.dk\/bibliotek"},{"label":"B\u00f8ger","link":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/"},{"label":"Active Server Pages","link":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/"},{"label":"Kapitel 7 Prototype p\u00e5 en ASP-applikation","link":"https:\/\/www.kristiansborg.dk\/bibliotek\/b%c3%b8ger\/active-server-pages\/kapitel-7-prototype-pa-en-asp-applikation\/"}],"_links":{"self":[{"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/pages\/521","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/comments?post=521"}],"version-history":[{"count":8,"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/pages\/521\/revisions"}],"predecessor-version":[{"id":523,"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/pages\/521\/revisions\/523"}],"up":[{"embeddable":true,"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/pages\/452"}],"wp:attachment":[{"href":"https:\/\/www.kristiansborg.dk\/bibliotek\/wp-json\/wp\/v2\/media?parent=521"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}