Inhoud
1 Van digitaal visitekaartje tot dotcom. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Webwinkel, thuiswinkel, online shop, … . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Voor wie is dit boek bedoeld?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kleine en middelgrote bedrijven. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hobbyisten en startende ondernemers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ontwerpers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ontwikkelaars . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Marketing en verkoop. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hindernissen en valkuilen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Waar geen wil is …. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Automatiseren is bezuinigen en reorganiseren. . . . . . . . . . . . . . . . . . . . . . . . . Interne concurrentie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Technology push: het moet omdat het kan. . . . . . . . . . . . . . . . . . . . . . . . . . . . Amateurisme en andere schaduwkanten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Voorbeelden in dit boek en de download. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Listings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PHP 4 en PHP 5. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Relaties tussen bestanden. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Directorystructuur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Voorbeelddatabases. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Besluit. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15 20 20 20 20 21 21 22 22 23 24 26 28 28 28 29 30 30 30 30
2 Software downloaden, installeren en configureren . . . . . . . . . . . . . . . 31 Softwaretechnologie van PHP en MySQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Webapplicaties en server-side scripting. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dynamische websites en dynamische webpagina’s. . . . . . . . . . . . . . . . . . . . . . Client-servermodel met PHP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PHP als middleware in de 3-tier architectuur . . . . . . . . . . . . . . . . . . . . . . . . . .
31 31 33 34 36
Webwinkels met PHP en MySQL
Direct aan de slag. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Websites ontwikkelen en testen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kant-en-klare totaaloplossingen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . phpdev. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PHP Triad en Sokkit. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XAMPP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . osCommerce. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Werken als administrator of beheerder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Firewalls configureren of uitschakelen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Webservers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Microsoft IIS (Internet Information Services). . . . . . . . . . . . . . . . . . . . . . . . . . IIS installeren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . IIS beheren en configureren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Apache HTTP Server. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Apache downloaden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Apache installeren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Apache beheren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Apache configureren voor PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PHP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PHP downloaden. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PHP installeren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PHP installeren met het installatieprogramma . . . . . . . . . . . . . . . . . . . . . . PHP installeren met een ZIP-pakket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Extensies installeren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Apache configureren voor PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Configuratie testen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Configuraties controleren en vergelijken. . . . . . . . . . . . . . . . . . . . . . . . . . . Documentatie van PHP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Voorbeeldcode van PHP op het web. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Databaseservers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MySQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Andere databases en databaseservers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Webbrowsers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Beveiligingsniveau aanpassen voor tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Broncode weergeven. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Resolutie en kleurdiepte. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fouten opsporen in clientscript. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fouten in PHP-scripts weergeven . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39 41 42 42 42 43 47 47 50 50 51 51 55 58 58 59 64 65 66 66 67 67 70 71 72 73 76 77 79 81 82 84 85 86 87 87 89 90
Inhoud
Editors en ontwikkelingsomgevingen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Crimson Editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dreamweaver. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PhpED. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PSPad. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . UltraEdit-32. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zend Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
91 92 93 94 94 95 95
3 Webdesign met (X)HTML, CSS en JavaScript. . . . . . . . . . . . . . . . . . . . . . . . . . 96 Grafische gebruikersinterfaces en front-ends. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 Structuur van HTML-documenten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 Tekstbestanden. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 Tags. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 Elementen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 Attributen en waarden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 Versie-informatie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 Validiteit en compatibiliteit. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 Hoofdstructuur: html, head en body . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 Titels van HTML-documenten en webpagina’s. . . . . . . . . . . . . . . . . . . . . . . . . 101 HTTP-equivalenten en metadata. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 Tekst indelen en opmaken. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 Koppen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 Alinea’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 Lijsten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 Inline elementen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 Symbolen en speciale tekens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 Tabellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 Randen en witruimte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 Koppen voor rijen en kolommen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 Breedte van tabellen, kolommen en cellen. . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 Uitlijning van cellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 Cellen samenvoegen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 Hyperlinks en ankers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 Relatieve en absolute URL’s. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 Protocolvoorvoegsels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 Hostnamen of servernamen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 Directory’s. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 Bestandsnamen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 Relatieve URL’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117
Webwinkels met PHP en MySQL
Marktsegmentatie met domeinnamen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hyperlinks naar e-mailadressen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hyperlinks naar bladwijzers (bookmarks). . . . . . . . . . . . . . . . . . . . . . . . . . . . Extensible HTML (XHTML). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Structuur van XHTML-documenten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Elementen openen en sluiten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Elementen zonder eindtags sluiten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Elementen nesten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Geen hoofdletters maar kleine letters. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Cascading Style Sheets (CSS). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CSS-stijlen toepassen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Externe CSS-bestanden koppelen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Het element style. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Het attribuut style . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . De elementen div en span. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CSS-stijlen definiëren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Klassen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Selectors voor hyperlinks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . HTML vervangen door CSS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CSS gebruiken voor verschillende media. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objecten weergeven en verbergen met CSS . . . . . . . . . . . . . . . . . . . . . . . . JavaScript. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objecten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . JavaScript in HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Gebeurtenissen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Onload en onunload. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Onclick en ondblclick. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Onmousedown en onmouseup. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Onmouseover, onmousemove en onmouseout. . . . . . . . . . . . . . . . . . . . . Onkeypress, onkeydown en onkeyup. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Onselect. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Onfocus en onblur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Onchange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Onsubmit en onreset. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Ondersteuning van JavaScript. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Compatibiliteit met webbrowsers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Browsercontroles in JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Browsercontroles in PHP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
118 119 119 120 121 121 122 122 122 122 123 123 125 126 126 126 127 128 129 130 132 132 133 134 134 135 135 135 135 136 136 136 136 136 137 139 140 142
Inhoud
4 Server-side scripting met PHP 4 en PHP 5. . . . . . . . . . . . . . . . . . . . . . . 143 Syntaxis van PHP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hoofdletters en kleine letters. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Puntkomma’s, regeleinden en inspringingen. . . . . . . . . . . . . . . . . . . . . . . . . . Expressies combineren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Enkele of dubbele aanhalingstekens. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Commentaar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PHP en HTML combineren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Extensies voor PHP-bestanden. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PHP-tags. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Uitvoer verzenden naar de client met echo. . . . . . . . . . . . . . . . . . . . . . . . . . . print() of echo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Plaats van de PHP-code. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . HTTP-headers instellen met header(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Verzonden HTTP-headers controleren met headers_sent(). . . . . . . . . . . HTTP-headers toevoegen in plaats van vervangen. . . . . . . . . . . . . . . . . . Code insluiten met server-side includes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Statische code insluiten met include() of include_once() . . . . . . . . . . . . Dynamische code insluiten met require() of require_once() . . . . . . . . . Variabelen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Variabelen declareren en vernietigen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Namen van variabelen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Gegevenstypen van variabelen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Boolean. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Integer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Float. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . String. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Array. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Resource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . NULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Gegevenstypen converteren en afdwingen . . . . . . . . . . . . . . . . . . . . . . . . . . . Type juggling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Type casting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Gegevenstypen instellen met settype(). . . . . . . . . . . . . . . . . . . . . . . . . . . . Gegevenstypen controleren met is_…(). . . . . . . . . . . . . . . . . . . . . . . . . . . Gegevenstypen controleren met gettype(). . . . . . . . . . . . . . . . . . . . . . . . . Pseudo-typen: number, mixed en void. . . . . . . . . . . . . . . . . . . . . . . . . . . .
143 143 144 144 145 146 147 147 148 148 149 150 152 154 155 155 156 157 157 157 158 159 159 159 160 160 160 160 160 160 161 161 162 162 162 163 163
Webwinkels met PHP en MySQL
Scope of bereik van variabelen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Superglobals of autoglobals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Constanten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Constanten definiëren en gebruiken. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Namen van constanten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Vereiste constanten controleren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Variabelen vervangen door constanten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Constanten variabel definiëren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Operatoren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Stringoperator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Wiskundige of rekenkundige operatoren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Increment en decrement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Delen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Modulus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Machtsverheffen en worteltrekken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Toewijzingsoperator en gecombineerde operatoren. . . . . . . . . . . . . . . . . . . . Bitsgewijze operatoren en bitmaskers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bitmaskers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Verwerkingsvolgorde van operatoren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Functies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Procedures, taalconstructies en instructies. . . . . . . . . . . . . . . . . . . . . . . . . . . Functies definiëren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Argumenten doorgeven en resultaten teruggeven. . . . . . . . . . . . . . . . . . . . . Optionele argumenten en standaardwaarden. . . . . . . . . . . . . . . . . . . . . . . . . Namen van functies. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Aliassen van functies. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Controlestructuren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Vergelijkingsoperatoren en logische operatoren. . . . . . . . . . . . . . . . . . . . . . . if … elseif … else … . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . else. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . elseif. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . switch … case … default …. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . default . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . break . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . while … en do … while …. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . for …. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Objecten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Klassen definiëren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
164 166 166 166 168 168 169 169 170 170 170 171 172 172 173 173 174 174 175 177 177 178 179 181 181 182 183 183 184 187 188 189 190 190 191 191 194 196
Inhoud
Variabelen en eigenschappen gebruiken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 Objecten maken en gebruiken. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
5 Relationele databases en databasegestuurde webapplicaties . . . 199 Arrays. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arrays definiëren en vullen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Geïndexeerde en associatieve arrays. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arrays lezen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Controlestructuren met foreach. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Geïndexeerde arrays verwerken. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Associatieve arrays koppelen tot een database . . . . . . . . . . . . . . . . . . . . . Relationele databases ontwerpen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tabellen, records en velden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Veldtypen en veldlengten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Veldtypen en veldlengten kiezen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Relaties en sleutels. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Databases voor MySQL ontwerpen en beheren. . . . . . . . . . . . . . . . . . . . . . . . phpMyAdmin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MySQL Control Center (MySQLCC). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . WinMySQLadmin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Databaseverbindingen en query’s. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Gegevens controleren en converteren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bereik van numerieke waarden. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lengte van strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Speciale veldtypen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Booleaanse waarden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Databaseverbindingen openen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Databases selecteren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Query’s uitvoeren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Resultaten van query’s gebruiken. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Resultaatsets vrijgeven en databaseverbindingen sluiten . . . . . . . . . . . . . . . Structured Query Language (SQL). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Records selecteren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Records sorteren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Voorwaarden en filters. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Records toevoegen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Records verwijderen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Records bijwerken. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . SQL-injectie tegengaan. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
199 199 200 202 203 203 204 209 209 210 211 212 213 213 214 215 216 218 219 219 219 219 220 220 221 221 222 223 223 225 226 227 228 228 228
Webwinkels met PHP en MySQL
Databasegebruik optimaliseren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Databaseverbindingen laat openen en vroeg sluiten . . . . . . . . . . . . . . . . . . . PHP-code bij geopende databaseverbindingen beperken . . . . . . . . . . . . . . . Controlestructuren voor databaseregels. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Indexen op databasevelden plaatsen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Gegevens per record beperken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Aantal records beperken. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Stored procedures. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Snelheid verhogen met output buffering. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eén-op-één-relaties denormaliseren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Databases ontwerpen voor asymmetrisch gebruik. . . . . . . . . . . . . . . . . . . . . Verouderde gegevens verwijderen of verplaatsen. . . . . . . . . . . . . . . . . . . . . . Semi-dynamische webpagina’s. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6 Formulieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 Formulieren ontwerpen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Het element form. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Het attribuut action. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bestemming automatisch instellen in PHP. . . . . . . . . . . . . . . . . . . . . . . . Formulieren verzenden naar e-mailadressen. . . . . . . . . . . . . . . . . . . . . . . HTTP-methode: get of post . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Get als standaard-HTTP-methode. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hoeveelheid gegevens. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Symbolen en speciale tekens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Beveiliging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Statische en dynamische URL’s. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Post combineren met get . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MIME-typen voor de HTTP-methode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Invoervakken. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Invoervakken voor meerdere regels. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Knoppen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Opschriften instellen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Knoppen voor speciale functies. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Selectievakjes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Keuzerondjes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Keuzelijsten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Synoniemen voor keuzen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Keuzelijsten voor meer dan één keuze. . . . . . . . . . . . . . . . . . . . . . . . . . . . Opties groeperen met het element optgroup. . . . . . . . . . . . . . . . . . . . . . .
10
230 231 231 232 232 233 234 234 235 236 237 237 238 239 239 240 240 240 240 242 243 244 244 244 245 245 246 247 249 249 250 251 251 252 253 256 257
Inhoud
Labels. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Verborgen formuliervelden. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formulieren in XHTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eindtags en lege elementen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kleine letters. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Waarden tussen aanhalingstekens. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Geen attributen zonder waarde. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formulieren lezen met PHP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . $_GET en $_POST. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . $_REQUEST. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . import_request_variables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Verouderde PHP-methoden. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Globale variabelen en register_globals. . . . . . . . . . . . . . . . . . . . . . . . . . . . $HTTP_GET_VARS en $HTTP_POST_VARS. . . . . . . . . . . . . . . . . . . . . . . . . . Uitvoer van formulieren testen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formulieren controleren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Reageren op de knop submit. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Reageren op meer dan één knop. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Reageren op de HTTP-methode. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . HTML-tags en PHP-code verwijderen met strip_tags(). . . . . . . . . . . . . . . . . . Verplichte formuliervelden controleren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Witruimte verwijderen in PHP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Lengte van strings controleren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Verplichte formuliervelden markeren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Reguliere expressies. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PHP-functies voor reguliere expressies. . . . . . . . . . . . . . . . . . . . . . . . . . . . Syntaxis van reguliere expressies. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Formuliergegevens opnieuw weergeven. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Invoervakken. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Keuzerondjes en selectievakjes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Keuzelijsten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tekst converteren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Focus. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tabindex voor de tabvolgorde. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Toegangstoetsen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Toegangstoetsen markeren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Unieke toegangstoetsen kiezen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Focus dynamisch verplaatsen met JavaScript. . . . . . . . . . . . . . . . . . . . . . . . .
258 259 260 260 260 260 260 261 261 262 263 263 263 264 264 265 266 267 267 268 269 269 270 271 272 272 272 274 274 274 275 275 277 277 277 278 278 279
11
Webwinkels met PHP en MySQL
7 Frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 Voordelen van frames . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Snelheid. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Multitasking en parallel computing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Semi-dynamische websites. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Servertechnologieën combineren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Framesets en frames ontwerpen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Framesets en frames definiëren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Attributen voor framesets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Attributen voor frames. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Framesets nesten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Hyperlinks tussen frames. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Geen frames: noframes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . JavaScript voor frames. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Kaping (hijacking) via frames bestrijden. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Webpagina’s in frames laden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8 Online catalogi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294 Online catalogi zonder databases. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Databaseondersteuning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . HTML templating. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Arrays. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Databasegestuurde catalogi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . MySQL-databases voor catalogi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . PHP-applicaties voor catalogi. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Gegevens converteren en presenteren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Afbeeldingen weergeven. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Notatie van bedragen en andere getallen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tekst weergeven in kleine letters of hoofdletters. . . . . . . . . . . . . . . . . . . . . . Content aanbieden in alternatieve bestandsformaten. . . . . . . . . . . . . . . . . . Zekerheid en duidelijkheid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zoeksystemen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Externe zoeksystemen gebruiken. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Databasegestuurde zoeksystemen ontwerpen. . . . . . . . . . . . . . . . . . . . . . . . . Zoeksystemen in PHP met MySQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zoekresultaten sturen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
281 281 282 283 283 284 284 286 286 287 290 291 291 291 293 294 294 296 296 297 297 299 300 300 302 303 305 307 308 309 310 310 313
9 Bestelsystemen en winkelwagentjes. . . . . . . . . . . . . . . . . . . . . . . . . . . 314 Winkelwagentjes als model en metafoor. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
12
Inhoud
Functioneel en technisch model. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Winkelmandje, winkelwagentje en andere metaforen. . . . . . . . . . . . . . . . . . Databases en tabellen voor winkelwagentjes . . . . . . . . . . . . . . . . . . . . . . . . . . . . Functies voor winkelwagentjes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Sessies en sessiebeheer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Controle over de browsercache. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Factureren en betalen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Factuur en betaling achteraf. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Facturen versturen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Gegevens voor facturen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Facturen doorlopend nummeren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Factuurdatum, vervaldatum en leveringsdatum. . . . . . . . . . . . . . . . . . . . Internationale facturen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Vooruitbetaling of aanbetaling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Leveren onder rembours . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eenmalige machtiging en automatisch incasso. . . . . . . . . . . . . . . . . . . . . . . . Creditcards. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iDEAL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Online betalingen via payment service providers (PSP’s). . . . . . . . . . . . . . .
314 316 317 318 320 322 322 322 323 325 326 326 327 327 328 328 329 331 331
10 Gebruikersaccounts en beveiliging. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 Gebruikersnamen, wachtwoorden en id’s. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Codeersterkte. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Aselecte getallen genereren met PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . RAND_MAX, getrandmax() en mt_getrandmax(). . . . . . . . . . . . . . . . . . . . . . srand() en mt_srand(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Aselecte strings genereren met PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Speciale id’s genereren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Invoerfouten voorkomen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Webpagina’s beveiligen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Beveiliging met PHP zonder databases. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Beveiliging met PHP en MySQL-databases. . . . . . . . . . . . . . . . . . . . . . . . . . . . Alternatieve accountgegevens voor het inloggen. . . . . . . . . . . . . . . . . . . . . . Vergeten gebruikersnamen en wachtwoorden. . . . . . . . . . . . . . . . . . . . . . . . . . . Gebruikernamen en wachtwoorden laten kiezen. . . . . . . . . . . . . . . . . . . . . . Gebruikersnamen en wachtwoorden opslaan in cookies . . . . . . . . . . . . . . . Gebruikersnamen en wachtwoorden e-mailen. . . . . . . . . . . . . . . . . . . . . . . . Hints . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
333 333 335 336 336 337 338 339 340 340 345 348 348 349 351 352 356
13
Webwinkels met PHP en MySQL
Beveiligde internetverbindingen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Beveiligde verbindingen openen en onderhouden. . . . . . . . . . . . . . . . . . . . . Apache met mod_ssl en OpenSSL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Beveiligde webpagina’s ontwerpen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
356 357 358 359
11 E-mail en nieuwsbrieven . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362 Mogelijkheden en voordelen van e-mail. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Eenvoudig automatiseren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Effectief en efficiënt communiceren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Klanten winnen en klanten binden. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-mailmarketing, direct marketing en databasemarketing. . . . . . . . . . . . . . E-mail verzenden met de PHP-functie mail(). . . . . . . . . . . . . . . . . . . . . . . . . . . . Configuratie voor de PHP-functie mail(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . SMTP-headers toevoegen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-mail verzenden als HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-mailformulieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-mailformulieren in PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . E-mailadressen controleren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nieuwsbrieven. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nieuwsbrieven verzenden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nieuwsbrieven beheren met e-mail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Nieuwsbrieven beheren met MySQL-databases. . . . . . . . . . . . . . . . . . . . . . . . Opt-out via e-mail automatiseren. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
362 362 362 363 364 366 367 368 369 371 373 376 378 378 379 381 384
12 Statistieken en informatiesystemen. . . . . . . . . . . . . . . . . . . . . . . . . . . . 386 Tellers voor pageviews en hits. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tellers voor PHP-pagina’s zonder databases. . . . . . . . . . . . . . . . . . . . . . . . . . . Tellers weergeven als afbeeldingen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Tellers verbergen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Logboeken. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Logboeken bijhouden met PHP en MySQL. . . . . . . . . . . . . . . . . . . . . . . . . . . . Webbugs maken voor statische webpagina’s. . . . . . . . . . . . . . . . . . . . . . . . . . Statistieken en informatiesystemen. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Gebruikersaccounts en klantgegevens. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Unieke bezoekers en uniek bereik. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Zoeksystemen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Winkelwagentjes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
386 386 389 390 391 391 394 395 396 397 399 399
Index. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401