Websites beheren met een database Fokke van der Molen

advertisement
Websites beheren met een database
Afstudeerscriptie Informatiekunde
Fokke van der Molen
Scriptiebegeleider en eerste lezer:
Dr. G. Welling
Tweede lezer:
Dr. E. Koster
Informatiekunde
Rijksuniversiteit Groningen
Juni 2005
Inhoudsopgave
1 Inleiding
2 De
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2
geschiedenis van het internet en het World Wide Web
Het vroege begin . . . . . . . . . . . . . . . . . . . . . . . .
De eerste internet concepten . . . . . . . . . . . . . . . . . .
De ideeën . . . . . . . . . . . . . . . . . . . . . . . . . . . .
De overgang naar een bredere gemeenschap van gebruikers .
Elektronische documenten . . . . . . . . . . . . . . . . . . .
De ontwikkeling van HTML . . . . . . . . . . . . . . . . . .
De toekomst van het internet . . . . . . . . . . . . . . . . .
3 Databases
3.1 De geschiedenis van databases . . . . . . . . . . . .
3.2 Pogingen om database systemen te standaardiseren
3.3 Relationele databases . . . . . . . . . . . . . . . . .
3.4 De eerste commerciële relationele databases . . . .
3.5 De verdere evolutie van databases . . . . . . . . . .
3.6 Databases en het internet . . . . . . . . . . . . . .
4 De
4.1
4.2
4.3
4.4
mogelijkheden om databases te koppelen aan
Van de database naar internet . . . . . . . . . . .
CGI-applicaties . . . . . . . . . . . . . . . . . . .
API-Applicaties . . . . . . . . . . . . . . . . . . .
Server Side Scripting . . . . . . . . . . . . . . . .
4.4.1 Server Side Javascript (SSJ) . . . . . . . .
4.4.2 ColdFusion . . . . . . . . . . . . . . . . .
4.4.3 Java Server Pages (JSP) . . . . . . . . . .
4.4.4 Active Server Page (ASP) . . . . . . . . .
4.4.5 PHP . . . . . . . . . . . . . . . . . . . . .
4.5 ASP en PHP . . . . . . . . . . . . . . . . . . . .
4.6 Conclusie . . . . . . . . . . . . . . . . . . . . . .
i
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
internet
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
4
4
6
8
9
11
12
14
.
.
.
.
.
.
16
16
18
19
20
21
22
.
.
.
.
.
.
.
.
.
.
.
23
23
24
24
25
25
25
26
26
27
28
29
INHOUDSOPGAVE
ii
5 De dynamische website bouwen
5.1 De versie van de scripttaal kiezen . . . . . . . . . . . . . . . . . .
30
31
6 ASP 3.0
6.1 Het database systeem kiezen . . . . . . . . . . . . . . . . . . . .
6.1.1 De database ontwerpen . . . . . . . . . . . . . . . . . . .
6.2 De ASP Pagina’s ontwerpen . . . . . . . . . . . . . . . . . . . .
6.2.1 De opzet van de website . . . . . . . . . . . . . . . . . .
6.2.2 Het presidenten gedeelte nauwkeuriger bekeken . . . . .
6.2.3 De gegevens van de presidenten in de database invoeren .
6.2.4 De website beheren . . . . . . . . . . . . . . . . . . . . .
6.3 Conclusie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
33
34
35
37
37
39
40
42
45
.
.
.
.
47
47
48
48
49
7 PHP 4.0
7.1 Het database systeem kiezen . . . . . . . . .
7.1.1 De database ontwerpen . . . . . . . .
7.2 De PHP Pagina’s ontwerpen en de opzet van
7.3 Conclusie voor het PHP gedeelte . . . . . .
. . . . . . .
. . . . . . .
de website .
. . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
8 Vergelijking tussen ASP en PHP
51
9 Eind conclusie
53
10 Literatuurlijst
55
A De Amerikaanse presidenten van 1789 tot heden
58
B De informatie die getoond wordt op de presidentiële pagina’s
60
C De database structuur
62
D ASP broncode
D.1 index.asp . . . . . . .
D.2 formhandler.asp . . . .
D.3 check login.inc.asp . .
D.4 dbconn.inc.asp . . . .
D.5 delete tekst.inc.asp . .
D.6 functies.inc.asp . . . .
D.7 pageselector.inc.asp . .
D.8 print additional.inc.asp
D.9 print admin.inc.asp . .
D.10 print biography.inc.asp
D.11 print context.inc.asp .
D.12 print footer.inc.asp . .
64
64
64
65
66
67
67
68
70
71
71
72
73
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
INHOUDSOPGAVE
D.13 print header.inc.asp . . . . . . . .
D.14 print president specifiek.inc.asp .
D.15 print presidents.inc.asp . . . . . .
D.16 print presidents additional.inc.asp
D.17 print presidents extern.inc.asp . .
D.18 print presidents speeches.inc.asp .
D.19 print presidents writings.inc.asp .
D.20 print quote.inc.asp . . . . . . . .
D.21 print speech.inc.asp . . . . . . . .
D.22 print voegtoe.inc.asp . . . . . . .
D.23 print wijzig.inc.asp . . . . . . . .
D.24 print writing.inc.asp . . . . . . .
D.25 voegtoe tekst.inc.asp . . . . . . .
D.26 wijzig tekst.inc.asp . . . . . . . .
iii
.
.
.
.
.
.
.
.
.
.
.
.
.
.
E PHP broncode
E.1 index.php . . . . . . . . . . . . . .
E.2 formhandler.php . . . . . . . . . .
E.3 check login.inc.php . . . . . . . . .
E.4 dbconn.inc.php . . . . . . . . . . .
E.5 delete tekst.inc.php . . . . . . . . .
E.6 functies.inc.php . . . . . . . . . . .
E.7 pageselector.inc.php . . . . . . . . .
E.8 print additional.inc.php . . . . . . .
E.9 print admin.inc.php . . . . . . . . .
E.10 print biography.inc.php . . . . . . .
E.11 print context.inc.php . . . . . . . .
E.12 print footer.inc.php . . . . . . . . .
E.13 print header.inc.php . . . . . . . .
E.14 print president specifiek.inc.php . .
E.15 print presidents.inc.php . . . . . . .
E.16 print presidents additional.inc.php .
E.17 print presidents extern.inc.php . . .
E.18 print presidents speeches.inc.php .
E.19 print presidents writings.inc.php . .
E.20 print quote.inc.php . . . . . . . . .
E.21 print speech.inc.php . . . . . . . .
E.22 print voegtoe.inc.php . . . . . . . .
E.23 print wijzig.inc.php . . . . . . . . .
E.24 print writing.inc.php . . . . . . . .
E.25 voegtoe tekst.inc.php . . . . . . . .
E.26 wijzig tekst.inc.php . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
73
75
78
80
81
83
84
85
88
89
90
91
92
93
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
96
96
96
97
98
99
99
100
101
102
103
104
105
105
107
110
113
114
115
117
118
121
123
124
125
126
127
INHOUDSOPGAVE
F Vergelijking van de syntax van PHP en ASP
iv
129
Voorwoord
Op deze plek wil ik graag de mensen bedanken die mij geholpen hebben tijdens
het schrijven van mijn scriptie. Allereerst zou ik Dr. George Welling willen
bedanken voor zijn begeleiding en grammaticale tips. Daarnaast verdienen mijn
ouders hier zeker ook een plek, omdat ze mij altijd gesteund hebben. Tenslotte
gaat mijn dank uit naar Jori, zonder haar zou ik er nog veel langer over hebben
gedaan!
1
Hoofdstuk 1
Inleiding
Tijdens mijn studie informatiekunde kwam ik voor het eerst in aanraking met
databases. Al snel werd ik getroffen door de vele mogelijkheden die databases
boden. Grote hoeveelheden gegevens konden op een efficiënte manier beheerd
worden. De vakken die op databases waren gericht hadden dan ook mijn grootste
interesse. Een ander aspect van de informatica-wereld dat mij boeide zijn websites en internet. Websites ontsluiten een schat aan informatie en kennis voor de
gebruikers van internet. Sinds het World Wide Web gemeengoed is, kan een gebruiker met een internetaansluiting beschikken over een vrijwel onbeperkte bron
van kennis. Gedurende het verstrijken van de jaren komen er steeds meer internetpagina’s bij, krijgen er steeds meer mensen toegang tot het internet en wordt
de verbinding tussen de verschillende computers overal ter wereld steeds sneller.
Kortom, de hoeveelheid informatie op het internet groeit met de dag. Hoewel veel
websites hoofdzakelijk gericht zijn op entertainment, bevat de overgrote meerderheid informatie voor de bezoeker, meestal in tekstvorm. Sommige websites zijn
specifiek gemaakt met het doel om grote hoeveelheden tekst te ontsluiten voor de
bezoekers. Het is deze categorie websites die ik persoonlijk het interessantst vind.
Dit soort sites zijn een bibliotheek op zich. Ze bevatten een grote hoeveelheid informatie met verwijzingen, in de vorm van hyperlinks, naar andere stukken tekst.
Een goed voorbeeld van een dergelijke site is de website over de Amerikaanse geschiedenis van de Rijksuniversiteit Groningen. Deze site bevat meer dan 3000
html-pagina’s met grote hoeveelheden tekst. (http://odur.let.rug.nl/usa)
Het grote probleem bij dit soort sites is dat het zeer moeilijk is om de teksten efficiënt te beheren. Gedurende mijn stage (waarvoor ik een dynamische
website, gekoppeld aan een database moest ontwerpen) en vooral tijdens mijn
studentenassistentschap (waarbij ik meehielp om de USA website van een andere opmaak te voorzien) ben ik er achter gekomen dat de lay-out van grote
sites goed en makkelijk te beheren is via cascading style sheets, maar dat de
inhoud van de pagina’s beheren een zeer moeizaam karwei bleef. De enige manier om de tekst van de pagina’s te updaten en/of te controleren was handmatig. Daarnaast moest het toevoegen van teksten ook handmatig gebeuren. Een
2
Hoofdstuk 1. Inleiding
3
voorbeeld hiervan zijn de brieven van Thomas Jefferson op genoemde USA website (http://odur.let.rug.nl/usa/P/tj3/writings/brf/jeflxx.htm). Als je een nieuwe
brief wilde toevoegen, moest er een pagina worden aangemaakt, de inhoud van de
brief in die pagina gezet worden en vervolgens hyperlinks naar die pagina worden
aangemaakt. Hierna moest het geheel weer getest worden op fouten, zoals bijvoorbeeld spellingsfouten. Al met al is het een hercules-taak om dergelijke grote
websites te beheren en up to date te houden.
Met behulp van databases zou dit proces zeer vereenvoudigd kunnen worden.
In plaats van dat de tekst van een pagina opgeslagen wordt in een HTML-bestand,
zou deze in een database kunnen worden ingevoerd. Met behulp van een Server
Side scripting taal kan de HTML-pagina dynamisch vanuit de database worden
gegenereerd. Hyperlinks kunnen automatisch worden aangemaakt, en de verschillende pagina’s worden aan de wensen van de bezoekers aangepast. Neem
weer het voorbeeld van de brieven van Jefferson. Zodra een bezoeker op de link
naar de brieven klikt, wordt er een overzicht van alle brieven uit de database
gehaald en deze, met hyperlinks naar de tekst van de brieven zelf, getoond aan
de bezoeker. Als er dan op een specifieke brief wordt geklikt, wordt de tekst
zelf uit de database gehaald en getoond. Als de beheerder van de website een
nieuwe brief vindt, hoeft hij/zij alleen maar de tekst van deze brief toe te voegen
aan de database en de website is geupdated, inclusief lay-out en noodzakelijke
hyperlinks. Daarnaast biedt een database nog het voordeel om een site te laten
beheren van buitenaf, door de beheerders toegang op afstand tot de database te
bieden, via het internet. Hierdoor wordt thuiswerken ook een stuk makkelijker
en kunnen bovendien mensen zonder enige kennis van een programmeertaal de
website beheren en up to date houden.
Deze scriptie heeft een tweeledig doel. Er zal worden onderzocht of een dergelijk systeem mogelijk is en of het inderdaad de hierboven geschetste gebruikersgemak en tijdswinst zal opleveren. De scriptie zal tevens onderzoeken hoe
dit dan dient te gebeuren en welke combinatie van scripttaal en databasesysteem
hiervoor het meest geschikt is. Er zijn immers meerdere manieren om websites
te koppelen aan een database.
Hoofdstuk 2
De geschiedenis van het internet
en het World Wide Web
Een scriptie die zich richt op websites ontkomt niet aan een korte beschrijving
van de ontstaansgeschiedenis van het internet en het World Wide Web. Zonder
internet geen World Wide Web en zonder World Wide Web niet het medium
waarop websites beschikbaar gesteld kunnen worden. Het internet heeft voor een
revolutie in de wereld van computers en communicatie gezorgd, die de wereld nog
nooit eerder had meegemaakt. De uitvinding van andere communicatiemiddelen,
zoals de telegraaf, de telefoon, de radio en de computer waren allen noodzakelijk voor het ontstaan van het internet, dat in wezen een integratie is van de
eigenschappen van al deze apparaten. Het internet is hierdoor een wereldwijd
medium voor samenwerking en interactie geworden tussen individuen en vooral
een bijna onuitputtelijke bron van informatie, die voor iedereen toegankelijk is.
Vanaf het begin is het internet een toonbeeld van gezamenlijke investeringen en
samenwerking. Vanaf het vroege onderzoek in packet switching netwerken zijn
de Amerikaanse regering, bedrijfsleven en wetenschap partners geweest in het
ontwikkelen en creëeren van deze nieuwe technologie, die al vrij snel gemeengoed werd. Het eindresultaat is dat veel burgers nu vertrouwd zijn met termen
als e-mail en website en een (groot) gedeelte van hun vrije tijd besteden op het
internet.
2.1
Het vroege begin
Het allereerste begin van het traject dat uiteindelijk zou leiden tot het World
Wide Web is wellicht de publicatie van Leonard Kleinrock in juli 1961.1 Dit
was het eerste paper dat de packet switching theorie behandelde. Zijn paper
overtuigde veel mensen van de theoretische voordelen van communicatie door
1
L. Kleinrock, ”Information Flow in Large Communication Nets”, RLE Quarterly Progress
Report, July 1961
4
Hoofdstuk 2. De geschiedenis van het internet en het World Wide Web
5
middel van packets in plaats van door middel van circuit switching, wat een
belangrijke stap richting computer netwerken was. Hierna, in 1964, publiceerde
de RAND Corporatie een rapport dat een computer netwerk beschreef dat een
nucleaire aanval kon overleven.2 Door dit rapport zijn er nog steeds mensen
die geloven dat het internet gebouwd is om een nucleaire aanval te overleven.
Het voorstel van de RAND Corporatie was om een gedecentraliseerd netwerk te
maken, een packet-switched netwerk:
”Packet switching is the breaking down of data into datagrams or
packets that are labeled to indicate the origin and the destination of the
information and the forwarding of these packets from one computer to
another computer until the information arrives at its final destination
computer. This was crucial to the realization of a computer network.
If packets are lost at any given point, the message can be resent by
the originator.” 3
Al vrij snel, in 1967, werd er een plan gepresenteerd door G. Roberts, van de
MIT Laboratory for Computer Science, om een dergelijk netwerk te onwikkelen,
ARPANET genaamd.4 Op de conferentie waar dit plan werd gepresenteerd, werd
er ook een paper gepresenteerd over een packet switched netwerk concept door
een groep uit het Verenigde Koninkrijk, Donald Davies en Roger Scantlebury.
Scantlebury bracht Roberts op de hoogte van hun werk en dat van de RAND
Corporatie. Zodoende bleek dat er drie afzonderlijke groepen (de groep van
Roberts van MIT, de groep van de RAND Corporatie en de groep uit het Verenigd
Koninkrijk) allen afzonderlijk bezig waren met een packet switched netwerk, wat
de invloed van de publicatie van Kleinrock goed aantoont.
Rond augustus 1968 werd er een gezamenlijk akkoord bereikt over de algemene
structuur en de specificaties van het ARPANET en werden mensen uitgenodigd
om een packet-switched netwerk te bouwen dat aan deze voorwaarden voldeed.
Uiteindelijk werd in december 1968 het contract om het ARPANET te bouwen
toegekend aan BBN (Bolt Beranek and Newman). BBN werkte aan de belangrijkste componenten voor het netwerk, de Interface Message Processors (IMP’s)
op een Honeywell minicomputer. Anderen, waaronder G. Roberts, ontwierpen en
optimaliseerden de topologie en de architectuur van het netwerk. De eerste node
die op het ARPANET werd aangesloten was die van het Network Measurement
Center van de UCLA (de groep van ’founding father’ Robert Kleinrock). In 1969
installeerde BBN de eerste IMP op de UCLA en zodoende kreeg de allereerste
host computer een verbinding met het netwerk. De tweede node werd gevormd
2
P. Baran, ”On Distributed Communications Networks”, IEEE Trans. Comm. Systems,
March 1964
3
http://www.davesite.com/webstation/net-history.shtml (22-11-03)
4
L. Roberts, ”Multiple Computer Networks and Intercomputer Communication”, ACM Gatlinburg Conf., October 1967
Hoofdstuk 2. De geschiedenis van het internet en het World Wide Web
6
door de Stanford Research Institute (SRI), waar een project liep dat een vroege
implementatie van hypertext bevatte. Een maand nadat SRI en de UCLA op het
ARPANET waren aangesloten werd het allereerste bericht verzonden van computer naar computer. Tegen het einde van 1969 waren er vier host computers
aangesloten op het ARPANET en hiermee was het prille begin van internet een
feit. Het ARPANET, met een verbinding van 50Kbps circuits, werd gebruikt om
onderzoek te doen naar problemen waar intensieve computerkracht voor nodig
was.
Meer computers werden vrij snel aangesloten op het ARPANET in de volgende
jaren. Nog geen twee jaar later, in 1971 waren er al 23 host computers aangesloten
op ARPANET. Het werk concentreerde zich nu op een volledig functionerende
host-to-host protocol en andere netwerk software. In december 1970 voltooide
de Network Working Group (NWG), onder hoofd van S. Crocker, het allereerste
host-to-host protocol voor ARPANET, bekend als het Network Control Protocol
(NCP). Nadat dit gereed was, concentreerde men zich op applicaties voor het
netwerk.
In oktober 1972 demonstreerde Bob Kahn van DARPA het ARPANET op de
International Computer Communication Conference (ICCC). Dit was de eerste
publieke demonstratie van deze nieuwe netwerktechnologie aan het publiek. In
maart van hetzelfde jaar werd de eerste echte populaire applicatie ontwikkeld: het
eerste e-mail programma ter wereld, door Ray Tomlinson van BBN. Dit simpele
programma kon alleen berichtjes verzenden en ontvangen, maar het voldeed aan
de behoefte van ARPANET gebruikers om met elkaar te kunnen communiceren.
In juli 1972 werd dit e-mail programma door Roberts verbeterd, zodat het kon
forwarden en berichten kon beantwoorden (in plaats van weer een nieuwe e-mail te
moeten opstellen aan de afzender). Vanaf dat moment werd e-mail de grootste en
belangrijkste netwerk applicatie. Het was tevens een voorbode van de activiteiten
die we tegenwoordig op het World Wide Web zien, namelijk een enorme groei van
applicaties die mensen met elkaar in verbinding brengen en laten communiceren
(zoals chatprogramma’s).
2.2
De eerste internet concepten
Langzaamaan veranderde het originele ARPANET in internet. ’Internet’ was
gebaseerd op het idee dat er meerdere, onafhankelijke, netwerken zouden zijn, te
beginnen met ARPANET als de pioneer van het packet switched netwerk. Al snel
kwamen er satelliet netwerken erbij, radio-netwerken en andere netwerken.
Het internet zoals we het nu kennen is gebaseerd op open architectuur. Een
zeer belangrijk principe, waardoor de keuze van een afzonderlijk netwerk en de
technologie daarvan niet gedicteerd wordt bij een bepaalde netwerk architectuur
(bijvoorbeeld die van ARPANET), maar vrij kan worden gekozen. De interactie
tussen de netwerken geschiedde door een ’Internetworking’ architectuur. Toen
Hoofdstuk 2. De geschiedenis van het internet en het World Wide Web
7
besloten werd tot dit concept, was er nog maar sprake van één algemene methode
om netwerken met elkaar in verbinding te stellen, de traditionele manier van
circuit switching. Zoals we nu weten, toonde Robert Kleinrock in 1961 aan dat
packet switching efficiënter was, waardoor dit een andere optie werd voor een
internetworking architectuur. Maar op het moment dat er besloten werd voor
een open architectuur was dit een vrij vooruitstrevende gedachte, aangezien men
toen maar één architectuur kende.
In een open architectuur kunnen de individuele netwerken afzonderlijk van
elkaar ontworpen en ontwikkeld worden en elk netwerk mag zijn eigen unieke
interface gebruiken, voor bijvoorbeeld gebruikers en providers. Hierdoor kan elk
netwerk worden ontworpen voor de specifieke omgeving en doeleinden waarvoor
het wordt ingezet. Het idee voor een open architectuur werd voor het eerst
geı̈ntroduceerd door Bob Kahn, vrij snel nadat deze was aangesteld door DARPA in 1972. Zijn werk was een onderdeel van het ontwikkelen van een packet
switched netwerk voor radio programma’s, maar het was zo belangrijk dat het
een afzonderlijk project werd. Het werd al snel ’internetting’ genoemd. In deze
tijd maakte het ARPANET gebruik van het netwerk protocol NCP (Network
Control Protocol) om data te versturen. Dit protocol stond communicatie toe
tussen de verschillende hosts in hetzelfde netwerk. Bob Kahn wilde een eigen protocol ontwikkelen voor het radio packet switched netwerk, omdat hij dan niet te
maken had met de verschillende besturingssystemen die er toen bestonden. Bovendien had het NCP protocol een aantal beperkingen, waarvan de belangrijkste
was dat het geen netwerken (of machines) kon bereiken die verder van elkaar waren verwijderd dan een enkele IMP op het ARPANET. Als er dan enkele packets
verloren gingen, stopte het protocol domweg (en de applicaties die er gebruik
van maakten). Op zich was dit geen groot probleem, omdat er maar een enkel
netwerk was (het ARPANET) en dit netwerk was zo betrouwbaar en stabiel, dat
fouten maar zelden voorkwamen. Het radio netwerk dat nu werd ontwikkeld zou
deze stabiliteit echter niet kunnen bieden, vandaar dat een verbetering van het
NCP protocol noodzakelijk was. Bob Kahn besloot om een nieuwe versie van het
protocol te ontwikkelen, dat tevens aan de behoeften van een open architectuur
netwerk zou voldoen.5 Uiteindelijk zou dit protocol het Transmission Control
Protocol/Internet Protocol (TCP/IP) worden genoemd.
In de lente van 1973 ging Kahn samenwerken met Vinton Cerf (van Stanford)
om een gedetailleerd design van het protocol op te stellen. Vinton Cerf was nauw
betrokken bij de ontwikkeling van het originele NCP protocol en wist zodoende veel af van de implementatie van de verschillende besturingssystemen die in
die dagen bestonden. Al vrij snel kon de eerste versie van het resultaat worden
beschreven op een speciale ontmoeting van de International Network Working
Group (INWG) in september 1973.6 Een leuk detail hierbij is dat het originele
5
R. Kahn, Communications Principles for Operating Systems. Internal BBN memorandum,
Jan. 1972
6
V. G. Cerf and R. E. Kahn, ”A protocol for packet network interconnection”IEEE Trans.
Hoofdstuk 2. De geschiedenis van het internet en het World Wide Web
8
concept voorzag in een totaal van 256 netwerken die met elkaar in verbinding
stonden, volgens de ontwerpers meer dan genoeg voor de nabije toekomst. Het
originele paper beschreef een enkel protocol, TPC. Uiteindelijk zou het TPC protocol worden gecombineerd met een ander, simpel, protocol, het IP protocol. Het
resultaat, TCP/IP, is nog steeds de standaardtechniek waarop elke internetdienst
draait. Naast e-mail (de belangrijkste) zagen andere applicaties voor het internet, zoals file sharing en zelfs de allereerste virussen, het levenslicht. De opkomst
van het World Wide Web illustreert in dit opzicht dan ook dat het internet niet
ontwikkeld is voor een enkele toepassing of applicatie, maar als een algemene
infrastructuur waarop nieuwe applicaties konden draaien. De diensten die het
TPC/IP protocol verzorgde maakte dit alles mogelijk.
2.3
De ideeën
DARPA gaf de opdracht voor het implementeren van TCP/IP aan drie verschillende instanties (Stanford, BBN en UCL). Binnen een jaar waren er dan ook drie
afzonderlijke implementaties van het TCP/IP systeem, die de mogelijkheid hadden om ze met elkaar te verweven. Dit was het begin van een ontwikkeling die
zou leiden tot het volwassen worden van de internet technologie. TCP/IP was in
het verleden ontwikkeld om drie soorten netwerken (ARPANET, het packet radio
netwerk en een packet satelliet netwerk) met elkaar te laten communiceren, maar
is nu uitgegroeid tot iets dat in principe elke vorm van netwerk kan incorporeren.
Het ARPANET zelf ging in januari 1983 over op TCP/IP, daarmee het NCP
protocol in zijn geheel vervangend.
De eerste implementaties van TCP/IP waren gebaseerd op grote, krachtige
systemen. Toen de eerste desktop computers arriveerden dachten velen dat het
TCP/IP protocol te groot en te complex was om op een dergelijke computer te
kunnen draaien. David Clark en zijn onderzoeksgroep van de MIT toonde aan dat
een compactere en simpelere implementatie van TCP/IP op een desktop computer mogelijk was. Zij produceerden dan ook een dergelijke simpele implementatie
voor de Xerox Alto en de IBM PC. Hierdoor konden ook bureau computers een
onderdeel worden van het Internet.
Door de combinatie van de ontwikkeling van LANs, PC’s en workstations in
1980, begon het internet wijdverspreid te groeien. Een belangrijke stap hierin was
de ontwikkeling van Ethernet. Met Ethernet is het mogelijk om data zeer snel te
versturen via coax-kabels. Dit was een cruciale stap in de ontwikkeling van LANs
(Local Area Network). De Ethernet technologie, ontworpen door Dr. Robert M.
Meltcalfe in 1973 is nu waarschijnlijk de dominante netwerk technologie op het
internet en PC’s. Workstations zijn de meest voorkomende computers. Deze
verandering, van een paar netwerken (met een paar zeer krachtige machines)
Comm. Tech., vol. COM-22, V 5, pp. 627-641, May 1974
Hoofdstuk 2. De geschiedenis van het internet en het World Wide Web
9
naar vele netwerken, met vele pc’s veroorzaakten een aantal nieuwe concepten en
veranderingen in de onderliggende technologie.
Omdat er zoveel verschillende afzonderlijke computers werden aangesloten op
de netwerken, werd het erg lastig om de verschillende hosts uit elkaar te houden
(tot dusver geı̈dentificeerd door middel van een IP-adres). Daarom kregen hosts
namen toegewezen, wat hun een stuk makkelijker te onthouden maakte voor gebruikers. Paul Mockapetris van de USC vond het systeem hoervoor, de Domain
Name System (DNS) uit. DNS stuurt data pakketjes naar een domein naam in
plaats van naar het IP-adres. De server vertaalde de domein naam dan naar
het corresponderende IP-adres. Op deze manier kregen hosts een verbinding met
hiërarchische namen (zoals www.let.rug.nl in plaats van 129.125.8.12), wat het
gebruikersgemak aanzienlijk verbeterde. Met het ontwikkelen van het internet
werden veranderingen in software (met name besturingssystemen) noodzakelijk
om de computers te integreren met het internet. DARPA, bijvoorbeeld, ondersteunde dan ook de universiteit van Berkeley, die bezig was om modificaties aan
te brengen in het UNIX besturingssysteem, zoals het opnemen van het TCP/IP
protocol. UNIX was dan ook een van de eerste besturingssystemen die een computer toestonden om verbinding met internet te maken. Het opnemen van het
TCP/IP protocol in UNIX was daarmee een van de belangrijkste stappen die de
weg vrijmaakten naar een breed gebruik van internet.
We schrijven 1985 en het internet is nu reeds gevestigd als een technologie die
een brede gemeenschap van wetenschappers en ontwikkelaars hielp bij hun werk.
Internet werd nu ook voorzichtig gebruikt voor dagelijkse communicatie via de
computer, vooral via e-mail.
2.4
De overgang naar een bredere gemeenschap
van gebruikers
Tot nu toe waren de verschillende netwerken die samen het internet vormden,
opgezet met een bepaald wetenschappelijk doel en voornamelijk beperkt tot het
gebruik door een gesloten groep van wetenschappers. Langzamerhand begon
men echter in te zien dat een bredere groep van gebruikers wenselijk was en
vanaf het midden van de jaren 80 begonnen ook studenten toegang te krijgen
tot de verschillende netwerken. Uiteindelijk resulteerde dit in niet-academische
gebruikers van het internet.
Met het toenemen van het aantal gebruikers nam ook de behoefte aan een
snellere verbinding toe en zodoende groeide de oorspronkelijke backbone in zowel
verbindingssnelheid als het aantal nodes dat ermee verbonden was. Dit alles was
mogelijk door de enorme subsidies die de Amerikaanse overheid tussen 1986 en
1995 gaf aan het bedrijfsleven voor het ontwikkelen van de netwerken en infrastructuur daarvan. Het TCP/IP protocol bleek bovendien in staat om dergelijke
Hoofdstuk 2. De geschiedenis van het internet en het World Wide Web
10
grote aantallen aan te kunnen en tot op de dag van vandaag is het de drager van
het internet.
Een andere belangrijke factor in deze snelle groei was de vrije toegang tot de
technische documentatie van het internet en dan met name de specificaties van
de protocollen. Vanaf het begin van ARPANET en het internet, promootte de
gemeenschap van academici de traditie in wetenschappelijke kringen om ideeën
en resultaten openlijk te publiceren. Hierdoor konden verschillende ontwikkelingsteams profiteren van elkanders werk en het verbeteren. Door middel van
e-mail konden er bovendien wetenschappers gezamenlijk werken aan een project,
onafhankelijk van hun verblijfplaats. Zodoende draaide het internet al vanaf het
begin om het verstrekken van informatie (in den beginne informatie over hoe het
internet zelf werkte en de verscheidene projecten die er mee te maken hadden)
en kon iedere ontwikkelaar vrijelijk beschikken over deze informatie.
Omdat de interesse van de wetenschappelijke wereld in het internet steeds
meer toenam en uiteindelijk ook studenten toegang kregen tot de netwerken, begon het bedrijfsleven interesse te tonen. Zij voorzagen een grotere markt (buiten
de academische wereld) en begonnen daarom de netwerken fors uit te breiden,
zodat meer mensen er op aangesloten konden worden, de overheid subsidieerde
dit bovendien. Met deze uitbreiding ontstond ook de behoefte aan een algemene standaard en enige controle op de groei. Hiervoor werd er een nieuwe
coördinerend lichaam opgericht, het World Wide Web Consortium (W3C)7 , oorspronkelijk geleid door Tim Berners-Lee (de ’uitvinder’ van het WWW). W3C
heeft de verantwoordelijkheid voor het laten evolueren van de verscheidene protocollen en de standaarden die met het internet te maken hebben.
Gedurende de twee decennia van internetactiviteiten zien we dan ook een
geleidelijke evolutie van het doel en organisatie vanuit de wetenschap naar een
brede gemeenschap van gebruikers in alle lagen van de samenleving.
Omdat het bedrijfsleven betrokken raakte bij de ontwikkeling van het internet
begonnen er ook commerciële producten op de markt te komen, gebaseerd op de
internet technologie. Meerdere bedrijven implementeerden de TCP/IP technologie in hun producten, omdat ze voorzagen dat hun klanten behoefte zouden
hebben aan het gebruik van deze producten op netwerken. Omdat iedereen gebruik maakte van TCP/IP en deze producten ontwikkeld waren met het oog op
netwerken, was het evident dat er bedrijven begonnen samen te werken en ideeën
met elkaar (en met wetenschappers) uit begonnen te wisselen. De latere jaren 80
worden dan ook gekenmerkt door talloze meetings en workshops waarbij bedrijven hun producten bespraken, showden en ervaringen uitwisselden, hierdoor werd
de standaard ook behouden. Dit alles kwam de gebruiker natuurlijk ook weer ten
goede en hielp mee aan de groei van het internet. Een korte schets van deze explosieve groei volgt hieronder. In 1985 begon de National Science Foundation T1
verbindingen aan te leggen. T1 heeft een verbindingssnelheid van 1.5Mbps . T1
7
http://www.w3.org/ The World Wide Web Consortium (08-10-04)
Hoofdstuk 2. De geschiedenis van het internet en het World Wide Web
11
was 25 keer zo snel als de oude 56kbps snelheid van CSNET. Dit nieuwe netwerk
werd NSFNET (National Science Foundation Network) genoemd. In 1988 was
het dataverkeer op het T1 NSFNET netwerk al zo sterk toegenomen, dat het
noodzakelijk werd om het netwerk up te graden naar een hogere snelheid en in
1989 waren er meer dan 100.000 hosts aangesloten op het internet. In dit jaar
was de eerste internetaansluiting in Nederland een feit, op BITNET.
BITNET (Because It’s Time NETwork) werd in 1981 opgericht. Het begon
als een verbinding tussen twee universiteiten in de Verenigde Staten, maar het
breidde zich al snel uit. In 1982 kwam er een fusie tussen BITNET en de Europese tegenhanger EARN (European Academic and Research Network). Andere
internationale netwerken volgden al snel en zodoende was BITNET al snel een
wereldwijd netwerk, met op zijn hoogtepunt in 1992 een verbinding tussen 1400
organisaties in 49 landen. Na de opkomst van het World Wide Web in 1994, begon
het aantal academische organisaties dat deelnam aan BITNET af te nemen.8
In 1990 richtten Merin, IBM en MCI een non-profit organisatie op, genaamd
ANS (Advanced Network & Services). ANS had als doel onderzoek te doen naar
hogesnelheids netwerken. Het bedrijf kwam al snel met het concept van de T3
lijn, een 45 Mbps lijn. NSF (dat immers behoefte had aan een hogere snelheid)
adopteerde al vrij snel de nieuwe verbinding. Tegen het einde van 1991 bestond
de gehele backbone van NSF dan ook uit T3. ARPANET werd toen opgeheven.
Haar 50Kbs verbindingen waren te zeer verouderd. Gedurende de loop van de
jaren zou het internet zich krachtig uitbreiden. Vanaf begin 1994 kwamen er
honderdduizenden hosts bij op de NSF backbone. Tegen het eind van 1994 kreeg
deze backbone een upgrade naar een ATM (Asynchronous Transmission Mode)
backbone, met een snelheid van 145 Mbps. In 1995 werden de eerste providers
opgericht, die internettoegang aan particulieren boden. In dat jaar konden ook
domeinnamen worden gekocht door particulieren en bedrijven (behalve .edu en
.gov domeinnamen, deze worden nog steeds verdeeld door de National Science
Foundation), waarna er steeds meer persoonlijke websites het licht zagen. Van
1991 tot aan 2003 zou het internet groeien van een enkele site (met vaak meedere
pagina’s) naar meer dan 40 miljoen.9
2.5
Elektronische documenten
Tot nu toe ging dit verhaal vrijwel uitsluitend over de achterliggende technologie
van het internet en niet zozeer over de manieren om informatie te verspreiden.
Dit gebeurde, naast e-mail, vooral via elektronische documenten. Elektronische
documenten maak je tegenwoordig door middel van HTML, ontwikkeld door de
Engelsman Tim Berners-Lee. Hij publiceerde de eerste versie van HTML 1991.
Vanaf de eerste publicaties van documenten op het internet, ontstond er namelijk
8
9
http://www.cren.net/cren/cren-hist-fut.html CREN history and future (08-10-04)
http://www.zakon.org/robert/internet/timeline/ (05-06-04)
Hoofdstuk 2. De geschiedenis van het internet en het World Wide Web
12
een behoefte om de tekst van deze documenten op te kunnen maken (bijvoorbeeld,
gedeeltes van de tekst moesten vet worden gedrukt). Vanaf het einde van de
jaren 60 (het tijdstip van de eerste publicaties op internet) kwamen er al codes
om documenten van een bepaalde structuur en opmaak te voorzien. De codes
werden tags genoemd; een term die nog steeds bestaat in HTML.
De eerste taal waarmee het mogelijk was om documenten op te maken was
SGML (Standard Generalized Markup Language). SGML (dat overigens nog
steeds in gebruik is) is een erg nuttige beschrijvingstaal voor elektronische documenten, maar is tevens ook complex. De oorzaak van deze complexiteit is vooral
het voortvloeien van SGML uit een samenwerkingsverband tussen vele bedrijven
en wetenschappelijke instellingen, die allemaal een stukje functionaliteit in de
taal wilden stoppen (voor hun eigen doeleinden). Hiernaast was ook de uitwisseling van SGML documenten een ingewikkelde zaak. Op deze problemen bedacht
Tim Berners-Lee een oplossing: een systeem, dat hij WorldWideWeb noemde.
De kenmerken van dit systeem waren:
• Elk bestand moest een uniek adres hebben, zodat elk afzonderlijk bestand
in het systeem makkelijk bereikbaar was via het internet. Dit kennen we
als de Uniform Resource Locator (URL).
• Een nieuw protocol om de informatie (de documenten) tussen de verschillende computers uit te wisselen, genaamd Hypertext Transfer Protocol (HTTP).
• Een nieuwe taal die het mogelijk maakte om de documenten op uniforme
wijze te coderen. Een belangrijk kenmerk van deze nieuwe taal was dat
het voorzag in het zogenaamde hypertext principe, waarmee documenten
naar elkaar konden verwijzen. Deze taal kennen we als Hypertext Markup
Language (HTML). HTML is tegenwoordig nog steeds de taal waarmee
webpagina’s worden gemaakt en waarmee naar andere webpagina’s worden
verwezen.
Tim Berners-Lee was niet alleen de man achter HTML, het World Wide Web
systeem en de afzonderlijke kenmerken daarvan, hij programmeerde tevens een
server om de documenten op te kunnen slaan en de eerste browser om de documenten mee te kunnen bekijken.10
2.6
De ontwikkeling van HTML
Bij het ontwikkelen van HTML baseerde Berners-Lee zich voornamelijk op SGML,
een taal die al enkele tientallen jaren beschikbaar was en zich had bewezen. In
wezen bracht Tim Berners-Lee voornamelijk wijzigingen aan in SGML. Hij vereenvoudigde SGML (door het aantal tags sterk in te korten). De taal werd
10
http://www.w3.org/People/Berners-Lee/Overview.html (05-06-04)
Hoofdstuk 2. De geschiedenis van het internet en het World Wide Web
13
universeel gemaakt, zodat het op elk computerplatform te gebruiken was en tenslotte had HTML als basis dat het altijd backwards compatible was met eerdere
versies (zodat gebruikers nooit hoefden te upgraden).11 Door deze kenmerken
van HTML konden gebruikers op eenvoudige wijze hun documenten opmaken en
met elkaar uitwisselen, dit alles onafhankelijk van hun computersysteem. Een
consortium (World Wide Web Consortium, W3C) werd opgericht om toe te zien
op de uitbreiding van HTML en het al dan niet toevoegen van eigenschappen er
aan. Helaas liep dit niet zoals gewild. Computers waren in de jaren 90 al wijd
verspreid en nieuwe programma’s werden door talloze individuen en bedrijven
gemaakt. Zo ook Marc Andreessen, die op 22-jarige leeftijd de eerste grafische
browser programmeerde (Mosaic). Deze browser zou later onder de naam Netscape Navigator grote bekendheid krijgen en de meest gebruikte op internet worden.
Op verzoek van haar klanten ontwikkelde Netscape eigen tags, bijvoorbeeld de
tag ’img’ om plaatjes in documenten te kunnen opnemen. Dit alles ging buiten
het W3C om en daarmee was er al geen sprake meer van een standaard. In een
later stadium ging Microsoft de concurrentie met Netscape aan met haar eigen
browser, Internet Explorer. Ook Microsoft ontwikkelde haar eigen tags, zoals
’marquee’ voor een lichtkrant op een website. Elke nieuwe versie van elke browser zorgde zodoende voor een uitbreiding van HTML met nieuwe tags. De browser van de concurrent ’begreep’ vervolgens een groot gedeelte van de tags niet,
waardoor de ontwikkelaars van de documenten (webpagina’s) gedwongen waren
om meerdere versies van hun websites te ontwikkelen, zodat de meestgebruikte
browsers deze goed toonden. Dit alles was een ongewenste situatie, voor zowel
gebruikers als ontwikkelaars. De gebruikersvriendelijkheid van het world wide
web begon steeds meer te dalen. Gelukkig slaagde de W3C erin om vanaf HTML
versie 3.2 weer een standaard af te dwingen. Zowel latere versies van Netscape
Navigator als van Internet Explorer geven websites die volgens deze standaarden
zijn geprogrammeerd op min of meer dezelfde wijze weer, waardoor webdesigners
weer kunnen uitgaan van één verzameling tags. Bovendien zorgde de introductie
van cascading stylesheets (CSS) aan het einde van de jaren 90 (weer) voor een
scheiding tussen opmaak en inhoud. Vanaf dat moment gingen steeds meer pagina’s alleen de HTML structuur elementen bevatten. De CSS-bestanden legden
vervolgens de opmaak van deze HTML structuur elementen vast. Tegenwoordig scheidt elke serieuze webdesigner de opmaak van de inhoud door middel van
CSS-bestanden. Dit gecombineerd met een afgesproken standaard (alhoewel de
verschillende browsers zich nog steeds niet hier voor 100% aan houden) maakt het
ontwikkelen van websites weer relatief makkelijk en bovendien beter te beheren.
11
Jeffrey Veen, The art and science of web design, p 392
Hoofdstuk 2. De geschiedenis van het internet en het World Wide Web
2.7
14
De toekomst van het internet
Het internet is erg veranderd sinds de decennia waarin het nu bestaat. De ontwikkeling geschiedde in een tijdperk toen er nog geen desktop computers waren
en voordat er zoiets als een Local Area Network bestond. De oorspronkelijke
doelgroep waren wetenschappers, maar tegenwoordig gebruiken mensen uit alle
lagen van de bevolking het. De oorspronkelijke functie van informatie uitwisseling is uitgebreid met e-mail, chat en entertainment, uiteindelijk resulterend in
het world wide web, zoals wij het nu kennen. Het begin was een creatie van een
paar betrokken wetenschappers en het is uitgegroeid tot een commercieel succes
waarin miljarden een rol spelen. Het internet is bovendien nog steeds niet klaar
met veranderen, groeien en evolueren. Nieuwe taken waarin het internet aan voldoet zijn, bijvoorbeeld, geluids- en video-overdracht, het opnemen van mobiele
telefoons in het netwerk en portable computers. Internet-telefonie en internettelevisie liggen om de hoek te wachten en in vele landen staat het aantal mensen
met een aansluiting nog in de kinderschoenen.
Het grootste probleem wat de verdere uitbreiding van het internet momenteel
zou kunnen vertragen is het beperkt aantal IP-adressen wat vrijgegeven kan worden (voor de domeinnamen). Men is bezig met een systeem dat een veel groter
aantal IP-adressen oplevert, maar wat tegelijkertijd naadloos kan aansluiten op
het oude IP-systeem. Op het moment van schrijven (medio 2004) zijn er nog
ongeveer 1 miljard IP-adressen beschikbaar. Te verwachten valt dat Europa en
vooral Azië op korte termijn veel meer IP-adressen nodig hebben.
De oplossing voor het tekort aan IP-adressen wordt vooral gezocht in de invoering van IPv6. Omdat de VS bij lange na nog geen tekort heeft aan internetadressen, zullen zij waarschijnlijk aan de zijlijn blijven kijken hoe de rest van de
wereld vecht met de invoering van het nieuwe adressysteem. Voorstanders van
IPv6 wijzen het land dan ook vooral op de veiligheidsvoordelen van het protocol. Het Amerikaanse Defense Department wil in 2008 al zijn netwerken hebben
overgezet op IPv6 en noemt veiligheid dan ook als zwaarstwegende reden:
”Security features were a key motive behind the Defense Department’s
endorsement of the IPv6 standard last month, according to John Stenbit, assistant secretary of Defense for networks and information integration. ”We’re now getting from beyond the point of talking about it
and into the point of actually getting programs done,”he said.12 ”
IPv6 is een standaard die de oude Ipv4 moet vervangen. IPv6 onderscheidt
zich van IPv4 door het gebruik van acht blokken, die uit hexadecimale (0000 t/m
FFFF) getallen bestaan, waardoor er veel meer cijfercombinaties mogelijk zijn
dan met IPv4 (dat uit 4 blokken van 4 cijfers bestaat).
12
CNET
(24-11-03)
News.com
(http://news.com.com/2100-1033 3-5055803.html?tag=fd lede1 hed)
Hoofdstuk 2. De geschiedenis van het internet en het World Wide Web
15
Al met al valt te verwachten dat het internet (nog steeds) de toekomst heeft.
Het aantal websites zal meer en meer toenemen, de verbindingssnelheid zal toenemen en het aantal mensen dat toegang heeft tot internet ook. Ook zul je steeds
meer traditionele informatiedragers (zoals boeken) gedigitaliseerd en op het web
gepubliceerd vinden. De noodzaak om (tekst-gebaseerde) websites efficiënt te
kunnen beheren neemt hierdoor ook jaarlijks toe. Oude methodes van beheren
blijken bij lange na niet efficiënt genoeg en de zoektocht naar het efficiënt beheren
van een (grote) website is dan ook nog niet voltooid. Deze scriptie is een klein
onderdeel in deze zoektocht.
Hoofdstuk 3
Databases
De hedendaagse maatschappij kan niet zonder databases. Een supermarkt heeft
een database nodig met produkten en de prijzen daarvan, een vliegtuigmaatschappij zal moeten bijhouden welke passagier naar welke bestemming moet, bibliotheken hebben bestanden met daarin hun boekencollectie, internet-zoekmachines
houden bij welke websites er allemaal zijn enzovoorts. Duizenden organisaties
gebruiken databases, uiteenlopend van personeelsbestanden tot gespecialiseerde produktdatabases. Databases vertegenwoordigen niet alleen een significante
aandeel van computer applicaties, maar ook van de informatiestroom van onze
samenleving. Databases zijn dan ook vrijwel onmisbaar voor onze samenleving en
dit is dan ook te illustreren met de miljarden die database produkten opleveren.1
3.1
De geschiedenis van databases
De geschiedenis van databases ligt grotendeels, zoals bij zoveel computer technologieën, in de Verenigde Staten en begint al aan het einde van de negentiende
eeuw. De Amerikaanse overheid had altijd al een sterke behoefte voor het verzamelen, sorteren en bijhouden van grote hoeveelheden data. In 1890 werd door
het Bureau of the Census een ex-werknemer aangesteld om ’s werelds eerste automatische informatie-verwerkingseenheid te ontwerpen. Het resultaat was een
pons-kaart machine om de volkstellingen van 1890 en 1900 mee te verwerken.
In 1911 fuseerde het bedrijf van deze ex-werknemer, Herman Hollerith, met een
ander bedrijf. Het resultaat is bekend als International Business Machines, IBM.
IBM zou nog een grote rol spelen in de geschiedenis van databases.
Gedurende de Eerste Wereldoorlog gebruikte de overheid de nieuwe pons-kaart
technologie om de noodzakelijke data voor de industriële produktie te verwerken
en om belastingen te innen. Nieuwe wetten, zoals de Social Security Act van
1935, vereisten bovendien nog meer dataverwerking, in dit geval de persoonsge1
Alleen al in de Verenigde Staten is de totale omzet van databaseprodukten 8 miljard dollar
(http://www.nap.edu/readingroom/books/far/ch6.html)
16
Hoofdstuk 3. Databases
17
gevens van 26 miljoen Amerikaanse burgers. Voor dit enorme project ontwierp
Remington-Rand later in 1951 speciale apparatuur, de eerste digitale computer,
de UNIVAC I.
De UNIVAC I (bron: http://wwwcsif.cs.ucdavis.edu/ csclub/museum/items/univac.html )
In 1959 had alleen het Pentagon al meer dan tweehonderd computers in gebruik
voor haar zakelijke doeleinden (zoals uitgaves, personeelsbestanden, lijsten met
onderdelen, enzovoorts). De leiding die de Verenigde Staten hadden op het gebied van pons-kaart data verwerking, was de belangrijkste reden voor hun latere
dominantie op het gebied van computerelektronica en software.
Tijdens de vroege jaren 60 besteedde men er veel aandacht aan om hardware
taken te scheiden van software taken, om programmeurs zich te kunnen laten
concentreren op het programmeren zelf. De term ’database’ werd in dat licht
ook voor het eerst gebruikt, het visualiseerde het beginsel dat opgeslagen data
kon worden gestructureerd en bewerkt, onafhankelijk van de hardware van het
systeem waar de data zich op bevond. Bedrijven kwamen er in die periode achter
dat het een stuk goedkoper was te investeren in onderzoek naar het automatiseren van bepaalde werkzaamheden (zoals het archiveren van gegevens) dan om er
mensen voor in te huren. IBM was dat betreft de grote voortrekker. Kenmerkend
voor de jaren 60 is dan ook de grote hoeveelheid onderzoek naar database systemen en het hiërarchische model, het netwerk model en de relationele modellen2
zagen allemaal in die tijd het licht, naast vele andere computer technologieën,
waarvan sommige nog steeds worden gebruikt.
2
Zie onder andere
http://delivery.acm.org/10.1145/370000/362685/p377-codd.pdf?key1=362685&key2=8778327901&coll
=GUIDE&dl=GUIDE&CFID=28794625&CFTOKEN=63395675 Voor het beroemde artikel
van E.F. Codd ”A relational model of Data for Large Shared Databanks (08-10-04)
Hoofdstuk 3. Databases
3.2
18
Pogingen om database systemen te standaardiseren
Met het betreden van de commerciële markt door computertechnologie, kwam er
een aantal technieken naar voren om data op te slaan, de kwaliteit van die data
te waarborgen, het te beveiligen en het te beheren. Dit hing sterk samen met de
opslagmedia, in het begin waren dit magnetische tapes.
Tapes vereisten seriële data toegang. Al vrij snel begonnen disk drives echter
de tapes te vervangen. Met disk drives was het mogelijk om data willekeurig
te benaderen, wat de tape standaard verouderd maakte. In 1961 introduceerde
Charles Bachman, van General Electric Company, een nieuwe methode om data
op te slaan: Integrated Data Storage (IDS). IDS verving de oudere manieren om
data op tapes op te slaan en voegde daar een aantal extra’s aan toe.
IDS werd daarmee in wezen de pioneer op het gebied van database management systemen, omdat het gebruik maakte van een nieuwe opslagmethode en dit
combineerde met een systeem dat toegang tot de data makkelijker maakte, evenals het beheren ervan. Gedurende deze beginjaren waren vooral industriële onderzoekers verantwoordelijk voor de innovaties op dit gebied, de wetenschap stond
er voor een groot gedeelte buiten. In het midden van de jaren 60 zetten Bachman
en anderen bijvoorbeeld de Database Task Group op, gesponsord door het bedrijfswezen. De Database Task Group (DBTG) had als doel om een standaard te
verkrijgen op het gebied van data opslag en verwerking. De DBTG publiceerde
al snel een groep specificaties hoe computertalen door data konden navigeren.
In 1971 werd er een formele standaard gepubliceerd, bekend geworden als de
Codasyl manier voor database management. Een aantal Codasyl-produkten werden geı̈ntroduceerd voor mainframe computers door Eckert-Mauchly Computer
Corporation, Honeywell Inc. en Siemens AG.
Een belangrijk bedrijf dat de Codasyl produkten niet ondersteunde was IBM,
dat in 1968 al een eigen produkt, IMS, had geı̈ntroduceerd. Codasyl was gebaseerd op een netwerk model voor data, IMS gebruikte een hiërarchische structuur.
Dus ondanks dat er een taakgroep was opgericht om een standaard te promoten,
was er al vrij snel sprake van twee producten die niet uitwisselbaar met elkaar waren. Hoe het opslaan van de gegevens in zijn werk ging, hing af van het type van
de gegevens. Er was geen universele manier om gegevens op te slaan, wat inhield
dat elke keer als iemand een veld aan de database werd toevoegde, iemand moest
uitzoeken hoe hij dat type gegeven moest opslaan. Dit vereiste grote kennis van
de databasestructuur, kennis over hoe men gegevens moest toevoegen en over
het opslaan van deze gegevens. Hetzelfde gold voor het tonen van de opgeslagen
gegevens. Databases waren in die dagen dus erg ongebruikersvriendelijk.3
3
http://math.hws.edu/vaughn/cpsc/343/2003/history.html (07-06-04)
Hoofdstuk 3. Databases
3.3
19
Relationele databases
Een groot gedeelte van de tegenwoordige markt voor database produkten bestaat uit relationele databases, gebaseerd op een model dat in de jaren 70 werd
bedacht. Dit model was al vrij snel het dominante database model en vertaald
in succesvolle commerciële produkten. Hoewel de oorsprong van het relationele
database model bij een bedrijf (IBM) ligt, was het te danken aan de subsidie van
de Amerikaanse overheid (via de universiteit van Californië te Berkeley) dat het
idee zich verspreidde en het tot een succes maakte.
In 1970 kwam Edgar F. Codd (een onderzoeker bij IBM) met een voorstel voor
een zogenaamde relationele database model. Codd was ontevreden over zowel
het Codasyl model als het IMS systeem van zijn eigen bedrijf.4 Hij koppelde
het schema van de database (de logische organisatie van de gegevens) los van
de fysieke opslag methodes. Op deze manier werden de data onafhankelijk van
de opslagmethode. Dit systeem is tot op de dag van vandaag standaard. De
basisgedachte van Codds systeem was dat niet de gebruiker informatie moest
opzoeken, maar dat het databasesysteem dat zou moeten doen voor de gebruiker.
In wezen had Codd een systeem ontwikkeld waarmee gebruikers databases konden
gebruiken door middel van commando’s in natuurlijke taal. De informatie werd
opgeslagen in tabellen, waardoor ze erg overzichtelijk werd. Het relationele model
hield twee dingen in:
• De data waren onafhankelijk van de hardware en opslagmethode
• Een programmeur kon de taal van het databasesysteem gebruiken om de
data te door zoeken, te gebruiken en te beheren.
Doordat het voorstel van Codd erg technisch was geformuleerd en gebruik
maakte van ingewikkelde wiskundige berekeningen om zijn stelling te ondersteunen, werd zijn artikel niet meteen herkend voor wat het waard was: een revolutionaire versimpeling van database modellen. Binnen IBM zagen mensen zijn model
lange tijd als een theoretisch speeltje van een wetenschapper, dat bovendien IMS
ondermijnde. Bij IBM was het probleem namelijk dat er al een database produkt
aanwezig was, IMS. Het bedrijf had daar al geld in geı̈nvesteerd en een infrastructuur opgezet om het te verkopen en te ondersteunen. Een nieuwe theorie voor een
database produkt zou zich moeten bewijzen voordat het een succesvol bestaand
produkt zou kunnen vervangen bij IBM. De reacties op de publicatie van Codds
artikel binnen wetenschappelijke kringen waren echter zo veelbelovend dat IBM
uiteindelijk het potentieel er van inzag. Codd promootte zijn artikel namelijk met
veel energie aan computer wetenschappers en organiseerde een publiekelijk debat tussen hem en de hoofdverantwoordelijke van de Codasyl standaard, Charles
4
http://en.wikipedia.org/wiki/Edgar F. Codd (08-10-04)
Hoofdstuk 3. Databases
20
Bachman.Het effect was zoals Codd hoopte: de technische gemeenschap omarmde Codds model en in de vroege jaren 70 zag je dan ook applicaties gebaseerd op
het relationele model van Codd. Een binnen IBM, bekend als ’System R’.5
Het ’System R’ project had als doel een relationele database systeem te ontwikkelen, dat een IBM produkt zou kunnen worden voor de verkoop. Het eerste
prototype van de projectgroep werd echter al als experiment gebruikt door verscheidene andere bedrijven, zoals de MIT Sloan School of Management.
System R was ook de groep die de huidige standaardtaal voor relationele databases ontwikkelde: SQL (Structured Query Language). Het uiteindelijke produkt
dat dankzij System R tot stand kwam was IBM’s DB2. Een andere produkt gebaseerd op Codds model was Ingres, ontwikkeld aan de Berkely universiteit met
steun van de Amerikaanse overheid. Dankzij deze steun verspreidde het relationele database model zich al snel buiten IBM om en werd het uiteindelijk een
universele standaard.
3.4
De eerste commerciële relationele databases
Ondanks dat IBM het bedrijf was dat het originele concept voor een relationele database uitvond en de SQL standaard, waren ze niet degenen die als eerste
een commercieel relationeel database produkt op de markt brachten. Die eer is
voor Honeywell Information Systems Inc. Zij brachten een commercieel produkt
op de markt in juni 1976, gebaseerd op hetzelfde principe als het IBM systeem,
maar onafhankelijk van hun geı̈mplementeerd. Ingres, de tegenhanger van IBM’s
System R, was open source en de programma code was vrij beschikbaar. IBM
distributeerde honderden kopieën over de hele wereld, zodat wetenschappers en
programmeurs er mee konden experimenteren en eventueel aanpassen. Een van
hun, Michael Stonebraker, richtte uiteindelijk Ingres Corporation op om de door
Berkeley ontworpen code te commercialiseren. De hoofdprogrammeur van Berkeley, Robert Epstein, richtte een eigen bedrijf op, Sybase. Een belangrijke klant
van Sybase was de Amerikaanse overheid. Andere wetenschappers van Berkeley
introduceerden de technologie bij andere bedrijven zodat de commerciële sector
al vrij snel bekend raakte met het nieuwe relationele database systeem, buiten
IBM om.
Ondanks de wederzijdse competitie tussen IBM en Berkeley was er ook veel
onderlinge uitwisseling. Berkeley stuurde bijvoorbeeld haar studenten naar IBM
om er rond te kijken. Het is dan ook geen verassing dat de taal van Ingres,
QUEL, erg veel op IBM’s SQL leek. Toch bleek SQL meer voordelen te bezitten
dan QUEL en SQL werd dan ook uiteindelijk de industriële standaard.
De eerste database systemen die ontworpen waren met de SQL standaardtaal,
begonnen te verschijnen in het begin van de jaren 80. Oracle was de eerste, met
Oracle versie 2. Oracle had hiermee, verrassend genoeg, eerder een op SQL
5
http://www.mcjones.org/System R/ (15-07-04)
Hoofdstuk 3. Databases
21
gebaseerde database produkt op de markt gebracht dan IBM zelf. De oprichter
van Oracle, Larry Ellison, had kennis gemaakt met SQL door publicaties van
de System R groep. IBM werd hierdoor gestimuleerd om haar eigen produkt op
de markt te brengen en volgde met het SQL/DS systeem. Verscheidene andere
bedrijven volgden.
Dit was mogelijk omdat de syntax van SQL was gepubliceerd in een artikel.6
Dankzij het publiceren van deze syntax (ook wel BNF genoemd) werd duidelijk
hoe elk commando van SQL werkte en hoe de verschillende commando’s met
elkaar samenhingen. Bedrijven konden hierdoor deze basis gebruiken om hun
eigen systemen te ontwikkelen, die 100% compatible waren met IBM’s systeem.
Relationele databases kenden dus al vanaf het begin, dankzij SQL, een standaard taal. DB2 wordt in deze periode de belangrijkste database applicatie.
Dankzij de opkomst van IBM’s PC richten veel mensen database bedrijven op
en brachten ze nieuwe produkten op de markt, zoals RIM, RBASE 5000, PARADOX, OS/2 Database Manager, Dbase III en IV en Watcom SQL.
3.5
De verdere evolutie van databases
Tegenwoordig zijn relationele databases maar één van de verschillende manieren
om verscheidene soorten informatie types die computers kennen te behandelen.
Onderzoek in information retrieval, digitale bibliotheken en wetenschappelijke
databases is nog steeds gaande.
De software van relationele databases is voortdurend verbeterd en aangepast
gedurende de jaren 80. Dit gebeurde door wensen van gebruikers, de steeds
grotere rekenkracht van de computer systemen en het feit dat steeds meer mensen
de beschikking kregen over een pc. De eerste database, door System R ontwikkeld,
kon 8 Megabyte aan data bevatten. Tegenwoordig kunnen databasesystemen
terabytes aan informatie bevatten. De opslagcapaciteit van databases is eigenlijk
rechtevenredig met de toenemende opslagcapaciteit van harde schijven.
SQL bleef de standaard en zal dit nog wel blijven gedurende de komende jaren.
Wel is het zo dat een werkgroep, opgericht door de ISO, de taal nog steeds aanpast
en verder ontwikkelt.7 In het midden van de jaren 80 realiseerde men zich dat er
bepaalde onderdelen waren, waar relationele databases niet praktisch voor waren,
vanwege het type data waar het om ging. Voorbeelden van onpraktische datatypes
voor het verwerken met een relationele database zijn: medicijnen, multimedia
data en data voor wetenschappelijke richtingen, zoals natuurkunde. Om dit soort
data op te kunnen slaan en op te kunnen vragen is er meer flexibiliteit nodig voor
de verwerkingswijze van deze data.
6
http://cui.unige.ch/db-research/Enseignement/analyseinfo/SQL7/BNFindex.html
BNF (20-10-04)
7
http://www.jcc.com/SQLPages/jccs sql.htm (15-04-07)
SQL
Hoofdstuk 3. Databases
22
Dit alles leidde tot het starten van onderzoek naar object georienteerde databases, waarmee gebruikers zelf konden definiëren hoe ze data wilden benaderen,
hoe ze de data wilden opslaan en hoe ze de data wilden weergeven. Dit hangt
sterk samen met de introductie van object georiënteerde programmeertalen zoals
C++, wat in ongeveer dezelfde periode gebeurde.
Kenmerkend voor de jaren 90 zijn dan ook de eerste object georienteerde
database management systemen. Deze systemen stonden gebruikers toe om databases te creeeren die onderzoeksresultaten opsloegen of bijvoorbeeld medische
gegevens.
3.6
Databases en het internet
In de jaren 90 werd er veel geld geı̈nvesteerd in internetbedrijven, waardoor er
een grote markt ontstond voor internetapplicaties. Een onderdeel daarvan waren
applicaties/software die gericht waren op de verbinding tussen het internet en
databases. Voorbeelden daarvan zijn Active Server Pages, FrontPage, Java Servlets, Coldfusion, Dreamweaver enzovoorts. Open Source werd in deze periode
ook populair en veel gebruikt, zoals onder meer gcc, cgi, Apache en MySQL.
Tegen het einde van de jaren 90 klapte de internet zeepbel uit elkaar en gingen
vele internetbedrijven failliet, maar de groei van database-internet applicaties
nam gestaag toe. De drie belangrijkste database bedrijven zijn tegenwoordig
IBM, Microsoft en Oracle. Tegenwoordig zijn vrijwel alle populaire websites
dynamische websites, wat inhoudt dat, elke keer als een bezoeker een pagina
opvraagt, deze de database die aan die pagina is gekoppeld raadpleegt, waarna
de bezoeker een nieuwe pagina te zien krijgt. De gegevens van die nieuwe pagina
zijn dus uit de database gehaald en zijn altijd net zo actueel als de database zelf.
Bovendien toont de dynamische pagina alleen die gegevens waar de gebruiker om
vraagt, door middel van een opdracht naar de database toe.
Op deze manier is, nadat de website is ontwikkeld, het bijhouden van de
website beperkt tot het bijhouden van de database. Elke keer als de database
wordt vervangen of gewijzigd veranderen de pagina’s van de website mee. De
beheerder van de website kan ook verschillende bezoekers verschillende toegangsrechten verlenen. Bezoekers kunnen onder meer zelf aangeven wat ze willen zien
op een bepaalde pagina. Dynamische websites bieden daarom dan ook veel meer
mogelijkheden dan ’gewone’ statische pagina’s.
In het volgende hoofdstuk zal een overzicht worden gegeven van de verschillende mogelijkheden die er tegenwoordig zijn om databases te koppelen aan websites
en zodoende dynamische pagina’s te creëren.
Hoofdstuk 4
De mogelijkheden om databases
te koppelen aan internet
Er zijn tegenwoordig vele manieren om databases te koppelen aan internet pagina’s. Al vrij snel ontstond er namelijk de behoefte om de inhoud van databases
te publiceren op het internet.
In de eerste instantie zocht men de oplossing door de database te ontsluiten via de database applicatie zelf, zoals het exporteren van tabellen naar een
html-pagina en daarna deze pagina op het internet te publiceren. Pas later gebeurde de koppeling door een benadering van buitenaf, via een internet pagina
een verbinding maken met de database.
4.1
Van de database naar internet
De meeste database applicaties kennen een exporteer functie om een (of meerdere) tabellen om te zetten naar een HTML bestand. Op deze manier krijgt een
bezoeker van de website de tabel voorgeschoteld, inclusief de inhoud, zoals die
ook aanwezig was in de database. Nadat de tabel uit de database is geëxporteerd
als HTML-pagina is het natuurlijk wel mogelijk om deze daarna aan te passen
en bijvoorbeeld gedeeltes niet te laten zien, bepaalde kolommen te verwijderen
enzovoorts. Het eindresultaat blijft echter altijd een statische pagina, die alleen verandert als de beheerder van de website hem verandert. De bezoeker ziet
resultaten zoals ze zijn.
Als de database daarna geupdated of gewijzigd wordt, moet er een geheel
nieuwe HTML pagina worden gemaakt. Dit is het grote nadeel van deze methode,
bij elke wijziging in de database, moet de beheerder de pagina ook wijzigen of
opnieuw aanmaken. Daarbij komt dat een pagina alle records uit een tabel in een
keer op het scherm toont. Dit is nogal onoverzichtelijk voor een bezoeker van de
pagina, deze moet namelijk gaan scrollen om alle informatie te kunnen zien. Het
zou bijna hetzelfde zijn als elke bezoeker de mogelijkheid heeft om de database
23
Hoofdstuk 4. De mogelijkheden om databases te koppelen aan internet
24
zelf te downloaden van de website, zodat hij alles kan bekijken. Het is dan ook
niet voor niets dat er al snel een behoefte ontstond om de website automatisch
met de inhoud van de database te laten mee veranderen. Wanneer de database
bijgewerkt werd, moest de pagina die de inhoud van die database toonde ook
bijgewerkt worden. Kortom, al vrij snel ontstond er de behoefte aan dynamische
pagina’s. Vele methodes zagen het licht, waarvan een overzicht hieronder volgt.
4.2
CGI-applicaties
CGI-applicaties zijn een van de allereerste technieken om websites dynamisch te
maken. CGI (Common Gateway Interface) applicaties worden meestal geschreven in de programmeertalen Perl of C, maar andere talen kunnen ook. CGI
verschaft programmeurs toegang tot de besturingssystemen en systeembronnen
van de webserver waar de pagina’s op staan. CGI is bovendien ook erg snel (aangezien de applicaties in het geheugen van de server worden geladen, in plaats
van dat de computer van de bezoeker dit moet doen). Het grote nadeel is echter
dat CGI applicaties erg lastig zijn te controleren op fouten (debuggen), ze een
hoop systeembronnen en bandbreedte in beslag nemen en tenslotte kan een slecht
geschreven CGI-script een server laten crashen.1 Uunet (een grote internationale
provider) zegt hierover dan ook:
”Nee, u mag zelf geen CGI-scripts op onze gratis webservers plaatsen.
Dit heeft te maken met veiligheidsredenen en de integriteit van het
systeem. Een slecht geschreven CGI-script kan een www-server laten
crashen. Dit willen we natuurlijk te allen tijde voorkomen. Daarom
mag u bij een homepage alleen gebruik maken van het script dat MCI
u aanbiedt.” 2
Door deze, belangrijke, nadelen zijn CGI scripts dan ook niet lang gebruikt en
waren ze nooit echt populair. Wel zijn ze nog steeds in gebruik, met name op
Unix systemen.
4.3
API-Applicaties
Een aantal webservers stelt programmeurs een API (Application Programming
Interface) ter beschikking waarmee ze de functionaliteit van de webserver kunnen uitbereiden. Netscape bijvoorbeeld biedt NSAPI (Netscape Server API) en
Microsoft heeft ISAPI (Information Server API). Die van Netscape wordt vrijwel
1
2
04)
http://hoohoo.ncsa.uiuc.edu/cgi/overview.html Uitleg over CGI (17-08-04)
http://www1.worldcom.com/nl/customer/helpdesk/homepages/cgi/ CGI-scripts (08-08-
Hoofdstuk 4. De mogelijkheden om databases te koppelen aan internet
25
niet meer gebruikt, omdat bijna 100% van alle internet gebruikers de browser
Internet Explorer gebruikt, of met Internet Explorer uitwisselbare browsers.3
ISAPI-Applicaties worden geı̈mplementeerd als DLL’s (dynamic link library)
en zijn ontwikkeld met talen als C en Delphi. Het systeem laadt deze DLL’s in
dezelfde procesruimten als de webserver, hierdoor hoeft er voor elke aanvraag van
een pagina niet telkens opnieuw een proces gestart te worden. ISAPI-Applicaties
zijn hierdoor sneller dan CGI-scripts.
Het nadeel is de complexiteit van het programmeren van de uitbereidingen.
Daarbij kan, omdat webserver en extensie hetzelfde proces delen, een fout in
de extensie de hele webserver platleggen, net zoals bij CGI-scripts. Dit laatste
is natuurlijk een erg belangrijk nadeel, waardoor API-applicaties hetzelfde lot
deelden als de CGI-applicaties.
4.4
Server Side Scripting
Een aantal technieken maakt het mogelijk om programmeercode op te nemen
in het HTML-bestand. Voordat de server het bestand naar de browser stuurt,
wordt deze eerst verwerkt door een externe applicatie of door de webserver zelf.
De server voert daarbij eerst de ingebedde code uit. Deze code kan ook vooraf
gecompileerd worden.
4.4.1
Server Side Javascript (SSJ)
Netscape biedt gebruikers van zijn webservers de mogelijkheid om JavaScript op
te nemen in de HTML-code. Deze JavaScript-code wordt eerst gecompileerd om
de prestaties te verbeteren. Voor gebruikers die goed bekend zijn met clientside JavaScript is SSJ een erg prettige oplossing. Het grote nadeel van SSJ is
alleen dat het platform afhankelijk is en maar een zeer beperkt aantal webservers
ondersteuning voor SSJ hebben. Hierdoor gebruikt maar een zeer klein aantal
gebruikers SSJ.
4.4.2
ColdFusion
ColdFusion van het software bedrijf Allaire is een scripttaal (net zoals bijvoorbeeld PHP of ASP). Het wordt geleverd met een aantal visuele tools die het
bouwen van websites sterk vereenvoudigen. Coldfusion is een goede optie voor
het maken van dynamische websites, gekoppeld aan databases. Bovendien is het
platform onafhankelijk. Toch heeft Coldfusion een aantal belangrijke nadelen:
Het is vrij duur in het gebruik en kent daarom maar een kleine groep gebruikers.
Omdat Coldfusion niet erg populair is, is er maar weinig documentatie te vinden.
3
http://v1.nedstatbasic.net/s?tab=1&link=5&id=710309
Nedstat
statistieken
www.startpagina.nl (een van de meest populaire pagina’s in Nederland) (17-08-04)
van
Hoofdstuk 4. De mogelijkheden om databases te koppelen aan internet
26
Een grote groep gebruikers van een scripttaal, brengt namelijk een grote behoefte
aan documentatie met zich mee (zoals websites en handboeken).
4.4.3
Java Server Pages (JSP)
Met Java Server Pages kun je Java-code opnemen in je HTML. De code wordt
eerst gecompileerd om de prestaties te verbeteren. Na compilatie is dan een
zogenaamd Servlet ontstaan. JSP is vrij snel (de compiler verwerkt de pagina’s
vrij snel en toont het als HTML aan de gebruiker) en platform onafhankelijk.
JSP kent bovendien de mogelijkheid om gebruik te maken van Java-beans. Dit
zijn in Java geschreven objecten die delen van de applicatielogica verzorgen.
Servlets zijn vaak beschreven als Applets die (zonder gebruikersinterface) op
de webserver draaien. Deze Servlets zijn, zoals gezegd, geprogrammeerd in Java.
De prestaties en de schaalbaarheid zijn goed, ze zijn platformonafhankelijk en in
combinatie met JSP kan de inhoud ervan gemakkelijk gewijzigd worden.
Maar ook Servlets kennen een belangrijk nadeel. De HTML die het servlet
aanmaakt is verpakt in afzonderlijke printopdrachten, waardoor het bijzonder
moeilijk wordt om een overzicht te krijgen van het uiteindelijke resultaat. Bovendien mag een programmeur bij het gebruik van Servlets nooit vergeten bepaalde
tekens vergeten, zoals backslashes voor dubbele aanhalingtekens. Hierdoor maak
je vrij snel fouten in de code, wat de taal er niet populairder op heeft gemaakt. Er
is echter een groep programmeurs die precisie prefereren boven gebruikersgemak.
Dit is een kwestie van smaak.
Webdesign met JSP is en blijft echter een zaak voor programmeurs die Javacode begrijpen. Professionele toepassingen die enkel op servlets zijn gebaseerd
zijn dan ook moeilijk te ontwikkelen en te onderhouden. Er zijn ook maar weinig
JSP-servers, waardoor het ontwikkelen van database-gekoppelde websites in die
taal niet erg aangemoedigd wordt.
4.4.4
Active Server Page (ASP)
ASP maakt gebruik van een combinatie van HTML en een programmeertaal
(zoals Vbscript (Microsoft Visual Basic Scripting Edition) of Javascript).4 De
code voert dingen uit, zoals een database openen, de benodigde queries uitvoeren
en de resultaten als HTML naar de gebruiker sturen.5 De eigenschappen van de
pagina worden dus vastgelegd door de progammeertaal die ingebed wordt in de
HTML pagina.
Voor het werken met ASP is het noodzakelijk dat je overweg kunt met een
programmeertaal die door ASP wordt ondersteund, zoals Visualbasic script of
4
5
Alex Fedorov, Professional Active Server Pages 2.0, p. 52
Microsoft Handboek Access 2000, p. 663
Hoofdstuk 4. De mogelijkheden om databases te koppelen aan internet
27
Javascript. De keuze is echter vrij ruim, waardoor veel ASP-programmeurs hun
ervaringen met andere programmeertalen kunnen meenemen.
Bepaalde toepassingen van ASP functioneren echter niet goed op grote websites, met name websites die gebruik maken van vele formulieren om gegevens te
behandelen. Bepaalde onderdelen van ASP zijn ook niet schaalbaar naar grote
bedrijfsomgevingen. ASP draait alleen op Microsofts Internet Information Server
(IIS) als webserver. ASP is door vier ontwikkelstadiums gegaan. ASP 1.0 (gedistributeerd samen met IIS 3.0), ASP 2.0 (gedistributeerd met IIS 4.0), ASP 3.0
(gedistributeerd samen met IIS 5.0) en de nieuwste ontwikkeling op ASP-gebied,
ASP.NET (onderdeel van het Microsoft .NET platform) dat de eerder vermelde
problemen wegneemt. ASP.NET kan echter alleen worden gebruikt op windows
2000 (of nieuwere) pc’s en ASP.NET pagina’s vereisen minimaal internet explorer
5.5 als browser. Hierdoor heeft de doorbraak van ASP.NET een tijd lang op zich
laten wachten.
In ASP 3.0 zijn er zeven ingebouwde objecten beschikbaar voor de programmeur: Application, ASPError, Request, Response, Server, ObjectContext en Session. Elk object is een groep van veelgebruikte functionaliteiten en door de vele
ingebouwde objecten is het programmeren van ASP websites vrij makkelijk.
4.4.5
PHP
PHP is een veelgebruikte open source programmeertaal, specifiek gericht op
server-side applicaties en het ontwikkelen van dynamische websites. PHP wordt
vaak gezien als de open-source tegenhanger van Microsofts ASP/Vbscript/Jscript
systeem. PHP is vrij gemakkelijk in het gebruik en de taal lijkt veel op de meer
bekende gestructureerde programmeertalen, zoals C en Perl. Hierdoor kunnen
veel ervaren programmeurs gemakkelijk overstappen naar PHP. Door de modulaire opbouw kan PHP ook gebruikt worden om GUI (Graphic User Interface)
applicaties mee te bouwen.
PHP staat interactie met een grote hoeveelheid relationele databases toe,
zoals MySQL, Oracle, DB2, Microsoft Access en PostgreSQL. PHP draait op alle
belangrijke besturingssystemen, zoals UNIX, Linux, Windows en Mac OS en de
webserver-varianten daarvan. De meestgebruikte combinatie is PHP draaiend op
een Apache webserver, dat weer draait onder een Linux besturingssysteem, met
MySQL als database. Deze combinatie is geheel open source.
Omdat PHP open source is, is de programmeertaal dan ook het resultaat van
een collectieve inzet van vele programmeurs. PHP is tegenwoordig een van de
populairste server-side scripting systemen op het internet, vooral na de release
van versie 4. Er is echter ook kritiek op PHP, zo hebben de ingebouwde functies
geen consistentie in opmaak, sommige zelfs inconsistentie in output (bv een false
statement als FALSE of 0). Er zijn ook erg veel ingebouwde functies, waarvan vele
een overlap qua taak hebben. Zo’n 3000 functies delen bovendien dezelfde global
Hoofdstuk 4. De mogelijkheden om databases te koppelen aan internet
28
namespace. Veel kritiek op PHP geldt echter voor scripttalen in het algemeen.6
4.5
ASP en PHP
Van de vele mogelijkheden om databases aan internet pagina’s te koppelen zijn
er twee het meest in gebruikt, ASP en PHP. Deze twee lijken dan ook sterk op
het elkaar in functionaliteit. Met beide wordt de HTML code van een internet
pagina afgewisseld met programmacode. Deze ASP of PHP code kan HTML als
output geven, waardoor een dynamische pagina het resultaat is.
Een van de belangrijkere verschillen is dat PHP open source is en op veel
besturingssystemen uit de voeten kan. ASP is door Microsoft ontwikkelt en is
daarom standaard aan Windows verbonden. Het is echter wel mogelijk om ASP
ook onder niet-Windows besturingssystemen te draaien. Een voorbeeld is Sun
Java System ASP, waarmee ASP onder solaris kan worden gedraaid.7
Omdat ASP gebruik maakt van componenten die wel standaard in windows
aanwezig zijn, maar niet in andere besturingssytemen is ASP niet echt platform
onafhankelijk. PHP is dat wel. PHP werkt op basis van een programmeertaal, die
zoals gezegd sterk lijkt op de meer bekende gestructureerde programmeertalen,
zoals C en Perl. ASP is taal onafhankelijk. Standaard werkt ASP met Vbscript
en Javascript, maar er zijn ook modules voor andere talen zoals Perl. PHP vereist
dat je een specifieke taal leert om er mee te kunnen werken, ASP geeft op dit
terrein veel meer vrijheid. Bovendien wordt over het algemeen het instapniveau
van Vbscript als lager beschouwd.
ASP werkt op basis van objecten. Als je een bepaalde taak wilt volbrengen,
dan gebruik je een daarvoor geschikt object. De objecten functioneren in dat opzicht als het noodzakelijke gereedschap om een taak te volbrengen. Een voorbeeld
is het Response object waarmee dingen naar de browser kunnen worden gestuurd
en het Request object waarmee ASP de gebruiker om informatie vraagt. PHP
heeft geen objecten, alle functies zijn gescheiden, zonder logische groepering van
functies.
Het grote voordeel van PHP tegenover ASP is de open source van PHP en dat
het meer platform onafhankelijk is. ASP biedt daarentegen een object-gebaseerde
omgeving en een bredere ondersteuning van programmeertalen. Uiteindelijk zijn
ze beiden erg geschikt voor het dynamisch maken van een website en deze te
koppelen aan een database.
6
http://en.wikipedia.org/wiki/PHP (22-12-04)
http://www.sun.com/software/chilisoft/index.xml Uitleg over Sun Java System ASP (2212-04)
7
Hoofdstuk 4. De mogelijkheden om databases te koppelen aan internet
4.6
29
Conclusie
Voor het koppelen van een database aan een dynamische site zijn zowel ASP als
PHP erg goede opties en het is moeilijk te besluiten welke van deze twee gekozen
zou moet worden. Dit is vaak sterk afhankelijk van welke talen de programmeur
al kent en onder welk besturingssysteem/webserver hij/zij de website wil laten
draaien. Beide overwegingen mogen echter niet gelden voor deze scriptie. De
andere genoemde manier om databases aan dynamische websites te koppelen zijn
minder geschikt dan ASP en PHP, vanwege de diverse genoemde nadelen.
Deze scriptie heeft als doel te kijken of er een systeem kan worden gemaakt
waarmee statische HTML pagina’s, die erg veel tekst bevatten, dynamisch kunnen
worden aangestuurd vanuit een database en hoe dit dan het beste kan worden
gedaan. Het USA project van de rijksuniversiteit van Groningen zal hierbij als
uitgangspunt dienen.
Aangezien PHP en ASP de meestgebruikte en best ondersteunde opties zijn
voor het koppelen van een database aan een website en deze dynamisch te maken
(en het bovendien erg moeilijk is om op basis van de theorie aan te wijzen welke
van deze twee het meest geschikt is voor het systeem dat wij voor ogen hebben)
zal het systeem gebouwd worden in zowel ASP als PHP, waarna een vergelijking
tussen die twee gemaakt zal worden.
Hoofdstuk 5
De dynamische website bouwen
De dynamische website die ik zal maken voor deze scriptie, heeft de website van
het USA project van de RuG als uitgangspunt. Maar aangezien dit een zeer omvangrijke website is, met duizenden html-pagina’s, is het binnen het tijdsbestek
van deze scriptie niet praktisch om deze complete website als uitgangspunt te
nemen. Ik zal me daarom concentreren op één specifiek onderdeel van de USA
website, namelijk het gedeelte over de Amerikaanse presidenten.1 Dit onderdeel
laat een lijst zien van alle Amerikaanse presidenten, van de eerste president (George Washington) tot de huidige (George W. Bush). Elke naam uit de getoonde
lijst is een hyperlink naar een pagina met verdere gegevens over die president,
zoals een korte biografie, speeches die de president gehouden heeft en publicaties
van de president. Zie hieronder bijvoorbeeld de pagina van Thomas Jefferson op
de USA site.
1
http://odur.let.rug.nl/ usa/P/index.htm een index van alle Amerikaande presidenten
30
Hoofdstuk 5. De dynamische website bouwen
31
Bron: http://odur.let.rug.nl/ usa/P/tj3/index.htm de pagina over Thomas Jefferson)
Het moge duidelijk zijn dat zelfs zo’n relatief klein onderdeel van het USA
project als het presidenten gedeelte nog een hele grote hoeveelheid gegevens bevat, verspreid over honderden html pagina’s. Een gedeelte van deze pagina’s zal
ik in een database invoeren en logisch ordenen in een relationele structuur om
redundantie te vermijden. Hierna zal een dynamische website gebouwd worden
die de gegevens weer uit de database haalt als de bezoeker hier om vraagt. Dit
zal een aantal belangrijke voordelen opleveren:
• Alle tekst zal op een centrale plek komen te staan, wat het beheer ervan
aanzienlijk zal vereenvoudigen. Ook zal het makkelijker zijn om een backup
te maken van de gegevens.
• Een dynamische pagina die de inhoud van de website genereert (inclusief
hyperlinks) op basis van de inhoud van de database zal nooit te maken
krijgen met inactieve links.
• Een aanpassing in de database brengt meteen een aanpassing voor de gehele site met zich mee. Als bijvoorbeeld in de database een naam wordt
veranderd van een president, zal die naam overal op de website zo worden
getoond.
• Meerdere mensen kunnen de website beheren, omdat een database systeem
toestaat dat meerdere mensen tegelijk aan hetzelfde bestand werken.
• Het wordt veel eenvoudiger om nieuwe gegevens toe te voegen aan de website en om specifieke teksten te herzien.
• Het aantal files (de html-pagina’s) zal drastisch verkleind worden, wat ook
weer belangrijke voordelen met zich meebrengt voor het beheer (Denk bijvoorbeeld aan het veranderen van de layout).
5.1
De versie van de scripttaal kiezen
Omdat het niet vooraf duidelijk is waarmee je een dergelijke site het beste kunt
maken, zal ik de website in zowel ASP als PHP ontwerpen. Om een goede
vergelijking mogelijk te maken is het noodzakelijk om ASP en PHP versies te
gebruiken die voldoen aan twee voorwaarden:
• Het zijn uitontwikkelde versies;
• Ze zijn beide in min of meer hetzelfde tijdperk ontwikkeld
Hoofdstuk 5. De dynamische website bouwen
32
Een niet volledig uitontwikkelde versie van ASP of PHP kan nooit als basis dienen
voor een vergelijking met een wel uitontwikkelde versie. In een uitontwikkelde
versie zullen serieuze bugs zijn verholpen, bepaalde veiligheidsproblemen zijn
opgelost en het geheel zal uitgebreid getest zijn in de praktijk. Een niet uit
ontwikkelde versie zal daarentegen teveel kinderziektes bevatten.
Het is ook vereist om ASP en PHP versies met elkaar te vergelijken die min
of meer in hetzelfde tijdperk zijn ontwikkeld, omdat er anders geen goede basis
ligt voor een vergelijking. Een ASP versie van 2002 zal namelijk bepaalde functionaliteiten niet hebben, die een PHP versie uit 2004 wel zal hebben, omdat de
ontwikkeling van websites, databases en alle andere dingen die met internet en
computers te maken hebben nooit stil staat. Versies die in hetzelfde jaar zijn
ontwikkeld, zijn gebaseerd op dezelfde technologie en standaarden waardoor deze
wel goed met elkaar te vergelijken zijn.
Om deze redenen is er gekozen voor ASP versie 3.0, de laatste uitontwikkelde
versie van de klassieke ASP, voordat ASP.NET beschikbaar kwam. ASP.NET
maakt gebruik van een geheel andere opzet dan de voorgaande ASP versies en is
in wezen niet goed vergelijkbaar met deze oudere versies. Zo is ASP.NET object
georiënteerd, maakt het gebruikt van voorgecompileerde code, is er een strikte
scheiding tussen de programmacode en de HTML en heeft het een uitgebreide
klassen bibliotheek.2
ASP versie 3.0 werd beschikbaar gesteld met het uitkomen van Windows 2000
(en Internet Information Server 5.0) en is kort na het begin van het jaar 2000
uitgekomen.
Voor PHP is er gekozen voor versie 4.0. Op het moment van schrijven is versie
5.0 van PHP al uit, maar nog lang niet overal in gebruik en deze PHP versie heeft
dezelfde problemen als ASP.NET in vergelijking met voorgaande versies. Versie
5.0 van PHP is onder andere niet goed te vergelijken met oudere PHP versies,
want deze maakt gebruik van een nieuwere engine (De Zend 2.0 engine).3 PHP
versie 4.0 is uitgekomen in mei 2000 en is daarmee dus ook goed te vergelijken
met ASP versie 3.0 qua tijdsperiode.
2
http://www.awprofessional.com/articles/article.asp?p=24406&seqNum=3 ASP.NET versus ASP (02-02-05)
3
http://www.zend.com/zend/zend-engine-summary.php Uitleg over de zend engine (03-0205)
Hoofdstuk 6
ASP 3.0
Het maken van een dynamische pagina met ASP 3.0 vereist een aantal benodigdheden. Deze zijn:
• Een webserver (die ASP ondersteunt);
• Een database systeem waarmee ASP een koppeling tot stand kan brengen
ASP draait op meerdere soorten webservers. De meestgebruikte combinatie is een
windows besturingssysteem (minimaal windows 2000) en de daarbij geleverde IIS
(Internet Information Server). Aanbevolen is minimaal IIS 5.0.
Het is mogelijk om oudere windows webserver software te gebruiken in combinatie met ASP (zoals Microsofts Personal Webserver) maar dan is het noodzakelijk om allerlei patches te downloaden en te installeren, zoals de Option Pack 4.0
voor Personal Webserver. Aangezien Internet Information Server 5.0 standaard
bij windows 2000 bijgeleverd zit, geeft de meerderheid van de gebruikers hieraan
de voorkeur.
ASP wordt niet standaard ondersteund door niet-Microsoft webservers, maar
ook hiervoor zijn oplossingen te bedenken. Zo biedt het bedrijf Sun Microsystems
een optie om ASP te draaien onder Apache webservers en uiteraard de Sun Java
System Web Server.1 Dit zijn echter commerciële oplossingen, waardoor ze (veel)
minder worden gebruikt dan de standaard opties om ASP te hosten.
Voor deze scriptie zal uit praktische overwegingen IIS 6.0 gebruikt worden,
draaiend onder een Microsoft Windows XP besturingssysteem. Er wordt hierbij vanuit gegaan dat ASP het beste werkt in combinatie met de aanbevolen
webserver ervoor.
1
http://versora.com/catalog/product info.php?products id=37 Sun producten catalogus
(03-02-05)
33
Hoofdstuk 6. ASP 3.0
6.1
34
Het database systeem kiezen
De tweede stap voor het maken van een dynamische website, gekoppeld aan een
database is het kiezen van het database systeem. Waarna het ontwerpen van de
database volgt, de basis van de dynamische website. Een goed opgezette database
waarin de tekstuele gegevens van de website worden opgeslagen, is noodzakelijk
voor het goed functioneren van een dynamische website. Als de database structuur niet in orde is, zal dit tot fouten leiden voor bezoekers van de website.
Allereerst dient er bepaald te worden welke relationeel databasemanagement
systeem het meest geschikt is voor de ASP website, die ik voor deze scriptie maak.
Enkele voorbeelden van populaire commerciële databasesystemen zijn: Oracle,
Sybase, Informix, Microsoft SQL Server, Microsoft Access en DB2. Enkele voorbeelden van populaire open source databasesystemen zijn: Postgres, Interbase en
MySQL. Al deze database systemen zijn geschikt te gebruiken in combinatie met
ASP.
Van belang is echter de snelheid van de database verbinding. Hoe sneller de
verbinding, hoe meer gegevens er per seconde uit kunnen worden gehaald door de
ASP pagina (en hoe meer het gebruikersgemak voor de bezoeker van de website
toeneemt). Het is dus belangrijk om de snelst mogelijke verbinding tot stand te
brengen. Dit geldt zeker voor websites waarvoor veel bezoekers worden verwacht.
ASP kent drie hoofdmanieren om een verbinding tot stand te brengen met de
database:
• ODBC met DSN;
• ODBC zonder DSN;
• OLEDB zonder DSN.
De eerste, ODBC (Open Database Connectivity) met DSN (Data Source Name), is de langzaamste van de drie. ODBC is een standaard voor database
verbindingen en vrijwel elk database managementsysteem ondersteunt dan ook
ODBC. Met Microsoft Windows kunnen ODBC koppelingen gemaakt worden
naar de databasebestanden. De DSN bevat de benodigde informatie om de database te openen, zoals wat de locatie van de database is. Deze methode is relatief
langzaam omdat ASP elke keer als er een verbinding nodig is de gegevens van de
DNS moet opvragen (uit het register bestand van Windows).
De tweede optie, ODBC zonder DSN, is dan ook sneller omdat je met deze methode de stap overslaat waar ASP de gegevens van de DSN moet opzoeken. Met
deze methode wordt eerst de ODBC database driver voor de betreffende database
gespecificeerd, daarna de informatie waarin de database zich exact bevindt (de
directory) en vervolgens de logingegevens voor die database. Elke methode die
gebruik maakt van ODBC blijft echter relatief traag, omdat ASP niet rechtstreeks
verbinding heeft met de database, maar via de extra ODBC laag.
Hoofdstuk 6. ASP 3.0
35
De derde optie, gebruik maken van OLEDB, is dan ook de snelste. OLEDB
lijkt op ODBC, maar is nieuwer, flexibeler en sneller. Helaas zijn er wel minder
databases systemen die OLEDB ondersteuning bieden. De drie belangrijkste
die wel OLEDB ondersteunen zijn Microsoft SQL server, Microsoft Access en
Oracle. Geen van deze drie is open source. De beste resultaten met ASP en
OLEDB worden geboekt met Microsoft SQL server en Microsoft Access, waarbij
SQL Server de snelste verbindingsresultaten geeft en Access veel sneller door de
database records heen loopt. Zie hiervoor ook de onderstaande tabel
Performance Comparison
SQL
Access
OLEDB DSN OLEDB DSN
Connection times:
18
82
62
99
Iterating through 1,000 Records Times:
2900
5400
100
950
bron: http://www.4guysfromrolla.com/webtech/063099-1.shtml (03-02-05)
Microsoft SQL server is bovendien meer geschikt voor grote hoeveelheden
verbindingen tegelijk.2 Dit komt door de manier waarop SQL Server werkt. Als
er een verbinding met Access wordt aangegaan wordt de gehele benodigde tabel
in het geheugen geladen, waarna er snel doorheen geloopt kan worden. Echter,
zodra er honderd of meer gebruikers gebruik zullen maken van een verbinding, zal
de server vrij snel met geheugen problemen te kampen krijgen. Dit verklaart ook
waarom Access bij kleine aantallen gebruikers sneller zal zijn dan SQL Server.
Voor het ontwerpen van een website moet dus worden overwogen hoeveel
bezoekers er worden verwacht. Indien dit er erg veel zijn, kan er beter worden
gekozen voor Microsoft SQL server boven Microsoft Access.
Voor de daadwerkelijke ontwikkeling van de website maakt dit verder niet uit.
ASP gaat op dezelfde manier om met een koppeling met Microsoft SQL server als
met een koppeling met Microsoft Access. Het enige verschil is een aantal regels
code om de database aan te roepen. De keuze tussen SQL server en Access is
dus puur een keuze gebaseerd op het verwachte aantal bezoekers van de website.
Aangezien ik beschik over Microsoft Access, maar niet over Microsoft SQL
Server zal ik uit praktische overwegingen gebruik maken van Access als een database systeem met OLEDB als de koppeling. Zou ik de website daadwerkelijk
online willen zetten, dan zou ik de voorkeur geven aan SQL Server boven Access.
6.1.1
De database ontwerpen
Nu er een keuze is gemaakt voor een database management systeem (Access),
kunnen we beginnen met het opzetten van de database structuur voor de website
zoals we die voor ogen hebben.
2
http://msdn.microsoft.com/library/default.asp?url=/library/enus/dnacc2k/html/acmsdeop.asp Over eigenschappen van de Access Jet Engine en de
SQL Server MSDE engine
Hoofdstuk 6. ASP 3.0
36
Hiervoor is eerst een analyse nodig van de gegevens die we willen opnemen
in de database. De kern van de website bestaat uit de 43 presidenten van de
Verenigde Staten van Amerika.3 Deze 43 presidenten zullen getoond worden
op de hoofdpagina als een lijst hyperlinks, die doorverwijzen naar een pagina
met nadere informatie over de specifieke president. Deze pagina bevat dan zelf
ook weer hyperlinks naar meer informatie, zoals de tekst van een speech die de
betreffende president gehouden heeft. Ik heb alle pagina’s van de presidenten
bekeken en bijgehouden wat voor soort informatie er werd getoond. Mijn analyse
leverde een lijst op, die te vinden is in bijlage B. De presidentiële pagina’s hebben
kort samengevat de volgende inhoud:
• Een hoofdpagina met links naar verdere informatie over de president.
• Deze pagina’s met verdere informatie bevatten allemaal een portretafbeelding van de president en verscheidene links naar teksten met meer informatie over de president.
• De teksten waar naar gelinkt wordt, bevatten allemaal quote links en bijna
allemaal context links.
• Quote bevat meta informatie over de tekst. Enkele daarvan (zoals: size
en identifier ) zijn niet langer relevant als de tekst in een database wordt
gestopt.
• Context bevat informatie over de context van de tekst, zoals bijvoorbeeld
waar de tekst over gaat en waarom hij geschreven is.
Deze pagina-structuur moet zo goed mogelijk worden omgezet in een relationele
database structuur. Op deze manier kan de website en de tekstuele informatie
ervan zo efficiënt mogelijk beheerd worden.
Op basis van de analyse heb ik een database structuur ontworpen waarin
het presidentiële gedeelte van het USA project zo goed mogelijk kan worden
opgenomen. (Zie hiervoor bijlage C). De verschillende database tabellen, die
bijna allemaal in relatie met elkaar staan door unieke sleutelvelden, garanderen de
integriteit van de database en voorkomen redundantie. Zo wordt er bijvoorbeeld
gegarandeerd dat elke president maar één keer voorkomt (unieke record in de tabel
presidents), waarbij alle gegevens die bij die specifieke president horen, zoals de
biografie en publicaties, weer in andere tabellen zijn opgenomen. Alle teksten
met verdere informatie bevatten tenslotte een link naar de specifieke quote en
context tabellen met meta-informatie over deze teksten.
De quote tabellen zijn weer gelinkt naar noodzakelijke tussentabellen om een
veel-op-veel relatie te garanderen waar dat nodig is. Zo kan een tekst meerdere auteurs hebben, die zelf weer aan meerdere teksten in de database hebben
meegewerkt.
3
Zie bijlage A voor een lijst met alle presidenten
Hoofdstuk 6. ASP 3.0
37
Tenslotte zijn er nog twee tabellen (content en meta information) die de informatie van de pagina zelf bevatten; die verder niets met de presidenten te maken
heeft. Het geheel van deze database bevat in wezen de gehele tekstuele informatie
van de website, waardoor er slechts een gering aantal ASP-pagina’s nodig zijn om
het complexe geheel aan te sturen.
Hierbij belanden we bij de volgende stap: het ontwerpen van de ASP-pagina’s.
6.2
De ASP Pagina’s ontwerpen
De opzet van de ASP pagina’s is dat alles waarin programmeercode staat een
eigen ASP-pagina krijgt. Alle pagina’s die alleen uit HTML bestaan, komen in
de database te staan. Dit staat garant voor een minimale hoeveelheid bestanden,
waarbij bovendien de website kan worden beheerd door personen met minimale
kennis van HTML. Er is geen ASP kennis voor nodig om nieuwe teksten en
dergelijke aan de website toe te voegen. Wel is het uiteraard noodzakelijk dat
er bij de website een goede documentatie komt waarin beschreven staat hoe de
website is opgezet en waar alles te vinden is.
6.2.1
De opzet van de website
De begin pagina van de website (index.asp) is de belangrijkste. Vanuit die pagina
staan er links naar verdere pagina’s, waarna de website zich verder vertakt. Voor
de opzet van deze scriptie heb ik de hoofdpagina van USA website van de RuG
min of meer overgenomen (dezelfde tekst en dezelfde stylesheet). Zie hieronder
een screenshot van de index pagina:
Hoofdstuk 6. ASP 3.0
38
De index pagina is als volgt opgezet:
• Bovenaan staat een logo;
• Links bevindt zich een menu met links naar de verschillende onderdelen van
de website;
• Onder het logo is een overzicht te vinden van de verschillende news-items;
• De rest van de pagina wordt in beslag genomen door een introductie tekst;
• Het geheel wordt afgesloten met een footer met copyright informatie.
De menu items en de news items worden aangemaakt door twee javascripts.
Deze twee scripts heb ik overgenomen voor de scriptie website en daarbij alle
links inactief gemaakt, behalve degene naar het presidenten gedeelte (omdat dat
het enige gedeelte is wat voor deze scriptie in een database zal worden gezet). De
introductietekst staat uiteraard in de database.
Index.asp bevat ter illustratie de volgende ASP code (in VB script):
<%
’ de p a g i n a opvragen u i t de q u e r y s t r i n g
pagina=request . querystring ( " pagina " )
Hoofdstuk 6. ASP 3.0
39
if pagina = " " then
pagina=" index "
end if
’ daarna de p a g i n a z e l f p r i n t e n ( header , t e k s t u i t db , f o o t e r )
%>
<!−− #include file =" inc \ print_header . inc . asp " −−>
<!−− #include file =" inc \ print_footer . inc . asp " −−>
Het systeem is dat elke pagina in de website wordt doorgegeven als een querystring variabele. De URL balk zal er bijvoorbeeld uitzien als:
http://...../index.asp?pagina=presidents. De website gaat vervolgens een verbinding maken met de database en kijken of die betreffende pagina wel aanwezig
is. Voor elke pagina die zelf ASP code bevat om iets aan te sturen zal een uitzondering worden gemaakt en is ze niet opgenomen in de database, maar als
bestand aanwezig. Index.asp bevat twee include bestanden: print header.inc.asp
en print footer.inc.asp.
Print header.inc.asp verzorgt het bovenste gedeelte van elke pagina en roept
een ander include bestand aan dat de verbinding met de database verzorgt (dbconn.inc.asp) en kijkt of de gevraagde website wel aanwezig is. Zo niet, dan volgt
een foutmelding.
Print header.inc.asp bevat tenslotten een include bestand dat kijkt of een
specifieke pagina moet worden opgebouwd met ASP code of dat die alleen uit
tekst bestaat dat uit de database kan worden gehaald. Zo zal de pagina die een
overzicht laat zien van alle presidenten moeten worden opgebouwd door middel
van ASP code, maar zal een pagina die de biografie laat zien van een president
simpelweg uit de database worden gehaald, omdat dat alleen tekst is zonder ASP
code.
Het include bestand print footer.inc.asp tenslotte laat de footer van de pagina zien (met copyright informatie). De programma code van alle pagina’s kan
worden gevonden in Bijlage D.
De index pagina van de door mij gemaakte website ziet er dan uiteindelijk
precies zo uit als die van de originele USA website, maar met veel minder statische
html-bestanden. De kracht van een website beheerd door middel van databases
komt echter veel duidelijker naar voren als we het specifieke presidenten gedeelte
onder de loep nemen.
6.2.2
Het presidenten gedeelte nauwkeuriger bekeken
De presidenten zitten allemaal als een unieke entry in de database samen met de
gegevens die moeten worden getoond op de website, zoals voornaam, achternaam,
Hoofdstuk 6. ASP 3.0
40
geboortejaar en sterftejaar. Dit geldt ook voor de presidentiële periodes, die met
een uniek ID worden verbonden met de presidenten. Dit is de basis van de
hoofdpagina van het presidenten gedeelte.
Deze pagina wordt opgebouwd door middel van een SQL query die alle regeerperiodes langsloopt:
SELECT term id, president id, beginjaar, eindjaar FROM
usa presidents terms WHERE term id > 0
Gedurende het uitvoeren van deze query worden alle presidentiële gegevens aangeroepen met de volgende query:
SELECT voornaam, achternaam From usa presidents WHERE president id = ”&selectPresidentTerm(1)&”
Waarbij de variabele selectPresidentTerm(1) het ID van de president is uit de
eerste query.
Nadat alle presidenten op deze manier worden gekoppeld aan hun regeerperiodes wordt door middel van een laatste query alle externe links getoond die bij
deze pagina horen:
SELECT titel, link, by, link by FROM Usa presidents extern
WHERE President id = 0
ID 0 is het algemene ID in de database, dat voor alle presidenten geldt. Door
middel van deze drie SQL queries wordt de hoofdpagina opgebouwd. Dit toont
duidelijk aan wat de kracht is van een dynamische website aangestuurd door een
database. Alle kerngegevens zitten in de database. Als nu bijvoorbeeld blijkt
dat de voornaam van een president verkeerd gespeld is, dan volstaat het om de
database record voor die president aan te passen. In de hele verdere website
zal deze correctie dan worden getoond. Als er een nieuwe president aantreedt
na George W. Bush4 , dan kan deze eenvoudig worden toegevoegd als een nieuwe
entry in de tabel voor de presidenten. Deze methode vereist wellicht meer werk bij
het opzetten van de website, zoals het uitzoeken van een goede structuur voor de
database en uiteraard meer programmeerkennis, maar is daarna veel makkelijker
te beheren. De code van de ASP pagina’s die het presidentiële gedeelte opbouwen
is te vinden in bijlage D.
6.2.3
De gegevens van de presidenten in de database invoeren
Nu de presidentiële hoofdpagina af is, moeten de gegevens die bij de presidenten
horen in de database worden ingevoerd, waarna deze informatie door middel van
ASP gekoppeld kan worden aan de presidenten.
4
George W. Bush is de president van de Verenigde Staten op het moment van schrijven van
deze scriptie.
Hoofdstuk 6. ASP 3.0
41
Er zijn in totaal 42 presidenten in de database (Grover Cleveland was twee keer
president). Elke president heeft een eigen pagina met meer informatie over deze
president, deze pagina bevat meestal een link naar de biografie van de president.
Soms is een biografie niet aanwezig, in dat geval wordt de bezoeker gevraagd
om zelf een tekst aan te leveren. Er is ook altijd een portret afbeelding van de
president aanwezig.
Tenslotte is er altijd informatie over de inaugural address van de president en
de state of union.
In het voorbeeld hieronder van een presidentiële pagina, is de informatie dat
er geen inaugural address en state of union aanwezig is.
Een voorbeeld van een pagina met een minimale hoeveelheid gegevens
De meeste presidentiële pagina’s bevatten echter veel meer gegevens, zoals
meerdere inaugural addresses, meerdere states of the nations (of unions), links
naar teksten van de president, publicaties, brieven en externe links.
Deze informatie is aanwezig in meer dan 1000 bestanden verspreid over meer
dan 170 mappen. Om al deze informatie handmatig in de database te stoppen
zou een gigantisch karwei zijn en daarom is het noodzakelijk om dit proces zo
goed mogelijk te automatiseren.
De bestandsindeling van de originele USA website is dat elke president een
folder heeft, waarvan de naam bestaat uit de eerste twee initialen van zijn naam,
gevolgd door een nummer dat aangeeft de hoeveelste president het is. Zo bevinden
de documenten van George Washington zich in de folder gw1.
Helaas is er geen consistentie in de bestandsnamen van de verschillende teksten. Zo bevinden alle speeches van George Washington, inclusief zijn inaugural
address zich in de directory /speeches maar hebben de inaugural addresses de
bestandsnamen wash1.htm en wash2.htm, de andere speeches hebben de namen
Hoofdstuk 6. ASP 3.0
42
gwson1.htm t/m gwson8.htm. Voor andere presidenten is dit weer anders. De
inaugural address van John Adams bevindt zich in het bestand inaug1.htm en
zijn overige speeches in de bestanden jason1.htm t/m jason4.htm.
Uiteraard betekent een dergelijke inconsitentie in naamvoering dat het niet
mogelijk is om de verschillende teksten automatisch in de database in te lezen.
Ik heb daarom, nadat ik de noodzakelijke structuur in zowel de database als de
ASP pagina’s had gemaakt, de gegevens van één president (George Washington)
handmatig toegevoegd. Zodat in ieder geval de werking van de website voldoende
kan worden gedemonstreerd. Zodra geklikt wordt op de link naar deze president
in het overzicht van de presidenten, worden alle teksten getoond die in de database
gekoppeld zijn aan George Washington. Als er teksten worden toegevoegd aan de
database worden die vervolgens automatisch in het overzicht getoond. Teksten
die worden verwijderd, zijn ook niet langer meer te zien in het overzicht.
De teksten die bij George Washington horen worden uit de database gehaald en getoond
6.2.4
De website beheren
Er is tenslotte nog een functie nodig om de website te beheren op afstand. Een
zogenaamde administrator moet teksten kunnen toevoegen, verwijderen en wij-
Hoofdstuk 6. ASP 3.0
43
zigen. Hiervoor heb ik een admin gedeelte gemaakt. Als er geklikt wordt op de
link admin in het menu volgt onderstaand scherm:
Inloggen als administrator
Hiermee kan worden ingelogd als administrator. De ingevoerde gegevens worden vergeleken met de database tabel Login waar alle administrators zijn opgenomen. Na succesvolle controle van deze gegevens is iemand ingelogd als beheerder
en krijgt hij/zij de mogelijkheid om teksten aan de website toe te voegen, teksten
te verwijderen en om bestaande teksten te wijzigen.
Elke pagina binnen de website controleert of de bezoeker ook ingelogd is als
administrator. Is dit het geval, dan heeft de beheerder de optie om teksten te
verwijderen, toe te voegen en te wijzigen. Op deze manier kan de website beheerd
worden zonder aanwezige kennis van HTML, ASP of zelfs databases. Het volstaat
nu bijvoorbeeld te klikken op de link ’voeg een tekst toe voor deze president’ en
daarna de tekst in te voeren, plus noodzakelijke informatie zoals wat voor soort
tekst het is en om welk jaar het gaat. Deze tekst zal dan automatisch worden
toegevoegd aan de website en getoond worden als op het overzicht wordt geklikt
Hoofdstuk 6. ASP 3.0
44
van de betreffende president. Hetzelfde gebeurd bij het verwijderen en wijzigen
van teksten.
Ter illustratie de pagina over George Washington, nadat je bent ingelogd als
beheerder:
De pagina over George Washington wanneer een beheerder de pagina bekijkt
De beheerder kan nu, om teksten te verwijderen, klikken op de afgebeelde
rode kruisjes, waarna een dialoogscherm volgt die om een bevestiging vraagt. Na
bevestiging wordt de tekst uit de database verwijderend en is het overzicht dat
bij de president hoort ook aangepast. Om een tekst toe te voegen kan geklikt
worden op de link ’[Voeg een tekst toe voor deze president]’, waarna onderstaande
scherm volgt:
Hoofdstuk 6. ASP 3.0
45
Het wijzigen van een tekst gebeurt op dezelfde wijze. Als een gebruiker die
ingelogd is als beheerder een pagina opent met een tekst, komt daar een link te
staan waarmee de tekst gewijzigd kan worden. De gehele website kan dus beheerd
worden door gebruikers zonder kennis van HTML of ASP. Ook kan de website nu
beheerd worden door meerdere personen, die niet langer aan een lokatie gebonden
zijn.
Tenslotte is het ook mogelijk om verschillende rechten te verbinden aan een administrator account. Te denken valt aan een superadministrator die alle rechten
heeft en bijvoorbeeld administrators die alleen bestaande teksten mogen wijzigen.
Het is ook mogelijk om alle wijzigen die administrators aanbrengen tijdelijk
op te slaan in een backup database, zodat de hoofdadministrator alle gemaakte
wijzigingen kan beoordelen voor ze definitief door te voeren.
Al met al betekent een dergelijk systeem dat een grote tekstgebaseerde website
vele malen eenvoudiger kan worden beheerd dan met de traditionele methode van
afzonderlijke HTML-pagina’s voor elke tekst.
6.3
Conclusie
Een grote tekstgebaseerde website kan relatief eenvoudig in een database kan
worden ingevoerd, waarna deze website veel eenvoudiger te beheren is. Ook
gelden nog een aantal andere voordelen die hierboven zijn beschreven.
Hoofdstuk 6. ASP 3.0
46
Dit alles is met ASP 3.0 goed te realiseren. Zie bijlage D voor de broncode
van het ASP-gedeelte.
Het uiteindelijke resultaat van de conversie van het presidentiële gedeelte naar
een dynamische website is 24 ASP-pagina’s, een Access database waarin alle tekstuele informatie ingevoerd is, de noodzakelijke afbeeldingen (zoals de portretten
van de presidenten) en tenslotte een CSS-bestand voor de layout. Vergeleken
met de originele site, waar het presidentiële gedeelte bestaat uit meer dan 1000
pagina’s in 177 directories springt de verbeterde efficientie meteen in het oog.
Uiteraard waren er ook een aantal problemen tijdens de conversie die opgelost moesten worden. Zo bleek het niet mogelijk te zijn om de aanwezige tekst
automatisch in te lezen in de database, waardoor dit handmatig moest gebeuren.
Het zal dan ook een grote tijdsinspanning vereisen voor een grootschalige website
als het USA project om deze om te zetten naar een dynamische versie.
Voor bestaande tekstgebaseerde websites dient zich dan ook de vraag aan of
de kosten wel opwegen tegen de baten. Mijns inziens is het wel de moeite waard
te investeren in een omschakeling naar een dynamische versie, omdat op langere
termijn de voordelen zullen opwegen tegen de benodigde tijdsinvestering. Dit
geldt zeker als de website meerdere beheerders zal hebben.
Verder moet nog opgemerkt worden dat een dergelijke omschakel procedure
een grondige analyse vereist. Zo bleek dat het niet voldoende was om de presidentiële termijnen in dezelfde tabel in te voeren als de presidenten, omdat er één
president was, Grover Cleveland, die niet in twee achtereenvolgende termijnen
president is geweest. Er waren meer van dergelijke uitzonderingen die opgelost
moesten worden tijdens het programmeren van de website. Hoe complexer de
materie, hoe moeilijker het is om deze te vangen in een strakke structuur.
Ik had niet de indruk dat er specifieke moeilijkheden waren die te maken
hadden met de keuze voor ASP als de scripttaal. Het systeem is goed te realiseren
in ASP. Nu aangetoond is dat het systeem dat we voor ogen hadden mogelijk is
in ASP, dient hetzelfde te gebeuren met PHP. Hierna kan worden gekeken welke
van de twee uiteindelijk de beste optie is om een dynamische website te maken
voor grote tekstgebaseerde projecten.
Hoofdstuk 7
PHP 4.0
Het maken van een dynamische website met PHP 4.0 vereist een webserver die
PHP ondersteunt en een databasesysteem waarmee PHP een koppeling tot stand
kan brengen. De meestgebruike combinatie voor PHP is een Apache webserver1 ,
draaiend op een Unix server. Apache is veruit de populairste webserver. Apache
is een open-source project, net zoals Linux, PHP zelf en MySQL. Apache draait
ook erg goed en stabiel onder een Windows besturingssysteem, al is IIS een betere
webserver voor Windows.2
Voor deze scriptie zal ik uit praktische overwegingen gebruik maken van een
Apache server3 draaiend onder Microsoft Windows XP. Zou de website daadwerkelijk gehost worden, dan zou ik kiezen voor een provider die een Apache server
zou draaien onder Unix.
7.1
Het database systeem kiezen
In principe kan PHP communiceren met elk relationeel databasesysteem (net
zoals ASP), maar van de beschikbare relationele databasesystemen, is de meestgebruikte combinatie PHP met een MySQL database. Samen met een Apache
webserver betekent dit een volledige open-source combinatie. De combinatie PHP
en MySQL heeft dan ook niet voor niets de bijnaam Dynamic Duo.4 Veel boeken
die over PHP gaan, gaan er ook vanuit dat MySQL als database systeem wordt
gebruikt, met als belangrijkste argument dat het open-source (en dus gratis) is.
In de vroeger versies van MySQL was er veel kritiek op door database experts,
omdat MySQL bepaalde relationele basis principes niet had overgenomen, zoals
stored procedures en transacties (een manier om data te bewaren wanneer de
1
http://news.netcraft.com/archives/web server survey.html Netcraft Webserver Survey Archives (05-04-05), 70% van de webservers is een Apache webserver.
2
Jay Greenspan en Brad Bulger, MySQL/PHP Database Applicaties (Amsterdam 2001)
3
Versie 2.0.53, de meest recente op het moment van schrijven. Versie 2.x heeft betere
ondersteuning voor windows platforms.
4
http://en.wikipedia.org/wiki/MySQL Wikipedia artikel over MySQL (07-04-05)
47
Hoofdstuk 7. PHP 4.0
48
server crasht). De MySQL handleiding argumenteerde altijd dat deze opties niet
nodig waren voor een goed werkende database.
De nieuwste versie van MySQL heeft echter deze opties wel. Zoals David
Axmark, een mede-oprichter zei:
”People have been criticising MySQL since we started [in 1995] for
not having stored procedures, triggers and views. We’re fixing 10 years
of criticism in one release.” 5
Er wordt in de scriptie vanuit gegaan dat PHP het beste werkt in combinatie met
de aanbevolen database ervoor door vele handleidingen en de website van PHP
zelf.6
7.1.1
De database ontwerpen
Aangezien de database structuur al was ontworpen voor het ASP gedeelte, was
de meest eenvoudige oplossing deze database structuur (en de inhoud) over te
nemen en te importeren in MySQL.
Gelukkig bestaan hiervoor een aantal tools. Ik heb gekozen om de Access
database om te zetten naar MySQL met behulp van het programma DB Converter
1.57 van Zenwerx, een shareware programma speciaal gemaakt om een Access
database om te zetten naar MySQL of Oracle. Hiermee is het gelukt om de
bestaande database, inclusief de inhoud, zonder noemenswaardige problemen om
te zetten naar MySQL.
7.2
De PHP Pagina’s ontwerpen en de opzet
van de website
Aangezien het doel van deze scriptie uiteindelijk is te kijken welke server side
scripttaal het meest geschikt is voor het maken van de dynamische website die
we voor ogen heb, heb ik er voor gekozen om de ASP/VBScript code die ik al
geprogrammeerd heb om te zetten naar PHP code. Op deze manier is een vergelijking goed te maken, aangezien ASP en PHP dan exact dezelfde handelingen
moeten doen. Waar dit mogelijk was, heb ik gebruik gemaakt van specifieke PHP
functies om hetzelfde doel te bereiken als met ASP. Bijvoorbeeld de PHP functie nl2br, waarmee HTML breaks worden gezet voor alle newlines in een string,
voor het admin gedeelte van de website. ASP heeft een dergelijke functie niet en
daarvoor moest ik dan ook zelf iets programmeren.
5
http://news.zdnet.co.uk/software/applications/0,39020384,39192964,00.htm Zdnet
news (07-04-05)
6
http://nl2.php.net/tut.php PHP: A simple tutorial (07-04-05)
7
http://www.zenwerx.com/ Website waar DB convert te downloaden is (07-04-05)
UK
Hoofdstuk 7. PHP 4.0
49
Het eindresultaat is de ASP website omgezet in PHP. De twee websites functioneren dan op precies dezelfde manier.
Index.php bevat ter illustratie de volgende PHP code:
<?php
// de p a g i n a opvragen u i t de q u e r y s t r i n g
$pagina=$_REQUEST [ ’ pagina ’ ] ;
if ( $pagina == " " ) {
$pagina=" index " ;
}
// daarna de p a g i n a z e l f p r i n t e n ( header , t e k s t u i t db , f o o t e r )
include ( " ./ inc / print_header . inc . php " ) ;
include ( " ./ inc / print_footer . inc . php " ) ;
?>
Ook de PHP-pagina’s maken gebruik van include bestanden, op dezelfde wijze
als de ASP pagina’s.
7.3
Conclusie voor het PHP gedeelte
Wat met ASP 3.0 goed te realiseren was, is met PHP 4.0 net zo goed te realiseren.
Zie bijlage E voor de broncode van het PHP-gedeelte. Het uiteindelijke resultaat
van de conversie naar een dynamische PHP website is 24 PHP-pagina’s (net zoveel
als bij ASP), een MySQL database waarin alle tekstuele informatie ingevoerd
is, de noodzakelijke afbeeldingen (zoals de portretten van de presidenten) en
tenslotte een CSS-bestand voor de layout. Vergeleken met het ASP-gedeelte zijn
er geen noemenswaardige verschillen. Sommige onderdelen waren eenvoudiger
te realiseren met PHP code (vooral daar waar PHP specifieke functies had voor
bepaalde taken) en andere met ASP/VBScript code (zoals het redirecten van een
pagina).
Beide versies hebben dezelfde functionaliteit en een bezoeker zal geen verschil
merken. Wel is het zo dat een MySQL database niet als een fysiek bestand aanwezig is dat geopend kan worden door een applicatie (zoals wel kan met Microsoft
Access). Hier zijn echter oplossingen voor verzonnen, waarbij met name phpMyAdmin in het oog springt.8 phpMyAdmin is een grafische gebruikers interface
waarmee de MySQL database goed te beheren is.
Ik had de indruk dat de PHP webserver en MySQL database een stuk lastiger
waren om op te zetten dan bij ASP het geval was, maar in de meeste gevallen zal
8
http://www.phpmyadmin.net/home page/ Homepage van phpMyAdmin. (03-05-05)
Hoofdstuk 7. PHP 4.0
dit al gebeurd zijn voordat een programmeur aan zijn taak begint.
50
Hoofdstuk 8
Vergelijking tussen ASP en PHP
Ik heb aangetoond dat het zowel met PHP als ASP goed te realiseren is om een
dynamische website te maken, gekoppeld aan een database.
Welke van de twee beter is, PHP of ASP, is altijd stof voor verhitte discussie.
Een grote community zoals Gathering of Tweakers.net 1 (een forum bedoeld voor
mensen die geı̈nteresseerd zijn in computers en de randverschijnselen ervan) kent
dan ook talloze discussies over ASP versus PHP2 en net zoals bij andere populaire
vergelijkingen, zoals Windows versus Linux, is het moeilijk om tot een objectieve
conclusie te komen. Wel kunnen we de feitelijke verschillen op een rijtje zetten.
In bijlage F is een syntax vergelijking tussen PHP en ASP opgenomen, hiermee
is goed te zien dat beide talen grofweg dezelfde mogelijkheden bieden. Wel valt
op dat PHP vaak meer alternatieven heeft om iets te doen en de syntax-notatie
van ASP over het algemeen wat eenvoudiger is.
PHP heeft meer ingebouwde functies en om hetzelfde resultaat te bereiken
in ASP moet je vaak vertrouwen op externe objecten. Soms zijn deze alleen ter
betaling beschikbaar. Bij PHP staat het open source principe ervoor garant dat er
veel meer te krijgen is zonder verdere kosten. ASP heeft dan weer het voordeel dat
het dicht tegen JavaScript aanleunt, waardoor mensen die JavaScript al kennen
(wat bij veel web designers het geval is) makkelijker kunnen overstappen naar
ASP (en vice versa). Uiteraard lijkt VBScript sterk op Visual Basic wat vooral
bekend zal zijn bij programmeurs die Microsoft Access applicaties ontwikkelen.
VBScript wordt over het algemeen ook beschouwd als een taal die makkelijker
te leren is dan PHP. Voor PHP is er weer meer documentatie beschikbaar op
internet dan ASP, vooral ook omdat PHP meer gebruikers kent.
Zoals in het verloop van deze scriptie al naar voren is gekomen, wordt ASP
met name gebruikt in een Microsoft windows, met bijbehorende applicaties, omgeving. PHP is open source en draait het beste met een webserver en database
1
http://gathering.tweakers.net/ Gathering of Tweakers.net forum (04-05-05)
http://gathering.tweakers.net/forum/find/keyword?data%5Bboolean%5D
=AND&data%5Bq%5D=asp+php&where=GoT#hitstart Discussies over ASP versus PHP op
Tweakers.net (04-05-05)
2
51
Hoofdstuk 8. Vergelijking tussen ASP en PHP
52
combinatie die ook open source zijn. Het is dan ook niet zo verwonderlijk dat
ASP meer ingang vind in het bedrijfsleven (dat traditioneel al veel gebruik maakt
van Microsoft software plus bijbehorende ondersteuning) en PHP bij particulieren die meer baat hebben bij het open source principe. Sterke aanhangers van
een van beide scripttalen zijn vaak ook degenen die alleen ervaring hebben met
de desbetreffende taal. Ook gaan handboeken en websites vaak maar over een
taal. Een leuke illustratie van dit feit is dat google maar één website oplevert
waarin PHP en ASP beide centraal staan.3
Tenslotte is er nog de kwestie van snelheid. PHP is over het algemeen sneller
dan VBScript. De paar benchmarks die te vinden zijn, wijzen uit dat PHP iets
sneller is dan VBScript in het gebruik.4 Mijn eigen metingen5 uitgevoerd op een
paar pagina’s, laten nooit een verschil zien van groter dan een paar honderdsten
van een seconde, het verschil was echter wel in het voordeel van PHP.6
Al met al zullen de meeste mensen het er mee eens zijn dat ASP en PHP even
geschikt zijn te gebruiken om een dynamische website mee te ontwerpen, ze doen
in dit opzicht niet voor elkaar onder. Bij deze conclusie sluit ik mij aan. Een
dynamische website, gekoppeld aan een database, kan zeer goed in zowel ASP
als PHP worden ontworpen. Een keuze voor een van beide is dan ook vooral een
kwestie van persoonlijke voorkeur, of wordt gemaakt vanwege reeds aanwezige
kennis met een van beide talen, of vanwege al aanwezige software.
3
4
http://www.asp-php.net/ ASPHP.net (04-05-05)
http://dada.perl.it/shootout/craps.html Computer Language Shootout Scorecard (01-06-
05)
5
ASP ondersteunt niet standaard een meting kleiner dan seconden, dus moest ik gebruik maken van een voorgeschreven script op http://www.4guysfromrolla.com/webtech/122799-1.shtml
(Timing the Execution Times of your ASP Scripts).
6
De gemiddelde uitvoer tijd voor een ASP-pagina was 0,03125 seconden, voor PHP lag dit
op 0,008517 seconden (10 metingen op 3 verschillende pagina’s binnen de website).
Hoofdstuk 9
Eind conclusie
Ik heb aangetoond dat het goed mogelijk is om een systeem te realiseren zoals
geschetst in de inleiding. Met een dynamische website gekoppeld aan een database wordt het veel makkerlijker om grote hoeveelheden tekst te beheren op
het internet. De website kan dan op afstand en door meerdere mensen worden
bijgehouden. De beheerders van de website hoeven daarbij niet te beschikken
over kennis van programmeertalen.
Omdat alle inhoud in een relationele database is ingevoerd, komt deze inhoud
op een centrale plek te staan, wat voordelen met zich meebrengt ten aanzien
van het beheer en backup-mogelijkheden. Verder is de website zo op te zetten
dat intern alle hyperlinks altijd zullen werken, omdat van te voren gecontroleerd
kan worden of datgene waarnaar verwezen wordt wel aanwezig is. Dit staat ook
garant voor een site die altijd up to date is qua interne links. Een tekstuele
aanpassing in bijvoorbeeld een biografie van een president, zal betekenen dat de
site automatisch deze aanpassing laat zien. Het is niet langer nodig om specifieke
HTML-bestanden te openen en bij te werken.
Kortom, het enige wat noodzakelijk is om een uitgebreide tekstgebaseerde
website bij te houden is het bijhouden van deze teksten zelf. De webpagina’s
passen zich automatisch aan de inhoud aan. Het database systeem maakt het
ook mogelijk dat meerdere mensen de website kunnen beheren, eventueel met
verschillende gebruikersrechten. Zo valt te denken aan een algemene toegang,
waarmee het mogelijk is om bestaande teksten te wijzigen, aan een wat hoger
niveau waarop het mogelijk is om teksten toe te voegen en te verwijderen en op
het allerhoogste niveau toegang tot de complete database.
De scriptie heeft aangetoond dat het omzetten van een grote tekstgebaseerde
website met vele statische HTML-pagina’s niet veel tijd hoeft te kosten, mits er
maar enige consistentie in de opzet is. De nadelen zijn dat voor een dergelijk
systeem een grondige analyse nodig is en dat het opzetten van een dynamische
website een veel grotere (tijds-)investering zal vereisen dan bij een statische website het geval is, maar uiteindelijk zal deze investering zich uitbetalen in het
vergrote gemak bij het beheren ervan.
53
Hoofdstuk 9. Eind conclusie
54
Een dergelijk systeem is zowel met ASP 3.0 als met PHP 4.0 uitstekend te
realiseren. Beide bieden uiteindelijk dezelfde functionaliteit. Sommige onderdelen
zijn makkelijker te realiseren met ASP en andere met PHP. Een keuze tussen een
van beide talen zal dan voornamelijk gebaseerd zijn op persoonlijke voorkeuren
(voor bijvoorbeel de syntax) of vanwege het al bekend zijn met een van beide
talen, of vanwege het al aanwezig zijn van bepaalde software.
Hoofdstuk 10
Literatuurlijst
Literatuur:
P. Baran, On Distributed Communications Networks, IEEE Trans. Comm. Systems, March 1964.
V. G. Cerf and R. E. Kahn, A protocol for packet network interconnection, IEEE
Trans. Comm. Tech., vol. COM-22, V 5, pp. 627-641, May 1974.
Alex Fedorov, Professional Active Server Pages 2.0
R. Kahn, Communications Principles for Operating Systems, Internal BBN memorandum, Jan. 1972.
L. Kleinrock, Information Flow in Large Communication Nets, RLE Quarterly
Progress Report, July 1961.
L. Roberts, Multiple Computer Networks and Intercomputer Communication,
ACM Gatlinburg Conf., October 1967
Jeffrey Veen, The art and science of web design
Handboeken:
Microsoft Handboek Access 2000
David Buser e.a., Beginning Active Server Pages 3.0 (Birmingham 2002)
Jay Greenspan en Brad Bulger, MySQL/PHP Database Applicaties (Amsterdam 2001)
Wiel Pollaert e.a., Database ontwerp, een praktijkgerichte aanpak (Zaltbommel
2004)
Websites:
55
Hoofdstuk 10. Literatuurlijst
56
http://cui.unige.ch/db-research/Enseignement/analyseinfo/SQL7/BNFindex.html
http://en.wikipedia.org/wiki/Edgar F. Codd
http://en.wikipedia.org/wiki/MySQL
http://en.wikipedia.org/wiki/PHP
http://delivery.acm.org/10.1145/370000/362685/p377-codd.pdf?key1=362685&key2=
8778327901&coll=GUIDE&dl=GUIDE&CFID=28794625&CFTOKEN=63395675
http://gathering.tweakers.net/
http://gathering.tweakers.net/forum/find/keyword?data%5Bboolean%5D=AND&data%5Bq%5D
=asp+php&where=GoT#hitstart
http://hoohoo.ncsa.uiuc.edu/cgi/overview.html
http://math.hws.edu/vaughn/cpsc/343/2003/history.html
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnacc2k/html/acmsdeop.asp
http://news.com.com/2100-1033 3-5055803.html?tag=fd lede1 hed
http://news.netcraft.com/archives/web server survey.html
http://news.zdnet.co.uk/software/applications/0,39020384,39192964,00.htm
http://nl2.php.net/tut.php http://odur.let.rug.nl/ũsa/
http://phplens.com/phpeverywhere/node/view/30
http://v1.nedstatbasic.net/s?tab=1&link=5&id=710309
http://versora.com/catalog/product info.php?products id=37
http://www.4guysfromrolla.com/webtech/122799-1.shtml
http://www.asp-php.net/
http://www.awprofessional.com/articles/article.asp?p=24406&seqNum=3
http://www.mcjones.org/System R/
http://www.cren.net/cren/cren-hist-fut.html
http://www.isoc.org/internet/history/brief.shtml#Timeline
http://www.jcc.com/SQLPages/jccs sql.htm
http://www.davesite.com/webstation/net-history.shtml
Hoofdstuk 10. Literatuurlijst
http://www.nap.edu/readingroom/books/far/ch6.html
http://www.phpmyadmin.net/home page/
http://www.sun.com/software/chilisoft/index.xml http://www.w3.org/
http://www.w3.org/People/Berners-Lee/Overview.html
http://www.zakon.org/robert/internet/timeline/
http://www.zend.com/zend/zend-engine-summary.php
http://www.zenwerx.com/
http://www1.worldcom.com/nl/customer/helpdesk/homepages/cgi/
57
Bijlage A
De Amerikaanse presidenten van
1789 tot heden
1. George Washington : 1789-1797
2. John Adams : 1797-1801
3. Thomas Jefferson : 1801-1809
4. James Madison : 1809-1817
5. James Monroe : 1817-1825
6. John Quincy Adams : 1825-1829
7. Andrew Jackson : 1829-1837
8. Martin van Buren : 1837-1841
9. William Henry Harrison : 1841-1841
10. John Tyler : 1841-1845
11. James K. Polk : 1845-1849
12. Zachary Taylor : 1849-1850
13. Millard Fillmore : 1850-1853
14. Franklin Pierce : 1853-1857
15. James Buchanan : 1857-1861
16. Abraham Lincoln : 1861-1865
17. Andrew Johnson : 1865-1869
58
Bijlage A. De Amerikaanse presidenten van 1789 tot heden
18. Ulysses S. Grant : 1869-1877
19. Rutherford B. Hayes : 1877-1881
20. James A. Garfield : 1881-1881
21. Chester A. Arthur : 1881-1885
22. Grover Cleveland : 1885-1889
23. Benjamin Harrison : 1889-1893
24. Grover Cleveland : 1893-1897
25. William McKinley : 1897-1901
26. Theodore Roosevelt : 1901-1909
27. William H. Taft : 1909-1913
28. Woodrow Wilson : 1913-1921
29. Warren G. Harding : 1921-1923
30. Calvin Coolidge : 1923-1929
31. Herbert C. Hoover : 1929-1933
32. Franklin D. Roosevelt : 1933-1945
33. Harry S. Truman : 1945-1953
34. Dwight D. Eisenhower: 1953-1961
35. John F. Kennedy : 1961-1963
36. Lyndon B. Johnson : 1963-1969
37. Richard M. Nixon : 1969-1974
38. Gerald Ford : 1974-1977
39. Jimmy Carter : 1977-1981
40. Ronald Reagan : 1981-1989
41. George Bush : 1989-1993
42. Bill Clinton : 1993-2001
43. George W. Bush : 2001-
59
Bijlage B
De informatie die getoond wordt
op de presidentiële pagina’s
• Portret afbeelding van de president
Links naar teksten:
• Speeches (zoals Annual Messages en Addresses)
• Writings (zoals brieven en essays)
• Externe links met extra informatie over de president of zaken die met de
president te maken hebben
• Een korte biografie over de president
• Links naar additionele informatie
Deze links bevatten bijna allemaal een zogenaamde ’quote’ en ’context’. Quote
bevat de volgende informatie over de tekst:
• Title (een entry)
• Edition (een entry)
• Creator (een entry)
• Subject (een entry)
• Series (een entry)
• Published (een entry)
• Description (een entry)
• LC Subjects (een entry)
60
Bijlage B. De informatie die getoond wordt op de presidentiële pagina’s
61
• Other authors (kunnen meerdere entries zijn)
• Notes (kunnen meerdere entries zijn)
• On-line Ed. (een entry)
• Publisher (een entry)
• Contributors (kunnen meerdere entries zijn)
• Date (een entry)
• Update (een entry)
• Type (een entry)
• Format (een entry, maar is overbodig als het niet langer om een bestand
gaat)
• Size (een entry, maar is overbodig als het niet langer om een bestand gaat)
• Identifier (een entry, maar is overbodig als het niet langer om een bestand
gaat)
• Source (een entry)
• Language (een entry)
• Relation (een entry)
• Coverage (een entry)
• Rights (een entry)
Context bevat context informatie over de tekst.
De teksten bevatten zelf ook vaak hyperlinks naar andere teksten binnen de
website. Ook afbeeldingen komen in vrijwel alle soorten teksten voor.
Bijlage C
De database structuur
De database bevat de volgende tabellen:
• usa content (met content informatie van de website, zoals menu items en
dergelijke)
• usa context (bevat de context informatie van verscheidene teksten)
• usa meta information (bevat de meta informatie van de website, zoals meta
tags)
• usa presidents (bevat alle presidenten van de USA)
• usa presidents additional (bevat teksten met overige informatie over presidenten)
• usa presidents biography (bevat de biografie van de presidenten)
• usa presidents extern (bevat de externe linken die bij de presidenten horen)
• usa presidents writings (bevat geschriften van de president)
• usa presidents speeches (bevat de speeches van de presidenten)
• usa presidents terms (bevat de 43 presidentiële termijnen)
• usa quotes (bevat de quote informatie van de teksten)
• usa quotes authors (bevat de auteurs van de teksten, kunnen meerdere zijn)
• usa quotes contributors (bevat de contributors van de teksten, kunnen meerdere zijn)
• usa quotes notes (bevat de notes van de teksten, kunnen meerdere zijn)
• usa ttb quotes authors (tussentabel quotes en authors)
62
Bijlage C. De database structuur
63
• usa ttb quotes contributors (tussentabel quotes en contributors)
• usa ttb quotes notes (tussentabel quotes en notes)
• Login (voor de login gegevens van de administrators
• Soort (Tabel om de soort tekst te bepalen, bv message)
Deze velden staan in relatie met elkaar, zoals in de afbeelding is weergegeven.
De tabel usa presidents bevat de id’s van de presidenten, die gelinkt wordt met
de termijnen van die presidenten. Dit is gedaan om per president correct weer te
geven de hoeveelste president het was. Zo is president Grover Cleveland de 22e
en de 24e president van de Verenigde Staten. De id’s van de presidenten staan
ook in de tabellen:
• usa presidents additional
• usa presidents biography
• usa presidents extern
• usa presidents writings
• usa presidents speeches
Zodat de presidenten gelinkt worden met hun speeches, writings en overige informatie (indien van toepassing). De meerderheid van deze bovengenoemde tabellen
heeft ook een quote-id en een context-id veld, zodat ze gelinkt kunnen worden
met de quote- en context informatie over de teksten. De volgende quote velden
kunnen meerdere entries bevatten:
• usa quotes authors
• usa quotes contributors
• usa quotes notes
En deze tabellen bevatten dan ook id’s die gelinkt worden met deze entries door
middel van een tussen tabel (om de veel-op-veel relatie te garanderen).
Bijlage D
ASP broncode
D.1
index.asp
<%
’ de p a g i n a opvragen u i t de q u e r y s t r i n g
pagina=request . querystring ( " pagina " )
if pagina = " " then
pagina=" index "
end if
’ daarna de p a g i n a z e l f p r i n t e n ( header , t e k s t u i t db , f o o t e r )
%>
<!−− #include file =" inc \ print_header . inc . asp " −−>
<!−− #include file =" inc \ print_footer . inc . asp " −−>
D.2
formhandler.asp
<!−− #include file =" inc / dbconn . inc . asp " −−>
<!−− #include file =" inc / functies . inc . asp " −−>
<! DOCTYPE HTML PUBLIC " -// W3C // DTD HTML 4.01 Transitional // EN ">
<html>
<head>
<title></title>
</head>
<body>
64
Bijlage D. ASP broncode
65
<%
pagina=request . querystring ( " pagina " )
if pagina=" login " then
%><!−−#include file=" inc / check_login . inc . asp "−−>
<%
elseif instr ( pagina , " voegtoe_teks t_ " ) then
%><!−−#include file=" inc / voegtoe_tekst . inc . asp "−−>
<%
elseif instr ( pagina , " wijzig_tekst_ " ) then
%><!−−#include file=" inc / wijzig_tekst . inc . asp "−−>
<%
elseif instr ( pagina , " delete_tekst " ) then
%><!−−#include file=" inc / delete_tekst . inc . asp "−−>
<%
else
response . write ( " <p > Formhandler voor < strong > "&pagina&" </ strong > </ p > " )
end if
%>
</body>
</html>
D.3
check login.inc.asp
<%
uname=request . form ( " username " )
password=request . form ( " password " )
’ controle
if uname=" " OR Password=" " then
session ( " X_ingelogd ")= false
else
SQLselectLogin=" select * FROM login WHERE StrComp ( Username , ’"&uname&" ’, 0) = 0
AND StrComp ( Password , ’"&password&" ’, 0) = 0 "
set selectlogin=conn . execute ( SQ Ls el ec tLo gi n )
if selectlogin . bof AND selectlogin . EOF then ’ geen s j o e g e
session ( " X_ingelogd ")= false
else
session ( " X_ingelogd ")=true
end if
Bijlage D. ASP broncode
end if
if session ( " X_ingelogd ")=true then
response . redirect " index . asp "
else
response . redirect " index . asp ? pagina = admin "
end if
%>
D.4
dbconn.inc.asp
<%
ip_adres=Request . ServerVariables ( " LOCAL_ADDR " )
if ip_adres = " 192.168.0.1 " then
’ v e r b i n d i n g met de d a t a b a s e maken met OLEDB
Set conn = Server . CreateObject ( " ADODB . Connection " )
strDatabaseType=" Access "
conn . Open " Provider = Microsoft . Jet . OLEDB .4.0; " &_
" Data Source = C :\ Inetpub \ wwwroot \ usa \ db \ usa_website . mdb ; " & _
" Persist Security Info = False "
else
Set conn = Server . CreateObject ( " ADODB . Connection " )
conn . Open " DBQ = " & Server . Mappath ( " ../../ lib / usa_website . mdb " ) &
" ; Driver ={ Microsoft Access Driver (*. mdb )}; "
end if
’ k i j k e n o f de p a g i n a wel a a n w e z i g i s
if pagina<>" formhandler " then
S QLselectPagina=" SELECT titel , tekst FROM usa_content WHERE
code = ’"&pagina&" ’ "
set selectPagina=conn . execute ( S Q L se l e c t P a g in a )
if not selectPagina . eof then
’ i s i e a a n w e z i g i n de db en kunnen de g e g e v e n s d a a r u i t worden g e h a a l d
titelpagina=selectPagina ( 0 ) ’ t i t e l van de p a g i n a
tekst=selectPagina ( 1 ) ’ t e k s t van de p a g i n a
else ’ dan i s de p a g i n a n i e t gevonden en komt e r een f o u t m e l d i n g
titel=" Fout - Pagina Niet Gevonden "
66
Bijlage D. ASP broncode
67
tekst=" <p > De pagina kan niet gevonden worden op de USA website . </p > "
’ eventueel uitbreiden
end if ’ v o o r de i f −then−e l s e v o o r o f de p a g i n a wel b e s t a a t
end if ’ v o o r o f de p a g i n a f o r m h a n d l e r i s o f n i e t
%>
D.5
delete tekst.inc.asp
<%
tabel=request . querystring ( " tabel " )
tabelveld=request . querystring ( " tabelveld " )
president_id=request . querystring ( " president_id " )
tekst_id=request . querystring ( " tekst_id " )
SQLdeleteTekst=" DELETE FROM "&tabel&" WHERE "&tabelveld&" = "&tekst_id&" "
conn . execute ( SQLdeleteTekst )
response . redirect " index . asp ? pagina = president_ "&president_id&" "
%>
D.6
functies.inc.asp
<%
if pagina=" presidents " then
%>
<ul>
<%
’ lijstje
p r i n t e n van p r e s i d e n t e n
’ de p r e s i d e n t e n l a t e n z i e n a l s v o l g t :
’ nummer , voornaam , achternaam : b e g i n j a a r −e i n d j a a r
’ l o o p j e om p r e s i d e n t s p e r i o d e s t e s e l e c t e r e n
S Q L s e l e c t P r e s i d e n t T e r m=" SELECT From u s a _ p r e s i d e n t s _ t e r m s term_id , president_id ,
beginjaar , eindjaar "
s e l e c t P r e s i d e n t T e r m=conn . execute ( S Q L s e l e c t P r e s i d e n t T e r m )
while not s e l e c t P r e s i d e n t T e r m . eof
Bijlage D. ASP broncode
68
’ l o o p j e om p r e s i d e n t e n t e s e l e c t e r e n d i e b i j d i e term horen
S Q L s e l e ct P r e s i d e n t=" SELECT From us a_ pre si de nt s voornaam , achternaam WHERE
president_id = "&s e l e c t P r e s i d e n t T e r m (1)& " "
selectPresident=conn . execute ( S Q L s e l e c t P r e s i d e n t )
’ op scherm p r i n t e n
%>
<li><a href=" index . asp ? pagina = president <%= s e l e c t P r e s i d e n t T e r m (1)% > ">
<%=selectPresident(0)%> <%=se l ec t P r e s i d en t (1)%></a> :
<%=s e l e c t P r e s i d e n t T e r m(2)%>−<%=s e l e c t P r e s i d e n t T e r m (3)%>
<%
s e l e c t P r e s i d e n t T e r m . movenext ’ v o l g e n d e term
wend
%>
</ul>
<%
end if
%>
D.7
pageselector.inc.asp
<%
if instr ( pagina , " _volunteer " ) then ’ algemene v o l u n t e e r p a g i n a l a t e n z i e n
response . redirect " index . asp ? pagina = volunteer "
elseif instr ( pagina , " voegtoe_teks t_ " ) then ’ p a g i n a v o o r t o e v o e g e n t e k s t e n l a t e n z i e n
%>
<!−− #include file =" print_voegtoe . inc . asp " −−>
<%
elseif instr ( pagina , " wijzig_tekst_ " ) then
’ pagina voor w i j z i g e n t e k s t e n l a t e n z i e n
%>
<!−− #include file =" print_wijzig . inc . asp " −−>
<%
elseif pagina=" admin " then
%>
<!−− #include file =" print_admin . inc . asp " −−>
Bijlage D. ASP broncode
<%
elseif pagina=" presidents " then
%>
<!−− #include file =" p rin t_pr esid e n t s . inc . asp " −−>
<%
elseif instr ( pagina , " president_ " ) then
’ s p e c i f i e k e p a g i n a l a t e n z i e n van d i e p r e s i d e n t
%>
<!−− #include file =" p r i n t _ p r e s i d e n t _ s p e c i f i e k . inc . asp " −−>
<%
elseif instr ( pagina , " biography_ " ) then ’ b i o g r a f i e l a t e n z i e n
%>
<!−− #include file =" print_biograph y . inc . asp " −−>
<%
elseif instr ( pagina , " speech_ " ) then ’ s p e e c h l a t e n z i e n
%>
<!−− #include file =" print_speech . inc . asp " −−>
<%
elseif instr ( pagina , " writing_ " ) then ’ w r i t i n g s l a t e n z i e n
%>
<!−− #include file =" print_writing . inc . asp " −−>
<%
elseif instr ( pagina , " additional_ " ) then ’ a d d i t i o n e l e i n f o r m a t i e l a t e n z i e n
%>
<!−− #include file =" p rin t_ad diti o n a l . inc . asp " −−>
<%
elseif instr ( pagina , " quote_ " ) then ’ q u o t e i n f o r m a t i e l a t e n z i e n
%>
<!−− #include file =" print_quote . inc . asp " −−>
<%
elseif instr ( pagina , " context_ " ) then ’ c o n t e x t i n f o r m a t i e l a t e n z i e n
%>
69
Bijlage D. ASP broncode
70
<!−− #include file =" print_context . inc . asp " −−>
<%
else ’ n i e t nader g e s p e c i f i c e e r d e p a g i n a
response . write tekst
end if
%>
D.8
print additional.inc.asp
<%
’ i d i s h e t nummer van de p a g i n a a d d i t i o n a l X
additional=split ( pagina , " _ " )
additional_id=additional ( 1 )
’ 0 i s a d d i t i o n a l , 1 i s h e t nummer van de a d d i t i o n a l en dat hebben we n o d i g
’ gegevens a d d i t i o n a l s e l e c t e r e n
S Q L s e l e c t a d d i t i o n a l=" SELECT titel , tekst , president_id
From u s a _ p r e s i d e n t s _ a d d i t i o n a l WHERE additional_id = "&additional_id&" "
set se lect addi tio nal=conn . execute ( S Q L s e l e c t a d d i t i o n a l )
titel=se lect addi tio nal ( 0 )
tekst=se lect addi tio nal ( 1 )
president_id=sel ect addi tion al ( 2 )
’ president selecteren
S Q L s e l e ct P r e s i d e n t=" SELECT voornaam , achternaam FROM us a_ pre si de nts
WHERE president_id = "&president_id&" "
set selectPresident=conn . execute ( S Q L s e l e c t P r e s i d e n t )
naamPresident=selectPresident (0)& " "&s e l e ct P r e s i d en t ( 1 )
trail=" < font class = trail > < a href = index . asp > FRtR </ a > >
<a href = index . asp ? pagina = presidents > Presidents </ a > > <a href = index . asp ? pagina =
president_ "&president_id&" >"&naamPresident&" </a > > <b > "&titel&" </b > < BR > < BR > </ font > "
’HTML code
%>
<%=trail%>
<p>
<h1 class=pres−head><%=titel%></h1><br>
<p><font class=small color=red >∗∗∗ <a href=" ">Quote </a>
∗ <a href=" ">Context </a> ∗∗∗</ font>
<p>
<%=tekst%>
<%
Bijlage D. ASP broncode
71
%>
D.9
print admin.inc.asp
<p>U kunt inloggen als Administrator . Daarmee kunt u de website beheren .
Dit kan bestaan uit bestaande teksten te wijzigen ,
maar ook uit het toevoegen van nieuwe teksten .
Hiertoe dient u de gebruikersnaam en het wachtwoord voor uw admin login in te voeren .
<br/><br/>
<%
if session ( " X_ingelogd ")= false then
%>
<p><b>
De door u ingevulde logingegevens zijn incorrect . Probeer het nogmaals .< br/><br/>
</b><p>
<%
end if
%>
Let er a . u . b . op dat de logingegevens <strong>hoofdletter−gevoelig </strong> zijn . </p>
<p>
<form action=" formhandler . asp ? pagina = login " method=" post ">
<label id=" txtusername " for=" username ">Gebruikersnaam </label>
<input type=" text " name=" username " value=" " id=" txtUsername " />
<label id=" txtpassword " for=" password ">Wachtwoord </label>
<input type=" password " name=" password " value=" " id=" txtPassword " />
<BR><BR>
<input type=" submit " value=" Inloggen " id=" btnLogin " />
</form>
</p>
D.10
print biography.inc.asp
<%
’ i d i s h e t nummer van de p a g i n a bi o g r a p h y X
biography=split ( pagina , " _ " )
biography_id=biography ( 1 )
’ 0 i s b io gra p hy , 1 i s h e t nummer van de b i o g r a p h y en dat hebben we n o d i g
’ gegevens biography s e l e c t e r e n
S Q L s e l e ct B i o g r a p h y=" SELECT titel , tekst , president_id From u s a _ p r e s i d e n t s _ b i o g r a p h y
WHERE biography_id = "&biography_id&" "
set selectBiography=conn . execute ( S Q L s e l e c t B i o g r a p h y )
titel=selectBiography ( 0 )
tekst=selectBiography ( 1 )
Bijlage D. ASP broncode
president_id=selectBiography ( 2 )
’ president selecteren
S Q L s e l e ct P r e s i d e n t=" SELECT voornaam , achternaam FROM us a_ pre si de nts
WHERE president_id = "&president_id&" "
set selectPresident=conn . execute ( S Q L s e l e c t P r e s i d e n t )
naamPresident=selectPresident (0)& " "&s e l e ct P r e s i d en t ( 1 )
trail=" < font class = trail > < a href = index . asp > FRtR </ a > >
<a href = index . asp ? pagina = presidents > Presidents </ a > >
<a href = index . asp ? pagina = president_ "&president_id&" >"&naamPresident&" </a >
> <b > "&titel&" </b > < BR > < BR > </ font > "
’HTML code
%>
<%=trail%>
<p>
<h1 class=pres−head><%=titel%></h1><br>
<p><font class=small color=red >∗∗∗ <a href=" ">Quote </a> ∗∗∗</ font>
<p>
<%=tekst%>
<%
%>
D.11
print context.inc.asp
<%
’ i d i s h e t nummer van de c o n t e x t X
context=split ( pagina , " _ " )
context_id=context ( 1 )
’ 0 i s c o n t e x t , 1 i s h e t nummer van de c o n t e x t en dat hebben we n o d i g
’ gegevens context s e l e c t e r e n
SQ Lsel ectc onte xt=" SELECT titel , tekst FROM usa_context
WHERE context_id = "&context_id&" "
set selectcontext=conn . execute ( SQL s e l e c t c o n t e x t )
titel=selectcontext ( 0 )
tekst=selectcontext ( 1 )
’HTML code
%>
<p>
<h1 class=pres−head><%=titel%></h1>
<%
if session ( " X_ingelogd ")=true then
72
Bijlage D. ASP broncode
73
%>
<BR>
<a href=" index . asp ? pagina = wijzig_context_ <%= context_id % > " >[ Wijzig deze tekst ] </a>
</BR>
<%
end if
%>
<p>
<%=tekst%>
<%
%>
D.12
print footer.inc.asp
</div>
<%
jaar=Year ( Now ( ) )
%>
<div id=" foot ">
&copy ; <%=jaar%>
</div>
</body>
</html>
D.13
print header.inc.asp
<!−− #include file =" dbconn . inc . asp " −−>
<?xml version=" 1.0 " encoding=" UTF -8 "?>
<! DOCTYPE html PUBLIC " -// W3C // DTD XHTML 1.0 Transitional // EN "
" http :// www . w3 . org / TR / xhtml1 / DTD / xhtml1 - transitional . dtd ">
<%
’ g e g e v e n s s i t e u i t db h a l e n
SQLselectMeta=" SELECT css , titel , subtitel , meta_description , meta_keywords ,
Bijlage D. ASP broncode
begin_jaar FROM u s a _ m e t a _ i n f o r m a t i o n "
set selectMeta=conn . execute ( SQLselectMeta )
css=selectMeta ( 0 )
hoofdtitel=selectMeta ( 1 )
subtitel=selectMeta ( 2 )
keywords=selectMeta ( 4 )
%>
<html xmlns=" http :// www . w3 . org /1999/ xhtml " lang=" nl ">
<head>
<title><%=hoofdtitel%> <%=subtitel%></title>
<meta http−equiv=" Content - Type " content=" text / html ; charset = iso -8859 -1 " />
<meta name=" description " content=" " />
<meta name=" keywords " content=" <%= keywords % > " />
<meta name=" author " content=" Fokke van der Molen " />
<meta name=" copyright " content=" Fokke van der Molen - 2004 " />
<meta http−equiv=" pragma " content=" no - cache " />
<meta http−equiv=" content - type " content=" text / html ; charset = ISO -8859 -1 " />
<meta http−equiv=" content - language " content=" nl - nl " />
<meta http−equiv=" content - style - type " content=" text / css " />
<meta http−equiv=" content - script - type " content=" text / javascript " />
<meta name=" content - language " content=" nl - nl " />
<meta name=" robots " content=" index , follow " />
<link href=" css / <%= css % > " rel=" stylesheet " type=" text / css " media=" screen ,
print " title=" USA " />
</head>
<body lang=" nl ">
<a href=" ./ index . asp " title=" USA "><img src=" img / usa_logo . jpg " alt=" USA logo "
id=" logo " border=" 0 "/></a>
<h1>
<%
if pagina=" index " then
response . write hoofdtitel
’ else
’
response . write t i t e l
end if
%>
</h1>
<script SRC=" java / nheader . js "></script>
<script SRC=" java / forms . js "></SCRIPT>
<%
if pagina=" index " then
%>
<script src=" java / new . js "></script>
74
Bijlage D. ASP broncode
<%
end if
%>
<!−− #include file =" pageselector . inc . asp " −−>
D.14
print president specifiek.inc.asp
<%
’ p r e s i d e n t i s h e t nummer van de p a g i n a p r e s i d e n t X
president=split ( pagina , " _ " )
president_id=president ( 1 )
’ 0 i s p r e s i d e n t , 1 i s h e t nummer van de p r e s i d e n t en dat hebben we n o d i g
’ gegevens president s e l e c t e r e n
S Q L s e l e ct P r e s i d e n t=" SELECT voornaam , achternaam , geboortejaar , sterftejaar ,
afbeelding From usa_presidents WHERE president_id = "&president_id&" "
set selectPresident=conn . execute ( S Q L s e l e c t P r e s i d e n t )
geboortejaar=selectPresident ( 2 )
sterftejaar=selectPresident ( 3 )
if geboortejaar=0 then
geboortejaar=" "
end if
if sterftejaar=0 then
sterftejaar=" "
end if
’ p r e s i d e n t i e l e periode gegevens s e l e c t e r e n
S Q L s e l e c t P r e s i d e n t T e r m=" SELECT Term_id , beginjaar , eindjaar FROM
u s a _ p r e s i d e n t s _ t e r m s WHERE president_id = "&president_id&" "
set s e l e c t P r e s i d e n t T e r m=conn . execute ( S Q L s e l e c t P r e s i d e n t T e r m )
termijn=" "
while not s e l e c t P r e s i d e n t T e r m . eof
term_id=s e l e c t P r e s i d e n t T e r m ( 0 )
if termijn<>" " then
termijn=termijn&" / "
end if
75
Bijlage D. ASP broncode
if jaren<>" " then
jaren=jaren&" / "
end if
’ b e p a l e n wat de term i s
if right ( term_id ,1)=1 then ’ g e t a l l e n d i e e i n d i g e n op 1
termijn=" "&term_id&" st "
elseif right ( term_id ,1)=2 then ’ g e t a l l e n d i e e i n d i g e n op 2
termijn=termijn&" "&term_id&" nd "
elseif right ( term_id ,1)=3 then ’ g e t a l l e n d i e e i n d i g e n op 3
termijn=termijn&" "&term_id&" rd "
else ’ o v e r i g e n
termijn=termijn&" "&term_id&" th "
end if
beginjaar=s e l e c t P r e s i d e n t T e r m ( 1 )
eindjaar=s e l e c t P r e s i d e n t T e r m ( 2 )
if beginjaar=0 then
beginjaar=" "
end if
if eindjaar=0 then
eindjaar=year ( now )
end if
jaren=jaren&beginjaar&" -"&eindjaar
s e l e c t P r e s i d e n t T e r m . movenext
wend
’ biografie selecteren
S Q L s e l e ct B i o g r a p h y=" SELECT biography_id FROM u s a _ p r e s i d e n t s _ b i o g r a p h y WHERE
president_id = "&president_id&" "
set selectBiography=conn . execute ( S Q L s e l e c t B i o g r a p h y )
while not selectBiography . eof
biography_id=selectBiography ( 0 )
selectBiography . movenext
wend
if biography_id=" " then ’ geen b i o g r a f i e , dus algemene t e k s t
biography_id=" volunteer "
end if
trail=" < font class = trail > < a href = index . asp > FRtR </ a > >
<a href = index . asp ? pagina = presidents > Presidents </ a > >
<b > "&selectPresident (0)& " & nbsp ; "&s e l e ct P r e s i d en t (1)& " </b > < BR > < BR > </ font > "
’ nu HTML code
%>
<%=trail%>
76
Bijlage D. ASP broncode
77
<font class=normal>
<h1 class=pres−head><%=selectPresi d en t(0)%> <%=s e l ec t P r e s i d en t(1)%>&nbsp ;
(<%=geboortejaar%>−<%=sterftejaar%>)</h1><br>
<h2 class=pres−head><%=termijn%> president of the United States : <%=jaren%></h2>
<%
if session ( " X_ingelogd ")=true then
%>
<BR/>
<BR/>
<a href=" index . asp ? pagina = voegtoe_tekst_ <%= president_id % > ">
[ Voeg een tekst toe voor deze president ] </a>
</BR>
<%
end if
%>
<p>
<table width=100%>
<tr>
<td>
<table width=100%>
<tr>
<td align=center>
<img src=" img / presidents / <%= S e l e c t P re s i d e n t (4)% > " alt=
" <%= selectPresident (0)% >& nbsp ; <%= s el e c t P r e si d e n t (1)% > ">
<br>
<%
if session ( " X_ingelogd ")=true and biography_id<>" volunteer " then
%>
<A HREF=" index . asp ? pagina = biography_ <%= biography_id % > ">
<%=selectPresident(0)%> <%=s e l e ct P r e s i d en t (1)%></A>
<BR>(<%=SelectPresident(2)%>−<%=S e l e ct P r e s i d en t (3)%>)
<input type=button class=" delete " title=" Verwijder de
biografie van <%= selectPre s i de n t (0)% >& nbsp ; <%= s e l e ct P r e s i d en t (1)% > "
onclick=" confirmDelete ( ’ biography ’ , ’ de biografie van
<%= selectPresident (0)% >& nbsp ; <%= s e le c t P r e s i de n t (1)% > ’ ,
’ formhandler . asp ? pagina = delete_tekst & tabel =
u s a _ p r e s i d e n t s _ b i o g r a p h y & tabelveld = biography_id
& tekst_id = <%= biography_id % >& president_id = <%= president_id % > ’) ">
<%
else
%>
<A HREF=" index . asp ? pagina = biography_ <%= biography_id % > ">
<%=selectPresident(0)%> <%=s e l e ct P r e s i d en t (1)%></A>
<BR>(<%=SelectPresident(2)%>−<%=S e l e ct P r e s i d en t (3)%>)
<%
end if
Bijlage D. ASP broncode
78
%>
</td><td>
<ul class=small>
<%
’ e e r s t a l l e nu s p e e c h e s p r i n t e n
%>
<!−− #include file =" p r i n t _ p r e s i d e n t s _ s p e e c h e s . inc . asp " −−>
<%
’ nu w r i t i n g s
%>
<!−− #include file =" p r i n t _ p r e s i d e n t s _ w r i t i n g s . inc . asp " −−>
<%
’ nu a d d i t i o n a l
%>
<!−− #include file =" p r i n t _ p r e s i d e n t s _ a d d i t i o n a l . inc . asp " −−>
<%
’ tenslotte externe links
%>
<!−− #include file =" p r i n t _ p r e s i d e n t s _ e x t e r n . inc . asp " −−>
<%
%>
</ul>
</td>
</tr>
</table>
</td></tr></table>
<%
%>
D.15
print presidents.inc.asp
<%
trail=" < font class = trail > < a href = index . asp > FRtR </ a > >
<b > Presidents </ b > < BR > < BR > </ font > "
%>
<%=trail%>
<p align=justify>This area is an index on the presidents of the United States and
contains information and documents of their speeches , writings , biographies and
anything else related to their person or the office they are holding .
</p>
<ol>
<%
’ lijstje
p r i n t e n van p r e s i d e n t e n
’ de p r e s i d e n t e n l a t e n z i e n a l s v o l g t :
Bijlage D. ASP broncode
79
’ nummer , voornaam , achternaam : b e g i n j a a r −e i n d j a a r
’ l o o p j e om p r e s i d e n t s p e r i o d e s t e s e l e c t e r e n
S Q L s e l e c t P r e s i d e n t T e r m=" SELECT term_id , president_id , beginjaar , eindjaar
FROM u s a _ p r e s i d e n t s _ t e r m s WHERE term_id > 0 "
set s e l e c t P r e s i d e n t T e r m=conn . execute ( S Q L s e l e c t P r e s i d e n t T e r m )
while not s e l e c t P r e s i d e n t T e r m . eof
’ l o o p j e om p r e s i d e n t e n t e s e l e c t e r e n d i e b i j d i e term horen
S Q L s e l e ct P r e s i d e n t=" SELECT voornaam , achternaam From us a_ pre si de nts
WHERE president_id = "&s e l e c t P r e s i d e n t T e r m (1)& " "
set selectPresident=conn . execute ( S Q L s e l e c t P r e s i d e n t )
’ e i n d j a a r van de h u i d i g e p r e s i d e n t i s 0 i n de db
’ v e r v a n g e n door h u i d i g j a a r , dan i s i e a l t i j d up t o d a t e
eindjaar=s e l e c t P r e s i d e n t T e r m ( 3 )
if eindjaar=0 then
eindjaar=year ( now )
end if
’ op scherm p r i n t e n
%>
<li><a href=" index . asp ? pagina = president_ <%= s e l e c t P r e s i d e n t T e r m (1)% > ">
<%=selectPresident(0)%> <%=se l ec t P r e s i d en t (1)%></a> :
<%=s e l e c t P r e s i d e n t T e r m(2)%>−<%=eindjaar%>
<%
s e l e c t P r e s i d e n t T e r m . movenext ’ v o l g e n d e term
wend
%>
</ol>
<p>
<b>Websites dedicated to the American Presidents </b>
<p>
<ul class=linklist>
<%
’ nu e x t e r n e l i n k s l a t e n z i e n . . . komt ook u i t db , met p r e s i d e n t i d : 0
S Q L s e l e c t E x t e r n e L i n k s=" SELECT titel , link , by , link_by FROM U s a _ p r e s i d e n t s _ e x t e r n
WHERE President_id = 0 "
set s e l e c t E xt e r n e L i n k s=conn . execute ( S Q L s e l e c t E x t e r n e L i n k s )
while not s e l e c t Ex t e r n e L i n k s . eof
’ de l i n k s tonen
extern_by=s e l e c t Ex t e r n e L i n k s ( 2 )
extern_link_by=s e l e c t E xt e r n e L i n k s ( 3 )
if ( extern_by<>" " or not ( isnull ( extern_by ) ) ) and ( extern_link_by<>" " or not
( isnull ( extern_link_by ) ) ) then ’ by p r i n t e n
by=" , by <a href = ’ "&extern_link_by&" ’>"&extern_by&" </a > "
Bijlage D. ASP broncode
80
elseif ( extern_by<>" " or not ( isnull ( extern_by ) ) ) and ( ( ex te rn _l ink _b y=" " or
isnull ( extern_link_by ) ) ) then ’ by z o n d e r l i n k b y p r i n t e n
by=" , by "&extern_by&" "
else
by=" "
end if
%>
<li><a href=" <%= s el e c t E x t e r n e L i nk s (1)% > "><%=s e l e c t E x t e r n e L i n k s (0)%></a> <%=by%>
<%
s e l e c t E xt e r n e L i n k s . movenext
wend
%>
</ul>
<%
’ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
’EINDE PRESIDENTEN GEDEELTE
’ ∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
%>
D.16
print presidents additional.inc.asp
<%
S Q L S e l e c t A d d i t i o n a l=" SELECT additional_id , titel , jaar FROM
u s a _ p r e s i d e n t s _ a d d i t i o n a l WHERE president_id = "&president_id&" "
set Se lect Addi tio nal=conn . execute ( S Q L S e l e c t A d d i t i o n a l )
a d d i t i o n a l t e l l e r t j e=0
while not Se lect Addi tio nal . eof
additional_id=Sel ect Addi tion al ( 0 )
ad diti onal _tit el=Se lect Addi tion al ( 1 )
additional_jaar=Se lect Addi tion al ( 2 )
a d d i t i o n a l t e l l e r t j e=a d d i t o n al t e l l e r t j e+1
if session ( " X_ingelogd ")=true then
%>
<li><a href=" index . asp ? pagina = additional_ <%= additional_id % > ">
Bijlage D. ASP broncode
<%=ad diti onal _ti tel%></a >, <%=a d d i ti o n a l _ j aa r%>
<input type=button class=" delete "
title=" Verwijder de additionele informatie
<%= ad diti ona l_ti tel % > - <%= a d d i t i on a l _ j a a r % > "
onclick=" confirmDelete ( ’ additional ’ , ’ <%= a d d i t i o n a l _ t i t e l % > ’ ,
’ formhandler . asp ? pagina = delete_tekst & tabel =
u s a _ p r e s i d e n t s _ a d d i t i o n a l & tabelveld = additional_id &
tekst_id = <%= additional_id % >& president_id = <%= president_id % > ’) ">
<%
else
%>
<li><a href=" index . asp ? pagina = additional_ <%= additional_id % > ">
<%=ad diti onal _ti tel%></a>,<%=a d d i ti o n a l _ j aa r%>
<%
end if
Se lect Addi tion al . movenext
wend
if additionaltellertje >0 then
’ hr b a l k p r i n t e n
%>
<hr>
<%
end if
%>
D.17
print presidents extern.inc.asp
<%
SQLSelectExtern=" SELECT extern_id , titel , link , by , link_by FROM
u s a _ p r e s i d e n t s _ e x t e r n WHERE president_id = "&president_id&" "
set SelectExtern=conn . execute ( SQLS el e c t E x t er n )
externtellertje=0
while not SelectExtern . eof
extern_id=SelectExtern ( 0 )
81
Bijlage D. ASP broncode
82
extern_titel=SelectExtern ( 1 )
extern_link=SelectExtern ( 2 )
extern_by=SelectExtern ( 3 )
extern_link_by=SelectExtern ( 4 )
if ( extern_by<>" " or not ( isnull ( extern_by ) ) ) and ( extern_link_by<>" " or not
( isnull ( extern_link_by ) ) ) then ’ by p r i n t e n
by=" , by <a href = ’ "&extern_link_by&" ’>"&extern_by&" </a > "
elseif ( extern_by<>" " or not ( isnull ( extern_by ) ) ) and ( ( ex te rn _l ink _b y=" " or
isnull ( extern_link_by ) ) ) then ’ by z o n d e r l i n k b y p r i n t e n
by=" , by "&extern_by&" "
else
by=" "
end if
externtellertje=externtellertje+1
if session ( " X_ingelogd ")=true then
%>
<li class=linklist><a href=" <%= extern_link % > "><%=extern_titel%></a><%=by%>
<input type=button class=" delete " title=" Verwijder de externe link
<%= extern_titel % > <%= by % > " onclick=" confirmDelete ( ’ extern ’ , ’ <%= extern_titel % > ’
,’ formhandler . asp ? pagina = delete_tekst & tabel = u s a _ p r e s i d e n t s _ e x t e r n & tabelveld =
extern_id & tekst_id = <%= extern_id % >& president_id = <%= president_id % > ’) ">
<%
else
%>
<li class=linklist><a href=" <%= extern_link % > "><%=extern_titel%></a><%=by%>
<%
end if
SelectExtern . movenext
wend
if externtellertje >0 then
’ hr b a l k p r i n t e n
%>
<hr>
<%
end if
%>
Bijlage D. ASP broncode
D.18
83
print presidents speeches.inc.asp
<%
’ s o r t e r e n per s o o r t
SQLSelectsoort=" SELECT soort_id , naam FROM Soort "
set selectsoort=conn . execute ( SQLsel ect so or t )
soorttellertje=0
while not Selectsoort . eof
soort_id=selectsoort ( 0 )
soort_naam=selectsoort ( 1 )
soorttellertje=0
SQLSelectspeech=" SELECT speeches_id , titel , jaar , soort_id FROM
u s a _ p r e s i d e n t s _ s p e e c h e s WHERE president_id = "&president_id&" and
soort_id = "&soort_id&" Order by jaar "
set Selectspeech=conn . execute ( SQLS el e c t s p e ec h )
while not Selectspeech . eof
speech_id=Selectspeech ( 0 )
speech_titel=Selectspeech ( 1 )
speech_jaar=Selectspeech ( 2 )
soorttellertje=soorttellertje+1
if session ( " X_ingelogd ")=true then
%>
<li><a href=" index . asp ? pagina = speech_ <%= speech_id % > "><%=speech_titel%></a >,
<%=speech_jaar%><input type=button class=" delete " title=" Verwijder de speech
<%= speech_titel % > - <%= speech_jaar % > " onclick=" confirmDelete ( ’ speech ’ ,
’ <%= speech_titel % > ’ , ’ formhandler . asp ? pagina = delete_tekst &
tabel = u s a _ p r e s i d e n t s _ s p e e c h e s & tabelveld = speeches_id & tekst_id =
<%= speech_id % >& president_id = <%= president_id % > ’) ">
<%
else
%>
<li><a href=" index . asp ? pagina = speech_ <%= speech_id % > "><%=speech_titel%></a >,
<%=speech_jaar%>
<%
end if
Selectspeech . movenext
wend
if soorttellertje >0 then
Bijlage D. ASP broncode
84
’ hr b a l k p r i n t e n
%>
<hr>
<%
end if
Selectsoort . movenext
wend
%>
D.19
print presidents writings.inc.asp
<%
’ s o r t e r e n per s o o r t
SQLSelectsoort=" SELECT soort_id , naam FROM Soort "
set selectsoort=conn . execute ( SQLsel ect so or t )
soorttellertje=0
while not Selectsoort . eof
soort_id=selectsoort ( 0 )
soort_naam=selectsoort ( 1 )
soorttellertje=0
SQ LSel ectw riti ng=" SELECT writings_id , titel , jaar , soort_id FROM
u s a _ p r e s i d e n t s _ w r i t i n g s WHERE president_id = "&president_id&" and
soort_id = "&soort_id&" Order by jaar "
set Selectwriting=conn . execute ( SQL S e l e c t w r i t i n g )
while not Selectwriting . eof
writing_id=Selectwriting ( 0 )
writing_titel=Selectwriting ( 1 )
writing_jaar=Selectwriting ( 2 )
soorttellertje=soorttellertje+1
if session ( " X_ingelogd ")=true then
%>
<li><a href=" index . asp ? pagina = writing_ <%= writing_id % > "><%=writing_titel%>
</a>,<%=writing_jaar%><input type=button class=" delete " title=
" Verwijder de tekst <%= writing_titel % > - <%= writing_jaar % > "
onclick=" confirmDelete ( ’ writing ’ , ’ <%= writing_titel % > ’ , ’ formhandler . asp ?
pagina = delete_tekst & tabel = u s a _ p r e s i d e n t s _ w r i t i n g s & tabelveld = writings_id &
Bijlage D. ASP broncode
85
tekst_id = <%= writings_id % >& president_id = <%= president_id % > ’) ">
<%
else
%>
<li><a href=" index . asp ? pagina = writing_ <%= writing_id % > "><%=writing_titel%>
</a>,<%=writing_jaar%>
<%
end if
Selectwriting . movenext
wend
if soorttellertje >0 then
’ hr b a l k p r i n t e n
%>
<hr>
<%
end if
Selectsoort . movenext
wend
%>
D.20
print quote.inc.asp
<%
’ i d i s h e t nummer van de quote X
quote=split ( pagina , " _ " )
quote_id=quote ( 1 )
’ 0 i s quote , 1 i s h e t nummer van de q u o t e en dat hebben we n o d i g
’ gegevens quote s e l e c t e r e n
SQLselectquote=" SELECT titel , edition , creator , subject , series , published ,
descriptions , lc_subjects , online_edition , publisher , date_text , update_text ,
type_text , source_text , language_text , relation , coverage , rights From usa_quotes
WHERE quote_id = "&quote_id&" "
set selectquote=conn . execute ( SQLsel ect qu ot e )
titel=request . querystring ( " titel " )
’HTML code
Bijlage D. ASP broncode
86
%>
<p>
<h1 class=pres−head><%=titel%></h1>
<%
if session ( " X_ingelogd ")=true then
%>
<BR>
<a href=" index . asp ? pagina = wijzig_quote_ <%= quote_id % > " >[ Wijzig deze tekst ] </a>
</BR>
<%
end if
%>
<p>
<dl>
<%
’ quote i n f o r m a t i e doorlopen
while not selectquote . eof
for each field in selectquote . fields
if field . value<>" " or not isnull ( field . value ) then
response . write ( " <dt > "&field . name&" </ dt > < dd > "&field . value&" </ dd > < BR > " )
end if
next
’ nu v i a t u s s e n t a b e l l e n a u t h o r s , c o n t r i b u t o r s en n o t e s l a t e n z i e n
S Q L s e l e c t a u t h o r s t t b=" SELECT author_id From u s a _ t t b _ q u o t e s _ a u t h o r s WHERE quote_id =
"&quote_id&" "
set se lect auth ors ttb=conn . execute ( S Q L s e l e c t a u t h o r s t t b )
while not se lect auth ors ttb . eof
author_id=se lect auth ors ttb ( 0 )
’ de a u t h o r s o p h a l e n en p r i n t e n
SQ Lsel ecta utho rs=" SELECT name From u s a _ q u o t e s _ a u t h o r s WHERE author_id =
"&author_id&" "
set selectauthors=conn . execute ( SQL s e l e c t a u t h o r s )
while not selectauthors . eof
for each field in selectauthors . fields
if field . value<>" " or not isnull ( field . value ) then
response . write ( " <dt > Authors </ dt > < dd > "&field . value&" </ dd > < BR > " )
end if
next
Bijlage D. ASP broncode
87
selectauthors . movenext
wend
se lect auth orst tb . movenext
wend
’ notes laten zien
S QL se l ec t no te s tt b=" SELECT note_id From u s a _ t t b _ q u o t e s _ n o t e s WHERE quote_id =
"&quote_id&" "
set selectnotesttb=conn . execute ( S QL s e l e c t n o t e s t t b )
while not selectnotesttb . eof
note_id=selectnotesttb ( 0 )
’ de n o t e s o p h a l e n en p r i n t e n
SQLselectnotes=" SELECT tekst From u s a _ q u o t e s _ n o t e s WHERE note_id = "&note_id&" "
set selectnotes=conn . execute ( SQLsel ect no te s )
while not selectnotes . eof
for each field in selectnotes . fields
if field . value<>" " or not isnull ( field . value ) then
response . write ( " <dt > Notes </ dt > < dd > "&field . value&" </ dd > < BR > " )
end if
next
selectnotes . movenext
wend
selectnotesttb . movenext
wend
’ contributors laten zien
S Q L s e l e c t c o n t r i b u t o r s t t b=" SELECT c ont ri bu to r_i d From u s a _ t t b _ q u o t e s _ c o n t r i b u t o r s
WHERE quote_id = "&quote_id&" "
set s e l e c t c o n t r i b u t o r s t t b=conn . execute ( S Q L s e l e c t c o n t r i b u t o r s t t b )
while not s e l e c t c o n t r i b u t o r s t t b . eof
contributor_id=s e l e c t c o n t r i b u t o r s t t b ( 0 )
’ de c o n t r i b u t o r s o p h a l e n en p r i n t e n
S Q L s e l e c t c o n t r i b u t o r s=" SELECT name From u s a _ q u o t e s _ c o n t r i b u t o r s WHERE
contributor_id = "&contributor_id&" "
set s e l e c t c on t r i b u t o r s=conn . execute ( S Q L s e l e c t c o n t r i b u t o r s )
while not s e l e c t co n t r i b u t o r s . eof
for each field in s e l e c t c on t r i b u t o r s . fields
if field . value<>" " or not isnull ( field . value ) then
response . write ( " <dt > Contributors </ dt > < dd > "&field . value&" </ dd > < BR > " )
end if
Bijlage D. ASP broncode
88
next
s e l e c t c on t r i b u t o r s . movenext
wend
s e l e c t c o n t r i b u t o r s t t b . movenext
wend
selectquote . movenext
wend
%>
</dl>
<%
%>
D.21
print speech.inc.asp
<%
’ i d i s h e t nummer van de p a g i n a s p e e c h X
speech=split ( pagina , " _ " )
speech_id=speech ( 1 )
’ 0 i s s p e e c h , 1 i s h e t nummer van de s p e e c h en dat hebben we n o d i g
’ gegevens speech s e l e c t e r e n
SQLselectspeech=" SELECT titel , tekst , president_id , soort_id , speeches_id , quote ,
context From u s a _ p r e s i d e n t s _ s p e e c h e s WHERE speeches_id = "&speech_id&" "
set selectspeech=conn . execute ( SQLs el e c t s p e ec h )
titel=selectspeech ( 0 )
tekst=selectspeech ( 1 )
president_id=selectspeech ( 2 )
soort_id=selectspeech ( 3 )
tekst_id=selectspeech ( 4 )
quote_id=selectspeech ( 5 )
context_id=selectspeech ( 6 )
’ president selecteren
S Q L s e l e ct P r e s i d e n t=" SELECT voornaam , achternaam FROM us a_ pre si de nts WHERE
president_id = "&president_id&" "
set selectPresident=conn . execute ( S Q L s e l e c t P r e s i d e n t )
naamPresident=selectPresident (0)& " "&s e l e ct P r e s i d en t ( 1 )
trail=" < font class = trail > < a href = index . asp > FRtR </ a > > <a href = index . asp ? pagina =
presidents > Presidents </ a > > <a href = index . asp ? pagina = president_ "&president_id&" >
"&naamPresident&" </a > > <b > "&titel&" </b > < BR > < BR > </ font > "
’HTML code
%>
Bijlage D. ASP broncode
<%=trail%>
<p>
<h1 class=pres−head><%=titel%></h1>
<%
if session ( " X_ingelogd ")=true then
%>
<BR>
<a href=" index . asp ? pagina = wijzig_tekst_ <%= tekst_id % >& soort_id = <%= soort_id % > ">
[ Wijzig deze tekst ] </a>
</BR>
<%
end if
%>
<p><font class=small color=red>
<%
if quote_id<>" 0 " then
%>
∗∗∗ <a href=" index . asp ? pagina = quote_ <%= quote_id % >& titel = <%= titel % > ">Quote </a>
<%
end if
if context_id<>" 0 " then
%>
∗ <a href=" index . asp ? pagina = context_ <%= context_id % > ">Context </a> ∗∗∗
<%
end if
%>
</font>
<p>
<%=tekst%>
<%
%>
D.22
print voegtoe.inc.asp
<%
’ p r e s i d e n t i s h e t nummer van de p a g i n a v o e g t o e p r e s i d e n t X
president=split ( pagina , " _ " )
president_id=president ( 2 )
’ 0 i s voegtoe , 1 i s president ,
’ 2 i s h e t nummer van de p r e s i d e n t en dat hebben we n o d i g
’ gegevens president s e l e c t e r e n
S Q L s e l e ct P r e s i d e n t=" SELECT voornaam , achternaam , geboortejaar , sterftejaar ,
89
Bijlage D. ASP broncode
90
afbeelding From usa_presidents WHERE president_id = "&president_id&" "
set selectPresident=conn . execute ( S Q L s e l e c t P r e s i d e n t )
voornaam=selectPresident ( 0 )
achternaam=selectPresident ( 1 )
%>
<p>U kunt een tekst toevoegen voor president <%=voornaam%> <%=achternaam%>.
<br/><br/>
<p>
<form action=" formhandler . asp ? pagina = voegtoe_tekst_ <%= president_id % > " method=" post ">
<select name=" soort " id=" soort ">
<option value=" 0 " disabled selected>Kies de soort tekst </option>
<%
’ l i j s t j e p r i n t e n u i t db
SQLselectSoort=" SELECT soort_id , naam from SOORT "
set selectSoort=conn . execute ( SQLsel ect So or t )
while not selectSoort . eof
%>
<option value=" <%= selectSoort (0)% > "><%=selectSoort (1)%></option>
<%
selectSoort . movenext
wend
%>
</select><BR/>
<input type=" text " name=" txt_titel " value=" Voer hier de titel in van de tekst . "
id=" txt_titel " size=" 80 "/>
<TEXTAREA name=" txt " rows=" 20 " cols=" 80 ">
Voer hier de tekst in . HTML tags zijn toegestaan .
</TEXTAREA>
<input type=" text " name=" txt_jaar " value=" Voer hier het jaar in van de tekst . "
id=" txt_jaar " size=" 80 "/>
<BR><BR>
<input type=" submit " value=" Voeg Toe " id=" btnVoegToe " />
</form>
</p>
D.23
print wijzig.inc.asp
<%
tekstarray=split ( pagina , " _ " )
tekst_id=tekstarray ( 2 )
’ 0 i s v o e g t o e , 1 i s t e k s t , 2 i s h e t nummer van de t e k s t en dat hebben we n o d i g
’ c a t e g o r i e opvragen
Bijlage D. ASP broncode
91
categorie=request . querystring ( " soort_id " )
tabel=" "
tekstsoort=" "
if categorie=" 1 " OR categorie=" 4 " then ’ w r i t i n g
tabel=" u s a _ p r e s i d e n t s _ w r i t i n g s "
tekstsoort=" writings "
elseif categorie=" 2 " or categorie=" 3 " then ’ s p e e c h
tabel=" u s a _ p r e s i d e n t s _ s p e e c h e s "
tekstsoort=" speeches "
elseif categorie=" 5 " then ’ b i o g r a p h y
tabel=" u s a _ p r e s i d e n t s _ b i o g r a p h y "
tekstsoort=" biography "
else ’ a d d i t i o n a l
tabel=" u s a _ p r e s i d e n t s _ a d d i t i o n a l "
tekstsoort=" additional "
end if ’ v o o r s o o r t e n c a t e g o r i e
’ t e k s t g e g e v e n s opvragen
SQLselecttekst=" SELECT titel , tekst , jaar From "&tabel&" WHERE "&tekstsoort&" _id =
"&tekst_id&" "
set selecttekst=conn . execute ( SQLsel ect te ks t )
titel=selecttekst ( 0 )
tekst=selecttekst ( 1 )
jaar=selecttekst ( 2 )
%>
<p>U kunt de volgende tekst wijzigen voor president <%=voornaam%>&nbsp ;
<%=achternaam%>. <br/><br/>
<p>
<form action=" formhandler . asp ? pagina = wijzig_tekst_ <%= president_id % > " method=" post ">
<input type=" hidden " name=" soort " id=" soort " value=" ">
<input type=" text " name=" txt_titel " value=" <%= titel % > " id=" txt_titel " size=" 80 "/>
<TEXTAREA name=" txt " rows=" 20 " cols=" 80 ">
<%=tekst%>
</TEXTAREA>
<input type=" text " name=" txt_jaar " value=" <%= jaar % > " id=" txt_jaar " size=" 80 "/>
<BR><BR>
<input type=" submit " value=" Wijzig " id=" btnVoegToe " />
</form>
</p>
D.24
print writing.inc.asp
Bijlage D. ASP broncode
92
<%
’ i d i s h e t nummer van de p a g i n a w r i t i n g X
writing=split ( pagina , " _ " )
writing_id=writing ( 1 )
’ 0 i s w r i t i n g , 1 i s h e t nummer van de w r i t i n g en dat hebben we n o d i g
’ gegevens writing s e l e c t e r e n
SQ Lsel ectw riti ng=" SELECT titel , tekst , president_id From
u s a _ p r e s i d e n t s _ w r i t i n g s WHERE writings_id = "&writing_id&" "
set selectwriting=conn . execute ( SQL s e l e c t w r i t i n g )
titel=selectwriting ( 0 )
tekst=selectwriting ( 1 )
president_id=selectwriting ( 2 )
’ president selecteren
S Q L s e l e ct P r e s i d e n t=" SELECT voornaam , achternaam FROM us a_ pre si de nts WHERE
president_id = "&president_id&" "
set selectPresident=conn . execute ( S Q L s e l e c t P r e s i d e n t )
naamPresident=selectPresident (0)& " "&s e l e ct P r e s i d en t ( 1 )
trail=" < font class = trail > < a href = index . asp > FRtR </ a > > <a href = index . asp ? pagina =
presidents > Presidents </ a > > <a href = index . asp ? pagina = president_ "&president_id&" >
"&naamPresident&" </a > > <b > "&titel&" </b > < BR > < BR > </ font > "
’HTML code
%>
<%=trail%>
<p>
<h1 class=pres−head><%=titel%></h1><br>
<p><font class=small color=red >∗∗∗ <a href=" ">Quote </a> ∗ <a href=" ">Context </a>
∗∗∗</ font>
<p>
<%=tekst%>
<%
%>
D.25
voegtoe tekst.inc.asp
<%
’ p r e s i d e n t i s h e t nummer van de p a g i n a v o e g t o e p r e s i d e n t X
president=split ( pagina , " _ " )
president_id=president ( 2 )
’ 0 i s voegtoe , 1 i s president ,
’ 2 i s h e t nummer van de p r e s i d e n t en dat hebben we n o d i g
Bijlage D. ASP broncode
93
’ g e p o s t e g e g e v e n s opvragen
categorie=trim ( request . form ( " soort " ) )
titel=trim ( request . form ( " txt_titel " ) )
tekst=trim ( request . form ( " txt " ) )
tekst=Replace ( tekst , " " " " , " " " " " " )
tekst=Replace ( tekst , " ’" , " ’’" )
’REPLACE CARRIAGE RETURNS IN THE VARIABLE <BR>
tekst = replace ( tekst , chr ( 1 3 ) , " <br > " )
jaar=trim ( request . form ( " txt_jaar " ) )
tabel=" "
if categorie<>" 0 " then
’ c a t e g o r i e opvragen
’ 1 = Onbekend
’ 2 = Address
’ 3 = Message
’4 = Letter
’ 5 = biography
if categorie=" 1 " OR categorie=" 4 " then ’ w r i t i n g
tabel=" u s a _ p r e s i d e n t s _ w r i t i n g s "
elseif categorie=" 2 " or categorie=" 3 " then ’ s p e e c h
tabel=" u s a _ p r e s i d e n t s _ s p e e c h e s "
elseif categorie=" 5 " then ’ b i o g r a p h y
tabel=" u s a _ p r e s i d e n t s _ b i o g r a p h y "
else ’ a d d i t i o n a l
tabel=" u s a _ p r e s i d e n t s _ a d d i t i o n a l "
end if ’ v o o r s o o r t e n c a t e g o r i e
’ i n db z e t t e n
SQLinsertTekst=" INSERT INTO "&tabel&" ( titel , tekst , jaar , soort_id , president_id )
VALUES ( ’ "&titel&" ’,’"&tekst&" ’,’"&jaar&" ’, "&categorie&" , "&president_id&" ) "
conn . execute ( SQLinsertTekst )
’ response . write SQLinsertTekst
response . redirect " index . asp ? pagina = president_ "&president_id&" "
else ’ i e t s mis
response . write ( " er is iets fout gegaan " )
end if ’ v o o r o f e r wel c a t e g o r i e i s opgegeven
%>
D.26
wijzig tekst.inc.asp
Bijlage D. ASP broncode
94
<%
tekstarray=split ( pagina , " _ " )
tekst_id=tekstarray ( 2 )
’ 0 i s voegtoe , 1 i s tekst ,
’ 2 i s h e t nummer van de t e k s t en dat hebben we n o d i g
tabel=" "
tekstsoort=" "
’ g e t v a r i a b e l e n opvragen
’ g e p o s t e g e g e v e n s opvragen
categorie=trim ( request . form ( " soort " ) )
titel=trim ( request . form ( " txt_titel " ) )
tekst=trim ( request . form ( " txt " ) )
tekst=Replace ( tekst , " " " " , " " " " " " )
tekst=Replace ( tekst , " ’" , " ’’" )
’REPLACE CARRIAGE RETURNS IN THE VARIABLE <BR>
tekst = replace ( tekst , chr ( 1 3 ) , " <br > " )
jaar=trim ( request . form ( " txt_jaar " ) )
tabel=" "
if categorie<>" 0 " then
’ c a t e g o r i e opvragen
’ 1 = Onbekend
’ 2 = Address
’ 3 = Message
’4 = Letter
’ 5 = biography
if categorie=" 1 " OR categorie=" 4 " then ’ w r i t i n g
tabel=" u s a _ p r e s i d e n t s _ w r i t i n g s "
tekstsoort=" writings "
elseif categorie=" 2 " or categorie=" 3 " then ’ s p e e c h
tabel=" u s a _ p r e s i d e n t s _ s p e e c h e s "
tekstsoort=" speeches "
elseif categorie=" 5 " then ’ b i o g r a p h y
tabel=" u s a _ p r e s i d e n t s _ b i o g r a p h y "
tekstsoort=" biography "
else ’ a d d i t i o n a l
tabel=" u s a _ p r e s i d e n t s _ a d d i t i o n a l "
tekstsoort=" additional "
end if ’ v o o r s o o r t e n c a t e g o r i e
’ i n db updaten
SQLupdateTekst=" UPDATE "&tabel&" SET titel = ’"&titel&" ’, tekst = ’"&tekst&" ’,
jaar = ’"&jaar&" ’, soort_id = "&categorie&" WHERE "&tekstsoort&" _id = "&categorie&" "
’ conn . e x e c u t e ( SQLupdateTekst )
Bijlage D. ASP broncode
response . write SQLupdateTekst
response . end
response . redirect " index . asp ? pagina = president_ "&president_id&" "
else ’ i e t s mis
response . write ( " er is iets fout gegaan " )
end if ’ v o o r o f e r wel c a t e g o r i e i s opgegeven
%>
95
Bijlage E
PHP broncode
E.1
index.php
<?php
// de p a g i n a opvragen u i t de q u e r y s t r i n g
$pagina=$_REQUEST [ ’ pagina ’ ] ;
if ( $pagina == " " ) {
$pagina=" index " ;
}
// daarna de p a g i n a z e l f p r i n t e n ( header , t e k s t u i t db , f o o t e r )
include ( " ./ inc / print_header . inc . php " ) ;
include ( " ./ inc / print_footer . inc . php " ) ;
?>
E.2
formhandler.php
<?php
include ( " ./ inc / dbconn . inc . php " ) ;
include ( " ./ inc / functies . inc . php " ) ;
?>
<! DOCTYPE HTML PUBLIC " -// W3C // DTD HTML 4.01 Transitional // EN ">
<html>
<head>
<title></title>
96
Bijlage E. PHP broncode
97
</head>
<body>
<?
$pagina=$_REQUEST [ ’ pagina ’ ] ;
if ( $pagina==" login " ) :
include ( " ./ inc / check_login . inc . php " ) ;
elseif ( ereg ( " voegtoe_tekst_ " , $pagina ) ) :
include ( " ./ inc / voegtoe_tekst . inc . php " ) ;
elseif ( ereg ( " wijzig_tekst_ " , $pagina ) ) :
include ( " ./ inc / wijzig_tekst . inc . php " ) ;
elseif ( ereg ( " delete_tekst " , $pagina ) ) :
include ( " ./ inc / delete_tekst . inc . php " ) ;
else :
echo ( " <p > Formhandler voor < strong > $pagina </ strong > </ p > " ) ;
endif ;
?>
</body>
</html>
E.3
check login.inc.php
<?php
$X_ingelogd=false ;
$uname=$_REQUEST [ ’ username ’ ] ;
$password=$_REQUEST [ ’ password ’ ] ;
// c o n t r o l e
if ( $uname==" " OR $password==" " ) :
$X_ingelogd=false ;
else :
$SQLselectLogin=" select * FROM login WHERE Username = ’ $uname ’ AND Password
= ’ $password ’ " ;
$selectLogin = mysql_query ( $SQLselectLogin , $connection ) ; // v o e r t query u i t
$Logintellertje =0;
while ( $ r e s u l t a a t _ s e l e c t L o g i n = my s ql _ f e t c h _ ro w ( $selectLogin ) )
{
Bijlage E. PHP broncode
98
$Logintellertje++;
}
if ( $Logintellertje <1): // geen s j o e g e
$X_ingelogd=false ;
else :
$X_ingelogd=true ;
endif ;
endif ;
if ( $X_ingelogd==true ) :
echo " < meta http - equiv =\" refresh \" content =\"0; url = index . php \" target =\" _top \" > " ;
else :
echo " < meta http - equiv =\" refresh \" content =\"0; url = index . php ? pagina = admin \"
target =\" _top \" > " ;
endif ;
?>
E.4
dbconn.inc.php
<?php
$hostname=" 192.168.0.1 " ;
$username=" " ;
$password=" " ;
$dblogin=" " ;
$dbpass=" " ;
$db=" test " ; //naam van de d a t a b a s e i s b e s t h a nd i g v o o r de c o n n e c t i e
$connection = mysql_connect ( $hostname , $username , $password ) ;
// de d a t a b a s e c o n n e c t i e wordt k l a a r g e z e t v o o r g e b r u i k
mysql_select_db ( $db , $connection ) ;
// k i j k e n o f de p a g i n a wel a a n w e z i g i s
if ( $pagina<>" formhandler " ) :
$S QLse lect Pag ina=" SELECT titel , tekst FROM usa_content WHERE code = ’ $pagina ’ " ;
$result_id = mysql_query ( $SQLselectPagina , $connection ) ; // v o e r t query u i t
$aantal = mysql_num_rows ( $result_id ) ;
if ( $aantal <>0):
// i s i e a a n w e z i g i n de db en kunnen de g e g e v e n s d a a r u i t worden g e h a a l d
while ( $resultaat = mysql_fet c h _ ro w ( $result_id ) )
{
$titelpagina=$resultaat [ 0 ] ; // t i t e l van de p a g i n a
Bijlage E. PHP broncode
99
$tekst=$resultaat [ 1 ] ; // t e k s t van de p a g i n a
}
else : // dan i s de p a g i n a n i e t gevonden en komt e r een f o u t m e l d i n g
$titel=" Fout - Pagina Niet Gevonden " ;
$tekst=" <p > De pagina kan niet gevonden worden op de USA website . </p > " ;
// e v e n t u e e l u i t b r e i d e n
endif ; // v o o r de i f −then−e l s e v o o r o f de p a g i n a wel b e s t a a t
endif ; // v o o r o f de p a g i n a f o r m h a n d l e r i s o f n i e t
?>
E.5
delete tekst.inc.php
<?php
$tabel=$_REQUEST [ ’ tabel ’ ] ;
$tabelveld=$_REQUEST [ ’ tabelveld ’ ] ;
$president_id=$_REQUEST [ ’ president_id ’ ] ;
$tekst_id=$_REQUEST [ ’ tekst_id ’ ] ;
$SQLdeleteTekst=" DELETE FROM $tabel WHERE $tabelveld = $tekst_id " ;
$deleteTekst = mysql_query ( $SQLdeleteTekst , $connection ) ; // v o e r t query u i t
echo " < meta http - equiv =\" refresh \" content =\"0; url = index . php ? pagina =
p r e s i d e n t _ $ p r e s i d e n t _ i d \" target =\" _top \" > " ;
?>
E.6
functies.inc.php
<?php
if ( $pagina==" presidents " ) :
?>
<ul>
<?
// l i j s t j e
p r i n t e n van p r e s i d e n t e n
// de p r e s i d e n t e n l a t e n z i e n a l s v o l g t :
//nummer , voornaam , achternaam : b e g i n j a a r −e i n d j a a r
// l o o p j e om p r e s i d e n t s p e r i o d e s t e s e l e c t e r e n
Bijlage E. PHP broncode
100
$ S Q L s e l e c t P r e s i d e n t T e r m=" SELECT From u s a _ p r e s i d e n t s _ t e r m s term_id , president_id ,
beginjaar , eindjaar " ;
$ s e l e c t P r e s i d e n t T e r m = mysql_query ( $SQLselectPresidentTerm , $connection ) ;
// v o e r t query u i t
while ( $ r e s u l t a a t _ s e l e c t P r e s i d e n t T e r m = m y s q l_ f e t c h _ ro w ( $ s e l e c t P r e s i d e n t T e r m ) )
{
// l o o p j e om p r e s i d e n t e n t e s e l e c t e r e n d i e b i j d i e term horen
$ S Q L s e l e c t P r e s i d e n t=" SELECT From us a_ pre si de nt s voornaam , achternaam WHERE
president_id = $ r e s u l t a a t _ s e l e c t P r e s i d e n t T e r m [1] " ;
$s elec tPre side nt = mysql_query ( $SQLselectPresident , $connection ) ; // v o e r t query u i t
while ( $ r e s u l t a a t _ s e l e c t P r e s i d e n t = m y s q l_ f e t c h _ ro w ( $ s e l e c t P r e s i d e n t ) )
{
// op scherm p r i n t e n
?>
<li><a href=" index . php ? pagina = president <?= $ r e s u l t a a t _ s e l e c t P r e s i d e n t T e r m [1]? > ">
<?=$ r e s u l t a a t _ s e l e c t P r e s i d e n t [0]? >& nbsp ;<?= $ r e s u l t a a t _ s e l e c t P r e s i d e n t [ 1 ] ? >
</a> : <?=$ r e s u l t a a t _ s e l e c t P r e s i d e n t T e r m [2]?>−<?= $ r e s u l t a a t _ s e l e c t P r e s i d e n t T e r m [ 3 ] ? >
<?
}
}
?>
</ul>
<?
endif ;
?>
E.7
pageselector.inc.php
<?php
if ( ereg ( " _volunteer " , $pagina ) ) : // algemene v o l u n t e e r p a g i n a l a t e n z i e n
Header ( " Location : index . php ? pagina = volunteer " ) ;
elseif ( ereg ( " voegtoe_tekst_ " , $pagina ) ) : // p a g i n a v o o r t o e v o e g e n t e k s t e n l a t e n z i e n
include ( " ./ inc / print_voegtoe . inc . php " ) ;
elseif ( ereg ( " wijzig_tekst_ " , $pagina ) ) : // p a g i n a v o o r w i j z i g e n t e k s t e n l a t e n z i e n
include ( " ./ inc / print_wijzig . inc . php " ) ;
Bijlage E. PHP broncode
elseif ( $pagina==" admin " ) :
include ( " ./ inc / print_admin . inc . php " ) ;
elseif ( $pagina==" presidents " ) :
include ( " ./ inc / p rin t_pr esid ent s . inc . php " ) ;
elseif ( ereg ( " president_ " , $pagina ) ) :
// s p e c i f i e k e p a g i n a l a t e n z i e n van d i e p r e s i d e n t
include ( " ./ inc / p r i n t _ p r e s i d e n t _ s p e c i f i e k . inc . php " ) ;
elseif ( ereg ( " biography_ " , $pagina ) ) : // b i o g r a f i e l a t e n z i e n
include ( " ./ inc / print_biography . inc . php " ) ;
elseif ( ereg ( " speech_ " , $pagina ) ) : // s p e e c h l a t e n z i e n
include ( " ./ inc / print_speech . inc . php " ) ;
elseif ( ereg ( " writing_ " , $pagina ) ) : // w r i t i n g s l a t e n z i e n
include ( " ./ inc / print_writing . inc . php " ) ;
elseif ( ereg ( " additional_ " , $pagina ) ) : // a d d i t i o n e l e i n f o r m a t i e l a t e n z i e n
include ( " ./ inc / p rin t_ad diti ona l . inc . php " ) ;
elseif ( ereg ( " quote_ " , $pagina ) ) : // q u o t e i n f o r m a t i e l a t e n z i e n
include ( " ./ inc / print_quote . inc . php " ) ;
elseif ( ereg ( " context_ " , $pagina ) ) : // c o n t e x t i n f o r m a t i e l a t e n z i e n
include ( " ./ inc / print_context . inc . php " ) ;
else : // n i e t nader g e s p e c i f i c e e r d e p a g i n a
echo $tekst ;
endif ;
?>
E.8
print additional.inc.php
<?php
// i d i s h e t nummer van de p a g i n a a d d i t i o n a l X
list ( $additional , $additional_id ) = split ( ’_ ’ , $pagina ) ;
// g e g e v e n s a d d i t i o n a l s e l e c t e r e n
$ S Q L s e l e c t a d d i t i o n a l=" SELECT titel , tekst , president_id From
u s a _ p r e s i d e n t s _ a d d i t i o n a l WHERE additional_id = $a dd it io nal _i d " ;
101
Bijlage E. PHP broncode
102
$ se le c ta d di ti o na l = mysql_query ( $SQLselectadditional , $connection ) ;
// v o e r t query u i t
while ( $ r e s u l t a a t _ s e l e c t a d d i t i o n a l = m y s q l_ f e t c h _ ro w ( $ s e l e c t a d d i t i o n a l ) )
{
$titel=$ r e s u l t a a t _ s e l e c t a d d i t i o n a l [ 0 ] ;
$tekst=$ r e s u l t a a t _ s e l e c t a d d i t i o n a l [ 1 ] ;
$president_id=$ r e s u l t a a t _ s e l e c t a d d i t i o n a l [ 2 ] ;
}
// p r e s i d e n t s e l e c t e r e n
$ S Q L s e l e c t P r e s i d e n t=" SELECT voornaam , achternaam FROM us a_ pre si de nt s WHERE
president_id = $president_id " ;
$s elec tPre side nt = mysql_query ( $SQLselectPresident , $connection ) ; // v o e r t query u i t
while ( $ r e s u l t a a t _ s e l e c t P r e s i d e n t = m y s q l_ f e t c h _ ro w ( $ s e l e c t P r e s i d e n t ) )
{
$naamPresident=$ r e s u l t a a t _ s e l e c t P r e s i d e n t [ 0 ] . $ r e s u l t a a t _ s e l e c t P r e s i d e n t [ 1 ] ;
}
$trail=" < font class = trail > < a href = index . php > FRtR </ a > >
<a href = index . php ? pagina = presidents > Presidents </ a > >
<a href = index . php ? pagina = president_$president_id >
$naamPresident </ a > > <b > $titel </ b > < BR > < BR > </ font > "
echo $trail ;
//HTML code
?>
<p>
<h1 class=pres−head><?=$titel?></h1><br>
<p><font class=small color=red >∗∗∗ <a href=" ">Quote </a> ∗
<a href=" ">Context </a> ∗∗∗</ font>
<p>
<?=$tekst?>
<?
?>
E.9
print admin.inc.php
<p>U kunt inloggen als Administrator . Daarmee kunt u de website beheren .
Dit kan bestaan uit bestaande teksten te wijzigen ,
maar ook uit het toevoegen van nieuwe teksten .
Hiertoe dient u de gebruikersnaam en het wachtwoord voor uw admin login in te voeren .
<br/><br/>
Bijlage E. PHP broncode
103
<?
if ( $X_ingelogd==false ) :
?>
<p><b>
De door u ingevulde logingegevens zijn incorrect . Probeer het nogmaals .< br/>
<br/></b><p>
<?
endif ;
?>
Let er a . u . b . op dat de logingegevens <strong>hoofdletter−gevoelig </strong> zijn .
</p>
<p>
<form action=" formhandler . php ? pagina = login " method=" post ">
<label id=" txtusername " for=" username ">Gebruikersnaam </label>
<input type=" text " name=" username " value=" " id=" txtUsername " />
<label id=" txtpassword " for=" password ">Wachtwoord </label>
<input type=" password " name=" password " value=" " id=" txtPassword " />
<BR><BR>
<input type=" submit " value=" Inloggen " id=" btnLogin " />
</form>
</p>
E.10
print biography.inc.php
<?php
// i d i s h e t nummer van de p a g i n a bi o g r a ph y X
list ( $biography , $biography_id ) = split ( ’_ ’ , $pagina ) ;
// g e g e v e n s b i o g r a p h y s e l e c t e r e n
$ S Q L s e l e c t B i o g r a p h y=" SELECT titel , tekst , president_id From u s a _ p r e s i d e n t s _ b i o g r a p h y
WHERE biography_id = $biography_id " ;
$s elec tBio grap hy = mysql_query ( $SQLselectBiography , $connection ) ; // v o e r t query u i t
while ( $ r e s u l t a a t _ s e l e c t B i o g r a p h y = m y s q l_ f e t c h _ ro w ( $ s e l e c t B i o g r a p h y ) )
{
$titel=$ r e s u l t a a t _ s e l e c t B i o g r a p h y [ 0 ] ;
$tekst=$ r e s u l t a a t _ s e l e c t B i o g r a p h y [ 1 ] ;
$president_id=$ r e s u l t a a t _ s e l e c t B i o g r a p h y [ 2 ] ;
}
// p r e s i d e n t s e l e c t e r e n
$ S Q L s e l e c t P r e s i d e n t=" SELECT voornaam , achternaam FROM us a_ pre si de nt s WHERE
president_id = $president_id " ;
$s elec tPre side nt = mysql_query ( $SQLselectPresident , $connection ) ; // v o e r t query u i t
while ( $ r e s u l t a a t _ s e l e c t P r e s i d e n t = m y s q l_ f e t c h _ ro w ( $ s e l e c t P r e s i d e n t ) )
{
Bijlage E. PHP broncode
104
$naamPresident=$ r e s u l t a a t _ s e l e c t P r e s i d e n t [ 0 ] . $ r e s u l t a a t _ s e l e c t P r e s i d e n t [ 1 ] ;
}
$trail=" < font class = trail > < a href = index . php > FRtR </ a > >
<a href = index . php ? pagina = presidents > Presidents </ a > >
<a href = index . php ? pagina = president_$president_id >
$naamPresident </ a > > <b > $titel </ b > < BR > < BR > </ font > " ;
echo $trail ;
//HTML code
?>
<p>
<h1 class=pres−head><?=$titel?></h1><br>
<p><font class=small color=red >∗∗∗ <a href=" ">Quote </a> ∗∗∗</ font>
<p>
<?=$tekst?>
<?
?>
E.11
print context.inc.php
<?php
// i d i s h e t nummer van de c o n t e x t X
list ( $context , $context_id ) = split ( ’_ ’ , $pagina ) ;
// g e g e v e n s c o n t e x t s e l e c t e r e n
$ SQ Ls e le c tc on t ex t=" SELECT titel , tekst FROM usa_context WHERE
context_id = $context_id " ;
$selectcontext = mysql_query ( $SQLselectcontext , $connection ) ; // v o e r t query u i t
while ( $ r e s u l t a a t _ s e l e c t c o n t e x t = m y s ql _ f e t c h _ ro w ( $s el ec tc ont ex t ) )
{
$titel=$ r e s u l t a a t _ s e l e c t c o n t e x t [ 0 ] ;
$tekst=$ r e s u l t a a t _ s e l e c t c o n t e x t [ 1 ] ;
}
//HTML code
?>
<p>
<h1 class=pres−head><?=$titel?></h1>
<?
if ( $X_ingelogd==true ) :
Bijlage E. PHP broncode
105
?>
<BR>
<a href=" index . php ? pagina = wijzig_context_ <?= $context_id ? > " >[ Wijzig deze tekst ] </a>
</BR>
<?
endif ;
?>
<p>
<?
echo $tekst ;
?>
E.12
print footer.inc.php
</div>
<?php
$jaar=date ( ’Y ’ ) ;
?>
<div id=" foot ">
&copy ; <?=$jaar?>
</div>
</body>
</html>
E.13
print header.inc.php
<?php
include ( " ./ inc / dbconn . inc . php " ) ;
?>
<xml version=" 1.0 " encoding=" UTF -8 ">
<! DOCTYPE html PUBLIC " -// W3C // DTD XHTML 1.0 Transitional // EN "
" http :// www . w3 . org / TR / xhtml1 / DTD / xhtml1 - transitional . dtd ">
<?php
Bijlage E. PHP broncode
// g e g e v e n s s i t e u i t db h a l e n
$SQLselectMeta=" SELECT css , titel , subtitel , meta_description , meta_keywords ,
begin_jaar FROM u s a _ m e t a _ i n f o r m a t i o n " ;
$result_Meta = mysql_query ( $SQLselectMeta , $connection ) ; // v o e r t query u i t
while ( $resultaat = mysql_fet c h _ ro w ( $result_Meta ) )
{
$css=$resultaat [ 0 ] ;
$hoofdtitel=$resultaat [ 1 ] ;
$subtitel=$resultaat [ 2 ] ;
$keywords=$resultaat [ 4 ] ;
}
?>
<html xmlns=" http :// www . w3 . org /1999/ xhtml " lang=" nl ">
<head>
<title><?=$hoofdtitel?>&nbsp ;<?= $subtitel?></title>
<meta http−equiv=" Content - Type " content=" text / html ; charset = iso -8859 -1 " />
<meta name=" description " content=" " />
<meta name=" keywords " content=" <?= $keywords ? > " />
<meta name=" author " content=" Fokke van der Molen " />
<meta name=" copyright " content=" Fokke van der Molen - 2004 " />
<meta http−equiv=" pragma " content=" no - cache " />
<meta http−equiv=" content - type " content=" text / html ; charset = ISO -8859 -1 " />
<meta http−equiv=" content - language " content=" nl - nl " />
<meta http−equiv=" content - style - type " content=" text / css " />
<meta http−equiv=" content - script - type " content=" text / javascript " />
<meta name=" content - language " content=" nl - nl " />
<meta name=" robots " content=" index , follow " />
<link href=" css / <?= $css ? > " rel=" stylesheet " type=" text / css " media=" screen ,
print " title=" USA " />
</head>
<body lang=" nl ">
<a href=" ./ index . asp " title=" USA "><img src=" img / usa_logo . jpg " alt=" USA logo "
id=" logo " border=" 0 "/></a>
<h1>
<?php
if ( $pagina==" index " ) :
echo $hoofdtitel ;
else :
echo $titel ;
endif ;
?>
</h1>
<script SRC=" java / nheader . js "></script>
<script SRC=" java / forms . js "></SCRIPT>
<?php
if ( $pagina==" index " ) :
106
Bijlage E. PHP broncode
107
?>
<script src=" java / new . js "></script>
<?php
endif ;
include ( " ./ inc / pageselector . inc . php " ) ;
?>
E.14
print president specifiek.inc.php
<?php
// p r e s i d e n t i s h e t nummer van de p a g i n a p r e s i d e n t X
list ( $president , $president_id ) = split ( ’_ ’ , $pagina ) ;
// g e g e v e n s p r e s i d e n t s e l e c t e r e n
$ S Q L s e l e c t P r e s i d e n t=" SELECT voornaam , achternaam , geboortejaar , sterftejaar ,
afbeelding From usa_presidents WHERE president_id = $president_id " ;
$s elec tPre side nt = mysql_query ( $SQLselectPresident , $connection ) ; // v o e r t query u i t
while ( $ r e s u l t a a t _ s e l e c t P r e s i d e n t = m y s q l_ f e t c h _ ro w ( $ s e l e c t P r e s i d e n t ) )
{
$voornaam=$ r e s u l t a a t _ s e l e c t P r e s i d e n t [ 0 ] ;
$achternaam=$ r e s u l t a a t _ s e l e c t P r e s i d e n t [ 1 ] ;
$geboortejaar=$ r e s u l t a a t _ s e l e c t P r e s i d e n t [ 2 ] ;
$sterftejaar=$ r e s u l t a a t _ s e l e c t P r e s i d e n t [ 3 ] ;
$afbeelding=$ r e s u l t a a t _ s e l e c t P r e s i d e n t [ 4 ] ;
if ( $geboortejaar ==0):
$geboortejaar=" " ;
endif ;
if ( $sterftejaar ==0):
$sterftejaar=" " ;
endif ;
}
// ’ p r e s i d e n t i e l e p e r i o d e g e g e v e n s s e l e c t e r e n
$ S Q L s e l e c t P r e s i d e n t T e r m=" SELECT Term_id , beginjaar , eindjaar FROM
u s a _ p r e s i d e n t s _ t e r m s WHERE president_id = $president_id " ;
$ s e l e c t P r e s i d e n t T e r m = mysql_query ( $SQLselectPresidentTerm , $connection ) ;
// v o e r t query u i t
Bijlage E. PHP broncode
108
$termijn=" " ;
while ( $ r e s u l t a a t _ s e l e c t P r e s i d e n t T e r m = m y s q l_ f e t c h _ ro w ( $ s e l e c t P r e s i d e n t T e r m ) )
{
$term_id=$ r e s u l t a a t _ s e l e c t P r e s i d e n t T e r m [ 0 ] ;
if ( ! $termijn==" " ) :
$termijn=$termijn . " / " ;
endif ;
if ( ! $jaren==" " ) :
$jaren=$jaren . " / " ;
endif ;
// b e p a l e n wat de term i s
if ( substr ( $term_id , −1, 1)==1): // g e t a l l e n d i e e i n d i g e n op 1
$termijn=$termijn . $term_id . " st " ;
elseif ( substr ( $term_id , −1, 1)==2): // g e t a l l e n d i e e i n d i g e n op 2
$termijn=$termijn . $term_id . " nd " ;
elseif ( substr ( $term_id , −1, 1)==3): // g e t a l l e n d i e e i n d i g e n op 3
$termijn=$termijn . term_id . " rd " ;
else : // o v e r i g e n
$termijn=$termijn . term_id . " th " ;
endif ;
$beginjaar=$ r e s u l t a a t _ s e l e c t P r e s i d e n t T e r m [ 1 ] ;
$eindjaar=$ r e s u l t a a t _ s e l e c t P r e s i d e n t T e r m [ 2 ] ;
if ( $beginjaar ==0):
$beginjaar=" " ;
endif ;
if ( $eindjaar ==0):
$eindjaar=date ( ’Y ’ ) ;
endif ;
$jaren=$jaren . $beginjaar . " -" . $eindjaar ;
}
// b i o g r a f i e s e l e c t e r e n
$ S Q L s e l e c t B i o g r a p h y=" SELECT biography_id FROM u s a _ p r e s i d e n t s _ b i o g r a p h y WHERE
president_id = $president_id " ;
$s elec tBio grap hy = mysql_query ( $SQLselectBiography , $connection ) ; // v o e r t query u i t
Bijlage E. PHP broncode
109
while ( $ r e s u l t a a t _ s e l e c t B i o g r a p h y = m y s q l_ f e t c h _ ro w ( $ s e l e c t B i o g r a p h y ) )
{
$biography_id=$ r e s u l t a a t _ s e l e c t B i o g r a p h y [ 0 ] ;
}
if ( $biography_id==" " ) : // geen b i o g r a f i e , dus algemene t e k s t
$biography_id=" volunteer " ;
endif ;
$trail=" < font class = trail > < a href = index . php > FRtR </ a > > <a href = index . php ? pagina =
presidents > Presidents </ a > > <b > $voornaam & nbsp ; $achternaam </ b > < BR > < BR > </ font > " ;
echo $trail ;
// nu HTML code
?>
<font class=normal>
<h1 class=pres−head><?=$voornaam?>&nbsp ;<?= $achternaam?>&nbsp ;(<?= $geboortejaar?>
−<?=$sterftejaar ?>)</h1><br>
<h2 class=pres−head><?=$termijn?> president of the United States : <?=$jaren?></h2>
<?
if ( $X_ingelogd==true ) : // i s i e i n g e l o g d
?>
<BR/>
<BR/>
<a href=" index . php ? pagina = voegtoe_tekst_ <?= $president_id ? > ">
[ Voeg een tekst toe voor deze president ] </a>
</BR>
<?
endif ;
?>
<p>
<table width=100%>
<tr>
<td>
<table width=100%>
<tr>
<td align=center>
<img src=" img / presidents / <?= $afbeelding ? > " alt=" <?= $voornaam ? >& nbsp ;
<?= $achternaam ? > ">
<br>
<?
if ( $X_ingelogd==true and $biography_id != " volunteer " ) :
?>
<A HREF=" index . php ? pagina = biography_ <?= $biography_id ? > "><?=$voornaam?>&nbsp ;
Bijlage E. PHP broncode
110
<?=$achternaam?></A>
<BR>(<?=$geboortejaar?>−<?=$sterftejaar?>)<input type=button class=" delete "
title=" Verwijder de biografie van <?= $voornaam ? >& nbsp ; <?= $achternaam ? > "
onclick=" confirmDelete ( ’ biography ’,’ de biografie van <?= $voornaam ? >& nbsp ;
<?= $achternaam ? > ’ , ’ formhandler . php ? pagina = delete_tekst & tabel =
u s a _ p r e s i d e n t s _ b i o g r a p h y & tabelveld = biography_id & tekst_id =
<?= $biography_id ? >& president_id = <?= $president_id ? > ’) ">
<?
else :
?>
<A HREF=" index . php ? pagina = biography_ <?= $biography_id ? > "><?=$voornaam?>&nbsp ;
<?=$achternaam?></A>
<BR>(<?=$geboortejaar?>−<?=$sterftejaar ?>)
<?
endif ;
?>
</td><td>
<ul class=small>
<?
// e e r s t a l l e s p e e c h e s p r i n t e n
include ( " ./ inc / p r i n t _ p r e s i d e n t s _ s p e e c h e s . inc . php " ) ;
// nu w r i t i n g s
include ( " ./ inc / p r i n t _ p r e s i d e n t s _ w r i t i n g s . inc . php " ) ;
// nu a d d i t i o n a l
include ( " ./ inc / p r i n t _ p r e s i d e n t s _ a d d i t i o n a l . inc . php " ) ;
// t e n s l o t t e e x t e r n e l i n k s
include ( " ./ inc / p r i n t _ p r e s i d e n t s _ e x t e r n . inc . php " ) ;
?>
</ul>
</td>
</tr>
</table>
</td></tr></table>
<?
?>
E.15
print presidents.inc.php
Bijlage E. PHP broncode
111
<?php
$trail=" < font class = trail > < a href = index . asp > FRtR </ a > >
<b > Presidents </ b > < BR > < BR > </ font > " ;
echo $trail ;
?>
<p align=justify>This area is an index on the presidents of the United States and
contains information and documents of their speeches , writings , biographies and
anything else related to their person or the office they are holding .
</p>
<ol>
<?
// l i j s t j e
p r i n t e n van p r e s i d e n t e n
// de p r e s i d e n t e n l a t e n z i e n a l s v o l g t :
//nummer , voornaam , achternaam : b e g i n j a a r −e i n d j a a r
// l o o p j e om p r e s i d e n t s p e r i o d e s t e s e l e c t e r e n
$ S Q L s e l e c t P r e s i d e n t T e r m=" SELECT term_id , president_id , beginjaar , eindjaar FROM
u s a _ p r e s i d e n t s _ t e r m s WHERE term_id > 0 " ;
$ s e l e c t _ P r e s i d e n t T e r m = mysql_query ( $SQLselectPresidentTerm , $connection ) ;
// v o e r t query u i t
while ( $ r e s u l t a a t _ s e l e c t P r e s i d e n t T e r m = m y s q l_ f e t c h _ ro w ( $ s e l e c t _ P r e s i d e n t T e r m ) )
{
// l o o p j e om p r e s i d e n t e n t e s e l e c t e r e n d i e b i j d i e term horen
$ S Q L s e l e c t P r e s i d e n t=" SELECT voornaam , achternaam From
usa_presidents WHERE president_id =
$ r e s u l t a a t _ s e l e c t P r e s i d e n t T e r m [1] " ;
$s elec tPre sid e n t = mysql_query ( $SQLselectPresident ,
$connection ) ;
// v o e r t query u i t
while ( $ r e s u l t a a t _ s e l e c t P r e s i d e n t =
mysql_fetch_ro w ( $ s e l e c t P r e s i d e n t ) )
{
// e i n d j a a r van de h u i d i g e p r e s i d e n t i s 0 i n de db
// v e r v a n g e n door h u i d i g j a a r , dan i s i e a l t i j d up t o d a t e
$eindjaar=$ r e s u l t a a t _ s e l e c t P r e s i d e n t T e r m [ 3 ] ;
if ( $eindjaar ==0):
$eindjaar=date ( ’Y ’ ) ;
endif ;
// op scherm p r i n t e n
?>
<li><a href=" index . php ? pagina = president_ <?= $ r e s u l t a a t _ s e l e c t P r e s i d e n t T e r m [1]? > ">
<?=$ r e s u l t a a t _ s e l e c t P r e s i d e n t [0]? >& nbsp ;<?= $ r e s u l t a a t _ s e l e c t P r e s i d e n t [ 1 ] ? >
</a> : <?=$ r e s u l t a a t _ s e l e c t P r e s i d e n t T e r m [2]?>−<?= $eindjaar?>
Bijlage E. PHP broncode
112
<?
}
}
?>
</ol>
<p>
<b>Websites dedicated to the American Presidents </b>
<p>
<ul class=linklist>
<?
// nu e x t e r n e l i n k s l a t e n z i e n . . . komt ook u i t db , met p r e s i d e n t i d : 0
$ S Q L s e l e c t E x t e r n e L i n k s=" SELECT titel , link , door , link_by FROM
U s a _ p r e s i d e n t s _ e x t e r n WHERE President_id = 0 " ;
$ s e l e c t E x t e r n e L i n k s = mysql_query ( $SQLselectExterneLinks , $connection ) ;
// v o e r t query u i t
while ( $ r e s u l t a a t _ s e l e c t E x t e r n e L i n k s = m y s q l_ f e t c h _ ro w ( $ s e l e c t E x t e r n e L i n k s ) )
{
// de l i n k s tonen
$extern_by=$ r e s u l t a a t _ s e l e c t E x t e r n e L i n k s [ 2 ] ;
$extern_link_by=$ r e s u l t a a t _ s e l e c t E x t e r n e L i n k s [ 3 ] ;
// i f ( ( $ e x t e r n b y !=”” o r != ( i s n u l l ( $ e x t e r n b y ) ) ) and ( $ e x t e r n l i n k b y !=”” o r
!= ( is_null ( $extern_link_by ) ) ) ) :
// by p r i n t e n
if ( ( $extern_by != " " ) and ( $extern_l i n k _b y != " " ) ) : // by p r i n t e n
$by=" , by <a href = ’ $extern_link_by & ’ > $extern_by </ a > " ;
// e l s e i f ( ( $ e x t e r n b y <>”” o r <> ( i s n u l l ( $ e x t e r n b y ) ) ) and ( ( $ e x t e r n l i n k b y =”” o r
is_null ( $extern_link_by ) ) ) ) : // by z o n d e r l i n k b y p r i n t e n
elseif ( ( $extern_by != " " ) and ( $ext er n _ l i n k _b y==" " ) ) : // by z o n d e r l i n k b y p r i n t e n
$by=" , by $extern_by " ;
else :
$by=" " ;
endif ;
?>
<li><a href=" <?= $ r e s u l t a a t _ s e l e c t E x t e r n e L i n k s [1]? > ">
<?=$ r e s u l t a a t _ s e l e c t E x t e r n e L i n k s [0]? > </ a>&nbsp ;<?=$by?>
<?
}
Bijlage E. PHP broncode
?>
</ul>
<?
// ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗
//EINDE PRESIDENTEN GEDEELTE
// ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗ ∗
?>
E.16
print presidents additional.inc.php
<?php
$ S Q L S e l e c t A d d i t i o n a l=" SELECT additional_id , titel , jaar FROM
u s a _ p r e s i d e n t s _ a d d i t i o n a l WHERE president_id = $president_id " ;
$ a d d i t i o n a l t e l l e r t j e =0;
$ Se le c tA d di ti o na l = mysql_query ( $SQLSelectAdditional , $connection ) ;
// v o e r t query u i t
while ( $ r e s u l t a a t _ S e l e c t A d d i t i o n a l = m y s q l_ f e t c h _ ro w ( $ S e l e c t A d d i t i o n a l ) )
{
$additional_id=$ r e s u l t a a t _ S e l e c t A d d i t i o n a l [ 0 ] ;
$ ad di t io n al _t i te l=$ r e s u l t a a t _ S e l e c t A d d i t i o n a l [ 1 ] ;
$a ddit iona l_ja ar=$ r e s u l t a a t _ S e l e c t A d d i t i o n a l [ 2 ] ;
$ a d d i t i o n a l t e l l e r t j e++;
if ( $X_ingelogd==true ) :
?>
<li><a href=" index . php ? pagina = additional_ <?= $a dd iti on al _id ? > ">
<?=$ ad di t io n al _t i te l?></a >, <?=$ a d d i t i o n a l _ j a a r?>
<input type=button class=" delete "
title=" Verwijder de additionele informatie
<?= $ a dd i ti on a l_ ti t el ? > - <?= $ a d d i t i o n a l _ j a a r ? > "
onclick=" confirmDelete ( ’ additional ’ , ’ <?= $ a d d i t i o n a l _ t i t e l ? > ’
,’ formhandler . php ? pagina = delete_tekst & tabel =
u s a _ p r e s i d e n t s _ a d d i t i o n a l & tabelveld = additional_id &
tekst_id = <?= $additional_id ? >& president_id = <?= $president_id ? > ’) ">
<?
else :
?>
<li><a href=" index . php ? pagina = additional_ <?= $a dd iti on al _id ? > ">
113
Bijlage E. PHP broncode
114
<?=$ ad di t io n al _t i te l?></a >, <?=$ a d d i t i o n a l _ j a a r?>
<?
endif ;
}
if ( $additionaltellertje >0):
// hr b a l k p r i n t e n
?>
<hr>
<?
endif ;
?>
E.17
print presidents extern.inc.php
<?php
$S QLSe lect Exte rn=" SELECT extern_id , titel , link , door , link_by FROM
u s a _ p r e s i d e n t s _ e x t e r n WHERE president_id = $president_id " ;
$e xter ntel lert je =0;
$SelectExtern = mysql_query ( $SQLSelectExtern , $connection ) ; // v o e r t query u i t
while ( $ r e s u l t a a t _ S e l e c t E x t e r n = m y s ql _ f e t c h _ ro w ( $SelectExtern ) )
{
$extern_id=$ r e s u l t a a t _ S e l e c t E x t e r n [ 0 ] ;
$extern_titel=$ r e s u l t a a t _ S e l e c t E x t e r n [ 1 ] ;
$extern_link=$ r e s u l t a a t _ S e l e c t E x t e r n [ 2 ] ;
$extern_by=$ r e s u l t a a t _ S e l e c t E x t e r n [ 3 ] ;
$extern_link_by=$ r e s u l t a a t _ S e l e c t E x t e r n [ 4 ] ;
if ( ( ! extern_by==" " ) and ( ! $extern _ l i n k _b y==" " ) ) : // by p r i n t e n
$door=" , by <a href = ’ $extern_link_ b y ’> $extern_by </ a > " ;
elseif ( ( ! $extern_by==" " ) and ( $ex te r n _ l i n k_ b y==" " ) ) : // by z o n d e r l i n k b y p r i n t e n
$door=" , by $extern_by " ;
else :
$door=" " ;
endif ;
Bijlage E. PHP broncode
$e xter ntel lert je++;
if ( $X_ingelogd==true ) :
?>
<li class=linklist><a href=" <?= $extern_link ? > "><?=$extern_titel?></a>
<?=$door?><input type=button class=" delete " title=
" Verwijder de externe link <?= extern_titel ? > <?= $door ? > "
onclick=" confirmDelete ( ’ extern ’ , ’ <?= $extern_titel ? > ’ ,
’ formhandler . php ? pagina = delete_tekst & tabel =
u s a _ p r e s i d e n t s _ e x t e r n & tabelveld = extern_id & tekst_id =
<?= $extern_id ? >& president_id = <?= $president_id ? > ’) ">
<?
else :
?>
<li class=linklist><a href=" <?= $extern_link ? > "><?=$extern_titel?></a>
<?=$door?>
<?
endif ;
}
if ( $externtellertje >0):
// hr b a l k p r i n t e n
?>
<hr>
<?
endif ;
?>
E.18
print presidents speeches.inc.php
<?php
// s o r t e r e n p e r s o o r t
$SQLSelectsoort=" SELECT soort_id , naam FROM Soort " ;
$soorttellertje =0;
$Selectsoort = mysql_query ( $SQLSelectsoort , $connection ) ; // v o e r t query u i t
while ( $ r e s u l t a a t _ S e l e c t s o o r t = my s ql _ f e t c h _ ro w ( $Selectsoort ) )
115
Bijlage E. PHP broncode
116
{
$soorttellertje =0;
$soort_id=$ r e s u l t a a t _ S e l e c t s o o r t [ 0 ] ;
$soort_naam=$ r e s u l t a a t _ S e l e c t s o o r t [ 1 ] ;
$S QLSe lect spee ch=" SELECT speeches_id , titel , jaar , soort_id FROM
u s a _ p r e s i d e n t s _ s p e e c h e s WHERE president_id = $president_id and soort_id = $soort_id
Order by jaar " ;
$Selectspeech = mysql_query ( $SQLSelectspeech , $connection ) ; // v o e r t query u i t
while ( $ r e s u l t a a t _ S e l e c t s p e e c h = m y s ql _ f e t c h _ ro w ( $Selectspeech ) )
{
$speech_id=$ r e s u l t a a t _ S e l e c t s p e e c h [ 0 ] ;
$speech_titel=$ r e s u l t a a t _ S e l e c t s p e e c h [ 1 ] ;
$speech_jaar=$ r e s u l t a a t _ S e l e c t s p e e c h [ 2 ] ;
$soorttellertje++;
if ( $X_ingelogd==true ) :
?>
<li><a href=" index . php ? pagina = speech_ <?= $speech_id ? > "><?=$speech_titel?></a >,
<?=$speech_jaar?><input type=button class=" delete " title=
" Verwijder de speech <?= $speech_titel ? > <?= $speech_jaar ? > " onclick=" confirmDelete ( ’ speech ’,
’ <?= $speech_titel ? > ’ , ’ formhandler . php ? pagina =
delete_tekst & tabel = u s a _ p r e s i d e n t s _ s p e e c h e s & tabelveld =
speeches_id & tekst_id = <?= $speech_id ? >& president_id = <?= $president_id ? > ’) ">
<?
else :
?>
<li><a href=" index . php ? pagina = speech_ <?= $speech_id ? > "><?=$speech_titel?></a >,
<?=$speech_jaar?>
<?
endif ;
}
if ( $soorttellertje >0):
// hr b a l k p r i n t e n
?>
<hr>
<?
endif ;
}
Bijlage E. PHP broncode
117
?>
E.19
print presidents writings.inc.php
<?php
// s o r t e r e n p e r s o o r t
$SQLSelectsoort=" SELECT soort_id , naam FROM Soort " ;
$Selectsoort = mysql_query ( $SQLSelectsoort , $connection ) ; // v o e r t query u i t
$soorttellertje =0;
while ( $ r e s u l t a a t _ S e l e c t s o o r t = my s ql _ f e t c h _ ro w ( $Selectsoort ) )
{
$soorttellertje =0;
$soort_id=$ r e s u l t a a t _ S e l e c t s o o r t [ 0 ] ;
$soort_naam=$ r e s u l t a a t _ S e l e c t s o o r t [ 1 ] ;
$ SQ LS e le c tw ri t in g=" SELECT writings_id , titel , jaar , soort_id FROM
u s a _ p r e s i d e n t s _ w r i t i n g s WHERE president_id = $president_id and soort_id = $soort_id
Order by jaar " ;
$Selectwriting = mysql_query ( $SQLSelectwriting , $connection ) ; // v o e r t query u i t
while ( $ r e s u l t a a t _ S e l e c t w r i t i n g = m y s ql _ f e t c h _ ro w ( $S el ec tw rit in g ) )
{
$writing_id=$ r e s u l t a a t _ S e l e c t w r i t i n g [ 0 ] ;
$writing_titel=$ r e s u l t a a t _ S e l e c t w r i t i n g [ 1 ] ;
$writing_jaar=$ r e s u l t a a t _ S e l e c t w r i t i n g [ 2 ] ;
$soorttellertje++;
if ( $X_ingelogd==true ) :
?>
<li><a href=" index . php ? pagina = writing_ <?= $writing_id ? > "><?=$w ri ti ng _ti te l?>
</a >, <?=$writing_jaar?><input type=button class=" delete "
title=" Verwijder de tekst <?= $w ri ti ng _ti te l ? > - <?= $writing_jaar ? > "
onclick=" confirmDelete ( ’ writing ’ , ’ <?= $ wri ti ng _t ite l ? > ’ ,
’ formhandler . php ? pagina = delete_tekst & tabel =
u s a _ p r e s i d e n t s _ w r i t i n g s & tabelveld = writings_id & tekst_id =
<?= $writings_id ? >& president_id = <?= $president_id ? > ’) ">
<?
else :
?>
<li><a href=" index . php ? pagina = writing_ <?= $writing_id ? > "><?=$w ri ti ng _ti te l?>
Bijlage E. PHP broncode
118
</a >, <?=$writing_jaar?>
<?
endif ;
}
if ( $soorttellertje >0):
// hr b a l k p r i n t e n
?>
<hr>
<?
endif ;
}
?>
E.20
print quote.inc.php
<?php
// i d i s h e t nummer van de quote X
list ( $quote , $quote_id ) = split ( ’_ ’ , $pagina ) ;
// g e g e v e n s q u o t e s e l e c t e r e n
$SQLselectquote=" SELECT titel , edition , creator , subject , series , published ,
descriptions , lc_subjects , online_edition , publisher , date_text , update_text ,
type_text , source_text , language_text , relation , coverage , rights
From usa_quotes WHERE quote_id = $quote_id " ;
$selectquote = mysql_query ( $SQLselectquote , $connection ) ; // v o e r t query u i t
$titel=$_REQUEST [ ’ titel ’ ] ;
//HTML code
?>
<p>
<h1 class=pres−head><?=$titel?></h1>
<?
if ( $X_ingelogd==true ) :
?>
<BR>
<a href=" index . php ? pagina = wijzig_quote_ <?= $quote_id ? > " >[ Wijzig deze tekst ] </a>
</BR>
Bijlage E. PHP broncode
119
<?
endif ;
?>
<p>
<dl>
<?
// q u o t e i n f o r m a t i e d o o r l o p e n
while ( $ r e s u l t a a t _ s e l e c t q u o t e = my s ql _ f e t c h _ ro w ( $selectquote ) )
{
//
f o r each f i e l d i n s e l e c t q u o t e . f i e l d s
//
if
//
r e s p o n s e . w r i t e (”<dt>”& f i e l d . name&”</dt><dd>”& f i e l d . v a l u e&”</dd><BR>”)
//
end i f
//
f i e l d . v a l u e <>”” o r not i s n u l l ( f i e l d . v a l u e ) then
next
// nu v i a t u s s e n t a b e l l e n a u t h o r s , c o n t r i b u t o r s en n o t e s l a t e n z i e n
$ S Q L s e l e c t a u t h o r s t t b=" SELECT author_id From u s a _ t t b _ q u o t e s _ a u t h o r s WHERE quote_id =
$quote_id " ;
$ se le c ta u th or s tt b = mysql_query ( $SQLselectauthorsttb , $connection ) ;
// v o e r t query u i t
while ( $ r e s u l t a a t _ s e l e c t a u t h o r s t t b = m y s q l_ f e t c h _ ro w ( $ s e l e c t a u t h o r s t t b ) )
{
$author_id=$ r e s u l t a a t _ s e l e c t a u t h o r s t t b [ 0 ] ;
// de a u t h o r s o p h a l e n en p r i n t e n
$ SQ Ls e le c ta ut h or s=" SELECT name From u s a _ q u o t e s _ a u t h o r s WHERE author_id =
$author_id " ;
$selectauthors = mysql_query ( $SQLselectauthors , $connection ) ; // v o e r t query u i t
while ( $ r e s u l t a a t _ s e l e c t a u t h o r s = m y s ql _ f e t c h _ ro w ( $s el ec ta uth or s ) )
{
// f o r each f i e l d i n s e l e c t a u t h o r s . f i e l d s
//
if
//
//
r e s p o n s e . w r i t e (”<dt>Authors </dt><dd>”& f i e l d . v a l u e&”</dd><BR>”)
end i f
// n e x t
}
f i e l d . v a l u e <>”” o r not i s n u l l ( f i e l d . v a l u e ) then
Bijlage E. PHP broncode
120
}
// n o t e s l a t e n z i e n
$ S Q L s e l ec t n o t e s t t b=" SELECT note_id From u s a _ t t b _ q u o t e s _ n o t e s WHERE quote_id =
$quote_id " ;
$selectnotesttb = mysql_query ( $SQLselectnotesttb , $connection ) ; // v o e r t query u i t
while ( $ r e s u l t a a t _ s e l e c t n o t e s t t b = m y s ql _ f e t c h _ ro w ( $ s e le c t n o t e s tt b ) )
{
$note_id=$ r e s u l t a a t _ s e l e c t n o t e s t t b [ 0 ] ;
// de n o t e s o p h a l e n en p r i n t e n
$SQLselectnotes=" SELECT tekst From u s a _ q u o t e s _ n o t e s WHERE note_id = $note_id " ;
$selectnotes = mysql_query ( $SQLselectnotes , $connection ) ; // v o e r t query u i t
while ( $ r e s u l t a a t _ s e l e c t n o t e s = my s ql _ f e t c h _ ro w ( $selectnotes ) )
{
//
f o r each f i e l d i n s e l e c t n o t e s . f i e l d s
//
if
//
r e s p o n s e . w r i t e (”<dt>Notes </dt><dd>”& f i e l d . v a l u e&”</dd><BR>”)
//
end i f
//
f i e l d . v a l u e <>”” o r not i s n u l l ( f i e l d . v a l u e ) then
next
}
}
// c o n t r i b u t o r s l a t e n z i e n
$ S Q L s e l e c t c o n t r i b u t o r s t t b=" SELECT c ont ri bu to r_i d From u s a _ t t b _ q u o t e s _ c o n t r i b u t o r s
WHERE quote_id = $quote_id " ;
$ s e l e c t c o n t r i b u t o r s t t b = mysql_query ( $SQLselectcontributorsttb , $connection ) ;
// v o e r t query u i t
while ( $ r e s u l t a a t _ s e l e c t c o n t r i b u t o r s t t b = m y s q l_ f e t c h _ ro w ( $ s e l e c t c o n t r i b u t o r s t t b ) )
{
$contributor_id=$ r e s u l t a a t _ s e l e c t c o n t r i b u t o r s t t b [ 0 ] ;
// de c o n t r i b u t o r s o p h a l e n en p r i n t e n
$ S Q L s e l e c t c o n t r i b u t o r s=" SELECT name From u s a _ q u o t e s _ c o n t r i b u t o r s WHERE
contributor_id = $contributor_id " ;
$ s e l e c t c o n t r i b u t o r s = mysql_query ( $SQLselectcontributors , $connection ) ;
// v o e r t query u i t
while ( $ r e s u l t a a t _ s e l e c t c o n t r i b u t o r s = m y s q l_ f e t c h _ ro w ( $ s e l e c t c o n t r i b u t o r s ) )
Bijlage E. PHP broncode
121
{
//
f o r each f i e l d i n s e l e c t c o n t r i b u t o r s . f i e l d s
//
if
//
r e s p o n s e . w r i t e (”<dt>C o n t r i b u t o r s </dt><dd>”& f i e l d . v a l u e&”</dd><BR>”)
//
end i f
//
f i e l d . v a l u e <>”” o r not i s n u l l ( f i e l d . v a l u e ) then
next
}
}
} // q u o t e h o o f d w h i l e l u s
?>
</dl>
<?
?>
E.21
print speech.inc.php
<?php
// i d i s h e t nummer van de p a g i n a s p e e c h X
list ( $speech , $speech_id ) = split ( ’_ ’ , $pagina ) ;
// g e g e v e n s s p e e c h s e l e c t e r e n
$S QLse lect spee ch=" SELECT titel , tekst , president_id , soort_id , speeches_id , quote ,
context From u s a _ p r e s i d e n t s _ s p e e c h e s WHERE speeches_id = $speech_id " ;
$selectspeech = mysql_query ( $SQLselectspeech , $connection ) ; // v o e r t query u i t
while ( $ r e s u l t a a t _ s e l e c t s p e e c h = m y s ql _ f e t c h _ ro w ( $selectspeech ) )
{
$titel=$ r e s u l t a a t _ s e l e c t s p e e c h [ 0 ] ;
$tekst=$ r e s u l t a a t _ s e l e c t s p e e c h [ 1 ] ;
$president_id=$ r e s u l t a a t _ s e l e c t s p e e c h [ 2 ] ;
$soort_id=$ r e s u l t a a t _ s e l e c t s p e e c h [ 3 ] ;
$tekst_id=$ r e s u l t a a t _ s e l e c t s p e e c h [ 4 ] ;
$quote_id=$ r e s u l t a a t _ s e l e c t s p e e c h [ 5 ] ;
$context_id=$ r e s u l t a a t _ s e l e c t s p e e c h [ 6 ] ;
}
// p r e s i d e n t s e l e c t e r e n
Bijlage E. PHP broncode
122
$ S Q L s e l e c t P r e s i d e n t=" SELECT voornaam , achternaam FROM us a_ pre si de nt s WHERE
president_id = $president_id " ;
$s elec tPre side nt = mysql_query ( $SQLselectPresident , $connection ) ; // v o e r t query u i t
while ( $ r e s u l t a a t _ s e l e c t P r e s i d e n t = m y s q l_ f e t c h _ ro w ( $ s e l e c t P r e s i d e n t ) )
{
$naamPresident=$ r e s u l t a a t _ s e l e c t P r e s i d e n t [ 0 ] . $ r e s u l t a a t _ s e l e c t P r e s i d e n t [ 1 ] ;
$trail=" < font class = trail > < a href = index . php > FRtR </ a > > <a href = index . php ? pagina =
presidents > Presidents </ a > > <a href = index . php ? pagina = president_$president_id >
$naamPresident </ a > > <b > $titel </ b > < BR > < BR > </ font > " ;
}
//HTML code
echo $trail ;
?>
<p>
<h1 class=pres−head><?=$titel?></h1>
<?
if ( $X_ingelogd==true ) :
?>
<BR>
<a href=" index . php ? pagina = wijzig_tekst_ <?= $tekst_id ? >& soort_id = <?= $soort_id ? > ">
[ Wijzig deze tekst ] </a>
</BR>
<?
endif ;
?>
<p><font class=small color=red>
<?
if ( ! $quote_id==" 0 " ) :
?>
∗∗∗ <a href=" index . php ? pagina = quote_ <?= $quote_id ? >& titel = <?= $titel ? > ">Quote </a>
<?
endif ;
if ( ! $context_id==" 0 " ) :
?>
∗ <a href=" index . php ? pagina = context_ <?= $context_id ? > ">Context </a> ∗∗∗
<?
endif ;
Bijlage E. PHP broncode
123
?>
</font>
<p>
<?
echo $tekst ;
?>
E.22
print voegtoe.inc.php
<?php
// p r e s i d e n t i s h e t nummer van de p a g i n a v o e g t o e p r e s i d e n t X
list ( $voegtoe , $president , $president_id ) = split ( ’_ ’ , $pagina ) ;
// g e g e v e n s p r e s i d e n t s e l e c t e r e n
$ S Q L s e l e c t P r e s i d e n t=" SELECT voornaam , achternaam FROM us a_ pre si de nt s WHERE
president_id = $president_id " ;
$s elec tPre side nt = mysql_query ( $SQLselectPresident , $connection ) ; // v o e r t query u i t
while ( $ r e s u l t a a t _ s e l e c t P r e s i d e n t = m y s q l_ f e t c h _ ro w ( $ s e l e c t P r e s i d e n t ) )
{
$voornaam=$ r e s u l t a a t _ s e l e c t P r e s i d e n t [ 0 ] ;
$achternaam=$ r e s u l t a a t _ s e l e c t P r e s i d e n t [ 1 ] ;
}
?>
<p>U kunt een tekst toevoegen voor president <?=$voornaam?>&nbsp ;<?= $achternaam ? >.
<br/><br/>
<p>
<form action=" formhandler . php ? pagina = voegtoe_tekst_ <?= $president_id ? > "
method=" post ">
<select name=" soort " id=" soort ">
<option value=" 0 " disabled selected>Kies de soort tekst </option>
<?
// l i j s t j e p r i n t e n u i t db
$SQLselectSoort=" SELECT soort_id , naam from SOORT " ;
$selectSoort = mysql_query ( $SQLselectSoort , $connection ) ; // v o e r t query u i t
while ( $ r e s u l t a a t _ s e l e c t S o o r t = my s ql _ f e t c h _ ro w ( $selectSoort ) )
{
?>
Bijlage E. PHP broncode
124
<option value=" <?= $ r e s u l t a a t _ s e l e c t S o o r t [0]? > ">
<?=$ r e s u l t a a t _ s e l e c t S o o r t [1]? > </ option>
<?
}
?>
</select><BR/>
<input type=" text " name=" txt_titel " value=" Voer hier de titel in van de tekst . "
id=" txt_titel " size=" 80 "/>
<TEXTAREA name=" txt " rows=" 20 " cols=" 80 ">
Voer hier de tekst in . HTML tags zijn toegestaan .
</TEXTAREA>
<input type=" text " name=" txt_jaar " value=" Voer hier het jaar in van de tekst . "
id=" txt_jaar " size=" 80 "/>
<BR><BR>
<input type=" submit " value=" Voeg Toe " id=" btnVoegToe " />
</form>
</p>
E.23
print wijzig.inc.php
<?php
list ( $voegtoe , $tekst , $tekst_id ) = split ( ’_ ’ , $pagina ) ;
// c a t e g o r i e opvragen
$categorie=$_REQUEST [ ’ soort_id ’ ] ;
$tabel=" " ;
$tekstsoort=" " ;
if ( $categorie==" 1 " OR $categorie==" 4 " ) : // w r i t i n g
$tabel=" u s a _ p r e s i d e n t s _ w r i t i n g s " ;
$tekstsoort=" writings_id " ;
elseif ( $categorie==" 2 " or $categorie==" 3 " ) : // s p e e c h
$tabel=" u s a _ p r e s i d e n t s _ s p e e c h e s " ;
$tekstsoort=" speeches_id " ;
elseif ( $categorie==" 5 " ) : // b i o g r a p h y
$tabel=" u s a _ p r e s i d e n t s _ b i o g r a p h y " ;
$tekstsoort=" biography_id " ;
else : // a d d i t i o n a l
$tabel=" u s a _ p r e s i d e n t s _ a d d i t i o n a l " ;
$tekstsoort=" additional_id " ;
endif ; // v o o r s o o r t e n c a t e g o r i e
Bijlage E. PHP broncode
125
// t e k s t g e g e v e n s opvragen
$SQLselecttekst=" SELECT titel , tekst , jaar From $tabel WHERE
$tekstsoort = $tekst_id " ;
$selecttekst = mysql_query ( $SQLselecttekst , $connection ) ; // v o e r t query u i t
while ( $ r e s u l t a a t _ s e l e c t t e k s t = my s ql _ f e t c h _ ro w ( $selecttekst ) )
{
$titel=$ r e s u l t a a t _ s e l e c t t e k s t [ 0 ] ;
$tekst=$ r e s u l t a a t _ s e l e c t t e k s t [ 1 ] ;
$jaar=$ r e s u l t a a t _ s e l e c t t e k s t [ 2 ] ;
}
?>
<p>U kunt de volgende tekst wijzigen . <br/><br/>
<p>
<form action=" formhandler . php ? pagina = wijzig_tekst_ <?= $president_id ? > " method=" post ">
<input type=" hidden " name=" soort " id=" soort " value=" <?= $categorie ? > ">
<input type=" text " name=" txt_titel " value=" <?= $titel ? > " id=" txt_titel " size=" 80 "/>
<TEXTAREA name=" txt " rows=" 20 " cols=" 80 ">
<?=$tekst?>
</TEXTAREA>
<input type=" text " name=" txt_jaar " value=" <?= $jaar ? > " id=" txt_jaar " size=" 80 "/>
<BR><BR>
<input type=" submit " value=" Wijzig " id=" btnVoegToe " />
</form>
</p>
E.24
print writing.inc.php
<?php
// i d i s h e t nummer van de p a g i n a w r i t i n g X
list ( $writing , $writing_id ) = split ( ’_ ’ , $pagina ) ;
// g e g e v e n s w r i t i n g s e l e c t e r e n
$ SQ Ls e le c tw ri t in g=" SELECT titel , tekst , president_id From u s a _ p r e s i d e n t s _ w r i t i n g s
WHERE writings_id = $writing_id " ;
$selectwriting = mysql_query ( $SQLselectwriting , $connection ) ; // v o e r t query u i t
while ( $ r e s u l t a a t _ s e l e c t w r i t i n g = m y s ql _ f e t c h _ ro w ( $s el ec tw rit in g ) )
{
$titel=$ r e s u l t a a t _ s e l e c t w r i t i n g [ 0 ] ;
$tekst=$ r e s u l t a a t _ s e l e c t w r i t i n g [ 1 ] ;
$president_id=$ r e s u l t a a t _ s e l e c t w r i t i n g [ 2 ] ;
}
Bijlage E. PHP broncode
126
// p r e s i d e n t s e l e c t e r e n
$ S Q L s e l e c t P r e s i d e n t=" SELECT voornaam , achternaam FROM us a_ pre si de nt s
WHERE president_id = $president_id " ;
$s elec tPre side nt = mysql_query ( $SQLselectPresident , $connection ) ; // v o e r t query u i t
while ( $ r e s u l t a a t _ s e l e c t P r e s i d e n t = m y s q l_ f e t c h _ ro w ( $ s e l e c t P r e s i d e n t ) )
{
$naamPresident=$ r e s u l t a a t _ s e l e c t P r e s i d e n t [ 0 ] . $ r e s u l t a a t _ s e l e c t P r e s i d e n t [ 1 ] ;
}
$trail=" < font class = trail > < a href = index . php > FRtR </ a > > <a href = index . php ? pagina =
presidents > Presidents </ a > > <a href = index . php ? pagina =
president_$president_id > $naamPresident </ a > > <b > $titel </ b > < BR > < BR > </ font > " ;
echo $trail ;
//HTML code
?>
<p>
<h1 class=pres−head><?=$titel?></h1><br>
<p><font class=small color=red >∗∗∗ <a href=" ">Quote </a> ∗
<a href=" ">Context </a> ∗∗∗</ font>
<p>
<?
echo $tekst ;
?>
E.25
voegtoe tekst.inc.php
<?php
// p r e s i d e n t i s h e t nummer van de p a g i n a v o e g t o e p r e s i d e n t X
list ( $voegtoe , $president , $president_id ) = split ( ’_ ’ , $pagina ) ;
// g e p o s t e g e g e v e n s opvragen
$categorie=trim ( strip_tags ( $_REQUEST [ ’ soort ’ ] ) ) ;
$titel=trim ( strip_tags ( $_REQUEST [ ’ txt_titel ’ ] ) ) ;
$tekst=trim ( strip_tags ( $_REQUEST [ ’ txt ’ ] ) ) ;
//REPLACE CARRIAGE RETURNS IN THE VARIABLE <BR>
$tekst = nl2br ( $tekst ) ;
$jaar=trim ( strip_tags ( $_REQUEST [ ’ txt_jaar ’ ] ) ) ;
$tabel=" " ;
if ( ! $categorie==" 0 " ) :
Bijlage E. PHP broncode
127
// c a t e g o r i e opvragen
// 1 = Onbekend
// 2 = Address
// 3 = Message
// 4 = L e t t e r
// 5 = b i o g r a p h y
if ( $categorie==" 1 " OR $categorie==" 4 " ) : // w r i t i n g
$tabel=" u s a _ p r e s i d e n t s _ w r i t i n g s " ;
elseif ( $categorie==" 2 " or $categorie==" 3 " ) : // s p e e c h
$tabel=" u s a _ p r e s i d e n t s _ s p e e c h e s " ;
elseif ( $categorie==" 5 " ) : // b i o g r a p h y
$tabel=" u s a _ p r e s i d e n t s _ b i o g r a p h y " ;
else : // a d d i t i o n a l
$tabel=" u s a _ p r e s i d e n t s _ a d d i t i o n a l " ;
endif ; // v o o r s o o r t e n c a t e g o r i e
// i n db z e t t e n
$SQLinsertTekst=" INSERT INTO $tabel ( titel , tekst , jaar , soort_id , president_id )
VALUES ( ’ $titel ’,’ $tekst ’,’ $jaar ’, $categorie , $president_id ) " ;
$insertTekst = mysql_query ( $SQLinsertTekst , $connection ) ; // v o e r t query u i t
echo " < meta http - equiv =\" refresh \" content =\"0; url = index . php ? pagina =
p r e s i d e n t _ $ p r e s i d e n t _ i d \" target =\" _top \" > " ;
else : // i e t s mis
echo ( " er is iets fout gegaan " ) ;
echo $categorie ;
endif ; // v o o r o f e r wel c a t e g o r i e i s opgegeven
?>
E.26
wijzig tekst.inc.php
<?php
list ( $voegtoe , $tekst , $tekst_id ) = split ( ’_ ’ , $pagina ) ;
$tabel=" " ;
$tekstsoort=" " ;
$categorie=$_REQUEST [ ’ soort_id ’ ] ;
// g e p o s t e g e g e v e n s opvragen
Bijlage E. PHP broncode
128
$categorie=trim ( $_REQUEST [ ’ soort ’ ] ) ;
$titel=trim ( $_REQUEST [ ’ txt_titel ’ ] ) ;
$tekst=trim ( $_REQUEST [ ’ txt ’ ] ) ;
//REPLACE CARRIAGE RETURNS IN THE VARIABLE <BR>
$tekst = nl2br ( $tekst ) ;
$jaar=trim ( $_REQUEST [ ’ txt_jaar ’ ] ) ;
if ( ! $categorie==" 0 " ) :
// c a t e g o r i e opvragen
// 1 = Onbekend
// 2 = Address
// 3 = Message
// 4 = L e t t e r
// 5 = b i o g r a p h y
if ( $categorie==" 1 " OR $categorie==" 4 " ) : // w r i t i n g
$tabel=" u s a _ p r e s i d e n t s _ w r i t i n g s " ;
$tekstsoort=" writings_id " ;
elseif ( $categorie==" 2 " or $categorie==" 3 " ) : // s p e e c h
$tabel=" u s a _ p r e s i d e n t s _ s p e e c h e s " ;
$tekstsoort=" speeches_id " ;
elseif ( $categorie==" 5 " ) : // b i o g r a p h y
$tabel=" u s a _ p r e s i d e n t s _ b i o g r a p h y " ;
$tekstsoort=" biography_id " ;
else : // a d d i t i o n a l
$tabel=" u s a _ p r e s i d e n t s _ a d d i t i o n a l " ;
$tekstsoort=" additional_id " ;
endif ; // v o o r s o o r t e n c a t e g o r i e
// i n db updaten
$SQLupdateTekst=" UPDATE $tabel SET titel = ’ $titel ’, tekst = ’ $tekst ’,
jaar = ’ $jaar ’, soort_id = $categorie WHERE $tekstsoort = $categorie " ;
$updateTekst = mysql_query ( $SQLupdateTekst , $connection ) ; // v o e r t query u i t
echo $ SQLupdateTekst ;
// echo ”<meta http−e q u i v =\” r e f r e s h \” c o n t e n t =\”0; u r l= i n d e x . php \” t a r g e t =\” t o p \” >”;
else : // i e t s mis
echo ( " er is iets fout gegaan " ) ;
endif ; // v o o r o f e r wel c a t e g o r i e i s opgegeven
?>
Bijlage F
Vergelijking van de syntax van
PHP en ASP
Eigenschap
Voorbeeld
code:
Print 10 regels op
het scherm
PHP
<html><body>
<?php
for ($i=1; $i<=10;
$i++)
print
”$i<br>”;
?>
</body></html>
ASP/VBScript
<html><body>
<%
for i = 1 to 10
Response.Write(i &
”<br>”) next
%>
</body></html>
Script tags
<?php ?>
Als
korte
tags
zijn toegestaan in
PHP.ini:
<? ?>
Als
ASP
tags
zijn toegestaan in
PHP.ini:
<% %>
<% %>
Einde van een regel
code
;
Geen
129
Bijlage F. Vergelijking van de syntax van PHP en ASP
Commentaar regel
// PHP commentaar regel
/* PHP commentaar tags (voor
meerdere regels) */
#
PHP
commentaar
regel
(alternatief)
’ VBScript commentaar regel
Beginteken voor variabelen
Moeten
variabelen
gedeclareerd
worden?
$
Geen
Nee
Optioneel. Als je
dit afdwingt bij de
configuratie krijg je
een error als je de
variabele niet declareert
Ondersteunt loosetyped variabelen?
Ja, maar vereist wel
gebruik van typecasting of settype( )
Ja
Zijn de variabelen
hoofdlettergevoelig?
Ja
Nee
Begrenzing van een
string
Met single-quotes,
double-quotes of de
PERL heredoc style.
Met double-quotes
Combineren
strings
Met een punt .
Met een ampersand
&
Line feed: \n
Carriage return: \r
Line feed: vbLf
Carriage
return:
vbCr
van
String constante
130
Bijlage F. Vergelijking van de syntax van PHP en ASP
HTML encode functies
htmlspecialchars($str) Vereist een ASP
Converteert < > & Server object
en ”naar de HTML
equivalenten
Server.HMTLEncode()
Werkt
net
als
urlencode()
Al- PHP’s htmlspecialle leestekens en chars().
andere niet-ASCII Server.URLEncode()
karaters
worden Werkt
net
als
vervangen
door PHP’s urlencode.
%xx code. Spaties
worden vervangen
door het + teken.
Dit maakt een
string geschikt als
URL.
urldecode() Werkt
net zoals urlencode(), maar dan
omgekeerd
Reguliere expressies
Ingebouwd
Met COM object
RegExp.
(Alleen
beschikbaar met de
laatste versies van
VBScript (5.5 of later))
Datums
time();
mktime();
print
date(’d-mY’,$adate);
Now
CDate(’2000-1-30’)
FormatDateTime(adate,2)
In ASP is de datum
notatie volgens de
locale settings, dus
je moet handmatig instellen welk
formaat je wilt
gebruiken.
131
Bijlage F. Vergelijking van de syntax van PHP en ASP
Arrays
Declareren met
$avar
=
array(1,’two’);
Voor
indexeren
moet er [ ] worden
gebruikt.
Arrays
beginnen te tellen
vanaf 0.
Declareren met
DIM avar(2)
Voor
indexeren
moet er ( ) gebruikt
worden.
Arrays
beginnen te tellen
vanaf 0.
Associatieve arrays
Wordt ondersteund
Wordt niet door
VBScript
ondersteund, maar kan
gesimuleerd worden
door een Dictonary
object te gebruiken.
Boolean true en false
Constanten True en
False
Constanten True en
False
Gelijk aan
== gelijk aan
!= niet gelijk aan
=== gelijk aan en
van hetzelfde type
!== niet identiek
= gelijk aan
<> niet gelijk aan
HTML sturen naar
de browser
Print en Echo
Response.Write()
If statements
if (bla == 0) {
$avar = ’abc’;
} else
$avar .= ’end’;
if bla = 0 then
avar = ’abc’
else
avar = avar & ’end’
endif
While statements
while ($a > 0) $a -=
1;
while a > 0 a = a 1 wend
132
Bijlage F. Vergelijking van de syntax van PHP en ASP
For loops
for
($i=0,$m=9;
$i<$m;
$i++){
print $i;
}
for i=1 to 100
Response.Write(i)
next
Switch/case
switch($aColor) {
case
’red’:
do1;break;
case
’green’:
do2;break;
default: do3; break;
}
select case aColor
case ”red”
do1
case ”green”
do2
case else
do3
end select
133
Tabel F.1: (bron: http://phplens.com/phpeverywhere/node/view/30 Part 1:
PHP, Javascript and VBScript Language Summary 04-05-3)
Download