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)%>&nbsp;<%=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%>&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> <% 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)%>&nbsp;<%=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)%>&nbsp;<%=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)%>&nbsp;<%=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)%>&nbsp;<%=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>&nbsp;<%=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%>&nbsp;<%=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)