|
Auf einen Blick |
4 |
|
|
Inhalt |
6 |
|
|
Vorwort |
16 |
|
|
1 Einleitung |
18 |
|
|
1.1 Konzeption |
22 |
|
|
1.2 Feedback |
25 |
|
|
2 Grundpfeiler der Webentwicklung |
26 |
|
|
2.1 Das weltweite Netz |
27 |
|
|
2.2 Das HTTP-Protokoll |
32 |
|
|
2.3 Hypertext Markup Language (HTML) |
35 |
|
|
2.4 Anbieter und Anwender |
37 |
|
|
2.4.1 Anbieter/Ressourceninhaber |
38 |
|
|
2.4.2 Nutzer Ihres Systems |
40 |
|
|
3 Installation |
44 |
|
|
3.1 Microsoft Windows |
46 |
|
|
3.1.1 Installation des XAMPP-Basispakets |
46 |
|
|
3.1.2 Installation von XAMPP Lite |
49 |
|
|
3.1.3 Starten und Beenden der Server |
50 |
|
|
3.2 Linux |
51 |
|
|
3.3 Konfiguration von XAMPP |
53 |
|
|
3.3.1 Sicherheitslücken schließen |
53 |
|
|
3.3.2 Konfigurationsdateien anpassen |
56 |
|
|
3.4 Aktualisierung der Komponenten |
62 |
|
|
3.5 Komponentenweise Installation |
64 |
|
|
3.6 Die Minimallösung: PHP als Webserver |
69 |
|
|
4 Einführung in PHP |
72 |
|
|
4.1 Strukturen einer PHP-Seite |
73 |
|
|
4.2 Variablen |
75 |
|
|
4.2.1 Grundlegende Syntax |
75 |
|
|
4.2.2 Datentypen |
77 |
|
|
4.2.3 Namenskonventionen |
99 |
|
|
4.3 Konstanten |
100 |
|
|
4.4 Kommentare |
101 |
|
|
4.5 Funktionen |
103 |
|
|
4.5.1 Syntax |
105 |
|
|
4.5.2 Gültigkeitsbereiche |
107 |
|
|
4.5.3 Namenskonventionen |
109 |
|
|
4.5.4 Anonyme Funktionen |
109 |
|
|
4.6 Kontrollkonstrukte |
111 |
|
|
4.6.1 Bedingte Entscheidungen |
112 |
|
|
4.6.2 Wiederholungen |
120 |
|
|
4.6.3 Sprunganweisungen |
129 |
|
|
4.7 Vordefinierte Informationen |
130 |
|
|
4.7.1 Superglobale Arrays |
131 |
|
|
4.7.2 Vordefinierte Konstanten |
141 |
|
|
4.8 Einbinden externer Dateien |
144 |
|
|
5 Objektorientierung in PHP |
148 |
|
|
5.1 Die Modellierungssprache UML |
148 |
|
|
5.2 Klassen und Objekte |
150 |
|
|
5.2.1 Konstruktoren und Destruktoren |
152 |
|
|
5.2.2 Zugriffsmodifizierer |
153 |
|
|
5.2.3 Funktionen oder Methoden |
157 |
|
|
5.2.4 Die Implementierung der Klasse »Fahrzeug« |
158 |
|
|
5.2.5 Magische Methoden |
160 |
|
|
5.3 Klassenbeziehungen |
164 |
|
|
5.3.1 Vererbung |
164 |
|
|
5.3.2 Klonen |
175 |
|
|
5.4 Automatisches Laden von Klassen |
177 |
|
|
5.5 Klassenattribute und -methoden überladen |
178 |
|
|
5.6 Namensräume |
184 |
|
|
5.7 Objektorientierte Fehlerbehandlung |
188 |
|
|
6 Einführung in MySQL |
194 |
|
|
6.1 Relationale Datenbanksysteme |
199 |
|
|
6.2 MySQL und SQL |
202 |
|
|
6.2.1 Eine Serververbindung aufbauen |
203 |
|
|
6.2.2 Grundlegende SQL-Kommandos |
210 |
|
|
6.2.3 Datentypen |
228 |
|
|
6.3 Zugriffswerkzeuge |
243 |
|
|
6.3.1 MySQL Administrator |
243 |
|
|
6.3.2 MySQL Query Browser |
245 |
|
|
6.3.3 MySQL Migration Toolkit |
246 |
|
|
6.3.4 MySQL Workbench |
248 |
|
|
6.3.5 phpMyAdmin |
250 |
|
|
7 MySQLi |
254 |
|
|
7.1 MySQLi in PHP einsetzen |
254 |
|
|
7.2 MySQLi-Klassen |
256 |
|
|
7.2.1 mysqli |
256 |
|
|
7.2.2 mysqli_result |
271 |
|
|
7.2.3 mysqli_stmt |
281 |
|
|
8 Wichtige PHP-Funktionalitäten |
290 |
|
|
8.1 Datums- und Zeitfunktionen |
290 |
|
|
8.1.1 Erstellung eines Datums |
291 |
|
|
8.1.2 Erstellung von Zeitstempeln |
292 |
|
|
8.1.3 Mikrosekunden |
293 |
|
|
8.1.4 Umgangssprachliche Zeitkalkulation |
295 |
|
|
8.2 Datei- und Verzeichnisfunktionen |
297 |
|
|
8.2.1 Auslesen und Schreiben von Dateien |
297 |
|
|
8.2.2 Arbeiten mit Verzeichnissen |
301 |
|
|
8.2.3 Prüfungen im Dateisystem |
303 |
|
|
8.3 Reguläre Ausdrücke |
304 |
|
|
8.3.1 Syntax |
306 |
|
|
8.3.2 Reguläre Ausdrücke in PHP |
312 |
|
|
8.3.3 Reguläre Ausdrücke in der Praxis |
316 |
|
|
8.4 PEAR und PECL |
318 |
|
|
8.4.1 PEAR |
319 |
|
|
8.4.2 PECL |
320 |
|
|
8.5 Datenabstraktion |
321 |
|
|
8.5.1 Abstraktion im Kleinen: DBX |
322 |
|
|
8.5.2 PDO |
329 |
|
|
8.6 SQLite |
347 |
|
|
8.7 Standard-PHP-Bibliothek |
357 |
|
|
8.7.1 Iteratoren |
358 |
|
|
8.7.2 Datenstrukturen |
361 |
|
|
8.7.3 Exceptions |
363 |
|
|
8.8 PHP-Archive |
364 |
|
|
9 Fortgeschrittenes MySQL |
378 |
|
|
9.1 Benutzerverwaltung |
378 |
|
|
9.2 Kontrollfluss und Aggregationen |
383 |
|
|
9.2.1 Bedingte Auswertung |
383 |
|
|
9.2.2 Aggregationen |
385 |
|
|
9.3 Performanter Datenbankzugriff |
391 |
|
|
9.3.1 JOIN-Syntax |
391 |
|
|
9.3.2 Indizes |
395 |
|
|
9.4 Metadaten |
401 |
|
|
9.4.1 INFORMATION_SCHEMA |
401 |
|
|
9.4.2 Metadatenanweisungen |
406 |
|
|
9.4.3 PERFORMANCE_SCHEMA |
407 |
|
|
9.5 Views |
409 |
|
|
9.5.1 Anlegen |
410 |
|
|
9.5.2 Editierbare und erweiterbare Sichten |
414 |
|
|
9.5.3 Ändern und löschen |
416 |
|
|
9.5.4 Ein praktisches Beispiel |
417 |
|
|
9.6 Stored Procedures |
418 |
|
|
9.6.1 Anlegen |
419 |
|
|
9.6.2 Aufrufen |
423 |
|
|
9.6.3 Ändern und Löschen |
424 |
|
|
9.6.4 Variablen |
424 |
|
|
9.6.5 Kontrollstrukturen |
425 |
|
|
9.6.6 Error Handling |
430 |
|
|
9.7 Trigger |
436 |
|
|
9.7.1 Anlegen |
436 |
|
|
9.7.2 Wozu aber sind Trigger notwendig? |
438 |
|
|
9.7.3 Löschen |
441 |
|
|
9.8 Partitionierung |
442 |
|
|
9.8.1 Partitionstypen |
446 |
|
|
9.8.2 Subpartitionierung |
455 |
|
|
9.8.3 Verwaltung von Partitionen |
457 |
|
|
9.9 Events |
459 |
|
|
9.9.1 Anlegen |
460 |
|
|
9.9.2 Ändern |
466 |
|
|
9.9.3 Löschen |
468 |
|
|
10 MySQL Storage Engines |
470 |
|
|
10.1 MyISAM |
472 |
|
|
10.2 InnoDB |
476 |
|
|
10.2.1 Transaktionen |
478 |
|
|
10.2.2 Referentielle Integrität |
481 |
|
|
10.3 MEMORY |
484 |
|
|
10.4 ARCHIVE |
486 |
|
|
10.5 Maria |
488 |
|
|
10.6 CSV |
489 |
|
|
10.7 MySQL Pluggable Storage Engines |
492 |
|
|
10.8 MySQL Forks |
494 |
|
|
10.8.1 Percona XtraDB |
495 |
|
|
10.8.2 OurDelta |
496 |
|
|
10.8.3 MariaDB |
497 |
|
|
10.8.4 Drizzle |
498 |
|
|
11 Sicherheit |
500 |
|
|
11.1 Formulardaten und Validierung |
502 |
|
|
11.2 Verschlüsselung |
507 |
|
|
11.2.1 Ein-Weg-Verschlüsselung |
507 |
|
|
11.2.2 Zwei-Wege-Verschlüsselung |
510 |
|
|
11.2.3 SSL |
514 |
|
|
11.3 Angriffsmethoden und Schutzmaßnahmen |
516 |
|
|
11.3.1 Cross-Site-Scripting (XSS) |
517 |
|
|
11.3.2 SQL Injection |
520 |
|
|
11.3.3 Angriffe auf Sitzungen |
521 |
|
|
11.3.4 HTTP Response Splitting |
523 |
|
|
11.3.5 Fazit |
525 |
|
|
11.4 Filter |
525 |
|
|
11.4.1 Verfügbare Filter |
526 |
|
|
11.4.2 Filterfunktionen |
527 |
|
|
11.4.3 Datenvalidierung |
535 |
|
|
11.4.4 Datenbereinigung |
543 |
|
|
12 Datenbankentwurf |
550 |
|
|
12.1 ERM |
551 |
|
|
12.2 Normalisierung |
555 |
|
|
12.2.1 Normalformen |
555 |
|
|
12.2.2 Denormalisierung |
560 |
|
|
12.3 Datenbankentwurf mit phpMyAdmin |
561 |
|
|
13 Extensible Markup Language |
564 |
|
|
13.1 XML-Grundlagen |
564 |
|
|
13.2 XPath |
566 |
|
|
13.3 SimpleXML |
570 |
|
|
13.4 MySQL-XML-Funktionalität |
582 |
|
|
14 Ein Basissystem mit PHP und MySQL |
592 |
|
|
14.1 Konfigurationsdateien |
593 |
|
|
14.1.1 common.php |
593 |
|
|
14.1.2 paths.php |
595 |
|
|
14.1.3 settings.php |
596 |
|
|
14.1.4 includeAllClasses.php |
598 |
|
|
14.2 Die Klasse für HTML |
598 |
|
|
14.3 Datenbankverbindungen |
601 |
|
|
14.3.1 Die Datenbankverbindungsklasse MySQL |
602 |
|
|
14.3.2 Abstraktionsschicht mittels PHP Data Objects |
608 |
|
|
14.3.3 Verwendung der PDO-Klasse |
613 |
|
|
14.3.4 SQLite-Verbindungsklasse |
615 |
|
|
14.4 Sicherheitsklasse |
616 |
|
|
14.5 Logging |
620 |
|
|
14.5.1 Die Logging-Klasse |
620 |
|
|
14.5.2 Verwendung des Loggings |
625 |
|
|
14.6 Debugging |
626 |
|
|
14.6.1 Die Klasse »DebugConsole« |
627 |
|
|
14.6.2 Hilfsdateien für die Debug-Konsole |
636 |
|
|
14.6.3 Verwendung der Klasse »DebugConsole« |
637 |
|
|
15 Sichere Webanwendungen |
640 |
|
|
15.1 Benutzer authentifizieren |
641 |
|
|
15.1.1 Klasse »Login« |
641 |
|
|
15.1.2 »Login«-Klasse anwenden |
645 |
|
|
15.2 Sitzungen mit der Datenbank verwalten |
647 |
|
|
15.2.1 Die Klasse der Sitzungsverwaltung |
647 |
|
|
15.2.2 Sitzungsverwaltung anwenden |
653 |
|
|
15.2.3 Probleme mit der Sitzungsverwaltung |
654 |
|
|
15.2.4 »Race Hazard« bei datenbankbasierter Sitzungsverwaltung |
655 |
|
|
15.2.5 Benutzerstatus abfragen |
657 |
|
|
15.2.6 Benutzer abmelden |
658 |
|
|
15.3 Passwörter sicher gestalten |
659 |
|
|
15.3.1 Passwortstrategie |
659 |
|
|
15.3.2 Zufalls-Passwörter generieren |
660 |
|
|
15.3.3 Passwort-Syntax überprüfen |
662 |
|
|
15.4 Logging realisieren |
664 |
|
|
15.4.1 Daten speichern |
665 |
|
|
15.4.2 Klasse »Log« |
666 |
|
|
15.4.3 Daten mittels JpGraph darstellen |
669 |
|
|
15.4.4 Klasse »Chart« |
670 |
|
|
15.4.5 Daten als PDF-Dokument archivieren |
673 |
|
|
15.4.6 Klasse »PDFMaker« |
675 |
|
|
15.4.7 »PDFMaker«-Klasse anwenden |
682 |
|
|
15.5 Einfache Intrusion Detection implementieren |
683 |
|
|
15.5.1 Konfigurationsdatei für das Intrusion Detection Login |
685 |
|
|
15.5.2 Klasse für Intrusion Detection |
686 |
|
|
15.6 Sichere Formulare |
692 |
|
|
15.7 Eigene Fehlerbehandlung einbauen |
698 |
|
|
15.7.1 Konfigurationsdatei für Fehlerbehandlung |
699 |
|
|
15.7.2 Fehlerbehandlungsklasse |
701 |
|
|
15.7.3 Fehlerbehandlung in das Basissystem integrieren |
706 |
|
|
16 Mehrbenutzersysteme |
708 |
|
|
16.1 Das Hauptproblem: 2 Benutzer - 1 Datensatz |
709 |
|
|
16.1.1 Szenario 1: Wer zuerst kommt … Ein Änderungsschlüssel |
709 |
|
|
16.1.2 Szenario 2: Datensätze explizit sperren |
709 |
|
|
16.2 Sperren von MySQL-Datensätzen |
711 |
|
|
16.2.1 Die Klasse »Locks« |
712 |
|
|
16.2.2 Beispielanwendung mit Sperren versehen |
716 |
|
|
16.3 Transaktionen im praktischen Einsatz |
720 |
|
|
16.3.1 Klasse »Bank« |
722 |
|
|
16.3.2 Sichere und unsichere »Banktransaktionen« verwenden |
725 |
|
|
16.4 Mehrsprachige Weboberflächen |
728 |
|
|
16.4.1 Klasse »LanguageSupport« |
729 |
|
|
16.4.2 Mehrsprachige Benutzeroberflächen realisieren |
733 |
|
|
16.4.3 Erweiterungsmöglichkeiten |
734 |
|
|
16.5 Mehrsprachige Weboberflächen mit gettext |
737 |
|
|
16.5.1 Vorbereiten einer PHP-Datei |
738 |
|
|
16.5.2 Dateiformat |
739 |
|
|
16.5.3 Ordnerstruktur von »locale« |
740 |
|
|
16.5.4 Klasse »Gettext« |
742 |
|
|
16.5.5 Software für die Erstellung von Locales-Dateien |
744 |
|
|
17 Web 2.0-Technologien |
750 |
|
|
17.1 JavaScript Object Notation |
750 |
|
|
17.2 AJAX |
753 |
|
|
17.2.1 Beispiel: Blog-»Suchmaschine« |
753 |
|
|
17.2.2 Klasse »AJAX« |
754 |
|
|
17.2.3 AJAXJavaScript.js |
763 |
|
|
17.2.4 PHP-Skripte für das AJAX-Beispiel |
768 |
|
|
17.2.5 PHPLiveX im Einsatz |
771 |
|
|
17.3 Web-API |
781 |
|
|
17.3.1 Webservices |
781 |
|
|
17.3.2 REST-Services |
783 |
|
|
17.3.3 Interface für unsere eigene Web-API |
785 |
|
|
17.3.4 REST-API |
786 |
|
|
17.3.5 JSON-API |
796 |
|
|
17.3.6 Verwendung und Aufruf der API-Klassen |
804 |
|
|
17.3.7 Klasse »Resolver« |
807 |
|
|
17.3.8 Klasse »Request« |
810 |
|
|
17.3.9 index.php |
816 |
|
|
17.4 jQuery |
817 |
|
|
17.5 Web-Feeds |
824 |
|
|
17.5.1 Technologie hinter Web-Feeds |
824 |
|
|
17.5.2 Erstellen von Feed und Einträgen |
826 |
|
|
17.5.3 RSS-Feed zur Verfügung stellen |
838 |
|
|
17.5.4 Einsatz des RSS-Feeds |
842 |
|
|
18 Blogs und Wikis |
844 |
|
|
18.1 Blog |
845 |
|
|
18.1.1 Klasse »Blog« |
846 |
|
|
18.1.2 Blog in der praktischen Anwendung |
858 |
|
|
18.2 Ein konkretes Mehrbenutzersystem: Wiki |
863 |
|
|
18.2.1 Die Klasse »Wiki« |
865 |
|
|
18.2.2 Wiki in der Praxis |
878 |
|
|
19 Bildergalerien |
882 |
|
|
19.1 Standard-Bildergalerie |
882 |
|
|
19.1.1 Klassenübersicht: Bildergalerie |
882 |
|
|
19.1.2 Klasse »AbstractGallery« |
886 |
|
|
19.1.3 Klasse »Admin« |
887 |
|
|
19.1.4 Klasse »Gallery« |
908 |
|
|
19.1.5 Klasse »Picture« |
911 |
|
|
20 Dauerhafte Objektspeicherung |
916 |
|
|
20.1 Persistenz |
916 |
|
|
20.2 Umsetzung persistenter Objekte |
916 |
|
|
20.2.1 Klasse Attribute |
917 |
|
|
20.2.2 Klasse Object |
919 |
|
|
20.3 Gültigkeitsprüfung von Parametern |
936 |
|
|
20.3.1 Konfigurationsdatei der Gültigkeitsprüfung |
936 |
|
|
20.3.2 Gültigkeitsprüfungsklasse |
940 |
|
|
20.3.3 Gültigkeitsprüfung in die Klasse »Object« einbauen |
954 |
|
|
20.4 Objekt-Serialisierung in Cookies mittels Traits |
956 |
|
|
20.4.1 Implementierung eines Traits |
956 |
|
|
20.4.2 Verwendung mehrerer Traits |
960 |
|
|
21 Automatische Formularerstellung |
962 |
|
|
21.1 Klasse »SimpleAutomaticFormular« |
965 |
|
|
21.2 Automatische Formulargenerierung anwenden |
981 |
|
|
21.3 Verbesserungsvorschläge |
982 |
|
|
22 Model View Controller |
984 |
|
|
22.1 Installation und Konfiguration von CakePHP |
987 |
|
|
22.2 Prinzipien in CakePHP |
989 |
|
|
22.3 MVC mit CakePHP umsetzen |
990 |
|
|
22.3.1 HABTM-Modell |
997 |
|
|
22.3.2 Validierung von Modell-Attributen |
1000 |
|
|
22.3.3 Methoden zum Controller hinzufügen |
1001 |
|
|
22.3.4 Views anpassen (selbst backen) |
1003 |
|
|
22.4 Ausblick |
1006 |
|
|
A PHP-Referenz |
1010 |
|
|
C.1 GPL |
1060 |
|
|
C.2 LGPL |
1062 |
|
|
C.3 BSD |
1063 |
|
|
C.4 PHP License |
1064 |
|
|
C.5 MySQL-Lizenz |
1064 |
|
|
C.6 Lizenzen im Überblick |
1065 |
|
|
Index |
1074 |
|