PHP Kookboek
![]() |
![]() |
Meer dan 300 recepten voor PHP
In het PHP Kookboek van Ward van der Put vind je meer dan driehonderd recepten voor PHP, thematisch verdeeld in acht hoofdstukken:
| 2 | PHP en (X)HTML |
| 1 | Hello world |
| 2 | Nooit meer overwerken rond de jaarwisseling |
| 3 | Client-servermodel met PHP |
| 4 | Technisch model met PHP |
| 5 | Functioneel model met PHP |
| 6 | Snel een webserver opzetten |
| 6a | XAMPP voor Windows, Mac OS, Linux en Solaris |
| 6b | WampServer voor WAMP |
| 6c | MAMP voor Mac OS X |
| 7 | Editors en IDE’s voor PHP |
| 8 | Lange PHP-tags |
| 9 | Korte PHP-tags |
| 9a | Maximale compatibiliteit met lange PHP-tags |
| 9b | Configuratiefout en beveiligingsprobleem |
| 10 | XML- en XHTML-tags |
| 11 | Let op de BOM |
| 12 | PHP-bestanden met een open einde |
| 13 | PHP in HTML-tags voor script |
| 14 | Foutmeldingen inschakelen en weergeven |
| 15 | Output printen of echoën |
| 16 | Variabelen buiten aanhalingstekens |
| 17 | Sneller echoën met komma’s |
| 18 | Heredoc |
| 19 | Nowdoc |
| 20 | HTML templating met server-side includes |
| 21 | Extensies van server-side includes |
| 22 | Server-side includes in vier smaken |
| 23 | Tien websites voor de prijs van één |
| 24 | Server-side includes veilig opslaan |
| 25 | Toegang tot directory’s blokkeren |
| 26 | Bestandstypen en extensies beveiligen |
| 27 | Gzip-compressie inschakelen voor snellere webpagina’s |
| 28 | Gzip-compressie van PHP inschakelen in .htaccess |
| 29 | Gzip-compressie van meer bestandstypen inschakelen in .htaccess |
| 30 | Gzip vervangen door deflate |
| 31 | Buffers flushen en een FOUC voorkomen |
| 3 | Programmeren met PHP |
| 32 | Commentaar in vier stijlen |
| 33 | Tabellen in commentaar |
| 34 | Nuttige tags uit phpDocumentor |
| 34a | Versiebeheer |
| 34b | Auteur en auteursrecht |
| 34c | Licentie |
| 34d | Onderdelen van applicaties |
| 34e | Invoer en uitvoer |
| 34f | Hyperlinks |
| 34g | Wat moeten we nog doen? |
| 35 | PHP-scripts printen in kleur |
| 36 | PHP-code inspringen |
| 37 | PHP-code inspringen met spaties of tabs |
| 38 | PHP-code uitlijnen met extra spaties |
| 39 | Regels voor regeleinden |
| 40 | Regels voor witregels |
| 41 | Accolades in K&R-stijl en Allman-stijl |
| 42 | Ternary operator |
| 43 | PHP-instructies met of zonder ronde haakjes |
| 44 | Hoofdletters en kleine letters |
| 45 | Hongaarse notaties voor PHP |
| 46 | Userland: het land van nooit gedacht |
| 47 | Variabelen declareren |
| 48 | Variabelen dumpen |
| 49 | Variabelen opruimen |
| 50 | Combinaties van variabelen in URL’s fatsoeneren |
| 51 | Constanten definiëren met define() |
| 52 | Constanten definiëren met const |
| 53 | Namen van constanten |
| 54 | Variabelen vervangen door constanten |
| 55 | Variabele constanten |
| 56 | Variabelen opnemen in constanten |
| 57 | Ongedefinieerde variabelen en constanten |
| 58 | Rekenmeesters laten rekenmonsters met rust |
| 59 | Syntaxis van booleaanse waarden |
| 60 | Statische arrays gebruiken als constanten |
| 61 | Functieresultaat of hulpvariabele |
| 62 | Vandaag besteld, morgen in huis |
| 63 | Dure resources efficiënter gebruiken |
| 64 | Programmeren met bits en bitmaskers |
| 65 | Defensief programmeren |
| 66 | Voorwaarden combineren of splitsen |
| 67 | Fouten afhandelen met foutmeldingen |
| 68 | Fouten afhandelen in PHP-stijl |
| 69 | Fouten afhandelen als uitzonderingen |
| 70 | Fouten onderdrukken |
| 71 | Achterwaartse compatibiliteit |
| 72 | PHP-versie controleren |
| 73 | Voorwaartse compatibiliteit |
| 73a | Verouderde onderdelen van PHP |
| 73b | PHP 5.3 en PHP 6 |
| 73c | Strict Standards-modus |
| 74 | Objecten, eigenschappen en methoden |
| 74a | Eigenschappen en variabelen |
| 74b | Methoden en functies |
| 75 | Methoden en eigenschappen combineren |
| 76 | Object of klasse |
| 77 | Van eigenschappen en methoden naar klassen |
| 78 | Zichtbaarheid van eigenschappen en methoden |
| 79 | Getters en setters |
| 80 | Constructors |
| 81 | Klassen zonder constructor |
| 82 | Standaardeigenschappen en constructors |
| 83 | Modules en extensies hergebruiken als klassen |
| 84 | Constructors in de stijl van PHP 4 |
| 85 | Destructors |
| 86 | Snellere webpagina’s met een constructor en destructor |
| 87 | Objecten opslaan in sessies of databases |
| 88 | Slapen en ontwaken |
| 4 | Webdesign en sitebeheer |
| 89 | Tijdzone instellen |
| 90 | Kalenders weergeven |
| 91 | Eerste dag van de week |
| 92 | URL’s met datums en trefwoorden |
| 93 | Datums en tijden volgens internetstandaarden |
| 94 | HTTP-clientfouten en HTTP-serverfouten |
| 94a | Webpagina’s voor HTTP-fouten instellen als ErrorDocument |
| 94b | HTML of XHTML voor serverfouten |
| 94c | HTTP-fouten genereren met de functie header() |
| 95 | HTTP-methoden controleren |
| 96 | Een geslaagde POST eindigen met GET |
| 97 | PHP-pagina’s verplaatsen en een 404 Not Found voorkomen |
| 98 | Webpagina’s verplaatsen via .htaccess |
| 99 | Doorverwijzen van .html naar .php |
| 100 | PHP-bestanden weergeven met de extensie .html |
| 101 | HTML-bestanden afhandelen als PHP-script |
| 102 | Hostnamen met of zonder www |
| 103 | URL’s herschrijven voor één bestand |
| 104 | Fouten e-mailen |
| 105 | Websites tijdelijk offline halen |
| 106 | Taalvoorkeuren bepalen met domeinnamen en hostnamen |
| 106a | Domeinen en domeinnamen |
| 106b | Hostnamen en subdomeinen |
| 107 | Taalvoorkeuren bepalen met directory’s |
| 108 | Taalvoorkeuren bepalen met herschreven URL’s |
| 109 | Taalvoorkeuren bepalen met HTTP |
| 110 | Gewogen taalvoorkeuren bepalen met HTTP |
| 111 | Uitzonderingen voor online shopping in de EU |
| 112 | Talen van webpagina’s melden |
| 113 | Cookies zetten en lezen |
| 114 | Cookies coderen in 7-bits ASCII |
| 115 | Gevulde koeken in overvolle koektrommels |
| 116 | Meerdere variabelen opslaan in één cookie |
| 117 | Variabelennamen voor cookies |
| 117a | Korte variabelennamen voor cookies |
| 117b | Leesbare variabelennamen voor cookies |
| 118 | Cookies verwijderen |
| 119 | Reageren op zoekwoorden van Google |
| 120 | Sneller en effectiever zoeken |
| 121 | Zoeken met synoniemen en een spellingcontrole |
| 122 | Zoeken met hints voor betere resultaten |
| 123 | Browsercache uitschakelen |
| 124 | URL’s inkorten voor Twitter |
| 124a | Hostnaam zonder subdomein |
| 124b | Aparte hostnaam voor ingekorte URL’s |
| 124c | Unieke ID’s genereren |
| 125 | Hoofdlettergevoelige ID’s opslaan in een database |
| 126 | Hot linking bestrijden met een rewrite rule |
| 127 | Hot linking bestrijden zonder rewrite rule |
| 128 | Downloads forceren |
| 129 | IP-adressen blokkeren met PHP |
| 130 | IP-adressen blokkeren met Apache |
| 131 | Geografische afstanden berekenen |
| 132 | Pauzes inlassen |
| 133 | Snelheden vergelijken met timers |
| 134 | Meten met statistisch betrouwbare timers |
| 135 | Snellere functies en methoden schrijven |
| 136 | Server-side includes combineren |
| 137 | Meten is weten, maar weet wat je meet |
| 137a | Client of server |
| 137b | Een 80/20-regel |
| 137c | Niet-lineaire prestaties |
| 138 | Afmetingen van afbeeldingen achterhalen |
| 139 | Thumbnails genereren |
| 140 | Sitestatistieken bijhouden met een database |
| 141 | A/B-tests opzetten met IP-adressen |
| 142 | A/B-tests opzetten met sessies en cookies |
| 5 | Databases en MySQL |
| 143 | Data opslaan in tekstbestanden |
| 144 | SQL-databases zonder databaseserver |
| 145 | Databasegestuurde webapplicaties in zes gangen |
| 145a | Stap 1: SQL-query opstellen |
| 145b | Stap 2: databaseverbinding openen |
| 145c | Stap 3: database selecteren |
| 145d | Stap 4: SQL-query uitvoeren |
| 145e | Stap 5: resultaten verwerken |
| 145f | Stap 6: resultaatset en databaseverbinding sluiten |
| 146 | Hoeveel is veel? |
| 147 | MySQL-engines: MyISAM of InnoDB |
| 147a | MyISAM voor snelle selectiequery’s |
| 147b | InnoDB voor snelle bijwerkquery’s |
| 147c | InnoDB voor referentiële integriteit |
| 147d | InnoDB voor ACID-transacties |
| 147e | MyISAM voor een full-text search |
| 147f | MyISAM voor schijfruimte |
| 147g | MyISAM en InnoDB combineren |
| 147h | Testen en meten |
| 148 | Naamgeving bij MySQL-databases |
| 148a | ASCII-karakters uit het Latijnse alfabet |
| 148b | Hoofdletters voor SQL en kleine letters voor namen |
| 148c | Spaties vervangen door underscores |
| 149 | Enkelvoud voor kolommen, meervoud voor tabellen |
| 150 | Naamconflicten oplossen met de puntnotatie |
| 151 | Naamconflicten voorkomen met GUID’s |
| 152 | Fouten afhandelen bij het openen van databaseverbindingen |
| 153 | MySQL op het kerkhof |
| 154 | SQL-injecties |
| 154a | Manipulaties in de DML (data manipulation language) |
| 154b | Manipulaties in de DDL (data definition language) |
| 155 | SQL-injectie bestrijden met controlestructuren |
| 156 | SQL-injectie bestrijden met escapes |
| 157 | SQL-injectie voorkomen met prepared statements |
| 158 | MySQL afschermen met PHP |
| 159 | Booleaanse waarden opslaan in databases |
| 160 | Floats opslaan als integers |
| 161 | Datums opslaan als integers |
| 162 | ISO-datums weergeven in het Nederlands |
| 163 | Rijke data voor tekst: meer is meer |
| 164 | Ideale paginatitels volgens Google en het W3C |
| 165 | Karaktersets in MySQL |
| 166 | Collaties in MySQL |
| 167 | Databaseverbindingen bij UTF-8 |
| 168 | Waarden beperken met enumeraties |
| 169 | Alfabetisch sorteren zonder lidwoorden |
| 170 | Data logisch sorteren |
| 171 | Aselect databasegegevens weergeven |
| 172 | LEFT JOIN of RIGHT JOIN |
| 173 | Vragen beantwoorden met query’s en joins |
| 173a | PRIMARY KEY (PK) en FOREIGN KEY (FK) |
| 173b | JOIN |
| 173c | LEFT JOIN |
| 173d | RIGHT JOIN |
| 173e | Van data naar informatie |
| 174 | Refererende sleutels toevoegen |
| 175 | Unieke waarden afdwingen |
| 176 | Veel-op-veel-relaties |
| 177 | SQL-query’s uitschrijven |
| 178 | Prioriteit van query’s |
| 179 | INSERT en UPDATE combineren |
| 180 | DELETE en INSERT combineren |
| 181 | Databases voor gebruikersaccounts |
| 181a | Gebruikersnaam en wachtwoord |
| 181b | Gebruikersnaam en versleuteld wachtwoord |
| 181c | Unieke id, gebruikersnaam en versleuteld wachtwoord |
| 181d | E-mailadres en versleuteld wachtwoord |
| 182 | Platte databasetabel met landcodes en geocodes |
| 183 | Relationeel datamodel met landcodes en geocodes |
| 184 | Landnummers voor snelle en compacte databases |
| 185 | EAV (entity-attribute-value) |
| 186 | Full-text search in MySQL |
| 187 | Zoeken met een full-text index |
| 188 | Full-text search testen en verbeteren |
| 189 | Zoekresultaten sorteren bij een full-text search |
| 189a | Full-text search met ORDER BY |
| 189b | Full-text search in een subquery |
| 190 | Full-text search bij InnoDB |
| 190a | Text search engines |
| 190b | Zoeken in een MyISAM-schaduwkopie |
| 191 | Foutloos zoeken ondanks invoerfouten |
| 6 | Webformulieren |
| 192 | Formulieren in HTML of XHTML |
| 192a | Elementen openen en sluiten |
| 192b | Attributen met waarden |
| 193 | PHP-scripts formulieren naar zichzelf laten posten |
| 193a | Naar de huidige directory posten met action="./" |
| 193b | Naar het huidige bestand posten met action="" |
| 193c | Het attribuut action weglaten |
| 194 | Formulieren verzenden met GET of POST |
| 194a | Standaard-HTTP-methode |
| 194b | Gegevens weergeven of verbergen |
| 194c | Hoeveelheid gegevens |
| 195 | Alleen GET of POST accepteren |
| 196 | GET en POST combineren |
| 197 | HTTP-verzoek in $_REQUEST |
| 198 | Output van formulieren controleren |
| 199 | Hotspots vergroten met labels |
| 200 | Posten met de Enter-toets voorkomen |
| 201 | Hongaarse notaties voor HTML en XHTML |
| 202 | Controles beginnen met isset() en empty() |
| 202a | Met isset() controleren of variabelen bestaan |
| 202b | Met empty() controleren of variabelen leeg zijn |
| 203 | Lege formuliervelden afhandelen |
| 204 | Output en input beveiligen |
| 205 | Witruimte en ASCII-stuurcodes verwijderen |
| 206 | Strings fatsoeneren met ltrim() en rtim() |
| 207 | Overbodige spaties verwijderen |
| 207a | Overbodige spaties zoeken en vervangen |
| 207b | Zoeken en vervangen met preg_replace() |
| 208 | Tags verwijderen |
| 209 | Posts simuleren voor tests |
| 210 | Input uit formulieren filteren |
| 211 | Magic quotes en backslashes |
| 211a | magic_quotes_gpc in php.ini |
| 211b | get_magic_quotes_gpc() en stripslashes() |
| 212 | Datatypen controleren |
| 213 | Eerst converteren, daarna valideren |
| 214 | Van string naar integer of float |
| 215 | Tekst uit grote tekstgebieden verwerken |
| 216 | Regeleinden in tekst standaardiseren |
| 217 | Overbodige witregels verwijderen |
| 218 | Hoofdlettergebruik corrigeren met PHP |
| 219 | Hoofdlettergebruik corrigeren met JavaScript |
| 220 | Tussenvoegsels in achternamen |
| 221 | Standaardfouten zoeken en vervangen |
| 222 | Woorden tellen met str_word_count() |
| 223 | Woorden tellen als array-elementen |
| 224 | Woorden tellen met substr_count() |
| 225 | Datums controleren |
| 226 | Nederlandse postcodes valideren |
| 227 | Nederlandse bankrekeningnummers valideren |
| 7 | E-mail en communicatie |
| 228 | Lengte van e-mailadressen |
| 229 | E-mailadressen valideren met een reguliere expressie |
| 230 | E-mailadressen valideren met een filterfunctie |
| 231 | E-mailadressen valideren met een DNS-lookup |
| 232 | E-mailadressen valideren met MX-records |
| 233 | E-mailadressen in HTML5 |
| 234 | E-mailadressen in webteksten weergeven of verbergen |
| 234a | E-mailadressen weergeven als hyperlinks |
| 234b | E-mailadressen verbergen |
| 235 | E-mail verzenden met de PHP-functie mail() |
| 236 | CC of BCC e-mailen |
| 237 | Wettelijke bewaarplicht voor e-mail en bijlagen |
| 238 | Prioriteit van e-mailberichten verhogen |
| 239 | Regeleinden in SMTP |
| 240 | E-mailinjecties met regeleinden voorkomen |
| 241 | Spamfilters omzeilen |
| 241a | SMTP-headers voor de afzender |
| 241b | Naam van de geaddresseerde |
| 241c | E-mailberichten testen |
| 242 | E-mail verzenden als HTML met opmaak |
| 243 | E-mail verzenden met Swift Mailer |
| 244 | E-mail verzenden met PHPMailer |
| 245 | URL’s voor telefoonnummers |
| 246 | Telefoonnummers valideren |
| 247 | Cijfers in telefoonnummers tellen |
| 248 | Uitzonderingen voor speciale telefoonnummers |
| 249 | Telefoonnummers vermommen met HTML-entiteiten |
| 250 | E-mailadressen en telefoonnummers weergeven als afbeeldingen |
| 251 | Quick response (QR) voor smartphones |
| 8 | Ajax |
| 252 | Ajax-effecten zonder Ajax |
| 253 | Client-servermodel bij Ajax |
| 254 | Controleren of JavaScript wordt ondersteund |
| 255 | Van ActiveX naar DOM |
| 256 | Browsercontrole voor ActiveX |
| 257 | Ajax op de client |
| 258 | Ajax op de server |
| 259 | PHP-applets voor Ajax-applicaties |
| 260 | Geen actie zonder reactie |
| 261 | PHP-sessies bij Ajax |
| 261a | Sessies starten en hervatten |
| 261b | Sessie-ID’s niet opnieuw genereren |
| 261c | Geblokkeerde sessiecookies omzeilen |
| 262 | Caching bij de HTTP-methode GET |
| 262a | Caching verbieden met HTTP-headers |
| 262b | URL’s dynamisch veranderen met JavaScript |
| 9 | Beveiliging |
| 263 | Binnen via de achterdeur |
| 264 | PHP in de safe mode |
| 265 | Beveiligde verbindingen gebruiken |
| 266 | Beveiligde verbindingen openen bij Apache en IIS |
| 267 | Beveiligde verbindingen openen bij mod_ssl en OpenSSL |
| 268 | Beveiligde verbindingen openen met poortnummers |
| 269 | Sessie-ID’s sterker versleutelen |
| 270 | Sessie-ID’s opnieuw genereren |
| 271 | Diefstal van cookies en sessiecookies voorkomen |
| 272 | PHP-sessies vermommen |
| 273 | Serversoftware verbergen met PHP |
| 274 | Serversoftware verbergen in de serverconfiguratie |
| 274a | Configuratie van Apache |
| 274b | Configuratie van PHP |
| 274c | Suhosin-patch voor ‘Hardened PHP’ |
| 275 | Digitale kluis met tijdslot |
| 276 | Aselecte getallen genereren |
| 277 | Mersenne Twister (MT) |
| 278 | Lange aselecte getallen genereren |
| 279 | Nog langere aselecte getallen genereren als numerieke strings |
| 280 | Sterke wachtwoorden genereren |
| 281 | Compatibele wachtwoorden genereren |
| 282 | Gemakkelijke maar veilige wachtwoorden genereren |
| 283 | Nog gemakkelijkere en veiligere wachtwoorden genereren |
| 284 | Aselect wachtwoorden trekken uit een vaste karakterset |
| 285 | Getallen weigeren als wachtwoord |
| 286 | Minimumlengte van wachtwoorden |
| 287 | Woordenboekaanvallen voorkomen |
| 288 | Wachtwoordsterkte controleren met CrackLib |
| 289 | Wachtwoordsterkte controleren met reguliere expressies |
| 290 | Gebruikersnamen behandelen als wachtwoorden |
| 291 | Wachtwoorden veilig wijzigen |
| 292 | Registratiesleutels en kortingscodes |
| 293 | Inloggen zonder database |
| 294 | Inloggen met een database |
| 295 | Inloggen met een HTTP-basisverificatie |
| 296 | Aantal inlogpogingen per sessie |
| 297 | Aantal inlogpogingen per gebruiker |
| 298 | Aantal inlogpogingen per IP-adres |
| 299 | Automatisch inloggen of niet? |
| 300 | Niet inloggen zonder uitloggen |
| 301 | Password managers omzeilen |
| 301a | AutoComplete uitschakelen |
| 301b | AutoComplete omzeilen |
| 302 | Cookies symmetrisch versleutelen |
| 303 | Data in cookies symmetrisch versleutelen |
| 304 | Data in cookies asymmetrisch versleutelen |
| 305 | SHA-1 vervangen door SHA-2 voor asymmetrisch encryptie |
| 306 | Databasegegevens versleutelen met SHA-2 |
| 307 | Symmetrische encryptie in MySQL |
| 308 | Pittige encryptie met peper en zout |
| 308a | Encryptie met een salt |
| 308b | Unieke geheime codes gebruiken |
| 308c | Encryptiealgoritmen variëren |
| 309 | Transacties beveiligen met een TAN-lijst in een database |
| 310 | Transacties beveiligen met een TAN-lijst zonder database |
| 311 | Databaseaccounts met beperkte rechten |
| 312 | Frame hijacking bestrijden met JavaScript |
| 313 | Frame hijacking bestrijden met HTML |
| 314 | Cookie poisoning voorkomen |
| 315 | Cross-site scripting (XSS) bestrijden |
| 315a | Invoer schonen met strip_tags() |
| 315b | Uitvoer schonen met htmlentities() |
| 316 | Cross-site request forgery (CSRF) voorkomen |
| 316a | Geen externe afbeeldingen of video’s accepteren |
| 316b | Geen ongecontroleerde hyperlinks publiceren |
| 316c | Niet automatisch inloggen |
| 316d | Wel automatisch uitloggen |
| 316e | HTTP-referrer controleren |
| 316f | Aanvullende beveiligingen van webformulieren |
| 317 | User agents controleren |
| 318 | Onveilige functies en klassen uitschakelen |
Voorproevers: Harm Cox (@harmisookhier), Niek Heezemans en René Weishaupt (@GetZenned).


