A.E.Veltstra
13 December 2000
Geheel herzien 12 juli 2012
Stel je voor dat je een database hebt gebouwd. Daarin heb je een tabel opgenomen met artikelen. Jouw webpagina moet die artikelen tonen. Dan heb je de keus:
- toon je alle artikelen uit de tabel bij elkaar in 1 pagina,
- of wil je een beperkt aantal per pagina,
- of wil je een opsommig van artikelen, met elk artikel op een aparte pagina?
Dit zijn ontwerpvragen die je beantwoord moet hebben voordat je de pagina bouwt. Dit artikel behandelt alleen de derde methode. We maken een programma dat een index van artikelen toont. De bezoeker maakt een keuze, waarna alleen dat artikel verschijnt.
Dit artikel gaat ervan uit dat je een ASP webserver hebt, of weet hoe de webserver ge-installeerd moet worden. Meer informatie kun je vinden bij www.4guysfromrolla.com.
Opzet van de tabel
Deze tabeldefinitie is gebaseerd op een tabel in MS Access 2000. Dat is niet de beste keus voor een webapplicatie, maar het werkt wel.
(De veldnaam bevat alleen tekst; geen voorlooptekens die door de html-lijstopmaak zijn toegevoegd, en geen dubbele punt.)
Voor de database geldt, dat alle tekst- en memovelden mogen leeg zijn. Geen enkel veld is verplicht. Als je een webpagina bouwt waar gegevens ingevoerd mogen worden, zul je op die pagina moeten controleren of de gegevens ingevoerd worden.
De webpagina "artikelen.asp"
Zoals je ziet, is het html-gedeelte redelijk simpel. Dit houdt in, dat de ASP-code ingewikkeld gaat worden.
De ASP-code
De code moet drie dingen doen:
Het ophalen van de gegevens wordt gesplitst: normaalgesproken wordt er alleen een artikelindex opgehaald. Ik hergebruik de ophaalfunctie: als er uit de index een artikel is gekozen, wordt dat artikel opgehaald. Deze opzet maakt de code iets moeilijker, maar bespaart een extra webpagina.
Enkele opmerkingen over het ASP-codeblok.
Verbinding maken met de database
Ophalen van de gegevens
De opgehaalde gegevens in de webpagina plaatsen
Omdat we in een codeblok werken, gebruiken we de opdracht Response.Write() om gegevens in html op te zetten. Dat kan best lastig zijn i.v.m. aanhalingstekens.
Nu ben je in staat om gegevens op te halen uit een database, en deze te presenteren in een webpagina. Vragen? Neem contact op!
Opzet van de tabel
Deze tabeldefinitie is gebaseerd op een tabel in MS Access 2000. Dat is niet de beste keus voor een webapplicatie, maar het werkt wel.
(De veldnaam bevat alleen tekst; geen voorlooptekens die door de html-lijstopmaak zijn toegevoegd, en geen dubbele punt.)
- Tabelnaam: tblArtikel
- AIndex: Sleutel, Autoteller, Lange integer
- ATitel: Tekst, 256
- AAuteur: Tekst, 256
- ADatum: Datum/Tijd, Korte datumweergave, Standaardwaarde = Date()
- ACategorie: Tekst, 256, Standaardwaarde = "Overig", Ge-indexeerd met duplicaten
- AArtikel: Memo
Voor de database geldt, dat alle tekst- en memovelden mogen leeg zijn. Geen enkel veld is verplicht. Als je een webpagina bouwt waar gegevens ingevoerd mogen worden, zul je op die pagina moeten controleren of de gegevens ingevoerd worden.
De webpagina "artikelen.asp"
<html><head><title>Artikelen</title></head>
<body>
<h1>Artikelen</h1>
<%
' Dit is het ASP-codeblok. De invulling volgt nog.
%>
<p><a title="Ververs index" href="artikelen.asp">Ververs het overzicht</a></p>
</body>
</html>
Zoals je ziet, is het html-gedeelte redelijk simpel. Dit houdt in, dat de ASP-code ingewikkeld gaat worden.
De ASP-code
De code moet drie dingen doen:
- 1. Een verbinding maken met de database;
- 2. Gegevens ophalen uit de database;
- 3. De opgehaalde gegevens in de webpagina plaatsen.
Het ophalen van de gegevens wordt gesplitst: normaalgesproken wordt er alleen een artikelindex opgehaald. Ik hergebruik de ophaalfunctie: als er uit de index een artikel is gekozen, wordt dat artikel opgehaald. Deze opzet maakt de code iets moeilijker, maar bespaart een extra webpagina.
Enkele opmerkingen over het ASP-codeblok.
- ASP-code staat tussen de <% en de %> tekens. Het wordt door de webserver uitgevoerd. De browser merkt er als het goed is helemaal niets van. Daarom is het niet nodig om het ASP-codeblok tussen commentaartags te plaatsen, zoals je met javascript zou doen.
- ASP-code is in principe MS VBScript, aangevuld met enkele objecten. VBScript is een beperkte vorm van Visual Basic. Het kan veel, maar niet zoveel als je zou verwachten. Alles over ASP en VBScript kun je vinden bij www.4guysfromrolla.com.
- Ondanks dat er VBScript wordt gebruikt, wordt dit nergens in het ASP-codeblok aangegeven. De webserver snapt dat de asp-tags "<% %>" gebruikt worden om een server-side script aan te geven. Als de webserver een MS IIS is, zal deze er automatisch van uitgaan dat er VBScript wordt gebruikt. De IIS is echter in staat om meerdere scripttalen te verwerken. Daarom is mogelijk om aan te geven dat er VBScript wordt gebruikt met de opdracht "<% @Language="VBScript" %>". Dergelijke taalstellingen mogen maar 1x per scriptblok bestaan.
Verbinding maken met de database
<%
On Error Resume Next 'ASP kent geen foutafhandeling zoals Visual Basic
Dim adoCon 'gaat de verbinding maken en vasthouden
Dim strCon 'zal de verbindingsinstellingen (connectionstring) krijgen
strCon = "driver={Microsoft Access Driver (*.mdb)};dbq=MijnPadNaarMijnDatabase;uid=;pwd="
'Voor andere RDBMS-en heb je ook een andere connectionstring nodig. Deze is voor MS Access.
'MijnPadNaarMijnDatabase moet worden vervangen door jouw pad naar jouw database.
'Het pad moet door de webserver gevonden worden; het mag geen webadres zijn.
'Vergeet niet dat je ook de naam van de database moet ingeven.
'Ga er even van uit dat er geen gebruikersbeveiliging is ingesteld in de database,
'zodat uid (User Identification) en pwd (Password) leeg gelaten worden.
Set adoCon = Server.CreateObject("ADODB.Connection")
If adoCon Is Nothing Then
'Er is geen verbindingsobject (ADODB is niet goed ge-installeerd)
Response.Write("<p>Geen verbinding met de database.</p>")
Response.Write("<p>Neem bij herhaling contact op met de webmaster.</p>")
Else
adoCon.Open (strCon)
If Err.Number = 0 Then
'Geen fouten: de verbinding is gelukt.
'Omdat de variabele adoCon globaal is, is de databaseverbinding beschikbaar in de hele webpagina.
Else
'Fouten bij het openen van de databaseverbinding.
Response.Write("<p>Fouten tijdens het verbinden met de database.</p>")
Response.Write("<p>Neem bij herhaling contact op met de webmaster.</p>")
End If
End If
%>
Ophalen van de gegevens
<%
On Error Resume Next
Dim lngArtNr 'Het eventueel gekozen artikelnummer.
Dim strSQL 'een SQL-opdracht (nodig hebt om de gegevens te selecteren)
Dim adoRst 'Gaat de gegevens vasthouden.
Dim blnErZijnArtikelen 'Vertelt of er wel of geen gegevens zijn.
blnErZijnArtikelen = False
'We moeten controleren of er een artikel is gekozen.
'De artikelindex die zometeen opgebouwd wordt, roept deze pagina opnieuw aan,
'en geeft een artikelnummer aan de querystring (zichtbaar in de adresbalk) mee.
'Die querystring wordt nu uitgelezen.
lngArtNr = (-1) 'waarde ingeven die niet mogelijk is voor de autoteller-reeks
lngArtNr = CLng(Request.QueryString("nr"))
'Het gekozen artikel, indien opgegeven, is een string,
'en moet omgezet worden naar een lange integer
If lngArtNr > (-1) Then 'haal het gekozen artikel op
strSQL = "SELECT * FROM tblArtikel WHERE AIndex = " & lngArtNr
Else 'haal een lijst op
'Je kunt ook de bezoeker een sorteermethode op laten geven.
strSQL = "SELECT AIndex, ATitel, AAuteur, ADatum, ACategorie FROM tblArtikel ORDER BY ADatum"
End If
Set adoRst = Server.CreateObject("ADODB.Recordset")
If adoRst Is Nothing Then
'Er is geen gegevensobject (ADODB is niet goed ge-installeerd)
Response.Write("<p>Er kunnen geen artikelen worden opgehaald uit de database.</p>")
Response.Write("<p>Neem bij herhaling contact op met de webmaster.</p>")
Else
'Open het gegevensobject en vul het met gegevens
'standaard = RecordSet.Open Source, ActiveConnection, CursorType, LockType, Options
'CursorType(1) = Static (default = 0 = ForwardOnly)
'Options(1) = (Source = Text) (default = 8 = (Source = Unknown))
adoRst.Open strSQL, adoCon, 0, 1
'controleer of er gegevens in het object zitten
If (adoRst.BOF = False) Or (adoRst.EOF = False) Then 'Er zijn gegevens
blnErZijnArtikelen = True
Else 'Er zijn geen gegevens
blnErZijnArtikelen = False
Response.Write("<p>Er zijn geen gegevens gevonden.</p>")
Response.Write("<p>Neem bij herhaling contact op met de webmaster.</p>")
End If
End If
%>
De opgehaalde gegevens in de webpagina plaatsen
Omdat we in een codeblok werken, gebruiken we de opdracht Response.Write() om gegevens in html op te zetten. Dat kan best lastig zijn i.v.m. aanhalingstekens.
<%
On Error Resume Next
'Je moet twee dingen bepalen:
'Werd er een artikel aangevraagd, en zijn er gegevens beschikbaar?
'De laatste is het belangrijkst. Als er geen gegevens zijn, hoef je niets op de pagina te plaatsen.
If blnErZijnArtikelen = True Then
If lngArtNr > (-1) Then 'Artikel plaatsen.
Response.Write("<h2>" & adoRst.Fields("ATitel") & "</h2>")
Response.Write("<p>" & adoRst.Fields("AAuteur") & "</p>")
Response.Write("<p>" & adoRst.Fields("ACategorie") & "</p>")
Response.Write("<hr><p>" & adoRst.Fields("AArtikel") & "</p><hr>")
Response.Write("<p>" & adoRst.Fields("ADatum") & "</p>")
Else 'Overzicht plaatsen.
Response.Write("<table>")
Response.Write("<tr><td>Titel</td><td>Auteur</td><td>Datum</td></tr>")
adoRst.MoveFirst
Do While adoRst.EOF = False
Response.Write("<tr><td><a title=" & Chr(34) & "Lees dit artikel" & Chr(34) & " href=" & Chr(34) & "artikelen.asp?nr=" & adoRst.Fields("AIndex") & Chr(34) & ">" & adoRst.Fields("ATitel") & "</a></td><td>" & adoRst.Fields("AAuteur") & "</td><td>" & adoRst.Fields("ADatum") & "</td></tr>")
Loop
Response.Write("</table>")
End If
End If
%>
Nu ben je in staat om gegevens op te halen uit een database, en deze te presenteren in een webpagina. Vragen? Neem contact op!
Need problem solving?
Talk to me. Let's meet for coffee or over lunch. Mail me at “omegajunior at protonmail dot com”.