595

Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Embed Size (px)

Citation preview

Page 1: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet
Page 2: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Thomas Theis

Einstieg in PHP 5.4 und MySQL 5.5

Page 3: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Liebe Leserin, lieber Leser,

dynamische Webseiten zu erstellen, das ist Ihr Ziel! Dieses Buch zeigt Ihnen, wieSie das einfach mit PHP und MySQL realisieren – auch wenn Sie bislang noch nieprogrammiert haben.

Damit Ihnen der Einstieg sicher gelingt, lernen Sie zu Beginn die notwendigenGrundlagen der Programmierung mit PHP kennen. Anschließend zeigt Ihnen Tho-mas Theis, wie Sie »richtige« Internetanwendungen mit PHP erstellen: z. B. Datenaus HTML-Formularen auslesen und in MySQL-Datenbanken abspeichern, Cookiesgenerieren, automatisch erzeugte E-Mails versenden, Chats, Blogs oder Foren indie eigene Website integrieren und vieles mehr.

Alles, was Sie zum Erstellen Ihrer Webseiten benötigen, lernen Sie Schritt fürSchritt anhand vieler kleiner Anwendungsbeispiele. Sämtliche Code-Zeilen werdendabei erklärt, so dass Sie alles problemlos nachvollziehen können. Durch das Lösender Übungsaufgaben können Sie Ihr neu gewonnenes Wissen anschließend über-prüfen und festigen.

Dieses Buch wurde mit großer Sorgfalt geschrieben, geprüft und produziert. Solltedennoch einmal etwas nicht so funktionieren, wie Sie es erwarten, freue ich mich,wenn Sie sich mit mir in Verbindung setzen. Ihre Kritik und konstruktiven Anre-gungen sind uns jederzeit herzlich willkommen!

Viel Spaß beim Programmieren Ihrer Webseiten wünscht Ihnen nun

Ihre Anne ScheibeLektorat Galileo Computing

[email protected] Press · Rheinwerkallee 4 · 53227 Bonn

Page 4: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Auf einen Blick

1 Einführung ........................................................................... 15

2 PHP-Programmierkurs .......................................................... 19

3 Daten senden und auswerten ............................................... 109

4 Datenbanken mit MySQL ..................................................... 167

5 Objektorientierung in PHP ................................................... 229

6 Fehler behandeln, Sicherheit erhöhen .................................. 281

7 Zeichenketten ...................................................................... 291

8 Dateien und Verzeichnisse ................................................... 307

9 Felder .................................................................................. 331

10 Datum und Zeit .................................................................... 353

11 Mathematische Funktionen .................................................. 375

12 Sessions und Cookies ........................................................... 393

13 Datenbanken mit SQLite3 .................................................... 421

14 XML ..................................................................................... 433

15 Ajax ..................................................................................... 445

16 jQuery .................................................................................. 461

17 Grafiken programmieren ...................................................... 481

18 PDF-Dateien erstellen .......................................................... 503

19 Automatisierter E-Mail-Versand ........................................... 523

20 Beispielprojekte ................................................................... 527

Page 5: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Der Name Galileo Press geht auf den italienischen Mathematiker und Philosophen GalileoGalilei (1564–1642) zurück. Er gilt als Gründungsfigur der neuzeitlichen Wissenschaft undwurde berühmt als Verfechter des modernen, heliozentrischen Weltbilds. Legendär ist seinAusspruch Eppur si muove (Und sie bewegt sich doch). Das Emblem von Galileo Press ist derJupiter, umkreist von den vier Galileischen Monden. Galilei entdeckte die nach ihm benanntenMonde 1610.

Lektorat Anne ScheibeKorrektorat Annette Lennartz, BonnCover Barbara Thoben, KölnTitelbild Johannes Kretzschmar, beetlebum.de, JenaTypografie und Layout Vera BraunerHerstellung Lissy HamannSatz Typographie & Computer, KrefeldDruck und Bindung Bercker Graphischer Betrieb, Kevelaer

Dieses Buch wurde gesetzt aus der Linotype Syntax Serif (9,25/13,25 pt) in FrameMaker.

Gerne stehen wir Ihnen mit Rat und Tat zur Seite:[email protected] bei Fragen und Anmerkungen zum Inhalt des [email protected] für versandkostenfreie Bestellungen und [email protected] für Rezensions- und Schulungsexemplare

Bibliografische Information der Deutschen NationalbibliothekDie Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbib-liografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar.

ISBN 978-3-8362-1877-1

© Galileo Press, Bonn 20128., aktualisierte Auflage 2012

Das vorliegende Werk ist in all seinen Teilen urheberrechtlich geschützt. Alle Rechte vorbehalten, insbesondere das Recht

der Übersetzung, des Vortrags, der Reproduktion, der Vervielfältigung auf fotomechanischem oder anderen Wegen und der

Speicherung in elektronischen Medien. Ungeachtet der Sorgfalt, die auf die Erstellung von Text, Abbildungen und Program-

men verwendet wurde, können weder Verlag noch Autor, Herausgeber oder Übersetzer für mögliche Fehler und deren Fol-

gen eine juristische Verantwortung oder irgendeine Haftung übernehmen. Die in diesem Werk wiedergegebenen Gebrauchs-

namen, Handelsnamen, Warenbezeichnungen usw. können auch ohne besondere Kennzeichnung Marken sein und als

solche den gesetzlichen Bestimmungen unterliegen.

Page 6: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Inhalt

1 Einführung .......................................................................................... 15

1.1 Zu diesem Buch ........................................................................... 151.2 PHP – eine Beschreibung ............................................................. 161.3 PHP – Vorzüge ............................................................................. 161.4 Aufbau dieses Buchs .................................................................... 171.5 Systemvoraussetzungen ............................................................... 18

2 PHP-Programmierkurs ..................................................................... 19

2.1 Einbettung von PHP in HTML ...................................................... 192.2 Kommentare ................................................................................ 212.3 Variablen, Datentypen und Operatoren ....................................... 23

2.3.1 Namen ........................................................................... 232.3.2 Variablen für Zahlen ....................................................... 242.3.3 Rechenoperatoren für Zahlen ......................................... 252.3.4 Variablen und Operatoren für Zeichenketten .................. 27

2.4 Einfache Formularauswertungen .................................................. 302.4.1 Eingabeformular ............................................................. 302.4.2 Auswertung mit $_POST ................................................ 322.4.3 Umwandlung von Zeichenketten in Zahlen ..................... 34

2.5 Verzweigungen ............................................................................ 372.5.1 if-Anweisung .................................................................. 382.5.2 if/else-Anweisung .......................................................... 392.5.3 Logische Operatoren ...................................................... 432.5.4 Rangordnung der Operatoren ........................................ 462.5.5 Mehrfache Verzweigung ................................................ 462.5.6 switch/case-Anweisung .................................................. 482.5.7 HTML in Verzweigungsblöcken ...................................... 50

2.6 Schleifen ...................................................................................... 512.6.1 for-Schleife .................................................................... 512.6.2 Beispiele für for-Schleifen ............................................... 532.6.3 Geschachtelte for-Schleifen ............................................ 542.6.4 Schleifen und Tabellen ................................................... 552.6.5 while-Schleife ................................................................ 582.6.6 do while-Schleife ........................................................... 602.6.7 Schleifenabbruch mit break ............................................ 612.6.8 Schleifenfortsetzung mit continue .................................. 62

5

Page 7: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Inhalt

2.7 Felder .......................................................................................... 632.7.1 Numerisch indizierte Felder ........................................... 642.7.2 Assoziative Felder .......................................................... 66

2.8 Funktionen .................................................................................. 702.8.1 Ein erstes Beispiel .......................................................... 702.8.2 Definition, Aufruf und Funktionstypen ........................... 722.8.3 Externe Dateien ............................................................. 732.8.4 Funktionen mit einem Parameter ................................... 732.8.5 Funktionen mit mehreren Parametern ............................ 752.8.6 Rückgabewert einer Funktion ......................................... 782.8.7 Kopie und Referenz ........................................................ 802.8.8 Gültigkeitsbereich von Variablen .................................... 842.8.9 Variable Parameterlisten ................................................ 862.8.10 include-Anweisung ........................................................ 88

2.9 Behandlung von Fehlern .............................................................. 912.9.1 Ohne Ausnahmebehandlung .......................................... 912.9.2 Mit Ausnahmebehandlung ............................................. 93

2.10 Beispiele ...................................................................................... 952.10.1 Formatierung von Zahlen ............................................... 952.10.2 Geldanlage ..................................................................... 972.10.3 Steuertabelle .................................................................. 1002.10.4 Bestimmung des Ostersonntags ...................................... 103

3 Daten senden und auswerten ........................................................ 109

3.1 Textelemente ............................................................................... 1093.1.1 Einzeilige Texteingabefelder ........................................... 1093.1.2 Mehrzeilige Texteingabefelder ....................................... 1123.1.3 Passworteingabefeld, verstecktes Element ...................... 114

3.2 Auswahlelemente ........................................................................ 1173.2.1 Radiobutton-Gruppe ...................................................... 1173.2.2 Einfaches Auswahlmenü ................................................. 1203.2.3 Kontrollkästchen ............................................................ 1223.2.4 Mehrfaches Auswahlmenü ............................................. 124

3.3 Aktionselemente .......................................................................... 1263.3.1 Absenden und Zurücksetzen .......................................... 1263.3.2 Allgemeine Buttons ........................................................ 130

3.4 Weitere Möglichkeiten ................................................................ 1343.4.1 Auswertung in anderem Frame ....................................... 1343.4.2 Felder von Formularelementen ....................................... 1363.4.3 Formular und Programm in einer Datei .......................... 140

6

Page 8: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Inhalt

3.4.4 Submit über Hyperlink, CSS ............................................ 1423.4.5 Daten an Formularziel anhängen .................................... 1443.4.6 Daten an Hyperlinkziel anhängen ................................... 1483.4.7 Dateien auf den Server hochladen .................................. 150

3.5 Beispiele ...................................................................................... 1533.5.1 Grundrechenarten .......................................................... 1543.5.2 Pizzabestellung .............................................................. 1563.5.3 Kopfrechnen .................................................................. 160

3.6 PHP-Programme publizieren ........................................................ 165

4 Datenbanken mit MySQL ............................................................... 167

4.1 MySQL und phpMyAdmin ........................................................... 1684.1.1 phpMyAdmin ................................................................. 1684.1.2 Beispieldatenbank und -tabelle ...................................... 1694.1.3 Datenbank erzeugen ...................................................... 1704.1.4 Tabelle erzeugen ............................................................ 1704.1.5 Primärschlüssel erzeugen ................................................ 1714.1.6 Datensätze eintragen ..................................................... 172

4.2 PHP und MySQL .......................................................................... 1744.2.1 Verbindung aufnehmen, Datensätze anzeigen ................ 1744.2.2 Datensätze auswählen .................................................... 1774.2.3 Ausgabe in eine HTML-Tabelle ....................................... 1824.2.4 Auswahl von Daten über ein Suchformular ..................... 1834.2.5 Datensätze erzeugen ...................................................... 1914.2.6 Ändern mehrerer Datensätze ......................................... 1964.2.7 Ändern eines bestimmten Datensatzes ........................... 1974.2.8 Datensätze löschen ........................................................ 2024.2.9 Benutzeroberfläche mit JavaScript und CSS .................... 2044.2.10 Ein Datenbankbrowser ................................................... 212

4.3 MySQL-Datenbanken publizieren ................................................ 2204.3.1 Verbindung aufnehmen .................................................. 2214.3.2 Export einer Tabelle ....................................................... 2234.3.3 Tabelle und Daten per Programm erzeugen .................... 226

5 Objektorientierung in PHP ............................................................. 229

5.1 Was ist objektorientierte Programmierung? ................................. 2295.2 Klassen und Objekte .................................................................... 230

5.2.1 private, protected und public ......................................... 2315.2.2 Anwendung der Klasse ................................................... 232

7

Page 9: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Inhalt

5.3 Konstruktor ................................................................................. 2345.4 Destruktor ................................................................................... 2365.5 Optionale Parameter ................................................................... 2385.6 Handles und Kopien .................................................................... 241

5.6.1 Vordefiniertes Klonen .................................................... 2425.6.2 Benutzerdefiniertes Klonen ............................................ 2445.6.3 Übergabe eines Objekts an eine Funktion ...................... 245

5.7 Vererbung ................................................................................... 2465.7.1 Grundlagen .................................................................... 2465.7.2 Konstruktoren bei Vererbung ......................................... 250

5.8 Dereferenzierung von Objekten ................................................... 2515.9 Konstanten, statische Eigenschaften und Methoden .................... 2525.10 Abstrakte Klassen und Methoden ................................................ 2555.11 Magische Konstanten .................................................................. 2575.12 Operator instanceof ..................................................................... 2595.13 Hilfsfunktionen ............................................................................ 2605.14 Ausgabemethode __toString() ...................................................... 2625.15 Serialisierung ............................................................................... 2635.16 autoload-Funktion ....................................................................... 2655.17 Beispiel Scheck ............................................................................ 2675.18 Beispiel Kopfrechnen ................................................................... 272

5.18.1 Programmablauf ............................................................. 2725.18.2 Klasse »Spiel« ................................................................. 2755.18.3 Klasse »Aufgabe« ............................................................ 279

6 Fehler behandeln, Sicherheit erhöhen .......................................... 281

6.1 Anzeige von Fehlern .................................................................... 2816.2 Dauerhafte Konfiguration der Anzeige von Fehlern ...................... 2836.3 Temporäre Konfiguration der Anzeige von Fehlern ...................... 2866.4 Angriffe und Sicherheit ................................................................ 287

6.4.1 Programmpakete ............................................................ 2886.4.2 Sichtbare Daten ............................................................. 2886.4.3 Sessions ......................................................................... 2886.4.4 Variablen ....................................................................... 2896.4.5 Eingaben prüfen ............................................................. 2896.4.6 Passwörter ..................................................................... 290

8

Page 10: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Inhalt

7 Zeichenketten .................................................................................... 291

7.1 Länge und Umwandlungsfunktionen ............................................ 2917.2 Zeichenketten und Felder ............................................................ 2947.3 Teilzeichenketten ......................................................................... 2967.4 Suchen nach Position ................................................................... 2987.5 Vergleich von Zeichenketten ........................................................ 2997.6 Codierung von Zeichen ................................................................ 3017.7 Einfache Verschlüsselung ............................................................. 3037.8 Weitere Verschlüsselungsmethoden ............................................. 305

8 Dateien und Verzeichnisse .............................................................. 307

8.1 Dateitypen ................................................................................... 3078.2 Lesen einer Zeile aus einer sequenziellen Datei ............................ 3088.3 Lesen aller Zeilen einer sequenziellen Datei ................................. 3108.4 Vereinfachtes Lesen einer Datei ................................................... 3138.5 Überschreiben einer sequenziellen Datei ...................................... 3148.6 Anhängen an eine sequenzielle Datei ........................................... 3158.7 Ein einfacher Zugriffszähler .......................................................... 3198.8 Wahlfreier Zugriff ........................................................................ 3218.9 Informationen über Dateien ......................................................... 3248.10 Informationen über ein einzelnes Verzeichnis .............................. 3268.11 Informationen über den Verzeichnisbaum .................................... 329

9 Felder ................................................................................................... 331

9.1 Operationen für numerisch indizierte Felder ................................ 3319.1.1 Sortierung ...................................................................... 3319.1.2 Wert und Position der Extrema ...................................... 3339.1.3 Statistische Auswertung ................................................. 3349.1.4 Feld verändern ............................................................... 338

9.2 Sortierung eines assoziativen Feldes ............................................. 3409.3 Zweidimensionale Felder, allgemein ............................................ 3429.4 Zweidimensionale numerische Felder ........................................... 3439.5 Zweidimensionale gemischte Felder ............................................. 3469.6 Zweidimensionale assoziative Felder ............................................ 348

10 Datum und Zeit ................................................................................. 353

10.1 Zeit ermitteln und ausgeben ........................................................ 35310.2 Zeit formatiert ausgeben .............................................................. 354

9

Page 11: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Inhalt

10.3 Zeitangabe auf Gültigkeit prüfen .................................................. 35710.4 Absolute Zeitangabe erzeugen ..................................................... 35810.5 Relative Zeitangabe erzeugen ...................................................... 36010.6 Mit Zeitangaben rechnen ............................................................. 36210.7 Zeitangaben in Datenbanken ....................................................... 36510.8 Beispiel Feiertagsberechnung ....................................................... 36710.9 Kopfrechnen mit Zeitmessung ...................................................... 371

11 Mathematische Funktionen ........................................................... 375

11.1 Taschenrechnerfunktionen ........................................................... 37511.2 Mathematische Konstanten ......................................................... 37611.3 Ganzzahlermittlung ...................................................................... 37711.4 Extremwerte ................................................................................ 37911.5 Winkelfunktionen ........................................................................ 38011.6 Prüffunktionen für Zahlen ............................................................ 38111.7 Zufallszahlen ................................................................................ 38311.8 Mischen ...................................................................................... 386

11.8.1 Mischen mit eigenem Algorithmus ................................. 38711.8.2 Mischen mit shuffle() ..................................................... 388

11.9 Stellenwertsysteme ...................................................................... 389

12 Sessions und Cookies ....................................................................... 393

12.1 Sessionmanagement .................................................................... 39412.2 Beispiel für Sessions: Zugriffszähler .............................................. 39412.3 Beispiel für Sessions: Geschützte Website .................................... 396

12.3.1 Ablauf ............................................................................ 39612.3.2 Login-Seite ..................................................................... 39812.3.3 Intro-Seite ..................................................................... 399

12.4 Beispiel für Sessions: Webshop .................................................... 40112.4.1 Ablauf ............................................................................ 40212.4.2 Startseite ........................................................................ 40412.4.3 Include-Datei ................................................................. 40512.4.4 Tabelle der Artikel .......................................................... 40712.4.5 Warenkorb ..................................................................... 40912.4.6 Kasse ............................................................................. 412

12.5 Cookies ....................................................................................... 41312.6 Beispiel für Cookies: Besuch ......................................................... 41512.7 Beispiel für Cookies: Adressspeicherung ....................................... 417

10

Page 12: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Inhalt

13 Datenbanken mit SQLite3 .............................................................. 421

13.1 SQLite3 ....................................................................................... 42113.2 Datenbankdatei, Tabelle und Datensätze erzeugen ...................... 42213.3 Abfrage der Datensätze ............................................................... 42413.4 Benutzeroberfläche mit JavaScript und CSS .................................. 42513.5 Beispiel Kopfrechnen ................................................................... 430

14 XML ..................................................................................................... 433

14.1 Einlesen eines einzelnen Objekts ................................................. 43314.2 Einlesen mehrerer Objekte ........................................................... 43614.3 Zugriff auf Attribute ..................................................................... 43914.4 Interne XML-Daten ..................................................................... 44114.5 Speicherung von Objekten ........................................................... 442

15 Ajax ...................................................................................................... 445

15.1 Hallo Ajax .................................................................................... 44515.2 Parameter senden ........................................................................ 44815.3 Bild tauschen ............................................................................... 45015.4 Mehrere Ergebnisse aus XML-Knoten .......................................... 45215.5 Mehrere Ergebnisse aus XML-Attributen ..................................... 45515.6 Zugriff auf MySQL-Datenbank ..................................................... 45615.7 Weitere Ereignisse ....................................................................... 458

16 jQuery .................................................................................................. 461

16.1 Erstes Beispiel .............................................................................. 46116.2 Selektoren, Methoden css(), html() und text() .............................. 46416.3 Ereignisse .................................................................................... 46716.4 Animationen ................................................................................ 47116.5 JavaScript .................................................................................... 47516.6 jQuery und Ajax ........................................................................... 477

17 Grafiken programmieren ................................................................. 481

17.1 Installation testen ........................................................................ 48117.2 Grafik speichern ........................................................................... 48317.3 Grafik unmittelbar anzeigen ......................................................... 48417.4 Text mit internen Fonts ................................................................ 48617.5 Text mit TrueType-Fonts .............................................................. 487

11

Page 13: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Inhalt

17.6 Bild aus einer Datei laden ............................................................ 48917.7 Bilder aus Dateien ineinander einbetten ...................................... 49017.8 Ellipsen und Bögen ...................................................................... 49217.9 Rechtecke und Polygone .............................................................. 49417.10 Linien und Pixel ........................................................................... 49517.11 Füllen mit Farbe .......................................................................... 49717.12 Darstellung eines Aktienkurses .................................................... 499

18 PDF-Dateien erstellen ..................................................................... 503

18.1 Installation .................................................................................. 50318.2 PDF-Dokument erzeugen ............................................................. 50418.3 Text in Zelle ................................................................................. 50618.4 Fließtext, Schriftparameter ........................................................... 50818.5 Tabelle ........................................................................................ 51018.6 Kopf- und Fußzeile ...................................................................... 51218.7 Bild aus Datei laden ..................................................................... 51518.8 Hyperlinks ................................................................................... 51618.9 Linie, Rechteck, Position .............................................................. 520

19 Automatisierter E-Mail-Versand ................................................... 523

20 Beispielprojekte ................................................................................ 527

20.1 Projekt »Chat« ............................................................................. 52720.1.1 Frame-Aufbau ................................................................ 52720.1.2 CSS-Formatierung .......................................................... 52920.1.3 Ausgabe, Version »Textdatei« ......................................... 52920.1.4 Darstellung der Textdatei ............................................... 53020.1.5 Ausgabe, Version »Datenbank« ...................................... 53120.1.6 Darstellung der Datenbanktabellen ................................ 53220.1.7 Eingabe, Head ................................................................ 53320.1.8 Eingabe, PHP zum Speichern, Version »Textdatei« .......... 53420.1.9 Eingabe, PHP zum Speichern, Version »Datenbank« ....... 53520.1.10 Eingabe, Formular .......................................................... 53620.1.11 Mögliche Erweiterungen ................................................ 537

20.2 Projekt »Blog« .............................................................................. 53820.2.1 Aufbau der Datenbank ................................................... 54020.2.2 Blog für den Betrachter, Programmcode ......................... 54120.2.3 Blog für den Betreiber, Programmcode ........................... 542

12

Page 14: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Inhalt

20.3 Projekt »Forum« .......................................................................... 54620.3.1 Darstellung, Anmeldung ................................................. 54720.3.2 Darstellung, Hauptbildschirm ......................................... 54820.3.3 Darstellung, neuer Beitrag .............................................. 55020.3.4 Datenbank, Tabelle der Teilnehmer ................................ 55020.3.5 Datenbank, Tabelle der Beiträge .................................... 55120.3.6 Passwortvergabe ............................................................ 55220.3.7 Forum, CSS .................................................................... 55420.3.8 Forum, JavaScript-Funktion ............................................ 55520.3.9 Forum, Anmeldung ........................................................ 55720.3.10 Forum, Zugangsprüfung und Überschrift ........................ 55820.3.11 Forum, neuen Beitrag speichern ..................................... 55920.3.12 Forum, Filterung auswählen ........................................... 56020.3.13 Forum, Sortierung durchführen ...................................... 56220.3.14 Forum, Filterung durchführen ........................................ 56320.3.15 Forum, Sortierung auswählen ......................................... 56420.3.16 Forum, Beiträge darstellen ............................................. 56520.3.17 Forum, neuen Beitrag eingeben ..................................... 566

A HTML für PHP ................................................................................... 567

A.1 Die erste Seite ............................................................................. 568A.2 Formulare .................................................................................... 569A.3 Tabellen ....................................................................................... 571A.4 Hyperlinks ................................................................................... 573

B Installationen ..................................................................................... 575

B.1 Installationen unter Windows ...................................................... 575B.2 Installationen unter Ubuntu Linux ................................................ 579

Index ............................................................................................................ 583

13

Page 15: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet
Page 16: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

1 Einführung

In diesem Kapitel erfahren Sie, warum PHP eine gute Wahl ist. Ich stelleIhnen die Vorzüge von PHP vor und beschreibe den Aufbau des Buchs.Damit der Einstieg leicht fällt …

1.1 Zu diesem Buch

PHP ist eine weitverbreitete Sprache zur Entwicklung dynamischer Inter-netanwendungen, deren Nutzung seit ihrer ersten Einführung stetigansteigt. PHP wird inzwischen auf Millionen Websites weltweit einge-setzt.

BestsellerDieses Buch erscheint aktuell zu PHP 5.4 und MySQL 5.5. Es ist, wie schonseine Vorgängerbücher zu PHP 4 und PHP 5, eine leicht verständliche Ein-führung in die wichtigsten Einsatzgebiete von PHP. Zahlreiche Kommen-tare und Mails zu diesem Bestseller haben gezeigt, dass es als Lehrbuchsehr gut angenommen wird. Viele Leser fühlen sich erfolgreich an dieHand genommen und in die PHP-Welt eingeführt. Die verschiedenen Auf-lagen des Buchs wurden ständig überarbeitet beziehungsweise erweitert.

Für den Einsteiger ergeben sich bei PHP 5.4 und MySQL 5.5 im Vergleichzu älteren Versionen nur wenige Änderungen. Die Beispiele in diesemBuch laufen unter allen Versionen von PHP 5 und MySQL 5.

Die Software auf dem beiliegenden Datenträger können Sie sehr einfachinstallieren. Mit ihrer Hilfe können Sie schnell eigene PHP-Programmeentwickeln und testen. PHP ist in vielen kostengünstigen Angeboten vonWebsiteprovidern enthalten, sodass Sie die erlernten Kenntnisse dorterfolgreich einsetzen können.

PHP lernenZum Erlernen von PHP anhand des vorliegenden Buchs werden vonIhnen, dem künftigen PHP-Programmierer, lediglich Grundkenntnisseauf Anwenderebene von Microsoft Windows oder Linux verlangt. Siesollten mit Dateien und Verzeichnissen sowie mit einem Browser arbei-ten können. Machen Sie sich nun mit dieser erfolgreichen und einfachenSprache vertraut!

15

Page 17: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Einführung1

Für die Hilfe bei der Erstellung dieses Buchs bedanke ich mich bei Chris-tine Siedle und Anne Scheibe sowie dem ganzen Team von Galileo Press.

1.2 PHP – eine Beschreibung

DynamischeInternetseiten

PHP ist die Abkürzung für PHP Hypertext Preprocessor. PHP ermöglichtEntwicklern die Erzeugung dynamischer Internetseiten, mit denen soge-nannte Web Applications, wie z. B. E-Commerce-Systeme, Chats oderForen, erstellt werden. Im Unterschied zu statischen Internetseiten kannsich der Inhalt aufgrund von Aktionen des Benutzers oder neuer Basis-informationen, die z. B. aus Datenbanken stammen, jederzeit ändern.

MySQL PHP unterstützt insbesondere die einfache Auswertung von Formularen,mit denen ein Benutzer Daten an eine Website senden kann. Es ermög-licht die Zusammenarbeit mit vielen verschiedenen Datenbanksystemen.Die weitaus meisten PHP-Entwickler setzen das DatenbanksystemMySQL ein. Ein besonderer Schwerpunkt dieses Buchs ist daher derZusammenarbeit von PHP und MySQL gewidmet.

1.3 PHP – Vorzüge

Gründe fürdie Verwendung

von PHP

PHP bietet im Vergleich zu anderen Programmiersprachen viele Vorteile.Als wichtigste Gründe für die Nutzung von PHP sind zu nennen:

Es dient der Entwicklung von Internetanwendungen.

Es ermöglicht die einfache Entwicklung von Programmen.

Es unterstützt verschiedene Plattformen.

Es lässt sich leicht in den beliebten Apache-Webserver integrieren.

Es ist erschwinglich und flexibel.

Im Folgenden sollen einige Eigenschaften von PHP näher betrachtet wer-den: Erlernbarkeit, Einsatzbereich, Preis und Ausführungsort.

Erlernbarkeit

Leicht erlernbar Im Vergleich zu anderen Sprachen ist PHP relativ leicht erlernbar. Diesliegt hauptsächlich daran, dass PHP im Gegensatz zu anderen Sprachenausschließlich für die Webserver-Programmierung entwickelt wurde undnur die dafür notwendigen Bestandteile enthält.

16

Page 18: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Aufbau dieses Buchs 1.4

Einsatzbereich

Auf vielenSystemeneinsetzbar

PHP wird von vielen Typen von Webservern einheitlich unterstützt.Andere Sprachen kommen nur auf bestimmten Servertypen zum Einsatz.Ein PHP-Programmierer kann also seine Kenntnisse später auf den unter-schiedlichsten Systemen nutzen.

Preis

Frei verfügbarPHP kostet nichts; Sie müssen weder einen Compiler noch ein Entwick-lungssystem kaufen. Es kann unter anderem auf dem ebenfalls frei ver-fügbaren und weitverbreiteten Apache-Webserver unter verschiedenenBetriebssystemen eingesetzt werden.

Ausführungsort

ServerprogrammEine Internetanwendung kann entweder auf einem Webserver (Server-programm) oder beim Betrachter einer Internetseite (Clientprogramm)ausgeführt werden. PHP-Programme sind stets Serverprogramme. BeimBetrachter wird also lediglich die Ausgabe der Programme dargestellt.Der Browser des Betrachters muss nur in der Lage sein, den vom Servergesendeten HTML-Code umzusetzen. Er muss keine besonderen Eigen-schaften besitzen, die mit der Programmiersprache des Webserverszusammenhängen. Die Seiten können daher auch von älteren Browserndargestellt werden.

Dateien und Datenbanken

Darüber hinaus haben Serverprogramme im Unterschied zu Clientpro-grammen (zum Beispiel in JavaScript) Zugriff auf Textdateien und Daten-banken. Dies ermöglicht erst die Durchführung häufig vorkommenderVorgänge: wie zum Beispiel die Suche nach bestimmten Daten oder dieÜbermittlung von Daten an den Server.

SicherheitDer Betrachter kann keine Rückschlüsse auf den erzeugenden Pro-grammcode oder auf die Quelldaten ziehen. Die Programme können alsovom Betrachter nicht kopiert und zu eigenen Zwecken weiterverwendetwerden.

1.4 Aufbau dieses Buchs

Alle Kapitel des Buchs haben den folgenden, lernfreundlichen Aufbau:

Grundlagen und Anwendung

Schritt für Schritt werden den bis zum jeweiligen Zeitpunkt vorhan-denen Grundlagen und Kenntnissen neue Elemente hinzugefügt. Ich

17

Page 19: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Einführung1

beschreibe die Theorie und erläutere sie anhand von vollständigen,anschaulichen und ausführlich kommentierten Beispielen.

Übungen Sie haben die Möglichkeit, Übungsaufgaben zum Thema zu lösen. Siesollen dabei das soeben erworbene Wissen umsetzen und habendamit eine unmittelbare Erfolgskontrolle. Sie können so selbst fest-stellen, ob Sie den betreffenden Abschnitt verstanden haben.

Die Lösungen zu allen Übungsaufgaben finden Sie (zusammen mitdem Code aller Programmbeispiele) auf dem Datenträger zum Buch.Sollten Sie eine Übungsaufgabe nicht vollständig gelöst haben, sokann Ihnen die dortige Lösung als Hilfestellung dienen.

Sofern Sie selbst eine lauffähige Lösung gefunden haben, können Siesie mit der vorgeschlagenen Lösung vergleichen. Beim Programmie-ren gilt der Grundsatz: Es gibt beliebig viele richtige Lösungen undnicht nur eine sogenannte Musterlösung. Allerdings soll mit dem Auf-bau der Beispiel- und Übungsprogramme auch ein übersichtlicherund lesbarer Programmierstil vermittelt werden, der ein strukturier-tes Erlernen und professionelles Programmieren ermöglicht.

1.5 Systemvoraussetzungen

Voraussetzungen PHP läuft unter zahlreichen Betriebssystemen, unter anderem unter Win-dows, Mac OS X und Linux. Sie benötigen für Ihre Arbeit mit PHP nebeneinem Browser zum Betrachten beziehungsweise Benutzen der Seiten diefolgende Minimalausstattung:

einen PHP-fähigen Webserver (zum Beispiel Apache)

PHP selbst

das Datenbanksystem MySQL

Buch-Datenträger Die beiden Installationspakete XAMPP und EasyPHP für Windows bein-halten jeweils alle notwendigen Bestandteile sowie weitere nützlicheSoftware und sind bereits fertig vorkonfiguriert. Sie finden sie auf demDatenträger zum Buch. Die Installationen beschreibe ich in Anhang B.Die beschriebene Installation für Ubuntu Linux sorgt für die richtigeKonfiguration.

18

Page 20: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

2 PHP-Programmierkurs

In diesem Kapitel lernen Sie, erfolgreich Programme in PHP zu schrei-ben. Sie lernen insbesondere Variablen und Felder, Operatoren, Kon-trollstrukturen und Funktionen kennen. Die Auswertung von Formula-ren und einige umfangreichere Beispiele runden das Kapitel ab.

Programmierstil

Typischer Einsatzzweck

2.1 Einbettung von PHP in HTML

In den meisten PHP-Programmen wird die folgende Methode verwen-det, um PHP-Programme in HTML-Dateien einzubetten:

<?php[PHP-Anweisung][PHP-Anweisung][PHP-Anweisung]

?><?php ... ?>

Die Markierung <?php leitet eine einzelne PHP-Anweisung oder einenBlock von PHP-Anweisungen ein. Diese werden bis zur Markierung ?>bearbeitet, die das Ende des Blocks darstellt. PHP-Blöcke können imgesamten Dokument untergebracht werden. Der Code wird von obennach unten abgearbeitet; es kann dabei mehrmals zwischen HTML undPHP gewechselt werden.

HTML-KursZur Auffrischung bzw. Vertiefung Ihrer HTML-Kenntnisse soll an dieserStelle auf zwei Möglichkeiten verwiesen werden, nämlich auf

Hinweise

Dieses Buch soll Ihnen nicht nur die Kenntnisse der Sprache PHP vermitteln,sondern auch einen übersichtlichen und strukturierten Programmierstil. Diesvereinfacht sowohl die Arbeit eines einzelnen Entwicklers als auch die Zusam-menarbeit eines Entwicklerteams und die spätere Wartung der Programme.Für viele denkbare Anwendungsfälle biete ich jeweils nur eine Lösung an underläutere den typischen Einsatzzweck, ohne Sie dabei durch eine allzu großeAnzahl von Möglichkeiten zu verwirren.

19

Page 21: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

den Schnellkurs »HTML für PHP« in Anhang A des Buchs, in dem diewichtigsten HTML-Themen, die zur PHP-Programmierung notwendigsind, erläutert werden, sowie auf

einen ausführlichen HTML-Kurs auf dem Datenträger zum Buch.

Das folgende, vollständige Beispiel verdeutlicht die Einbettung von PHP-Code in HTML:

<html><head><title>Titelzeile der Datei</title></head><body>Die erste Zeile in HTML<br /><?php echo "Die zweite Zeile in PHP<br />"; ?>Die dritte Zeile in HTML<br /><?php

echo "Die vierte Zeile in PHP<br />";echo "Die fünfte Zeile in PHP";

?></body></html>

Listing 2.1 Datei einbettung.php

echo Die PHP-Anweisung echo gibt den angegebenen Text auf dem Bildschirmaus. Der Text muss in doppelten Anführungszeichen oder einfachen Hoch-kommata geschrieben werden. Falls der Text HTML-Markierungen bein-haltet (hier <br /> für einen Zeilenumbruch), werden diese ausgeführt.Die Ausgabe des Programms im Browser sehen Sie in Abbildung 2.1.

Abbildung 2.1 Einbettung von PHP in HTML

Um das Beispiel nachzuvollziehen, gehen Sie wie folgt vor:

Starten Sie unter XAMPP zunächst den Apache-Webserver über dasXAMPP Control Panel. Unter EasyPHP starten Sie die Anwendung

20

Page 22: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Kommentare 2.2

EasyPHP, damit werden alle benötigten Server gestartet. UnterUbuntu Linux ist der Apache-Webserver bereits gestartet.

Legen Sie die Datei einbettung.php in das Hauptverzeichnis des Web-servers. Dies ist unter XAMPP C:\xampp\htdocs, unter EasyPHP C:\EasyPHP\www und unter Ubuntu /var/www.

Geben Sie in der Adresszeile Ihres Browsers http://localhost/einbet-tung.php ein. Einige Browser blenden die Teilzeichenfolge http://anschließend aus. Lassen Sie sich nicht davon irritieren, sie gehört zurvollständigen Adresse.

Sollten Sie in Ihrem Browser nicht die gleiche Ausgabe wie in Abbildung2.1 sehen, kontrollieren und korrigieren Sie gegebenenfalls die eingege-bene Adresse. Falls diese stimmt, ist PHP möglicherweise nicht korrektinstalliert. Schlagen Sie in dem Fall noch einmal in Anhang B, »Installati-onen«, nach.

2.2 Kommentare

KommentareMit Hilfe von Kommentaren wird ein Programm lesbarer. Kommentarewerden nicht ausgeführt, sondern dienen nur der Information des Ent-wicklers, insbesondere bei umfangreichen Programmen. Sollte es sichum eine Gruppe von Entwicklern handeln oder sollte das Programm spä-ter von anderen Entwicklern weiter bearbeitet werden, so ist es beson-ders notwendig, Kommentare zu schreiben.

r

Man unterscheidet zwischen einzeiligen und mehrzeiligen Kommen-taren.

// Ein einzeiliger Kommentar beginnt mit den Zeichen // und endet amEnde der Zeile. Er wird im Allgemeinen zur Kommentierung einzel-ner Begriffe verwendet.

/* ... */ Ein mehrzeiliger Kommentar beginnt mit den Zeichen /* und endetmit den Zeichen */. Er wird üblicherweise zur Erläuterung eines Pro-grammblocks verwendet.

Hinweis

Erfahrungsgemäß gibt es immer wieder Entwickler, die ihre Programme nurminimal kommentieren. Dies stellt sich nach kurzer Zeit als Nachteil für sieselbst und ihre Kollegen heraus.

21

Page 23: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

Ein Beispiel hierzu:

<html><body><?php

echo "Das ist der Anfang"; // Kommentar// bis zum Zeilenende

/* Ein Kommentar übermehrere Zeilen hinweg */

echo " und hier das Ende des Programms";?></body></html>

Listing 2.2 Datei kommentar.php

Die Ausgabe des Programms im Browser sehen Sie in Abbildung 2.2.

Abbildung 2.2 Programm (ohne sichtbare Kommentare)

Übung »u_ausgabe«

Schreiben Sie ein PHP-Programm innerhalb einer Webseite (Dateiu_ausgabe.php) mit Kommentarzeilen. Speichern Sie die Datei im Hauptver-zeichnis Ihres Webservers, und testen Sie das Programm, indem Sie einenBrowser aufrufen und die Adresse http://localhost/u_ausgabe.php eingeben.Die Ausgabe des Programms im Browser sollte aussehen wie in Abbildung2.3.

Abbildung 2.3 Ergebnis der Übung »u_ausgabe«

22

Page 24: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Variablen, Datentypen und Operatoren 2.3

2.3 Variablen, Datentypen und Operatoren

VariableInnerhalb eines Programms können Informationen zur späteren Verwen-dung in Variablen gespeichert werden. Diese Variablen unterscheidensich in ihren Datentypen. PHP unterstützt Datentypen für:

ganze Zahlen

Zahlen mit Nachkommastellen

Zeichenketten (Strings)

Felder (ein- und mehrdimensionale Felder von Variablen)

Objekte

DatentypenDer Datentyp für eine Variable wird nicht vom Programmierer festge-legt, sondern richtet sich nach dem Zusammenhang, in dem die Variableverwendet wird. Eine Variable kann ihren Datentyp innerhalb eines Pro-gramms wechseln. Im Unterschied zu vielen anderen Programmierspra-chen findet in PHP keine Variablendeklaration statt. Dies bedeutet, dasseine Variable bei ihrem ersten Erscheinen sofort benutzt werden kannund dem Programm vorher nicht bekannt gemacht werden muss.

Zunächst geht es um die einfachen Datentypen (Zahlen und Zeichenket-ten), mit denen viele Aufgaben bei der Programmierung bereits erledigtwerden können. Später kommen Felder und Objekte hinzu.

2.3.1 Namen

VariablennamenFür den Namen einer Variablen (und später auch Funktionen) gelten fol-gende Regeln:

$ Er muss mit einem Dollarzeichen beginnen.

Er darf keine Leerzeichen enthalten.

Er darf nur aus Buchstaben und Ziffern bestehen, wobei das erste Zei-chen ein Buchstabe sein muss. Es sind Groß- und Kleinbuchstabenerlaubt, zwischen denen jedoch unterschieden wird ($HokusPokus istnicht das Gleiche wie $hokuspokus).

Er darf keine deutschen Umlaute oder ein scharfes S (ß) enthalten.

Er darf als einziges Sonderzeichen den Unterstrich _ enthalten.

Er darf nicht mit einem reservierten Wort identisch sein, also zumBeispiel mit einem Befehl aus der Sprache PHP.

23

Page 25: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

Sie sollten selbsterklärende Namen vergeben. Dies hat den Vorteil, dasssich jeder, der sich später mit dem Programm befasst, sofort zurechtfin-det. Einige Beispiele: $Startmeldung, $Temperaturwert, $XKoordinate,$Ywert.

2.3.2 Variablen für Zahlen

Betrachten Sie einmal das folgende Programm, in dem der Preis für eineTankfüllung Benzin berechnet wird:

<html><body><?php

$liter = 14;$preis = 1.35;$zahlung = $liter * $preis;echo $zahlung;

?></body></html>

Listing 2.3 Datei zahl_var.php

Die Aufgabe dieses Programms ist die Multiplikation zweier Zahlen unddie Ausgabe des Ergebnisses. Dies wird wie folgt durchgeführt:

Zahlenvariable Die Variable $liter wird eingeführt. Ihr wird der Wert 14 zugewie-sen, wodurch $liter zu einer Variablen für eine ganze Zahl wird.

Die Variable $preis wird eingeführt. Ihr wird der Wert 1.35 zugewie-sen, also wird $preis zu einer Variablen für eine Zahl mit Nachkom-mastellen (dabei muss der Punkt als Dezimaltrennzeichen verwendetwerden).

Die Variable $zahlung wird eingeführt. Die Variablen $liter und$preis werden miteinander multipliziert; das Ergebnis wird der Vari-ablen $zahlung zugewiesen. Damit wurde $zahlung ebenfalls zueiner Variablen für eine Zahl mit Nachkommastellen.

Der Wert von $zahlung (also 18.9) wird mit der Anweisung echo aus-gegeben. Mit echo lassen sich nicht nur Texte, sondern auch Variab-len sowie HTML-Code ausgeben. Dies wird in Abschnitt 2.3.4, »Vari-ablen und Operatoren für Zeichenketten«, erläutert.

Abbildung 2.4 zeigt die Ausgabe des Programms im Browser.

24

Page 26: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Variablen, Datentypen und Operatoren 2.3

Abbildung 2.4 Ergebnis einer einfachen Berechnung

2.3.3 Rechenoperatoren für Zahlen

Rechenoperatoren + – * / %

Bei Zahlen können Sie die Rechenoperatoren (arithmetische Operatoren)aus Tabelle 2.2 verwenden.

Zu erwähnen sind auch die kombinierten Zuweisungsoperatoren += und-=. Mit ihrer Hilfe kann eine Addition bzw. eine Subtraktion zusammenmit einer Zuweisung erfolgen. Zwei Beispiele hierzu:

$x = 5; $x += 3; (jetzt hat $x den Wert 8)

$x = 5; $x -= 3; (jetzt hat $x den Wert 2)

Ein weiteres Beispiel mit einer etwas umfangreicheren Berechnung:

Hinweis

Eine Zahl mit Nachkommastellen kann auch als sogenannte Exponentialzahldargestellt werden. Im oben angegebenen Programm hätten Sie für die Zahl1.35 eine der Schreibweisen aus Tabelle 2.1 verwenden können, was zumgleichen Ergebnis geführt hätte.

Schreibweise Berechnung Ergebnis

$preis = 0.135e1; 0.135 * 101 = 0.135 * 10 1.35

$preis = 135e-2; 135 * 10 – 2 = 135 * 0.01 1.35

Tabelle 2.1 Beispiele für Schreibweisen von Exponentialzahlen

Operator Bedeutung

+ Addition

– Subtraktion

* Multiplikation

/ Division

% Modulo-Operation: der Rest bei einer ganzzahligen DivisionZum Beispiel ergibt 7% 3 den Wert 1. Denn 7 dividiert durch 3 ergibt 2, Rest 1.

Tabelle 2.2 Rechenoperatoren in PHP

25

Page 27: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

<html><body><?php

$liter1 = 16;$liter2 = 23;$liter3 = 34;$preis = 1.35;$gesamtzahlung = ($liter1 + $liter2 + $liter3) * $preis;echo $gesamtzahlung;

?></body></html>

Listing 2.4 Datei zahl_operator.php

Rangordnung derOperatoren

Beachten Sie, dass (wie in der Mathematik üblich) Multiplikation undDivision Vorrang vor Addition und Subtraktion haben, also zuerst ausge-führt werden. Bei Operatoren mit gleicher Rangordnung werden Aus-drücke von links nach rechts bearbeitet.

Allerdings können Sie als Entwickler die Reihenfolge durch das Setzenvon Klammern beeinflussen. Ausdrücke in Klammern werden zuerstvollständig ausgewertet, das Ergebnis fließt später in die restlicheBerechnung ein.

Zum vorliegenden Programm: Die Variablen $liter1, $liter2, $liter3und $preis werden eingeführt und mit Werten belegt. Die Variable$gesamtzahlung wird wie folgt errechnet:

Die drei Literzahlen werden addiert (ergibt 73).

Die Gesamtliterzahl wird mit dem Preis multipliziert (ergibt 98.55).

Die Ausgabe des Programms im Browser sehen Sie in Abbildung 2.5.

Abbildung 2.5 Ergebnis einer umfangreicheren Berechnung

26

Page 28: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Variablen, Datentypen und Operatoren 2.3

Der Ausdruck $gesamtzahlung = $liter1 + $liter2 + $liter3 * $preis,also ohne Klammern, führt nicht zum richtigen Ergebnis, da in diesem Fall

die Multiplikation zuerst ausgeführt wird (es ergibt sich der Preis für34 Liter) und

anschließend zu diesem Preis die beiden anderen Literzahlen addiertwerden.

2.3.4 Variablen und Operatoren für Zeichenketten

StringsZeichenketten (Strings) müssen in doppelte Hochkommata (" ") oder ineinfache Hochkommata (' ') eingeschlossen werden.

Hochkomma, Punkt

Das Zeichen . (Punkt) dient der Verkettung von Zeichenketten bezie-hungsweise von Zahlen und Zeichenketten. Dies wird zum Beispiel füreine kommentierte Ergebnisausgabe genutzt. Der Operator .= (Punktgleich) kann zur Vergrößerung einer Zeichenkette eingesetzt werden.Falls die Zeichenketten HTML-Code enthalten, so gelangt dieser HTML-Code zur Ausführung. Ein Beispielprogramm:

<html><body><?php

$liter = 14;

Übung »u_zahl«

Berechnen Sie in einem PHP-Programm (Datei u_zahl.php) den Bruttopreiseines Einkaufs. Es werden insgesamt drei Artikel eingekauft. Die Nettopreiseder einzelnen Artikel betragen 22,50 €, 12,30 € und 5,20 €. Der Bruttopreisberechnet sich bekanntlich aus dem Nettopreis zuzüglich 19 % Umsatz-steuer. In die Berechnung muss also der Faktor 1.19 eingehen.

Speichern Sie die Datei im Hauptverzeichnis Ihres Webservers, und testenSie anschließend Ihr Programm, indem Sie einen Browser aufrufen und dieAdresse http://localhost/u_zahl.php eingeben.

Die Ausgabe des Programms im Browser sollte aussehen wie in Abbildung2.6.

Abbildung 2.6 Ergebnis der Übung »u_zahl«

27

Page 29: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

$preis = 1.35;$zahlung = $liter * $preis;$einheit1 = "Liter";$einheit2 = 'Euro';

$gesamt = "<p>Tankfüllung: " . $liter . " " . $einheit1;$gesamt .= " kosten " . $zahlung . " "

. $einheit2 . "</p>";echo $gesamt;echo "<p>Tankfüllung: $liter $einheit1

kosten $zahlung $einheit2</p>";echo '<p>Tankfüllung: $liter $einheit1

kosten $zahlung $einheit2</p>';?></body></html>

Listing 2.5 Datei zeichenkette.php

Erläuterung:

Im ersten Teil des Programms findet die Berechnung des Preises statt.

Den Variablen $einheit1 und $einheit2 werden Zeichenketten zu-gewiesen – in doppelten beziehungsweise in einfachen Hochkommata.

Der Variablen $gesamt wird eine Zeichenkette zugewiesen, die sichaus einzelnen Zeichenketten, Zahlenvariablen, Zeichenkettenvariab-len und HTML-Code zusammensetzt (Operator .).

Die Zeichenkette $gesamt wird verlängert (Operator .=).

Die Zeichenkette $gesamt wird ausgegeben.

Der gleiche Ausgabetext soll auf zwei weitere Arten ausgegeben wer-den. Der Wert einer einzelnen Variablen wird auch dann ausgegeben,wenn die Variable innerhalb einer Zeichenkette untergebracht wurde.Diese Form wird häufig verwendet. Sie sollten allerdings darauf ach-ten, dass die Zeichenkette zwischen doppelte Hochkommata gesetztwird.

Falls die Variable innerhalb einer Zeichenkette mit einfachen Hoch-kommata steht, wird nur der Name der Variablen, nicht aber der Wertder Variablen im Text ausgegeben (siehe Ausgabe). Dies ist normaler-weise nicht erwünscht.

28

Page 30: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Variablen, Datentypen und Operatoren 2.3

Ein Tipp zum besseren Verständnis: Verfolgen Sie jeden einzelnenSchritt des Programms, und notieren Sie den aktuellen Wert jeder Vari-ablen, sobald sich dieser ändert.

Abbildung 2.7 zeigt die Ausgabe des Programms im Browser.

Abbildung 2.7 Arbeiten mit Zeichenketten

Hinweis

Beim Schreiben eines Programms im Editor sollte innerhalb einer Zeichen-kette, also innerhalb einfacher oder doppelter Hochkommata, kein Zeilen-umbruch erfolgen. In diesem Buch ist dies aber aus drucktechnischen Grün-den an einigen Stellen notwendig, da einige Zeichenketten schlicht zu langsind.

Sie erkennen zusammengehörige, lange Zeichenketten leicht an dem gerin-geren Abstand zwischen den einzelnen Zeilen und an der Einrückung ab derzweiten Zeile. An diesen Stellen wurde kein Absatzumbruch, sondern einmanueller Zeilenwechsel durchgeführt. Falls Sie die betreffende Programm-stelle übernehmen, sollten Sie sie unbedingt in einer einzelnen Zeile schrei-ben.

Übung »u_zeichenkette«

Schreiben Sie das Programm aus der vorherigen Übung u_zahl um (Dateiu_zeichenkette.php). Das Zwischenergebnis und das Endergebnis sollenerrechnet werden. Speichern Sie die Datei im Hauptverzeichnis Ihres Web-servers, und testen Sie Ihr Programm, indem Sie einen Browser aufrufen unddie Adresse http://localhost/u_zeichenkette.php eingeben.

Die Ausgabe des Programms im Browser sollte aussehen wie in Abbildung 2.8.

29

Page 31: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

2.4 Einfache Formularauswertungen

Formulareauswerten

In den bisher gezeigten Beispielen hatte der Benutzer eines Programmsnoch keine Möglichkeit, eigene Eingaben vorzunehmen. Er konnte dasProgramm lediglich aufrufen und das Ergebnis betrachten.

Eine besondere Stärke und ein typischer Einsatzzweck von PHP istjedoch die Auswertung von Benutzereingaben aus Formularen. Erstdurch eine solche Auswertung wird die dynamische Informationsüber-mittlung zwischen Benutzer und Webserver ermöglicht. Dem Betrachterwird zunächst ein Formular vorgelegt, in dem er eigene Einträge vorneh-men beziehungsweise bei dem er aus bereits vorhandenen Einträgen aus-wählen kann. Er füllt das Formular aus, sendet es ab und erhält nach derAuswertung eine Antwort vom Webserver.

2.4.1 Eingabeformular

Texteingabefeld In diesem Abschnitt soll eine Informationsübermittlung mit Hilfe voneinzeiligen Texteingabefeldern ermöglicht werden. Formulare könnennoch aus einer Reihe weiterer Elemente bestehen. Diese werden ausführ-lich in Kapitel 3, »Daten senden und auswerten«, besprochen.

Der HTML-Programmcode des Formulars:

<html><body><p>Bitte tragen Sie Ihren Vornamen

und Ihren Nachnamen ein.<br />Senden Sie anschließend das Formular ab.</p><form action = "eingabe.php" method = "post">

Abbildung 2.8 Ergebnis der Übung »u_zeichenkette«

30

Page 32: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Einfache Formularauswertungen 2.4

<p><input name = "vor" /> Vorname</p><p><input name = "nach" /> Nachname</p><p><input type = "submit" /><input type = "reset" /></p>

</form></body></html>

Listing 2.6 Datei eingabe.htm

Die Ausgabe des Formulars im Browser, mit eingegebenen Beispieldaten,sehen Sie in Abbildung 2.9.

Abbildung 2.9 Eingabeformular mit Beispieldaten

form, action, method

Innerhalb des HTML-Dokuments befindet sich ein form-Container. DieMarkierung <form> beinhaltet

das Attribut action, das auf die Datei mit dem PHP-Auswertungspro-gramm (hier: eingabe.php) verweist, und

das Attribut method, das auf die Übermittlungsmethode zum Webser-ver (hier post) verweist.

Der form-Container beinhaltet die verschiedenen Formularelemente.Dabei handelt es sich um:

zwei einzeilige Texteingabefelder mit den Namen vor beziehungs-weise nach für die Eintragung des Vornamens beziehungsweise desNachnamens

submit, reset eine Schaltfläche zum Absenden (engl. submit); beim Betätigen wer-den die eingetragenen Daten an den Server gesendet, und es wird dasgenannte PHP-Auswertungsprogramm angefordert

31

Page 33: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

eine Schaltfläche zum Zurücksetzen (engl. reset) des Formulars; beimBetätigen wird das Formular wieder in den Anfangszustand versetzt,wie es zum Beispiel bei einer Fehleingabe notwendig sein kann

Die Auswertung der Eingabedaten stelle ich im folgenden Abschnitt vor.

2.4.2 Auswertung mit $_POST

Das antwortende PHP-Programm für das Formular in Datei eingabe.htmsieht wie folgt aus:

<html><body><?php

echo "Guten Tag, " . $_POST["vor"]. " " . $_POST["nach"];

?></body></html>

Listing 2.7 Datei eingabe.php

Übung »u_eingabe«, Teil 1

Erweitern Sie das Beispiel dahingehend, dass eine vollständige Adresse ein-gegeben werden kann (Datei u_eingabe.htm). Es sollen zusätzlich drei weitereEingabefelder für die Angaben zu Straße, Hausnummer, Postleitzahl und Ortinnerhalb des Formulars vorhanden sein.

Das Formular sollte aussehen wie in Abbildung 2.10 (mit Beispieldaten).

Abbildung 2.10 Erweitertes Eingabeformular mit Beispieldaten

32

Page 34: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Einfache Formularauswertungen 2.4

Falls der Benutzer das oben angegebene Beispiel eingegeben hat, antwor-tet der Server, wie in Abbildung 2.11 dargestellt.

Abbildung 2.11 Auswertung eines einfachen Eingabeformulars

$_POSTEs gibt in PHP einige vordefinierte Variablen, unter anderem das assozi-ative Feld $_POST. Aus den Namen der Eingabefelder werden automa-tisch Elemente dieses Feldes, falls die Übermittlungsmethode post ver-wendet wird.

Die Elemente können angesprochen werden, indem Sie ihren Namen inAnführungszeichen und eckigen Klammern hinter dem Namen des Fel-des $_POST angeben. Die Eintragung im Texteingabefeld vor wird alsozum Wert der Variablen $_POST["vor"] im Programm.

Feldelemente lassen sich allerdings nicht in einer Zeichenkette innerhalbvon Hochkommata ausgeben, wie dies bei einzelnen Variablen der Fallist. Daher ist die Ausgabezeile mit echo etwas umfangreicher. WeitereEinzelheiten zu Feldern sowie insbesondere zu assoziativen Feldern fol-gen in Abschnitt 2.7.2, »Assoziative Felder«.

$_GETSie können ein Formular statt mit der Methode post auch mit derMethode get versenden. Sie müssen dabei darauf achten, dass Sie dasFeld $_GET statt des Feldes $_POST verwenden. Die Methode post ist imAllgemeinen zu bevorzugen, da sie sicherer und universell ist.

Übung Code eingeben

Dieses Zusammenspiel von HTML-Datei und PHP-Datei stellt einen wichti-gen Schritt dar. Daher zunächst eine »einfache« Aufgabe: Geben Sie dasangegebene Beispiel mit einem Texteditor ein, und speichern Sie es unterden Dateinamen eingabe.htm und eingabe.php ab. Füllen Sie das Formularaus, senden Sie es ab, und kontrollieren Sie die Reaktion des Webservers.

Übung »u_eingabe«, Teil 2

Erstellen Sie (passend zum Formular aus Übung u_eingabe, Teil 1) ein PHP-Programm, das die Daten des Benutzers bestätigt. Falls der Benutzer dieoben angegebenen Beispieldaten eingegeben hat, soll die Ausgabe des Pro-gramms im Browser aussehen wie in Abbildung 2.12.

33

Page 35: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

2.4.3 Umwandlung von Zeichenketten in Zahlen

Ein Texteingabefeld eines Formulars nimmt eine Zeichenkette auf; eswird dabei eine Zeichenkette an das PHP-Programm übermittelt. Häufigsollen jedoch Zahlen, zum Beispiel zur Ausführung von Berechnungen,übermittelt werden. Dabei sind die folgenden Regeln zu beachten.

Umwandlung,Konvertierung

Bei der Umwandlung einer Zeichenkette (Konvertierung) ist der Beginnder Zeichenkette wichtig. Falls sie mit gültigen numerischen Zeichen be-ginnt, werden diese Zeichen genutzt. Andernfalls ergibt sich der Wert 0.Eine gültige Folge von numerischen Zeichen beinhaltet:

ein Vorzeichen (optional)

eine oder mehrere Ziffern

einen Dezimalpunkt (optional)

einen Exponenten (optional); der Exponent ist ein kleines e oder eingroßes E, gefolgt von einer oder mehreren Ziffern

Die Zeichenkette wird interpretiert

als ganze Zahl, falls sie nur Ziffern beinhaltet, oder

als Zahl mit Nachkommastellen, falls sie neben den Ziffern die Zei-chen . (Punkt), e oder E beinhaltet.

Einige Beispiele sehen Sie in Tabelle 2.3.

Abbildung 2.12 Auswertung des erweiterten Eingabeformulars

Zeichenkette Wert Datentyp

"352" 352 ganze Zahl

"352xz" 352 ganze Zahl

"xz352" 0 Zeichenkette

Tabelle 2.3 Beispiele für Umwandlungen von Zeichenketten

34

Page 36: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Einfache Formularauswertungen 2.4

Falls Sie Zeichenkettenvariablen der Sicherheit halber explizit (also vomProgrammentwickler gesteuert) in Zahlen umwandeln möchten, könnenSie die beiden Funktionen doubleval() beziehungsweise intval()anwenden. Ein kleines Beispiel für zwei Umwandlungen:

$a = "435";$a = intval($a);$b = "22.6";$b = doubleval($b);

Nach der Bearbeitung dieses Programmteils stehen die Variablen $a und$b als Zahlenvariablen mit dem ganzzahligen Wert 435 beziehungsweisedem Wert 22.6 für weitere Berechnungen zur Verfügung.

In den Einführungsbeispielen dieses Buchs werden Eingabefehler desBenutzers nicht immer abgefangen. Die Programme würden sonst unnö-tig umfangreich und schwer verständlich. Später werden wir Routinen indie Programme einbauen, die möglichst alle Eingabefehler abfangen.Aber es gilt immer der Grundsatz: Kein Programm ist vollständig gegenEingabefehler gesichert.

Im nachfolgenden Beispiel wird der Benutzer aufgefordert, in einem For-mular zwei Zahlen einzugeben und das Formular abzusenden. Ein PHP-Programm berechnet die Summe der beiden Zahlen und gibt das Ergeb-nis aus. Der HTML-Code des Formulars:

<html><body><p>Bitte tragen Sie zwei Zahlen ein

und senden Sie das Formular ab.</p><form action = "eingabe_zahl.php" method = "post">

<p>Wert 1: <input name = "w1" /></p><p>Wert 2: <input name = "w2" /></p><p><input type = "submit" />

"35.2" 35.2 Zahl mit Nachkommastellen

"35.2xz" 35.2 Zahl mit Nachkommastellen

"xz35.2" 0 Zeichenkette

"-352" – 352 ganze Zahl

"35e2" 3500 Zahl mit (möglichen) Nachkommastellen

"35e-2" 0.35 Zahl mit Nachkommastellen

Zeichenkette Wert Datentyp

Tabelle 2.3 Beispiele für Umwandlungen von Zeichenketten (Forts.)

35

Page 37: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

<input type = "reset" /></p></form></body></html>

Listing 2.8 Datei eingabe_zahl.htm

Das PHP-Programm:

<html><body><?php

$erg = $_POST["w1"] + $_POST["w2"];echo "Die Summe von " . $_POST["w1"]

. " und " . $_POST["w2"] . " ist $erg";?></body></html>

Listing 2.9 Datei eingabe_zahl.php

Abbildung 2.13 Senden von Zahlen

Ein Aufruf mit den in Abbildung 2.13 dargestellten Eingabewerten ergibtdie in Abbildung 2.14 dargestellte Antwort.

Abbildung 2.14 Umwandlung und Berechnung des Ergebnisses

36

Page 38: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Verzweigungen 2.5

Im Antwortprogramm werden die eingegebenen Zeichenketten nachden oben angegebenen Regeln automatisch in Zahlen umgewandelt.

2.5 Verzweigungen

Bisher wurden die Dateien mit dem HTML-Code und dem PHP-Code reinsequenziell abgearbeitet, das heißt, es wurde eine Anweisung nach deranderen durchgeführt. Programme sind aber auch in der Lage, auf unter-schiedliche Bedingungen zu reagieren. Einzelne Anweisungen werdendann nur in bestimmten Situationen ausgeführt.

if, if/elseDie Ausführung dieser Anweisungen wird in solchen Fällen von eineroder von mehreren Bedingungen (if-Anweisung) abhängig gemacht. Jenachdem, ob die Bedingung zutrifft, werden die entsprechenden Anwei-sungen ausgeführt oder nicht. Darüber hinaus können bei Nichterfüllung

Übung »u_eingabe_zahl«

Erstellen Sie ein Eingabeformular (Datei u_eingabe_zahl.htm) und ein dazupassendes PHP-Programm (Datei u_eingabe_zahl.php), mit dessen Hilfe dasQuadrat einer Zahl berechnet werden kann. Die Zahl soll also mit sich selbstmultipliziert werden.

Formular und Ergebnis sollten aussehen wie in den Abbildung 2.15 undAbbildung 2.16.

Abbildung 2.15 Eingabe der Übung »u_eingabe_zahl«

Abbildung 2.16 Ergebnis der Übung »u_eingabe_zahl«

37

Page 39: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

der Bedingung alternative Anweisungen (if/else-Anweisung) bearbeitetwerden. Man nennt diese Stellen in einem Programm Verzweigungenoder auch bedingte Anweisungen.

Bedingung,wahr, falsch

Bedingungen werden mit Hilfe von Wahrheitswerten (wahr oder falsch)und Vergleichsoperatoren erstellt. Es folgt Tabelle 2.4 mit einer Über-sicht über die Vergleichsoperatoren.

Vergleichs-operatoren

Bei der Überprüfung auf Gleichheit hin sollten Sie besonders auf dasdoppelte Gleichheitszeichen achten. Es handelt sich dabei um eineBedingung und nicht um eine Zuweisung.

2.5.1 if-Anweisung

Ein Beispiel für eine Verzweigung mit einer if-Anweisung:

<html><body><?php

$preis = 0.98;if ($preis < 1) echo "Der Preis liegt unter 1 &euro;";

?></body></html>

Listing 2.10 Datei if.php

Falls $preis kleiner als 1 ist, wird der entsprechende Text in das Doku-ment geschrieben, andernfalls geschieht nichts. Die Bedingung (hier:$preis < 1) muss in Klammern stehen. Die Ausgabe sehen Sie in Abbil-dung 2.17.

Operator Bedeutung Geltungsbereich

== gleich Zahlen und Zeichenketten

!= ungleich Zahlen und Zeichenketten

> größer als Zahlen

< kleiner als Zahlen

>= größer als oder gleich Zahlen

<= kleiner als oder gleich Zahlen

Tabelle 2.4 Vergleichsoperatoren in PHP

38

Page 40: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Verzweigungen 2.5

Abbildung 2.17 Einfache if-Bedingung

Ein weiteres Beispiel:

<html><body><?php

$preis = 0.98;if ($preis < 1)

echo "Der Preis liegt unter 1 &euro;.<br />";echo "Das ist günstig.";

?></body></html>

Listing 2.11 Datei if_block.php

Anweisungsblock . .

Falls aufgrund einer Bedingung mehrere Anweisungen ausgeführt wer-den sollen, müssen diese innerhalb von geschweiften Klammern stehen.Dies nennt man einen Anweisungsblock. In diesem Programm werdenzwei Ausgaben erzeugt, da $preis kleiner als 1 ist. Abbildung 2.18 zeigtdie Ausgabe.

Abbildung 2.18 Verzweigung mit Anweisungsblock

2.5.2 if/else-Anweisung

Ein Beispiel für eine Verzweigung mit einer if/else-Anweisung:

<html><body>

39

Page 41: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

<?php$preis = 1.02;

if ($preis < 1)

echo "Der Preis liegt unter 1 &euro;<br />";echo "Das ist günstig";

else

echo "Der Preis liegt bei 1 &euro; oder darüber<br />";echo "Langsam wird es teuer";

?></body></html>

Listing 2.12 Datei ifelse.php

Falls die Bedingung hinter if nicht zutrifft, werden die Anweisungenhinter else ausgeführt. Auch hier gilt, dass bei mehreren Anweisungengeschweifte Klammern gesetzt werden müssen. Die Ausgabe sehen Sie inAbbildung 2.19.

Abbildung 2.19 Verzweigung mit else

Passwort Ein weiteres Beispiel (mit Eingabeformular) verdeutlicht den Vergleichvon Zeichenketten bei einer Bedingung. Der Benutzer soll ein Zugangs-passwort eintragen (ausnahmsweise in sichtbarer Form). Das PHP-Pro-gramm vergleicht die Eingabe mit dem gespeicherten Passwort und rea-giert entsprechend. Der HTML-Code des Formulars sieht wie folgt aus:

<html><body><p>Bitte tragen Sie das Zugangspasswort ein</p><form action = "ifelse_zugang.php" method = "post">

<p><input name = "pw" /></p><p><input type = "submit" />

40

Page 42: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Verzweigungen 2.5

<input type = "reset" /></p></form></body></html>

Listing 2.13 Datei ifelse_zugang.htm

Das Auswertungsprogramm sieht so aus:

<html><body><?php

if ($_POST["pw"] == "bingo")echo "Zugang gestattet";

elseecho "Zugang verweigert";

?></body></html>

Listing 2.14 Datei ifelse_zugang.php

Falls der Benutzer das Passwort aus Abbildung 2.20 eingibt, …

Abbildung 2.20 Eingabe des Passworts

… erhält er Zugang, siehe Abbildung 2.21, …

Abbildung 2.21 Auswertung der Verzweigung

… andernfalls nicht.

41

Page 43: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

Übung »u_ifelse1«

Erstellen Sie ein Eingabeformular (Datei u_ifelse1.htm) und ein dazu passen-des PHP-Programm (Datei u_ifelse1.php). Es soll der Preis für eine Tankfül-lung berechnet werden. Es gibt zwei Sorten Benzin: Normal (Preis: 1,35 € )und Super (Preis: 1,40 € ).

Der Benutzer gibt im ersten Eingabefeld die getankte Literzahl und im zwei-ten Eingabefeld entweder ein N oder ein S ein. Das PHP-Programm ermitteltin Abhängigkeit von der Sorte und der getankten Menge den zu zahlendenBetrag. Es wird davon ausgegangen, dass der Benutzer keine Fehleingabenmacht.

Falls der Benutzer also beispielsweise eingibt, dass er 15 Liter Super-Benzintankt, siehe Abbildung 2.22, …

Abbildung 2.22 Eingabe Tankvorgang

… sollte die Ausgabe des Programms aussehen wie in Abbildung 2.23.

Abbildung 2.23 Ergebnis Tankvorgang

Übung »u_ifelse2«

Erweitern Sie die vorherige Übung. Großkunden, die 100 Liter oder mehrtanken, erhalten unabhängig von der Sorte an dieser Tankstelle 2 % Rabatt.Falls der Benutzer beispielsweise eingibt, dass er 120 Liter Normal-Benzintankt, siehe Abbildung 2.24 …

42

Page 44: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Verzweigungen 2.5

2.5.3 Logische Operatoren

LogischeOperatoren

Logische Operatoren dienen der Verknüpfung mehrerer Bedingungen.

Logisches Oder

LogischesOder ||

Das logische Oder (Zeichen ||) wird verwendet, falls nur eine von meh-reren Bedingungen zutreffen muss. Zur Verdeutlichung wird das Beispielmit der Passworteingabe (ifelse_zugang.htm und ifelse_zugang.php)erweitert. Es gibt nun zwei Passwörter, die zum erfolgreichen Zugangführen. Das Eingabeformular (in der Datei oder.htm) bleibt gleich, dasAuswertungsprogramm sieht wie folgt aus:

<html><body><?php

if ($_POST["pw"] == "bingo" || $_POST["pw"] == "kuckuck")echo "Zugang gestattet";

elseecho "Zugang verweigert";

?>

Abbildung 2.24 Eingabe der Übung »u_ifelse2«

… sollte die Ausgabe des Programms aussehen wie in Abbildung 2.25.

Abbildung 2.25 Ergebnis der Übung »u_ifelse2«

43

Page 45: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

</body></html>

Listing 2.15 Datei oder.php

Es gibt zwei Bedingungen. Davon muss eine zutreffen, damit der Zuganggestattet wird. Jede Bedingung muss vollständig formuliert werden. DerAusdruck $_POST["pw"] == "bingo" || "kuckuck" würde zu einer Fehler-meldung führen, da die zweite Bedingung unvollständig ist.

Logisches Und

LogischesUnd &&

Das logische Und (Zeichen &&) wird verwendet, falls alle Bedingungenzutreffen müssen. Dies wird wiederum an einem erweiterten Beispielder Passworteingabe verdeutlicht. Der Benutzer muss nun seinen Namenund sein Zugangspasswort eingeben. Der Zugang wird nur gestattet, fallsbeide Angaben korrekt sind, es sich also um einen sowohl berechtigtenals auch bekannten Benutzer handelt. Zunächst das geänderte Eingabe-formular:

<html><body><p>Bitte tragen Sie Name und Zugangspasswort ein</p><form action = "und.php" method = "post">

<p><input name = "bname" /> Name</p><p><input name = "pw" /> Passwort</p><p><input type = "submit" /><input type = "reset" /></p>

</form></body></html>

Listing 2.16 Datei und.htm

Das Auswertungsprogramm sieht wie folgt aus:

<html><body><?php

if ($_POST["bname"] == "Maier"&& $_POST["pw"] == "kuckuck")

echo "Zugang gestattet";else

echo "Zugang verweigert";?>

44

Page 46: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Verzweigungen 2.5

</body></html>

Listing 2.17 Datei und.php

Gibt der Benutzer zwar den Namen Maier, aber ein falsches Passwort ein,wird der Zugang verweigert, da beide Angaben stimmen müssen. DasGleiche trifft zu, falls der Benutzer den Namen Meier (mit e statt mit a)und das Passwort kuckuck eingibt, da in diesem Fall nur die zweiteBedingung zutrifft – siehe Formular und Ausgabe (siehe Abbildung 2.26bzw. Abbildung 2.27).

Abbildung 2.26 Eingabe von Name und Passwort

Abbildung 2.27 Richtiges Passwort, falscher Name

Logisches Nicht

LogischesNicht !

Mit Hilfe des Operators Nicht (Zeichen !) wird der Wahrheitswert vonBedingungen umgekehrt. Dies kann bei komplexen logischen Verknüp-fungen hilfreich sein.

Übung »u_oder_und«

Testen Sie die Beispiele in den Dateien oder.htm und oder.php bzw. und.htmund und.php mit verschiedenen Passwörtern beziehungsweise Name-Pass-wort-Kombinationen.

45

Page 47: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

2.5.4 Rangordnung der Operatoren

Rangordnung derOperatoren

Ausdrücke mit mehreren Operatoren werden von links nach rechts auf-gelöst – unter Beachtung der Rangordnung. Nachfolgend sehen Sie inTabelle 2.5 die Rangordnung der bisher verwendeten Operatoren. Eswird mit der höchsten Stelle der Rangordnung begonnen.

Klammern stehen innerhalb der Rangordnung an erster Stelle. Mit ihrerHilfe können Sie Ausdrücke in einer gewünschten Reihenfolge bearbei-ten lassen. Zusätzlich können Sie Klammern verwenden, falls Sie sich beider Rangordnung nicht sicher sind.

2.5.5 Mehrfache Verzweigung

MehrfacheVerzweigung

Verzweigungen mit if und else lassen sich verschachteln, sodass einemehrfache Verzweigung möglich wird. Diese kann für mehr als zweimögliche Fälle verwendet werden. Ein Beispiel hierzu:

<html><body><?php

$preis = 1.12;

if ($preis < 1)

Operator Bedeutung

() Klammern

! - logisches Nicht, negatives Vorzeichen

* / % Multiplikation, Division, Modulo-Operation

+ - Addition, Subtraktion

< <= > >= kleiner, kleiner oder gleich, größer, größer oder gleich

== != gleich, ungleich

&& logisches Und

|| logisches Oder

= Zuweisung

Tabelle 2.5 Rangordnung der Operatoren

Übung »u_logisch«

Erweitern Sie das Beispielprogramm aus dem vorherigen Abschnitt. Nur diebeiden Benutzer Marten (Passwort Hamburg) und Schmitz (Passwort Berlin)sollen Zugang haben (Dateien u_logisch.htm und u_logisch.php).

46

Page 48: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Verzweigungen 2.5

echo "Der Preis liegt unter 1 &euro;<br />";echo "Das ist günstig";

else

if ($preis <= 1.2)

echo "Der Preis liegtzwischen 1 &euro; und 1.20 &euro;<br />";

echo "Langsam wird es teuer";else

echo "Der Preis liegt über 1.20 &euro;<br />";echo "Das ist viel zu teuer";

?></body></html>

Listing 2.18 Datei if_schachtel.php

Falls $preis kleiner als 1 ist, trifft die erste Bedingung zu. Die restlichenBedingungen müssen dann nicht mehr geprüft werden. Andernfalls kann$preis nur noch größer oder gleich 1 sein. Es wird dann die nächsteBedingung ($preis <= 1.2) geprüft. Falls diese ebenfalls nicht zutrifft,kann $preis nur noch größer als 1.2 sein. Die Ausgabe sehen Sie inAbbildung 2.28.

Abbildung 2.28 Ergebnis mehrfacher Verzweigung

Übung »u_if_schachtel«

Erweitern Sie das Programm aus Übung u_ifelse1. Es soll der Preis für eineTankfüllung berechnet werden, ohne Rabatt für Großkunden. Es gibt dreiSorten Benzin: Normal (Preis: 1,35 €), Super (Preis: 1,40 €) und Diesel (Preis:1,10 € ).

47

Page 49: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

2.5.6 switch/case-Anweisung

switch/case Die switch/case-Anweisung bietet für einen bestimmten Typ von mehr-fachen Verzweigungen eine alternative Schreibweise. Sie kann eingesetztwerden, falls eine bestimmte Variable auf mehrere, feste Werte hingeprüft werden soll. Diese Form der mehrfachen Verzweigung ist insbe-sondere dann übersichtlicher als eine geschachtelte Verzweigung, wennviele unterschiedliche Fälle vorliegen.

Ein Beispiel bietet Übungsaufgabe u_if_schachtel (siehe oben). Das Einga-beformular aus der Datei u_if_schachtel.htm können Sie übernehmen (inswitch_case.htm). Das Auswertungsprogramm mit der Anweisungswitch/case sieht wie folgt aus:

Der Benutzer gibt im ersten Eingabefeld die getankte Literzahl und im zwei-ten Eingabefeld entweder ein N, ein S oder ein D ein. Das PHP-Programmermittelt in Abhängigkeit von der Sorte und der getankten Menge den zuzahlenden Betrag. Es wird davon ausgegangen, dass der Benutzer keine Fehl-eingaben macht.

Falls der Benutzer 35 Liter Diesel tankt, siehe Abbildung 2.29, ...

Abbildung 2.29 Eingabe der Übung »u_if_schachtel«

... sollte die Ausgabe aussehen wie in Abbildung 2.30.

Abbildung 2.30 Ergebnis der Übung »u_if_schachtel«

48

Page 50: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Verzweigungen 2.5

<html><body><?php

switch($_POST["sorte"])

case "N":$zahlung = $_POST["liter"] * 1.35;echo $_POST["liter"]

. " L Normal kosten $zahlung &euro;";break;

case "S":$zahlung = $_POST["liter"] * 1.4;echo $_POST["liter"]

. " L Super kosten $zahlung &euro;";break;

case "D":$zahlung = $_POST["liter"] * 1.1;echo $_POST["liter"]

. " L Diesel kosten $zahlung &euro;";break;

default:echo "Als Sorte nur N, S oder D eingeben!";

?></body></html>

Listing 2.19 Datei switch_case.php

break, defaultEs wird ein sogenannter switch-Block erzeugt. Innerhalb dieses switch-Blocks wird der Wert von $_POST["sorte"] untersucht. Die vorhande-nen Fälle (engl. case) werden der Reihe nach mit diesem Wert vergli-chen. Sobald einer der Fälle zutrifft, werden alle weiteren Anweisungenbearbeitet, bis man auf die Anweisung break trifft. Die Anweisungennach break werden nicht mehr ausgeführt.

Optional kann die Anweisung default benutzt werden. Diese ist dannnützlich, wenn keiner der genannten Fälle zutrifft. Dies wäre im obenangegebenen Programm der Fall, falls der Benutzer als Sorte weder Nnoch S noch D eingeben würde.

Falls der Benutzer die Eingaben 35 und P macht, siehe Abbildung 2.31, …

49

Page 51: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

Abbildung 2.31 Eingabe für switch/case

… ergibt sich eine Ausgabe wie in Abbildung 2.32.

Abbildung 2.32 Default-Fall

2.5.7 HTML in Verzweigungsblöcken

HTML und PHPgemischt

Falls innerhalb einer einfachen oder mehrfachen Verzweigung jeweilsnur reiner HTML-Code ohne PHP-Variablen ausgegeben werden muss,ist eine gemischte Schreibweise mit PHP und HTML recht nützlich. EinBeispiel:

<html><body><?php

$preis = 1.12;if ($preis < 1):

?>Der Preis liegt unter 1 &euro;<br />Das ist günstig<?php else: ?>Der Preis liegt bei 1 &euro; oder darüber<br />Langsam wird es teuer<?php endif; ?></body></html>

Listing 2.20 Datei if_html.php

50

Page 52: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Schleifen 2.6

Der Ablauf der Verzweigung wird auf mehrere PHP-Blöcke verteilt:

Nach der Bedingung if ($preis < 1) wird ein Doppelpunkt notiert.Dies bedeutet, dass die Verzweigung noch »offen« ist. Der anschlie-ßende HTML-Code bis zum nächsten Teil der Verzweigung wird nurausgeführt, sofern die Bedingung zutrifft.

Es folgt die else-Anweisung, ebenfalls mit einem Doppelpunkt. Fürden darauffolgenden HTML-Code gilt das Gleiche. Die Verzweigungist nach wie vor »offen«.

Sie wird erst durch die Anweisung endif abgeschlossen.

Dazwischen kann der HTML-Code ohne echo, Anführungszeichen, Semi-kolon usw. notiert werden. Diese gemischte Schreibweise aus PHP undHTML können Sie auch für andere Formen der Verzweigung und andereKontrollstrukturen benutzen.

2.6 Schleifen

Schleife, Wiederholung

Falls sich innerhalb eines Programms einzelne Anweisungen oder Blöckevon Anweisungen wiederholen, werden Schleifen verwendet. In PHPgibt es unter anderem die for-Schleife und die while-Schleife. WelcheVariante bei der Lösung eines aktuellen Problems die richtige ist, lässtsich leicht entscheiden:

Sie verwenden die for-Schleife, falls Ihnen die Anzahl der Wiederho-lungen bekannt ist oder diese sich eindeutig im Verlauf des Pro-gramms vor der Schleife ergibt (Zählschleife).

Sie verwenden die while-Schleife, falls Ihnen die Anzahl der Wieder-holungen nicht bekannt ist und diese sich nicht eindeutig im Verlaufdes Programms vor der Schleife ergibt. Die Wiederholung oder derAbbruch der Schleife ergeben sich erst zur Laufzeit des Programms(bedingungsgesteuerte Schleife).

2.6.1 for-Schleife

forDie for-Schleife wird verwendet, um eine feste Anzahl an Wiederholun-gen zu erzeugen. Entweder ist die Anzahl vorher bekannt, oder Start undEnde der Wiederholung sind bekannt beziehungsweise können errech-net werden. Ein Beispiel:

51

Page 53: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

<html><body><?php

for ($i=1; $i<=5; $i++)

echo "Zeile $i<br />";

?></body></html>

Listing 2.21 Datei for.php

Mit Hilfe des Programms werden fünf Zeilen in das Dokument geschrie-ben, jeweils mit dem Inhalt Zeile: <Nummer>. Die Ausgabe sehen Sie inAbbildung 2.33.

Abbildung 2.33 Schleife

Die for-Schleife besteht aus Kopf und Rumpf. Der Kopf der for-Schleifebesteht aus drei Teilen, die durch Semikola voneinander getrennt sind:

Startwert

Bedingung zur Wiederholung

Veränderung der Schleifenvariablen

In diesem Beispiel wird die Variable $i als sogenannte Schleifenvariableverwendet, das heißt, mit Hilfe von $i wird die Schleife gesteuert.

Die Variable $i bekommt zunächst den Wert 1. Es wird geprüft, ob dieBedingung zur Wiederholung erfüllt ist. Ist dies der Fall, wird mit demAnfangswert der Rumpf der Schleife durchlaufen. Dies liefert die Aus-gabe: Zeile 1. Anschließend wird die Variable durch die Veränderungder Schleifenvariablen (auf 2) erhöht.

52

Page 54: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Schleifen 2.6

Es wird anschließend geprüft, ob die Bedingung zur Wiederholung nocherfüllt ist. Ist dies der Fall, so wird der Rumpf der Schleife mit dem Wert$i (Ausgabe: Zeile 2) durchlaufen usw. Nach dem fünften Durchlaufwird $i auf 6 erhöht. Damit trifft die Bedingung zur Wiederholung nichtmehr zu; das Programm beendet die Schleife und läuft weiter. Im vorlie-genden Programm ist dann das Ende erreicht.

++, --

2.6.2 Beispiele für for-Schleifen

Einige Beispiele für Schleifensteuerungen sind in Tabelle 2.6 aufgeführt:

Sie sollten immer darauf achten, dass Sie nicht aus Versehen eine Endlos-schleife erzeugen. Dies könnten Sie zum Beispiel mit dem folgendenSchleifenkopf erreichen: for ($i=3; $i>2; $i=$i+3). Die Bedingung$i>2 ist für alle Zahlen, die erzeugt werden, erfüllt. Demnach wird dieseSchleife niemals beendet, und das Programm »hängt sich auf«.

Anmerkung

$i++ ist eine Kurzform der Zuweisung $i=$i+1. Häufig wird auch $i-- ver-wendet. Dies ist eine Kurzform der Zuweisung $i=$i-1, also eine Verminde-rung von $i um 1.

Auch bei Schleifen gilt: Falls sich die Schleife auf mehrere Anweisungenbezieht, müssen diese in geschweifte Klammern gesetzt werden. Strenggenommen wäre dies also beim oben genannten Beispiel nicht notwendiggewesen; aber es schadet auch nicht.

Kopf der for-Schleife $i bekommt nacheinander die Werte

for ($i=10; $i<=15; $i++) 10, 11, 12, 13, 14, 15

for ($i=10; $i<15; $i++) 10, 11, 12, 13, 14

for ($i=10; $i>=5; $i--) 10, 9, 8, 7, 6, 5

for ($i=10; $i>5; $i--) 10, 9, 8, 7, 6

for ($i=3; $i<=22; $i=$i+3) 3, 6, 9, 12, 15, 18, 21

for ($i=32; $i>12; $i=$i-4) 32, 28, 24, 20, 16

for ($i=12; $i<13; $i=$i+0.2) 12.0, 12.2, 12.4, 12.6, 12.8

$a=6, $b=16, $c=2;for ($i=$a; $i<$b; $i=$i+$c)

6, 8, 10, 12, 14

Tabelle 2.6 Beispiele für Schleifensteuerungen

53

Page 55: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

2.6.3 Geschachtelte for-Schleifen

GeschachtelteSchleifen

Schleifen können geschachtelt werden. Dabei befindet sich eine Schleifeinnerhalb einer anderen Schleife (Schachtelung). Dadurch wird späterdie Bearbeitung einer zweidimensionalen Struktur, wie zum Beispieleiner Tabelle oder eines zweidimensionalen Feldes (siehe Abschnitt 9.3,»Zweidimensionale Felder, allgemein«), möglich. Ein Beispiel:

<html><body><?php

for ($z=1; $z<=5; $z=$z+1)

for ($s=1; $s<=3; $s=$s+1)

echo "Ze$z/Sp$s ";echo "<br />";

?></body></html>

Listing 2.22 Datei for_schachtel.php

Übung »u_for«

Schreiben Sie ein Programm (Datei u_for.php), in dem mit Hilfe verschiede-ner for-Schleifen die in Abbildung 2.34 angegebenen Zeilen ausgegebenwerden. Ein Tipp: Für die letzte Zahlenreihe wird eine zusätzliche if-Bedin-gung benötigt.

Abbildung 2.34 Ergebnis der Übung »u_for«

54

Page 56: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Schleifen 2.6

Die erste (äußere) Schleife wird fünfmal durchlaufen. Innerhalb dieserSchleife befindet sich wiederum eine (innere) Schleife, die bei jedemDurchlauf der äußeren Schleife dreimal durchlaufen wird. Anschließendwird ein Umbruch erzeugt. Es gibt insgesamt 5×3=15 Wiederholungen.Abbildung 2.35 zeigt die Programmausgabe.

Abbildung 2.35 Geschachtelte Schleife

2.6.4 Schleifen und Tabellen

Schleife mit HTML-Tabelle

Schleifen werden häufig im Zusammenhang mit HTML-Tabellen einge-setzt. Das erweiterte Beispiel aus der Datei for.php kann innerhalb einerTabellenstruktur zum Beispiel wie folgt angegeben werden:

Übung »u_for_schachtel«

Schreiben Sie ein Programm (Datei u_for_schachtel.php), in dem mit Hilfezweier geschachtelter for-Schleifen das kleine Einmaleins ausgegeben wird.Die Ausgabe soll aussehen wie in Abbildung 2.36.

Abbildung 2.36 »Kleines Einmaleins«

55

Page 57: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

<html><body><table border="1"><?php

for ($i=8; $i<=13; $i++)

echo "<tr>";echo "<td>Zeile</td>";echo "<td align='right'>$i</td>";echo "</tr>";

?></table></body></html>

Listing 2.23 Datei tabelle.php

Tabellenanfang und Tabellenende werden hier im HTML-Bereich ange-geben. Die veränderlichen Bestandteile (Anzahl der Zeilen und Inhalt derzweiten Spalte) werden im PHP-Bereich angegeben. Bei jedem Durchlaufder Schleife wird eine Tabellenzeile mit jeweils zwei Zellen ausgegeben.

Die Ausgabe sehen Sie in Abbildung 2.37.

Abbildung 2.37 Schleife und Tabelle

Hinweis

Die Ausrichtung der Zellen (align='right') muss innerhalb der Zeichen-kette (die zwischen doppelten Hochkommata steht) in einfachen Hochkom-mata angegeben werden, da in PHP ansonsten die Zeichenkette zu frühbeendet würde.

56

Page 58: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Schleifen 2.6

Das erweiterte Beispiel aus der Datei for_schachtel.php mit einergeschachtelten Schleife innerhalb einer Tabellenstruktur:

<html><body><table border="1"><?php

for ($z=8; $z<=13; $z=$z+1)

echo "<tr>";for ($s=1; $s<=5; $s=$s+1)

echo "<td align='right'>$z/$s</td>";echo "</tr>";

?></table></body></html>

Listing 2.24 Datei tabelle_schachtel.php

Abbildung 2.38 Geschachtelte Schleife und Tabelle

Tabellenbeginn und Tabellenende werden hier wiederum im HTML-Bereich angegeben. Die äußere Schleife sorgt für das Erzeugen der Tabel-lenzeilen, die innere Schleife für das Erzeugen und Füllen der Zellen.Abbildung 2.38 zeigt die Ausgabe.

Übung »u_tabelle«

Erweitern Sie das Programm aus Übung u_for_schachtel. Betten Sie das»kleine Einmaleins« in eine Tabelle ein (u_tabelle.php). Die Ausgabe soll aus-sehen wie in Abbildung 2.39.

57

Page 59: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

2.6.5 while-Schleife

while Die while-Schleife wird dazu benutzt, eine unbestimmte Anzahl an Wie-derholungen zu erzeugen. Das Ende der Wiederholungen wird bei einemder Schleifendurchläufe erreicht. while-Schleifen werden häufig beiDatenbankabfragen eingesetzt (siehe Abschnitt 4.2, »PHP und MySQL«).

Im nachfolgenden Beispiel wird gewürfelt. Die gewürfelten Zahlen wer-den addiert. Dies wird so lange wiederholt, wie die Summe der gewür-felten Zahlen kleiner als 25 ist.

Zufallszahlen-generator

Zum Erzeugen der »zufälligen« Würfelergebnisse wird der Zufallszahlen-generator von PHP verwendet. Er muss zunächst initialisiert werden,damit er tatsächlich »zufällige« Ergebnisse produziert. Innerhalb derSchleife wird jeweils ein Würfelergebnis erzeugt. Die dazu notwendigenFunktionen srand() und rand() werden in Abschnitt 11.7, »Zufallszah-len«, näher erläutert.

Die Anzahl der Würfe ist sowohl dem Entwickler als auch dem Benutzerunbekannt, daher kann keine for-Schleife verwendet werden. Das Pro-gramm sieht wie folgt aus:

<html><body><?php

/* Initialisierung */

Abbildung 2.39 »Kleines Einmaleins« in Tabelle

58

Page 60: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Schleifen 2.6

srand((double)microtime()*1000000);$summe = 0;

while ($summe < 25)

$zufallszahl = rand(1,6); // Würfel$summe = $summe + $zufallszahl;echo "Zahl $zufallszahl, Summe $summe<br />";

?></body></html>

Listing 2.25 Datei while.php

Die Bedingung zur Wiederholung muss, wie bei einer Verzweigung, inKlammern stehen. Bei der ersten Prüfung der Bedingung hat $summenoch den Wert 0, deshalb darf die Schleife durchlaufen werden. Inner-halb der Schleife wird die gewürfelte Zufallszahl zur Variablen $summeaddiert. Die gewürfelte Zahl und die aktuelle Zwischensumme werdenausgegeben.

Es wird wiederum überprüft, ob die Summe weiterhin kleiner als 25 ist.Ist dies der Fall, wird die Schleife erneut durchlaufen. Andernfalls wirdmit der Anweisung hinter dem Schleifenende fortgefahren. Falls dortkeine Anweisung mehr steht, ist das Programm zu Ende. Es wird also solange (engl. while) eine Zahl addiert, bis die Bedingung für die Wieder-holung nicht mehr erfüllt ist.

Die Seite könnte aussehen wie in Abbildung 2.40 – natürlich abhängigvon den zufällig ermittelten Werten.

Abbildung 2.40 while-Schleife mit Zufallswerten

59

Page 61: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

2.6.6 do while-Schleife

do while Die do while-Schleife arbeitet wie die while-Schleife, mit einem Unter-schied: die Prüfung für die Wiederholung wird erst am Ende der Schleifeausgeführt. Die Schleife wird also mindestens einmal durchgeführt. DasWürfelprogramm sieht damit wie folgt aus:

<html><body><?php

srand((double)microtime()*1000000);$summe = 0;do

$zufallszahl = rand(1,6);$summe = $summe + $zufallszahl;echo "Zahl $zufallszahl, Summe $summe<br />";

Übung »u_while«

Erstellen Sie ein kleines Computerspiel. Zwei Spieler würfeln gegeneinander(Zufallszahlengenerator); die Würfe jedes Spielers sollen addiert werden.Sobald einer der beiden Spieler oder beide Spieler in einer Spielrunde denWert 25 erreicht oder überschritten haben, ist das Spiel zu Ende (Dateiu_while.php). Der Name des Gewinners soll anschließend ausgegeben wer-den. Die Ausgabe könnte aussehen wie in Abbildung 2.41.

Abbildung 2.41 Übung »u_while«, Spiel

60

Page 62: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Schleifen 2.6

while ($summe < 25);

?></body></html>

Listing 2.26 Datei dowhile.php

Die Schleife wird selbst dann ausgeführt, wenn die Variable $summeschon vor der Schleife den Wert 25 oder mehr hat.

2.6.7 Schleifenabbruch mit break

breakMit Hilfe der Anweisung break, die Ihnen bereits aus der switch/case-Verzweigung bekannt ist, kann eine Schleife vorzeitig beendet werden.Damit wird eine zusätzliche Möglichkeit für eine Schleifensteuerunggeschaffen, um ein Programm lesbarer zu machen.

Im folgenden Beispiel wird wiederum gewürfelt, solange die Summekleiner als 25 ist. Es soll allerdings nun höchstens sechsmal gewürfelt(Sonderfall) und dann abgebrochen werden.

<html><body><?php

srand((double)microtime()*1000000);$summe = 0;$zaehler = 0;

while ($summe < 25)

$zufallszahl = rand(1,6);$summe = $summe + $zufallszahl;$zaehler = $zaehler + 1;echo "Nr. $zaehler, Zahl $zufallszahl,";echo " Summe $summe<br />";if ($zaehler >= 6) break; // Sonderfall

Hinweis

Eine break-Anweisung, die nicht in einem switch-Block steht, aber inner-halb einer Schleife, wird immer gemeinsam mit einer Bedingung auftreten,da der vorzeitige Abbruch einer Schleife nur in einem »Sonderfall« erfolgensollte.

61

Page 63: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

?></body></html>

Listing 2.27 Datei break.php

Es wird ein zusätzlicher Zähler (Variable $zaehler) verwendet. DieseVariable wird zunächst auf 0 gesetzt. Innerhalb der Schleife wird ihrWert stets um 1 erhöht. Sie zählt also die Anzahl der Schleifendurchläufe.Falls dabei die Zahl 6 erreicht beziehungsweise überschritten wird, brichtdie Schleife unmittelbar ab. Dies geschieht auch dann, wenn die Summenoch kleiner als 25 ist. Die Seite sieht aus wie in Abbildung 2.42, natür-lich abhängig von den zufällig ermittelten Werten.

Abbildung 2.42 Beispiel zu break

2.6.8 Schleifenfortsetzung mit continue

continue Die Anweisung continue sorgt für den Abbruch des aktuellen Schleifen-durchlaufs. Die Schleife wird anschließend unmittelbar mit dem nächs-ten Durchlauf fortgesetzt. Ein Programm sieht wie folgt aus:

<html><body><?php

for ($i=1; $i<=15; $i++)

Hinweis

Der Vergleich if ($zaehler == 6) hätte auch zu einem Abbruch geführt,allerdings nur bei einer Erhöhung um 1. Würde man zum Beispiel den Zählerstets um 2 erhöhen, könnte der Wert 6 nicht exakt erreicht werden. DieSchleife würde über die vorgesehene Abbruchstelle hinausgehen. Daherarbeitet man in diesen Fällen gewöhnlich mit Bereichsangaben (>= oder <=).

62

Page 64: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Felder 2.7

if($i>=5 && $i<=12)continue;

echo "Zeile $i<br />";

?></body></html>

Listing 2.28 Datei continue.php

Für die Werte 5 bis 12 wird keine Ausgabe vorgenommen, siehe Abbil-dung 2.43.

Abbildung 2.43 Beispiel zu continue

2.7 Felder

Um eine größere Menge zusammengehöriger Daten zu speichern, kön-nen Sie entweder viele einzelne Variablen (jeweils mit einem eigenenNamen) oder ein Feld von Variablen mit einem einheitlichen Namennutzen. Felder sind dabei zu bevorzugen, da sie eine schnellere und kom-fortablere Verarbeitung bieten. PHP unterstützt zwei Typen von Feldern:

Numerisch indizierte Felder

Numerisch indizierte Felder: Die einzelnen Variablen in einem nume-risch indizierten Feld werden über eine laufende Nummer innerhalbdes Feldes angesprochen.

Assoziative Felder Assoziative Felder (auch Hash-Tabelle genannt): Die einzelnen Variab-len in einem assoziativen Feld werden über eine eindeutige Bezeich-nung innerhalb des Feldes angesprochen.

Die genannten Feldtypen werden in diesem Abschnitt angesprochen.Eine ausführliche Beschreibung finden Sie in Kapitel 9, »Felder«.

63

Page 65: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

Felder können eine oder mehrere Dimensionen haben:

Feldmodell Ein eindimensionales Feld können Sie sich als eine Liste oder alseinen mathematischen Vektor vorstellen. Es könnte sich zum Beispielum eine Preisliste oder die Namensliste der Mitglieder einer Gruppehandeln.

Ein zweidimensionales Feld können Sie sich als eine Tabelle oder alseine mathematische Matrix vorstellen. Dies könnte zum Beispiel derInhalt einer Datenbanktabelle mit verschiedenen Feldern und Daten-sätzen sein. Zweidimensionale Felder existieren in drei Varianten:rein numerisch indiziert, rein assoziativ oder gemischt (numerischindiziert/assoziativ).

Es können auch Felder mit mehr als zwei Dimensionen zum Einsatzkommen. Eine geeignete Modellvorstellung wird mit wachsenderDimensionszahl allerdings immer schwieriger.

2.7.1 Numerisch indizierte Felder

Nehmen wir an, es sei eine Woche lang jeden Tag an einem bestimmtenOrt eine Temperatur gemessen worden. Es stehen somit sieben Tempe-raturwerte zur weiteren Betrachtung und Untersuchung zur Verfügung.Diese Werte werden zunächst in einem numerisch indizierten Feldgespeichert und ausgegeben.

<html><body><?php

$tp = array(17.5, 19.2, 21.8, 21.6, 17.5);$tp[5] = 20.2;$tp[6] = 16.6;for($i=0; $i<=6; $i = $i+1)

echo "Temperatur $i: $tp[$i]<br />";

?></body></html>

Listing 2.29 Datei numerisch.php

In diesem Programm werden zwei häufig eingesetzte Techniken zurErzeugung beziehungsweise Vergrößerung von Feldern gezeigt:

64

Page 66: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Felder 2.7

array() Mit Hilfe der Funktion array() wird die Variable $tp zu einem Feld(engl. array) mit fünf Elementen. Diese Elemente sind automatischdurchnummeriert worden, beginnend bei 0.

Felder können auch einfach durch die Zuweisung einzelner Elementeerzeugt oder vergrößert werden. Dies ist hier mit den beiden Zuwei-sungen $tp[5] = 20.2; und $tp[6] = 16.6; geschehen. Dabei ist diebisherige Nummerierung zu beachten, andernfalls könnten vorhan-dene Elemente überschrieben werden.

Feldindex Ein einzelnes Feldelement sprechen Sie an, indem Sie nach demNamen des Feldes in eckigen Klammern die laufende Nummer desElements angeben. Diese wird auch Index genannt.

Insgesamt hat das Feld nun sieben Elemente. Die Struktur erkennen Siein Tabelle 2.7.

Diese Elemente werden anschließend mit Hilfe einer for-Schleifeuntereinander ausgegeben. Dabei nimmt die Schleifenvariable $i nachein-ander die verwendeten Indexwerte an (0 bis 6). Abbildung 2.44 zeigt dieAusgabe.

Abbildung 2.44 Numerisch indiziertes Feld

Name des Elements Nummer (= Index) des Elements Wert des Elements

$tp[0] 0 17.5

$tp[1] 1 19.2

$tp[2] 2 21.8

$tp[3] 3 21.6

$tp[4] 4 17.5

$tp[5] 5 20.2

$tp[6] 6 16.6

Tabelle 2.7 Numerisch indiziertes Feld

65

Page 67: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

2.7.2 Assoziative Felder

Die Temperaturwerte aus dem vorherigen Abschnitt sollen nun in einemassoziativen Feld angeordnet werden. Die Elemente eines solchen Feldeswerden nicht über eine laufende Nummer, sondern über eine Schlüssel-bezeichnung (engl. key) identifiziert. Dadurch wird es möglich, den Feld-elementen eindeutige Begriffe zuzuordnen und die Suche nach bestimm-ten Feldelementen zu vereinfachen. Zunächst sollen die Werte wiederumgespeichert und ausgegeben werden.

<html><body><?php

$tp = array("Montag"=>17.5, "Dienstag"=>19.2,"Mittwoch"=>21.8);

$tp["Donnerstag"] = 21.6;$tp["Freitag"] = 17.5;$tp["Samstag"] = 20.2;$tp["Sonntag"] = 16.6;

// Ein bestimmtes Elementecho "<p>" . $tp["Montag"] . "</p>";

Übung »u_numerisch«

Es sollen Vorname und Alter von sechs Personen in zwei Feldern gespeichertwerden. Das erste Feld soll die Vornamen enthalten, das zweite Feld die zu-gehörigen Altersangaben. Die Elemente der beiden Felder sollen paarweiseals Tabelle auf dem Bildschirm ausgegeben werden (Datei u_numerisch.php),siehe Abbildung 2.45.

Abbildung 2.45 Ergebnis der Übung »u_numerisch«

66

Page 68: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Felder 2.7

// Tabellenkopfecho "<table border='1'>";echo "<tr><td><b>Wochentag</b></td>";echo "<td><b>Temperatur</b></td></tr>";// Alle Keys und Values aus dem Feldforeach($tp as $name=>$wert)

echo "<tr><td>$name</td>". "<td align='right'>$wert</td></tr>";

echo "</table>";

// Nur alle Values aus dem Feld, zum Summieren$summe = 0;foreach($tp as $wert)

$summe = $summe + $wert;echo "<p>Summe: $summe</p>";

?></body></html>

Listing 2.30 Datei assoziativ.php

Die Ausgabe des Programms zeigt Abbildung 2.46.

Abbildung 2.46 Assoziatives Feld

Die Verwendung assoziativer Felder erscheint zunächst etwas unüber-sichtlich. Wenn Sie sich aber mit der Vorgehensweise vertraut gemacht

67

Page 69: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

haben, können assoziative Felder je nach Problemstellung einige Vorteilemit sich bringen. Es gibt zwei Techniken zur Erzeugung eines Feldes:

Key, Value Mit Hilfe der Funktion array() wird die Variable $tp zu einem Feldmit drei Elementen. Diese Elemente haben eindeutige Schlüsselbe-zeichnungen (Keys) und zugehörige Werte (Values). Diese Paare wer-den einander mit dem Operator => zugeordnet. Der Key muss dabeizwischen doppelte Hochkommata geschrieben werden.

Felder können auch einfach durch die Zuweisung einzelner Elementeerzeugt oder vergrößert werden. Dies ist hier mit den Zuweisungenin der Form $tp["Samstag"] = 20.2; usw. geschehen.

Insgesamt hat das Feld nun sieben Elemente, siehe Tabelle 2.8.

Eine Möglichkeit, ein einzelnes Element eines assoziativen Feldes auszu-geben, ist: echo "<p>" . $tp["Montag"] . "</p>";

Name des Elements Schlüsselbezeichnung (Key) des Elements

Wert (Value)des Elements

$tp["Montag"] Montag 17.5

$tp["Dienstag"] Dienstag 19.2

$tp["Mittwoch"] Mittwoch 21.8

$tp["Donnerstag"] Donnerstag 21.6

$tp["Freitag"] Freitag 17.5

$tp["Samstag"] Samstag 20.2

$tp["Sonntag"] Sonntag 16.6

Tabelle 2.8 Assoziatives Feld

Hinweis

Da der Name des Keys zwischen doppelte Hochkommata geschrieben wer-den muss, ist die Ausgabe innerhalb einer Zeichenkette nicht möglich. Eineder folgenden Vorgehensweisen hätte also nicht zum Erfolg geführt:

Es werden überall doppelte Hochkommata gesetzt. Dadurch wird dieZeichenkette zu früh beendet. Beispiel: echo "<p>$tp["Montag"]</p>";

Es werden statt doppelter Hochkommata bei den Keys einfache Hoch-kommata gesetzt. Dies ist ein Fehler bei der Benutzung des assoziativenFeldes und führt dazu, dass der Index nicht erkannt wird. Beispiel:echo "<p>$tp['Montag']</p>";

Es werden bei der echo-Anweisung einfache Hochkommata gesetzt.Diese Form ist erlaubt, sie liefert aber nur den Namen des Feldelements,nicht jedoch seinen Wert. Beispiel: echo '<p>$tp["Montag"]</p>';

68

Page 70: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Felder 2.7

foreach, asDie foreach-Schleife bietet eine Möglichkeit, alle Elemente eines assozi-ativen Feldes auszugeben.

In der ersten Schleife sorgt die Anweisung foreach($tp as $name=>$wert) dafür, dass bei jedem Schleifendurchlauf jeweils ein einzel-nes Key-Value-Paar in den Variablen $name und $wert bereitgestelltwird. Beide Variablen werden ausgegeben.

In der zweiten Schleife sorgt die Anweisung foreach($tp as $wert)dafür, dass bei jedem Schleifendurchlauf jeweils nur der Value jedesElements in der Variablen $wert bereitgestellt wird. Dieser Wert wirdzum Summieren aller Feldelemente genutzt.

Hinweis

Falls Sie einem bestimmten Key bei der Erzeugung des Feldes oder spätereinen neuen Wert zuordnen, wird nicht etwa ein neues Element hinzuge-fügt, sondern der erste Wert überschrieben. Die folgende Anweisungerzeugt also nur die beiden Feldelemente mit den Keys Montag und Dienstagund den Values 19.2 und 21.8:$tp = array("Montag"=>17.5, "Dienstag"=>19.2,

"Montag"=>21.8);

Übung »u_assoziativ«

Es sollen Vorname und Alter von sechs Personen untersucht werden. Diesesechs Angaben werden in einem assoziativen Feld gespeichert. Die Vorna-men sollen die Keys, die Altersangaben die Values darstellen. Key und Valueder Elemente des Feldes sollen paarweise als Tabelle auf dem Bildschirmausgegeben werden (Datei u_assoziativ.php), siehe Abbildung 2.47.

Abbildung 2.47 Ergebnis der Übung »u_assoziativ«

69

Page 71: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

2.8 Funktionen

Es gibt in PHP zahlreiche vordefinierte Funktionen, die vom Entwicklereingesetzt werden können. Sie werden unter anderem in den Kapiteln 7,»Zeichenketten«, 10, »Datum und Zeit«, und 11, »Mathematische Funkti-onen«, beschrieben. Darüber hinaus hat der Entwickler die Möglichkeit,eigene Funktionen zu schreiben, sogenannte benutzerdefinierte Funktio-nen. Diese haben folgende Vorteile:

Gleiche oder ähnliche Vorgänge müssen nur einmal beschrieben wer-den und können beliebig oft ausgeführt werden.

Modularisierung Programme können modularisiert werden. Dies bedeutet, dass sie inkleinere Bestandteile zerlegt werden können, die übersichtlicher sindund einfacher gewartet werden können.

Eine besondere Variante von Funktionen, die sogenannten rekursivenFunktionen, werden in einem anschaulichen Beispiel in Abschnitt 8.11,»Informationen über den Verzeichnisbaum«, erläutert.

Der Name einer Funktion darf nicht mit einem reservierten Wort iden-tisch sein, also zum Beispiel mit einem Befehl aus der Sprache PHP.

2.8.1 Ein erstes Beispiel

Ein Beispiel für eine einfache benutzerdefinierte Funktion:

<html><head><?php

function trennstrich()

echo "<br />";for ($i=1; $i<=40; $i=$i+1)

echo "-";echo "<br />";

?></head><body><?php

trennstrich();echo "Dies ist ein Programm,";trennstrich();echo "in dem mehrmals";

70

Page 72: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Funktionen 2.8

trennstrich();echo "eine Funktion verwendet wird,";trennstrich();echo "die zu Beginn definiert wurde";trennstrich();

?></body></html>

Listing 2.31 Datei funktion.php

functionEigene Funktionen werden mit Hilfe von function ... () ... defi-niert. Der Name der Funktion folgt nach dem Schlüsselwort function,und in runden Klammern folgen die Parameter, sofern welche vorhan-den sind. Anschließend folgt in geschweiften Klammern der eigentlicheFunktionsrumpf. Häufig erfolgt die Definition einer Funktion im Kopfeines HTML-Dokuments, wie hier bei der Funktion trennstrich().

Die Aufgabe der Funktion trennstrich() ist die Darstellung eines Zeilen-umbruchs, von 40 Bindestrichen und eines weiteren Zeilenumbruchs.Jedes Mal, wenn sie vom eigentlichen Programm im Rumpf des Doku-ments (mit trennstrich()) aufgerufen wird, führt sie die genannte Auf-gabe aus. Die Ausgabe sehen Sie in Abbildung 2.48.

Abbildung 2.48 Funktion »trennstrich()«

Übung »u_funktion«

Erstellen Sie eine Funktion vermerk(), die einen Entwicklervermerk erzeugt:Jedes Mal, wenn die Funktion aufgerufen wird, erscheint Ihr Name in einerTabellenzelle mit Rahmen, wie im Folgenden dargestellt.

71

Page 73: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

2.8.2 Definition, Aufruf und Funktionstypen

Aufruf Der Aufruf einer eigenen oder einer vordefinierten Funktion erfolgt

entweder aus dem Rumpf des Dokuments heraus (im zuvor angegebe-nen Beispiel mit trennstrich()) oder

aus anderen Funktionen heraus.

Definition Dabei ist der Ort der Funktionsdefinition wichtig. Sie können nur Funk-tionen aufrufen, die dem Programm bekannt sind. Sie müssen also

entweder zu den vordefinierten Funktionen gehören oder

im Dokument definiert worden sein (wie im oben angegebenen Bei-spiel) oder

aus eigenen, externen Dateien stammen (siehe Abschnitt 2.8.3).

Eine Funktion

ohne Parameter: führt bei jedem Aufruf immer genau die gleiche Auf-gabe aus (wie im oben angegebenen Beispiel).

mit einem oder mehreren Parametern: führt bei jedem Aufruf inAbhängigkeit von den Parametern ähnliche Aufgaben aus.

mit einem Rückgabewert: führt gleiche oder ähnliche Aufgaben ausund liefert ein Ergebnis an die aufrufende Stelle zurück.

Für den Namen einer Funktion gelten die gleichen Regeln wie für denNamen einer Variablen. Der einzige Unterschied besteht darin, dass

Testen Sie Ihre Funktion mit einem geeigneten Programm, in dem die Funk-tion mehrmals aufgerufen wird (Datei u_funktion.php). Die Ausgabe könnteaussehen wie in Abbildung 2.49.

Abbildung 2.49 Ergebnis der Übung »u_funktion«

72

Page 74: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Funktionen 2.8

Namen von Funktionen nicht mit dem Zeichen $ (Dollar) beginnen dür-fen. Die Regeln wurden bereits in Abschnitt 2.3.1, »Namen«, genannt.

2.8.3 Externe Dateien

Falls der Entwickler bestimmte nützliche Funktionen geschrieben hat,die er in mehreren Programmen verwenden möchte, können diese Funk-tionen auch in externen Dateien untergebracht werden. Diese externenDateien lassen sich mit den Anweisungen require beziehungsweiseinclude in die jeweiligen Programme einbinden.

include, requireDie Anweisungen include und require haben die gleiche Wirkung – miteiner Ausnahme. Falls eine einzubindende Datei nicht gefunden wird:

beendet require das Programm mit einem Fehler

gibt include lediglich eine Warnung aus und das Programm läuft wei-ter

Es gibt auch noch die Anweisungen include_once und require_once.Diese binden ebenfalls externe Dateien ein, wobei darauf geachtet wird,dass eine einmal eingebundene Datei nicht ein zweites Mal eingebundenwird. In einem größeren Projekt, das aus mehreren, größeren Dateienbesteht, ist nicht für jeden Fall zu überschauen, ob eine Datei bereits ein-gebunden wurde.

Beispiele zur Anweisung include finden Sie in Abschnitt 2.8.10,»include-Anweisung«.

2.8.4 Funktionen mit einem Parameter

ParameterEine Funktion mit einem Parameter führt bei jedem Aufruf in Abhängig-keit vom Parameterwert ähnliche Aufgaben aus. Das vorherige Beispielwurde jetzt ein wenig erweitert. Die Funktion erzeugt nun unterschied-lich lange Trennstriche, wie Sie nachfolgend erkennen können:

<html><head><?php

function trennstrich($anzahl)

echo "<br />";for ($i=1; $i<=$anzahl; $i=$i+1)

echo "-";echo "<br />";

73

Page 75: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

?></head><body><?php

trennstrich(30);echo "In diesem Programm";trennstrich(40);echo "sind die Trennstriche";$x = 20;trennstrich($x);echo "unterschiedlich lang";trennstrich($x * 3);

?></body></html>

Listing 2.32 Datei parameter.php

Die Funktion trennstrich() wird insgesamt viermal aufgerufen, jedesMal mit einem anderen Wert in den Klammern hinter dem Funktionsna-men. Dies ist der Parameter; er kann eine Zahl, eine Variable oder dasErgebnis einer Berechnung sein.

Der Parameter wird an die Funktion übergeben. Dort wird dieser Wertin der Variablen $anzahl gespeichert. Der Wert von $anzahl steuert dieAusführung der for-Schleife mit dem Ergebnis, dass die Trennstricheunterschiedlich lang sind. Es wird also bei jedem Aufruf beinahe die glei-che Aktion durchgeführt, in Abhängigkeit vom Wert des Parameters.Abbildung 2.50 zeigt die Ausgabe.

Abbildung 2.50 Ergebnis der Funktion trennstrich() mit Parameter

74

Page 76: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Funktionen 2.8

2.8.5 Funktionen mit mehreren Parametern

MehrereParameter

Falls einer Funktion mehrere Parameter übergeben werden, sind dieAnzahl, der Datentyp (Zahl oder Zeichenkette) und die Reihenfolge derParameter wichtig. Der erste Wert wird an den ersten Parameter, derzweite Wert an den zweiten Parameter übergeben usw. Es folgt ein Bei-spiel für eine eigene Funktion mit mehreren Parametern:

Übung »u_parameter1«

Erweitern Sie die Funktion vermerk() aus Übung u_funktion. Sie soll von ver-schiedenen Entwicklern genutzt werden können. Der Name des Entwicklerswird als Parameter an die Funktion übergeben. Jedes Mal, wenn die Funk-tion aufgerufen wird, erscheint der betreffende Name in einer Tabellenzellemit Rahmen und fester Größe, wie in Abbildung 2.51 dargestellt (Dateiu_parameter1.php).

Testen Sie Ihre Funktion mit einem geeigneten Programm, in dem die Funk-tion mehrmals mit verschiedenen Namen aufgerufen wird.

Abbildung 2.51 Ergebnis der Übung »u_parameter1«

Übung »u_parameter2«

Erstellen Sie eine Funktion quadrat(), die das Quadrat einer Zahl berechnetund ausgibt. Die betreffende Zahl wird als Parameter an die Funktion über-geben. Testen Sie Ihre Funktion mit einem geeigneten Programm, in demdie Funktion mehrmals mit verschiedenen Zahlen aufgerufen wird (Dateiu_parameter2.php). In Abbildung 2.52 sehen Sie ein Beispiel.

Abbildung 2.52 Ergebnis der Übung »u_parameter2«

75

Page 77: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

<html><head><?php

function flexloop($von, $bis, $schritt)

echo "Eine Schleife von $von bis $bis mit"." der Schrittweite $schritt<br />";

for ($i = $von; $i <= $bis; $i = $i + $schritt)echo "$i ";

?></head><body><?php

echo "<p>Nummer 1:<br />";flexloop(5,27,3);echo "<p>Nummer 2:<br />";flexloop(-10,10,4);

echo "<p>Nummer 3:<br />";$x = 100;$y = 200;$z = 10;flexloop($x,$y,$z);

echo "<p>Nummer 4:<br />";flexloop($x,$y,($y-$x)/8);

?></body></html>

Listing 2.33 Datei mehrere.php

Beim Aufruf der Funktion flexloop() müssen jeweils drei Parameterübergeben werden, und zwar durch Kommata voneinander getrennt.Diese werden in der vorliegenden Reihenfolge den Variablen $von, $bisund $schritt zugeordnet.

Die Variablen werden zur Steuerung der for-Schleife in der Funktionverwendet. Es wird also bei jedem Aufruf eine ähnliche Aktion durchge-führt, beeinflusst durch den Wert der Parameter. Die Ausgabe sieht auswie in Abbildung 2.53.

76

Page 78: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Funktionen 2.8

Abbildung 2.53 Funktion mit mehreren Parametern

Übung »u_mehrere1«

Schreiben Sie ein Programm (Datei u_mehrere1.php), in dem eine Funktionmittel() definiert und benutzt wird, die den arithmetischen Mittelwert vondrei Zahlen berechnet und ausgibt. Die drei Zahlen werden der Funktionjeweils als Parameter übergeben. Testen Sie die Funktion mit mehreren ver-schiedenen Aufrufen innerhalb des Programms. Die Ausgabe könnte ausse-hen wie Abbildung 2.54.

Abbildung 2.54 Ergebnis der Übung »u_mehrere1«

Hinweis

Den arithmetischen Mittelwert von drei Zahlen berechnen Sie, indem Sie dieSumme der drei Zahlen durch 3 teilen.

77

Page 79: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

2.8.6 Rückgabewert einer Funktion

Rückgabewert Funktionen mit Rückgabewert dienen dazu, ein Ergebnis zu ermittelnund dieses an die aufrufende Stelle zurückzuliefern. Der zurückgelieferteWert muss entweder in einer Variablen gespeichert oder direkt ausgege-ben werden, andernfalls geht er verloren. Es folgt ein Beispiel für eineFunktion mit einem Rückgabewert:

<html><head><?php

function add($z1, $z2)

$summe = $z1 + $z2;return $summe;

?></head><body><?php

$c = add(3,4); // aufrufende Stelle

Übung »u_mehrere2«

Erweitern Sie die Funktion vermerk() aus Übung u_parameter1. Sie soll vonverschiedenen Entwicklern genutzt werden können. Vorname, Nachnameund Abteilung werden als Parameter an die Funktion übergeben. Jedes Mal,wenn die Funktion aufgerufen wird, erscheint eine Ausgabezeile mit diesenInformationen und der E-Mail-Adresse.

Die E-Mail-Adresse setzt sich wie folgt zusammen: [email protected]. Testen Sie Ihre Funktion mit einem geeignetenProgramm, in dem die Funktion mehrmals mit verschiedenen Informationenaufgerufen wird (Datei u_mehrere2.php). Eine mögliche Ausgabe sehen Sie inAbbildung 2.55.

Abbildung 2.55 Ergebnis der Übung »u_mehrere2«

78

Page 80: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Funktionen 2.8

echo "Summe: $c<br />";

$x = 5;$c= add($x,12); // aufrufende Stelleecho "Summe: $c<br />";

// aufrufende Stelle innerhalb der Ausgabeecho "Summe: " . add(13,2) . "<br />";

// Ausgabe in Zeichenkette, falsch!echo "Summe: add(13,2)";

?></body></html>

Listing 2.34 Datei rueckgabewert.php

Die Funktion add() besitzt die beiden Parameter $z1 und $z2. Innerhalbder Funktion werden diese Parameter addiert und in der Variablen$summe gespeichert.

returnMit Hilfe der Anweisung return wird der Wert an die aufrufende Stellezurückgeliefert und kann dort weiterverarbeitet werden. In den erstenbeiden Fällen wird der Wert in der Variablen $c gespeichert, im drittenFall wird er ohne Zwischenspeicherung direkt ausgegeben. Die Ausgabesehen Sie in Abbildung 2.56.

Abbildung 2.56 Funktion mit Rückgabewert

Hinweise

Eine direkte Ausgabe eines Funktionsergebnisses darf nicht innerhalbeiner Zeichenkette stehen. Die letzte Zeile der Ausgabe zeigt, dass dannnur der Name der Funktion und ihre Parameter genannt werden, dieFunktion aber nicht aufgerufen wird.

79

Page 81: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

2.8.7 Kopie und Referenz

Bei der Übergabe von Parametern an eine Funktion müssen Sie sich nochfolgende Frage stellen: Was passiert, wenn ich in der Funktion einen dersoeben übergebenen Parameter verändere?

PHP bietet hier zwei Möglichkeiten an:

call-by-value Übergabe der Parameter als Kopie (call-by-value): Eine Veränderungder Kopien hat keine Rückwirkung auf das Original. Diese Methodewird zum Beispiel angewendet, wenn die Daten nur in eine Richtungfließen, also nur Werte an die Funktion übergeben werden. Sie wurdebei den bisherigen Programmen für Funktionen angewendet.

call-by-reference Übergabe der Parameter als Referenz auf das Original (call-by-refe-rence): Eine Veränderung hat Rückwirkung auf das Original. DieseMethode wird angewendet, wenn die Funktion mehr als einen Wertermitteln und liefern soll. Über einen Rückgabewert (siehe Abschnitt2.8.6, »Rückgabewert einer Funktion«) könnte nur ein einziger Wertzurückgeliefert werden.

Mit Hilfe der Anweisung return kann eine Funktion auch vorzeitig ver-lassen werden. Dies gilt unabhängig davon, ob sie einen Wert zurücklie-fert oder nicht.

Mit Hilfe der Anweisung return kann nicht nur eine einzelne Variable,sondern auch ein Feld aus einer Funktion zurückgeliefert werden. EinBeispiel: Der Aufruf $x = feldfunc(); sorgt dafür, dass $x zu einem Feldmit mehreren Elementen wird. Dies setzt voraus, dass in der Funktionfeldfunc() eine Anweisung, wie zum Beispiel return $p, existiert und $pein (numerisch indiziertes oder assoziatives) Feld mit mehreren Elemen-ten ist.

Übung »u_rueckgabewert«

Schreiben Sie ein Programm (Datei u_rueckgabewert.php), in dem eine Funk-tion bigger() definiert und aufgerufen wird. Diese Funktion ermittelt diegrößere zweier übergebener Zahlen und liefert diese Zahl zurück. Testen Siedie Funktion mit mehreren verschiedenen Aufrufen innerhalb des Pro-gramms, und geben Sie das Ergebnis zur Kontrolle aus.

Ein Aufruf der Funktion könnte lauten:

$c = bigger(3,4);

Die Ausgabe des Programms wäre in diesem Fall:

Maximum: 4

80

Page 82: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Funktionen 2.8

Beide Methoden sollen zum Vergleich an einem Beispiel dargestellt wer-den. Den Funktionen rtauschen() beziehungsweise vtauschen() wer-den jeweils zwei Parameter übergeben. Innerhalb der Funktionen sollendie beiden übergebenen Parameter miteinander vertauscht werden.

In Abhängigkeit von den verschiedenen angewendeten Methoden wirddieses Tauschen Rückwirkungen auf die Originalvariablen im Hauptpro-gramm haben. Die Werte werden jeweils vor und nach dem Tauschenangezeigt:

<html><head><?php

function vtauschen($a, $b)

$temp = $a;$a = $b;$b = $temp;

function rtauschen(&$a, &$b)

$temp = $a;$a = $b;$b = $temp;

?></head><body><?php

$x = 12; $y = 18;echo "<p>Methode 1, vorher: $x, $y<br />";vtauschen($x,$y);echo "Methode 1, nachher: $x, $y</p>";

$x = 12; $y = 18;echo "<p>Methode 2, vorher: $x, $y<br />";rtauschen($x,$y);echo "Methode 2, nachher: $x, $y</p>";

?></body></html>

Listing 2.35 Datei referenz.php

81

Page 83: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

Methode 1: Der Wert der Variablen $x wird beim Aufruf der Funktionvtauschen() an die Variable $a übergeben. Der Wert der Variablen $ywird an die Variable $b übergeben. Innerhalb der Funktion vtauschen()werden $a und $b getauscht. Da aber nur die Kopien getauscht werden,hat dies keine Auswirkungen auf die Originale $x und $y.

Referenz & Methode 2: Den Unterschied sehen Sie im Funktionskopf functionrtauschen(&$a, &$b). Die Variable $x wird beim Aufruf der Funktionrtauschen() an eine Referenz (Zeichen &) übergeben – dies ist $a. DieVariable $y wird ebenfalls an eine Referenz übergeben – dies ist $b.Innerhalb der Funktion werden die Referenzen vertauscht. Dadurch wer-den auch die Originale $x und $y vertauscht.

Die Ausgabe, jeweils mit den Werten vor und nach der Vertauschung,sieht aus wie in Abbildung 2.57.

Abbildung 2.57 Kopie und Referenz

Felder übergeben Das folgende Programm zeigt, dass bei Feldern die gleichen Möglichkei-ten zur Verfügung stehen. Wird also nur das Original des Feldes an eineKopie übergeben (Methode 1), so wird durch eine Veränderung derKopie des Feldes das Originalfeld nicht verändert. Bei einer Übergabeper Referenz (Methode 2) zeigt sich das gleiche Verhalten wie obenbeschrieben.

<html><head><?php

function vtauschen($f)

$temp = $f[0];$f[0] = $f[1];$f[1] = $temp;

82

Page 84: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Funktionen 2.8

function rtauschen(&$f)

$temp = $f[0];$f[0] = $f[1];$f[1] = $temp;

?></head><body><?php

$f[0] = 12; $f[1] = 18;echo "<p>Methode 1, vorher: $f[0], $f[1]<br />";vtauschen($f);echo "Methode 1, nachher: $f[0], $f[1]</p>";

$f[0] = 12; $f[1] = 18;echo "<p>Methode 2, vorher: $f[0], $f[1]<br />";rtauschen($f);echo "Methode 2, nachher: $f[0], $f[1]</p>";

?></body></html>

Listing 2.36 Datei referenz_feld.php

Übung »u_referenz«

Schreiben Sie ein PHP-Programm (Datei u_referenz.php) mit einer Funktionrechne(). Dieser Funktion werden zwei Zahlen übergeben. Sie soll zweiErgebnisse über die Parameterliste zurückliefern: zum einen die Summe derbeiden übergebenen Zahlen, zum anderen das Produkt der beiden überge-benen Zahlen.

Alle beteiligten Zahlen sollen im Hauptteil des Programms, also außerhalbder Funktion, ausgegeben werden. Verwenden Sie zur Übergabe die zweiteMethode (call-by-reference). Nach einem Funktionsaufruf mit den Parame-tern 5 und 7 und der anschließenden Ausgabe erscheint eine Ausgabe wie inAbbildung 2.58.

Abbildung 2.58 Ergebnis der Übung »u_referenz«

83

Page 85: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

2.8.8 Gültigkeitsbereich von Variablen

Variablen werden auch nach ihrem Gültigkeitsbereich unterschieden.Dies ist der Bereich, in dem die betreffende Variable mit ihrem Wertbekannt ist. Man unterscheidet:

Lokal Lokale Variablen: Diese werden innerhalb einer Funktion definiertund stehen nur innerhalb dieser Funktion zur Verfügung.

Global Globale Variablen: Diese werden außerhalb einer Funktion definiertund stehen nur außerhalb derselben zur Verfügung. Dies ist einUnterschied zu vielen anderen Programmiersprachen.

Superglobal Superglobale Variablen: Bei diesen Variablen handelt es sich um PHP-Systemvariablen. Sie stehen sowohl innerhalb als auch außerhalb vonFunktionen zur Verfügung. Zu ihnen zählt das assoziative Feld$_POST, das die Namen und Werte von Formularfeldern zur Verfü-gung stellt.

Hier einige Regeln im Zusammenhang mit dem Gültigkeitsbereich vonVariablen:

Die Benutzung lokaler Variablen bietet den Vorteil, dass Variablennicht so leicht aus Versehen an weit voneinander entfernten Stellenverändert werden können.

Ein Parameter, der als Kopie an eine Funktion übergeben wird, istdort lokal.

Lokale Variablen gleichen Namens in unterschiedlichen Funktionenoder globale Variablen gleichen Namens haben nichts miteinander zutun.

Falls Sie eine globale Variable innerhalb einer Funktion benutzenmöchten, muss sie dort entweder mit dem Schlüsselwort globalbekannt gemacht oder als Parameter übergeben werden.

Hinweis

Die Variablen der Funktionen eines Programms sollten immer »so lokal wiemöglich« sein:

Zum einen wird die Modularisierung des Programms verbessert, dasheißt die Zerlegung eines Programms in übersichtliche Programmteilemit klar definierten Schnittstellen zwischen den Teilen.

Zum anderen wird die Wiederverwendbarkeit der Funktionen für andereProgramme erleichtert.

84

Page 86: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Funktionen 2.8

Schlüsselwort »global«

Ein Beispiel mit lokalen und globalen Variablen und dem Schlüsselwortglobal:

<html><head><?php

function summiere()

echo "Variable z: $z<br />";global $x;$y = 35;$z = $x + $y;echo "Variable z: $z<br />";

?></head><body><?php

$x = 6;$y = 52;$z = $x + $y;summiere();echo "Variable z: $z";

?></body></html>

Listing 2.37 Datei global.php

In diesem Programm existieren insgesamt fünf unterschiedliche Variablen:

Die beiden Variablen $y und $z in der Funktion summiere() sind nurdort lokal bekannt.

Zum Zeitpunkt des ersten Ausgabebefehls in der Funktion existiert $znoch nicht. Daher kann für $z kein Wert ausgegeben werden.

Anschließend bekommen $y und $z innerhalb der Funktionen einenWert. $z kann nun ausgegeben werden.

Nach Verlassen der Funktion summiere() sind beide Werte nichtmehr verfügbar.

Im Hauptprogramm gibt es insgesamt drei Variablen: $x, $y und $z.Das Schlüsselwort global sorgt dafür, dass $x auch in der Funktionsummiere() mit seinem Wert bekannt ist.

85

Page 87: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

$y und $z sind nur außerhalb von Funktionen bekannt. Sie haben hierauch andere Werte als beispielsweise innerhalb der Funktion sum-miere().

Die Ausgabe des Programms sehen Sie in Abbildung 2.59. Je nach Vor-einstellung des Webservers für die Anzeige von Fehlern, Warnungenund Hinweisen bezüglich der PHP-Programmierung erscheint eineNotice. Zum Thema Voreinstellungen siehe auch Kapitel 6, »Fehlerbehandeln, Sicherheit erhöhen«.

Abbildung 2.59 Lokale und globale Variablen

2.8.9 Variable Parameterlisten

Der Einsatz von Funktionen mit variablen Parameterlisten erhöht dieFlexibilität von Funktionen, allerdings auch den Programmieraufwand.

VariableParameteranzahl

Bisher musste die Anzahl der Parameter bei einem Funktionsaufrufgenau der Anzahl der Parameter entsprechen, die bei der Definition derFunktion vorgegeben wurden. Mit Hilfe der folgenden Funktionen istdies nicht mehr zwingend notwendig:

func_num_args() Die Funktion func_num_args() liefert die Anzahl der übergebenenParameter.

func_get_arg() Die Funktion func_get_arg() liefert einen bestimmten Parameteraus der Parameterliste.

func_get_args() Die Funktion func_get_args() (mit einem s am Ende) liefert einnumerisch indiziertes Feld mit allen übergebenen Parametern.

Das nachfolgende Programm verdeutlicht den Einsatz von func_num_args() und func_get_arg():

<html><body><?php

function addiere()

86

Page 88: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Funktionen 2.8

$anz = func_num_args();echo "<p>Anzahl der Werte: $anz<br />";echo "Werte: ";

$sum = 0;for($i=0; $i<$anz; $i++)

$sum = $sum + func_get_arg($i);echo func_get_arg($i) . " ";

echo "<br />Summe der Werte: $sum</p>";

addiere(2,3,6);addiere(13,26);addiere(65,-3,88,31,12.5,7);

?></body></html>

Listing 2.38 Datei get_arg.php

Die Funktion addiere() wird insgesamt dreimal aufgerufen, jedes Malmit einer anderen Anzahl an Parametern. Diese Anzahl wird mit Hilfevon func_num_args() ermittelt. Sie wird zur Steuerung einer for-Schleife verwendet.

Innerhalb der for-Schleife werden alle gelieferten Parameter mit Hilfevon func_get_arg() ausgegeben und addiert. Nach Beendigung derSchleife wird die Summe der Werte wie in Abbildung 2.60 ausgegeben.

Abbildung 2.60 Variable Parameterlisten mit func_get_arg()

87

Page 89: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

Eine alternative Lösung mit Hilfe der Funktion func_get_args() bietetdas nachfolgende Programm. Die Ausgabe sieht genauso aus.

<html><body><?php

function addiere()

$param = func_get_args();$anz = func_num_args();echo "<p>Anzahl der Werte: $anz<br />";echo "Werte: ";

$sum = 0;for($i=0; $i<$anz; $i++)

$sum = $sum + $param[$i];echo "$param[$i] ";

echo "<br />Summe der Werte: $sum</p>";

addiere(2,3,6);addiere(13,26);addiere(65,-3,88,31,12.5,7);

?></body></html>

Listing 2.39 Datei get_args.php

Mit Hilfe der Anweisung $param = func_get_args(); werden alle Para-meter im Feld $param gespeichert. Die Funktion func_num_args() ermit-telt wiederum die Anzahl der Parameter. Innerhalb der for-Schleife wer-den alle gelieferten Parameter aus dem Feld $param ausgegeben undaddiert.

2.8.10 include-Anweisung

ExterneFunktions-

bibliotheken

Benutzerdefinierte Funktionen, die von mehreren Programmen genutztwerden sollen, können in externe Dateien ausgelagert werden. Mit Hilfeder include-Anweisung wird der Inhalt dieser Dateien in dasjenige Pro-gramm eingebunden, das sie benötigt. Dabei ist zu beachten, dass derProgrammcode in den externen Dateien in vollständige, gültige PHP-Markierungen eingeschlossen sein muss.

88

Page 90: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Funktionen 2.8

Im folgenden Beispiel wird zunächst innerhalb der Datei einbin-den.inc.php eine Funktion maxi() definiert. Diese ermittelt aus den bei-den übergebenen Parametern das Maximum, speichert diesen Wert indie Variable $erg und liefert ihn mit Hilfe der return-Anweisung zurück.

Die return-Anweisung steht im vorliegenden Fall innerhalb des if-Blocks beziehungsweise innerhalb des else-Blocks. Damit wird die Bear-beitung der Funktion unmittelbar unterbrochen, und der Programmab-lauf kehrt zur Aufrufstelle zurück:

<?phpfunction maxi($x, $y)

if ($x > $y)

$erg = $x;return $erg;

else

$erg = $y;return $erg;

?>

Listing 2.40 Datei einbinden.inc.php

Die Funktion wird vom nachfolgenden Programm aufgerufen. Dort wirdzunächst die Datei einbinden.inc.php mit Hilfe der include-Anweisungeingebunden. Damit sind alle Funktionen aus der Datei einbinden.inc.phpim aktuellen Programm bekannt und können verwendet werden.

Hinweis

Es ist zu empfehlen, einer solchen Datei die Endung .inc.php zu geben. Zumeinen ist sie damit als eine Datei erkennbar, die externe Funktionen beinhal-tet. Zum anderen wird sie besser vor einem unberechtigten Aufruf geschützt:

Abhängig von den Einstellungen des Webservers werden Dateien mitbestimmten Endungen einfach auf dem Bildschirm ausgegeben, sodassder Quellcode eingesehen werden kann.

Dateien mit der Endung php werden im Gegensatz dazu vom Webserverals PHP-Code angesehen, intern gelesen und ausgeführt, sodass derQuellcode nicht sichtbar wird.

89

Page 91: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

<html><body><?php

include "einbinden.inc.php";$a = 2;$b = 6;$c = maxi($a, $b);echo "Das Maximum von $a und $b ist $c";

?></body></html>

Listing 2.41 Datei einbinden.php

Die Ausgabe des Programms sehen Sie in Abbildung 2.61.

Abbildung 2.61 Nutzung einer include-Datei

Übung »u_einbinden«

Erstellen Sie eine kleine Funktionsbibliothek mit zwei Funktionen (Dateiu_einbinden.inc.php). Beide Funktionen sollen mit variablen Parameterlistenarbeiten.

Die erste Funktion mit dem Namen mittelwert() soll den arithmeti-schen Mittelwert einer beliebigen Menge von Zahlen berechnen und perRückgabewert zurückliefern. Es muss also die Summe dieser Zahlendurch die Anzahl geteilt werden.

Die zweite Funktion mit dem Namen maximum() soll die größte Zahl auseiner beliebigen Menge von Zahlen berechnen und per Rückgabewertzurückliefern. Dazu ist die nachfolgend beschriebene Vorgehensweisenotwendig.

Zunächst wird die erste übergebene Zahl einer lokalen Variablen (zum Bei-spiel $mx) der Funktion zugewiesen. Anschließend werden alle anderenübergebenen Zahlen mit $mx verglichen. Sollte eine der Zahlen größer als $mxsein, so haben Sie ein neues Maximum gefunden, und dieser Wert wird $mxzugewiesen. Am Ende der Funktion wird $mx zurückgeliefert.

Testen Sie Ihre Bibliothek durch einige Aufrufe der beiden Funktionen mitunterschiedlich vielen Zahlen (Datei u_einbinden.php). Diese Bibliothek kön-nen Sie später erweitern und auch für andere Programme nutzen.

90

Page 92: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Behandlung von Fehlern 2.9

2.9 Behandlung von Fehlern

ExceptionhandlingBei der Behandlung von Fehlern kommt das Konzept des Exceptionhand-lings (Ausnahmebehandlung) zum Einsatz. Es bietet die Möglichkeit,bestimmte Fehler abzufangen. Damit wird es einem Programm ermög-licht, weiterzulaufen, obwohl ein Fehler aufgetreten ist. Sie werdenlediglich informiert, so dass Sie die Fehlerursache abstellen können.

try, throwBeim Exceptionhandling wird der Codebereich, in dem ein Fehler auftre-ten kann, in einen sogenannten try-Block eingeschlossen. Es wird »ver-sucht«, den Code auszuführen. Falls ein definierter Fehler auftritt, wirdein Objekt der Klasse Exception durch die Anweisung throw erzeugt(zum Thema Klassen und Objekte finden Sie in Kapitel 5, »Objektorien-tierung in PHP«, eine ausführliche Beschreibung).

catchAnschließend wird statt des restlichen Codes im try-Block der Code imzugehörigen catch-Block ausgeführt; der Fehler wird somit »abgefan-gen«. Dies erläutere ich am Beispiel eines Programms, zu dem es zweiVersionen gibt: einmal ohne und einmal mit Ausnahmebehandlung.

2.9.1 Ohne Ausnahmebehandlung

Zunächst das Programm ohne Ausnahmebehandlung:

<html><body><?php

/* Für dieses Programm alle Fehler anzeigen */ini_set("error_reporting", 32767);

/* Variable unbekannt */$c = 2 * $a;echo "<p>$c</p>";

/* Division durch 0 */$x = 24;for($y=4; $y>-3; $y--)

$z = $x / $y;echo "$x / $y = $z<br />";

/* Zugriff auf Funktion */fkt();

91

Page 93: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

echo "Ende"?></body></html>

Listing 2.42 Datei exception_ohne.php

Erläuterung:

ini_set() Zunächst wird mit Hilfe der Funktion ini_set() der PHP-Konfigura-tionsparameter error_reporting eingestellt. Dieser bestimmt, wel-che Fehler angezeigt werden und welche nicht. Der Wert 32767 führtdazu, dass der weitaus größte Teil der Fehler angezeigt wird. Mehr zuden Konfigurationsparametern finden Sie in Kapitel 6, »Fehler behan-deln, Sicherheit erhöhen«.

Notice Anschließend wird eine Variable innerhalb eines Ausdrucks verwen-det, die bis zu diesem Zeitpunkt noch unbekannt ist. Darüber werdenSie mit Hilfe einer Notice informiert, siehe Abbildung 2.62.

Abbildung 2.62 Ausgabe ohne Ausnahmebehandlung

92

Page 94: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Behandlung von Fehlern 2.9

Warning Nachfolgend wird die Zahl 24 nacheinander durch die Zahlen 4, 3, 2,1, 0, –1, –2 geteilt. Bei der Division tritt ein Fehler auf, wenn durch 0geteilt wird. Darüber werden Sie mit Hilfe eines Warnings informiert,siehe wiederum Abbildung 2.62.

Fatal Error Als Letztes wird eine unbekannte Funktion aufgerufen. Dies führt zueinem Fatal Error und dem Abbruch des Programms. Daher ist dieletzte Ausgabe mit dem Text »Ende« nicht mehr zu sehen, siehe auchin Abbildung 2.62.

2.9.2 Mit Ausnahmebehandlung

Es folgt das gleiche Programm, diesmal aber mit Ausnahmebehandlung:

Fehlerklasse<html><body><?php

/* Für dieses Programm alle Fehler anzeigen */ini_set("error_reporting", 32767);

/* Variable unbekannt */tryif(!isset($a))

throw new Exception("Variable unbekannt");$c = 2 * $a;echo "<p>$c</p>";

catch(Exception $e)echo $e->getMessage() . "<br />";

/* Division durch 0 */$x = 24;for($y=4; $y>-3; $y--)try

if($y == 0)throw new Exception("Division durch 0");

$z = $x / $y;echo "$x / $y = $z<br />";

catch(Exception $e)

93

Page 95: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

echo $e->getMessage() . "<br />";

/* Zugriff auf Funktion */try

if(!function_exists("fkt"))throw new Exception("Funktion unbekannt");

fkt();catch(Exception $e)

echo $e->getMessage() . "<br />";

echo "Ende"?></body></html>

Listing 2.43 Datei exception_mit.php

Erläuterung:

try Vor der Nutzung der unbekannten Variablen wird mit Hilfe der Funk-tion isset() geprüft, ob die Variable existiert. Das Ganze findet ineinem try-Block statt. Es ist also ein »Versuch«, die Variable zu nut-zen.

throw Falls festgestellt wird, dass die Variable nicht existiert, wird mit Hilfevon throw eine Exception (Ausnahme) erzeugt und »geworfen«, miteinem zugehörigen Text.

catch Diese Exception wird in dem catch-Block »gefangen«, der dem try-Block zugeordnet ist. Bei der Erzeugung der Exception wurde ihr eineMeldung mitgegeben. Diese Fehlermeldung wird mit Hilfe derMethode getMessage() ausgegeben, siehe Abbildung 2.63.

Der Rest des try-Blocks wird nicht mehr bearbeitet.

Das Gleiche findet in diesem Programm noch zweimal statt:

Zunächst wird geprüft, ob durch 0 geteilt werden soll. Ist dies der Fall,so wird eine entsprechende Meldung ausgegeben (siehe wiederumAbbildung 2.63) und mit dem nächsten Schleifendurchlauf fortge-fahren.

94

Page 96: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiele 2.10

function_exists() Anschließend wird mit Hilfe der Funktion function_exists()

geprüft, ob die Funktion existiert. Ist dies nicht der Fall, so wird eineentsprechende Meldung ausgegeben, siehe auch Abbildung 2.63.

Das Programm läuft bis zum »Ende«.

Abbildung 2.63 Ausgabe mit Ausnahmebehandlung

2.10 Beispiele

In diesem Abschnitt finden Sie einige umfangreichere Beispiele, in denenSie Ihre Kenntnisse aus dem Programmierkurs anwenden können. Siebeinhalten keine neuen Programmierelemente, sondern dienen der Dar-stellung des Zusammenspiels der verschiedenen Elemente.

Zur übersichtlichen und einheitlichen Darstellung von Zahlen (zum Bei-spiel in einigen Tabellen dieses Abschnitts) wird zunächst die Formatie-rung von Zahlen eingeführt.

2.10.1 Formatierung von Zahlen

number_format()Die formatierte Ausgabe von Zahlen geschieht mit Hilfe der Funktionnumber_format(). Ein Beispiel hierzu:

<html><body><?php

echo "<p><b>Zahlenformatierung:</b></p>";$d = 12.3 * 3098.55397 * 445.2;echo "<p>Variable d: $d</p>";

95

Page 97: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

echo "<p>Mit Tausenderteilung (englisch), ohneDezimalstellen:<br />". number_format($d) . "</p>";

echo "<p>Mit Tausenderteilung, auf drei Dezimalstellengerundet (englisch):<br />". number_format($d,3) . "</p>";

echo "<p>Mit Tausenderteilung, auf drei Dezimalstellengerundet (deutsch):<br />". number_format($d,3,",",".") . "</p>";

?></body></html>

Listing 2.44 Datei formatierung.php

Abbildung 2.64 zeigt die Bildschirmausgabe.

Abbildung 2.64 Formatierung von Zahlen

Die Funktion number_format() kann mit einem, zwei oder vier Parame-tern aufgerufen werden:

Falls sie mit einem Parameter aufgerufen wird, wird die Zahl mitKomma als Tausendertrennzeichen ausgegeben, und zwar ohne Nach-kommastellen.

Falls sie mit zwei Parametern aufgerufen wird, wird die Zahl mitKomma als Tausendertrennzeichen ausgegeben, und zwar mit derAnzahl an Nachkommastellen, die im zweiten Parameter angegebenist.

96

Page 98: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiele 2.10

Falls sie mit vier Parametern aufgerufen wird, wird die Zahl mit demvierten Parameter als Tausendertrennzeichen, der gewünschtenAnzahl an Nachkommastellen und dem dritten Parameter als Dezi-maltrennung ausgegeben.

2.10.2 Geldanlage

Ein Benutzer besucht die Website einer Bank, die verschiedene Möglich-keiten zur Geldanlage bietet. Eine dieser Möglichkeiten ist die Anlageeines bestimmten Betrags über eine festgelegte Laufzeit. Je länger dasGeld angelegt wird, desto höher ist der Zinssatz. Der Benutzer gibt denangelegten Betrag sowie die Laufzeit ein und erhält als Antwort eineTabelle, in der die Entwicklung seiner Geldanlage von Jahr zu Jahr dar-gestellt wird.

Der Zinssatz in Abhängigkeit von der Laufzeit:

<= 3 Jahre 3%<= 5 Jahre 4%<=10 Jahre 5%>10 Jahre 6%

Das zugehörige Eingabeformular:

<html><body><h2>Geldanlage</h2><p>Geben Sie bitte die folgenden Werte ein:</p><form action="geldanlage.php" method="post">

<p><input name="grundbetrag" />Grundbetrag (in &euro;)</p>

<p><input name="laufzeit" /> Laufzeit (in Jahren)</p><p><input type="submit" /><input type="reset" /></p>

</form></body></html>

Listing 2.45 Datei geldanlage.htm

Das Formular sehen Sie in Abbildung 2.65 (mit Beispieldaten).

Im PHP-Auswertungsprogramm werden zunächst die Eingabewerte zurbesseren Kontrolle wieder ausgegeben. Anschließend wird mit Hilfeeiner mehrfachen Verzweigung der Zinssatz aus der Laufzeit bestimmtund ausgegeben.

97

Page 99: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

Abbildung 2.65 Eingabeformular »Geldanlage«

Danach wird eine Schleife durchlaufen. Für jedes Jahr der Geldanlagegibt es einen Durchlauf der Schleife. Bei jedem Durchlauf wird der bisdahin entstandene Gesamtbetrag berechnet, formatiert und ausgegeben.Das Programm dazu sieht so aus:

<html><body><h2>Geldanlage</h2>

<?php$betrag = $_POST["grundbetrag"];$laufzeit = $_POST["laufzeit"];echo "<p>Grundbetrag: $betrag &euro;<br />";echo "Laufzeit: $laufzeit Jahre<br />";

/* Zinssatz in Abhängigkeit von der Laufzeit */if ($laufzeit <= 3)

$zinssatz = 3;else if ($laufzeit <= 5)

$zinssatz = 4;else if ($laufzeit <= 10)

$zinssatz = 5;else

$zinssatz = 6;echo "Zinssatz: $zinssatz %</p>";?>

<table border="1"><tr>

98

Page 100: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiele 2.10

<td align="right"><b>nach Jahr</b></td><td align="right"><b>Betrag</b></td>

</tr>

<?php/* Anlageberechnung und Ausgabe */for($i=1; $i<=$laufzeit; $i++)

echo "<tr>";echo "<td align='right'>$i</td>";$betrag = $betrag + $betrag * $zinssatz / 100;$ausgabe = number_format($betrag,2,",",".");echo "<td align='right'>$ausgabe &euro;</td>";echo "</tr>";

?></table></body></html>

Listing 2.46 Datei geldanlage.php

Die Ausgabe des oben angegebenen Beispiels sehen Sie in Abbildung2.66.

Abbildung 2.66 Ausgabe »Geldanlage«

99

Page 101: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

2.10.3 Steuertabelle

Es soll eine (stark vereinfachte) Berechnung und Ausgabe von Steuersät-zen, Steuerbeträgen und Nettoeinkommen vorgenommen werden. DerSteuersatz wird aus dem Bruttoeinkommen nach Tabelle 2.9 berechnet.

Der Benutzer kann folgende Daten eingeben:

Startwert: erster Wert, für den die genannten Beträge berechnet wer-den

Endwert: letzter Wert, für den die genannten Beträge berechnet wer-den

Intervall: Abstand der einzelnen Werte voneinander

Der Programmcode des Eingabeformulars:

<html><body><h2>Steuertabelle</h2><p>Geben Sie bitte die folgenden Werte ein:</p><form action="steuertabelle.php" method="post"><p><input name="start" /> Startwert (in &euro;)</p><p><input name="ende" /> Endwert (in &euro;)</p><p><input name="intervall" /> Intervall (in &euro;)</p><p><input type="submit" /><input type="reset" /></p>

</form></body></html>

Listing 2.47 Datei steuertabelle.htm

Das Formular sehen Sie in Abbildung 2.67 (mit Beispieleingaben).

Bruttoeinkommen Steuersatz

<= 12000 12 %

<= 20000 15 %

<= 30000 20 %

> 30000 25 %

Tabelle 2.9 Einkommen und Steuersätze

100

Page 102: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiele 2.10

Abbildung 2.67 Eingabeformular »Steuertabelle«

Im PHP-Auswertungsprogramm wird eine Schleife durchlaufen. Fürjeden Wert des Bruttoeinkommens gibt es einen Durchlauf. Innerhalbder Schleife wird zunächst mit einer mehrfachen Verzweigung aus demBruttoeinkommen der Steuersatz bestimmt. In Abhängigkeit vom Steuer-satz werden der Steuerbetrag und das Nettoeinkommen berechnet. Allevier Informationen werden formatiert und ausgegeben. Die Ausgabegeschieht in einer Tabelle mit vier Spalten:

Bruttoeinkommen in Euro

Steuersatz in Prozent

Steuerbetrag in Euro

Nettoeinkommen in Euro

Das Programm:

<html><body><h2>Steuertabelle</h2>

<table border="1"><tr>

<td align="center"><b>Gehalt</b></td><td align="center"><b>Steuersatz</b></td><td align="center"><b>Steuerbetrag</b></td><td align="center"><b>Netto</b></td>

</tr>

101

Page 103: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

<?phpfor($brutto = $_POST["start"];

$brutto <= $_POST["ende"];$brutto = $brutto + $_POST["intervall"])

/* Berechnung des Steuersatzes */if($brutto <= 12000)

$satz = 12;else if($brutto <= 20000)

$satz = 15;else if($brutto <= 30000)

$satz = 20;else

$satz = 25;

$steuerbetrag = $brutto * $satz / 100;$netto = $brutto – $steuerbetrag;echo "<tr>";echo "<td align='right'>"

. number_format($brutto,2,",",".")

. " &euro;</td>";echo "<td align='right'>"

. number_format($satz,1,",",".")

. " %</td>";echo "<td align='right'>"

. number_format($steuerbetrag,2,",",".")

. " &euro;</td>";echo "<td align='right'>"

. number_format($netto,2,",",".")

. " &euro;</td>";echo "</tr>";

?>

</table></body></html>

Listing 2.48 Datei steuertabelle.php

Die Ausgabe des oben angegebenen Beispiels sehen Sie in Abbildung2.68.

102

Page 104: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiele 2.10

Abbildung 2.68 Ausgabe »Steuertabelle«

2.10.4 Bestimmung des Ostersonntags

OstersonntagIn diesem Abschnitt soll eine Funktion ostersonntag() zur Bestimmungdes Termins des Ostersonntags in einem vorgegebenen Jahr entwickeltwerden. Auf Basis des Ostersonntags können alle beweglichen Feiertageeines Bundeslandes berechnet werden. Eine Liste der (beweglichen undfesten) Feiertage wird häufig im Zusammenhang mit Terminplanungs-programmen benötigt (siehe das Beispiel in Abschnitt 10.8, »Beispiel Fei-ertagsberechnung«).

Die Funktion ostersonntag() soll in der Funktionsbibliothek ostersonn-tag.inc.php bereitgestellt werden. Sie soll mit Hilfe eines Formulars(Datei ostersonntag.htm) und eines PHP-Programms (Datei ostersonn-tag.php) getestet werden.

Im Formular werden vom Benutzer in zwei Eingabefeldern zwei Jahres-zahlen angegeben. Das Programm liefert eine Tabelle, in der zu jedemJahr im angegebenen Jahresbereich der jeweilige Termin des Ostersonn-tags ausgegeben wird. Falls der Benutzer eine Eingabe wie in Abbildung2.69 vornimmt, …

103

Page 105: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

Abbildung 2.69 Eingabe »Jahresbereich«

… wird die Tabelle in Abbildung 2.70 geliefert.

Abbildung 2.70 Ausgabe der Ostersonntage im Bereich 2008 bis 2015

Ostern ist stets am ersten Sonntag nach dem ersten Vollmond des Früh-lings. So hat es das erste Kirchenkonzil im Jahr 325 n. Chr. festgelegt,und dies gilt bis heute. Im Jahr 1800 entwickelte der deutsche Mathema-tiker Carl Friedrich Gauß (1777 – 1855) eine Formel zur Berechnung desOstersonntags. Sie ist so genau, dass erst für das Jahr 8202 ein Fehler auf-tritt.

104

Page 106: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiele 2.10

Seine Formel: Ostern fällt im Jahr J auf den (e+D+1)-ten Tag nach dem21. März, wobei gilt:

d = ((15 + J/100 – J/400 – (8 * J/100 + 13) / 25) mod 30 + 19 * (J mod19)) mod 30

Falls d = 29, so ist D = 28.

Falls d = 28 und J mod 17 >= 11, so ist D = 27.

Falls d weder 28 noch 29, so ist D = d.

e = (2 * (J mod 4) + 4 * (J mod 7) + 6 * D + (6 + J/100 – J/400 – 2) mod7) mod 7

Zur Umsetzung in ein Programm müssen Sie Folgendes wissen:

mod entspricht dem Operator Modulo (%) aus PHP. Dies ist also derganzzahlige Rest einer Division.

Alle vorkommenden Divisionen (zum Beispiel J/100) sind Ganzzahl-divisionen, die Stellen hinter dem Komma werden abgeschnitten.Zum Abschneiden können Sie die mathematische Funktion floor()benutzen. Der Ausdruck 1952/100 ergibt den Wert 19.52 (mit Nach-kommastellen). Der Ausdruck floor(1952/100) ergibt den Wert 19(ohne Nachkommastellen, also eine Ganzzahldivision).

Die Funktion ostersonntag() in der Bibliothek ergibt sich wie folgt:

<?phpfunction ostersonntag($j, &$t, &$m)

// Berechnung von klein d$d = ((15 + floor($j/100) – floor($j/400)

– floor((8 * floor($j/100) + 13) / 25)) % 30+ 19 * ($j % 19)) % 30;

// Berechnung von groß Dif ($d==29)

$D = 28;else if ($d == 28 && $j%17 >= 11)

$D = 27;else

$D = $d;

// Berechnung von klein e$e = (2 * ($j%4) + 4 * ($j%7) + 6 * $D

+ (6 + floor($j/100) – floor($j/400) – 2) % 7) % 7;

105

Page 107: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

// Berechnung von Tag und Monat// Rückgabe der Werte per Referenz$m = "03";$t = 21 + $e + $D + 1;if ($t > 31)

$m = "04";$t = $t – 31;

if($t < 10)

$t = "0" . $t;?>

Listing 2.49 Datei ostersonntag.inc.php

Das Jahr wird über den Parameter $j an die Funktion geliefert. $t und $msind Referenzen für die Variablen für Tag und Monat. Die Werte stehennach Aufruf der Funktion an der Aufrufstelle zur Verfügung. Innerhalbder Funktion wird das Ergebnis in einzelnen Schritten bestimmt:

Der Wert von $d wird gemäß der oben angegebenen Formel errech-net.

Der Wert von $D ergibt sich mit Hilfe einer mehrfachen Verzweigungaus $d.

Der Wert von $e wird gemäß der oben angegebenen Formel errech-net.

Falls der errechnete Tag nicht mehr im Monat März liegt, müssen Tagund Monat auf den entsprechenden Tag im Monat April umgerechnetwerden. Beispiel: Aus dem 36.03. wird der 05.04.

Die Zahlen werden in Text umgewandelt, mit führenden Nullen beiden einstelligen Zahlen.

Das Eingabeformular für den Benutzer:

<html><body><h2>Ostersonntag</h2><p>Bitte geben Sie zwei Jahreszahlen ein<br />und senden Sie das Formular ab:</p><form action="ostersonntag.php" method="post"><p><input name="anfang" /> Erste Jahreszahl</p><p><input name="ende" /> Zweite Jahreszahl</p><p><input type="submit" />

106

Page 108: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiele 2.10

<input type="reset"></p></form></body></html>

Listing 2.50 Datei ostersonntag.htm

Die beiden Jahreszahlen werden in den Feldern anfang und ende einge-geben. Das PHP-Programm zur Erzeugung der Tabelle:

<html><body><h2>Ostersonntag</h2><?php

// Einbinden der Funktionsbibliothekinclude "ostersonntag.inc.php";// Größere Jahreszahl zuerst? Tauschen!$anfang = $_POST["anfang"];$ende = $_POST["ende"];if ($anfang > $ende)

$temp = $anfang;$anfang = $ende;$ende = $temp;

echo "<table border='1'>";echo "<tr><td><b>Jahr</b></td>"

. "<td><b>Datum</b></td></tr>";

// Schleife über alle Jahreszahlenfor ($jahr=$anfang; $jahr<=$ende; $jahr++)

ostersonntag($jahr, $tag, $monat);echo "<tr><td>$jahr</td>"

. "<td>$tag.$monat.$jahr</td></tr>";echo "</table>";

?></body></html>

Listing 2.51 Datei ostersonntag.php

107

Page 109: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programmierkurs2

Die Funktionsbibliothek wird eingebunden; somit steht die Funktionostersonntag() zur Verfügung. Falls der Benutzer die beiden Jahreszah-len in der falschen Reihenfolge eingegeben hat, werden sie getauscht. Ineiner Schleife wird die Funktion ostersonntag() für jeden Wert vonanfang bis ende aufgerufen. In den beiden Variablen $tag und $monatsind per Referenz nach jedem Aufruf die Werte für den Tag und denMonat des betreffenden Jahres gespeichert. Diese beiden Werte werdenausgegeben.

108

Page 110: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

3 Daten senden und auswerten

Dieses Kapitel zeigt Ihnen, auf welch vielfältige und komfortable WeiseSie dem Programmbenutzer ermöglichen können, Informationen an denWebserver zu übermitteln. Zudem erläutere ich die Auswertung dieserInformationen und zeige Ihnen, wie Sie Ihre Programme im Internet ver-öffentlichen können.

Im Programmierkurs habe ich bereits einfache Formulare angesprochen.Durch Eingabe von Daten in ein Eingabefeld und das anschließendeAbsenden des Formulars wurden sie an den Webserver übermittelt.Neben dem dabei verwendeten einzeiligen Texteingabefeld gibt es eineReihe weiterer Formularelemente, die eine sichere und fehlerfreieBenutzung beziehungsweise Übermittlung der Daten stark vereinfachen.Sie lassen sich in drei große Gruppen unterteilen:

Textelemente

Auswahlelemente

Aktionselemente

3.1 Textelemente

Zu den Textelementen gehören die Ihnen bereits bekannten, einzeiligenTexteingabefelder, die mehrzeiligen Texteingabefelder, die Passwortein-gabefelder sowie die versteckten Elemente.

Sie können alle Textelemente mit Werten vorbelegen. Dies kann dieBenutzung vereinfachen, falls in einem Feld ein bestimmter Wert beson-ders häufig vorkommt. Beim Zurücksetzen eines Formulars wird dieserWert eingesetzt.

3.1.1 Einzeilige Texteingabefelder

<input type="text" />

Ein einzeiliges Texteingabefeld (<input type="text" /> oder einfach<input />) dient der Übermittlung kleinerer Textinformationen (zum

109

Page 111: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

Beispiel des Namens oder der Adresse) oder einzelner Zahlenwerte. Eskann über die folgenden Eigenschaften verfügen:

name name: zur eindeutigen Kennzeichnung bei der Auswertung in einemPHP-Programm

size size: zur Darstellung in einer bestimmten Breite innerhalb des Einga-beformulars

maxlength maxlength: zur Begrenzung der Menge der Zeichen, die eingegebenwerden können

value value: zur Vorbelegung des Eingabefeldes

readonly readonly: zum Verhindern der Eingabe; im Zusammenhang mit PHPselten benötigt

Ein Beispiel mit unterschiedlichen einzeiligen Texteingabefeldern:

<html><body><h2>Einzeilige Texteingabefelder</h2><form action = "text.php" method = "post">

<p><input name="eins" size="40" /> Feld Eins</p><p><input name="zwei" size="10"

maxlength="5" /> Feld Zwei</p><p><input name="drei" value="Inhalt Drei" /> Feld Drei</p><p><input name="vier" value="Inhalt Vier"

readonly="readonly" /> Feld Vier</p><p><input type = "submit" /><input type = "reset" />

</form></body></html>

Listing 3.1 Datei text.htm

Erläuterung:

Das Feld Eins dient der Eingabe eines längeren Textes; die Größebeträgt 40.

Das Feld Zwei dient der Eingabe von maximal fünf Zeichen undwurde daher auch in der Darstellungsgröße auf den Wert 10beschränkt.

110

Page 112: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Textelemente 3.1

Das Feld Drei wurde mit dem Text Inhalt Drei vorbelegt. Falls derBenutzer keine Änderungen vornimmt, wird dieser Text als Wertgesendet.

Das Feld Vier wurde mit dem Text Inhalt Vier vorbelegt. Der Benut-zer kann keine Änderungen vornehmen, dieser Text wird als Wertgesendet.

Das Formular mit einer Beispieleingabe sehen Sie in Abbildung 3.1.

Abbildung 3.1 Verschiedene Texteingabefelder

Das PHP-Auswertungsprogramm:

<html><body><?php

echo "Eins: " . $_POST["eins"] . "<br />";echo "Zwei: " . $_POST["zwei"] . "<br />";echo "Drei: " . $_POST["drei"] . "<br />";echo "Vier: " . $_POST["vier"];

?></body></html>

Listing 3.2 Datei text.php

Die Auswertung zeigt Abbildung 3.2.

111

Page 113: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

Abbildung 3.2 Auswertung der verschiedenen Texteingabefelder

3.1.2 Mehrzeilige Texteingabefelder

<textarea> Ein mehrzeiliges Texteingabefeld (<textarea> ... </textarea>) dientder Übermittlung umfangreicher Textinformationen (zum Beispiel vonKommentaren oder Diskussionsbeiträgen). Es sollte über die folgendenEigenschaften verfügen:

name name: zur eindeutigen Kennzeichnung bei der Auswertung in einemPHP-Programm

cols cols: zur Festlegung einer bestimmten Breite innerhalb des Eingabe-formulars

rows rows: zur Festlegung einer bestimmten Höhe innerhalb des Eingabe-formulars

Es kann mit einem Text vorbelegt werden. Außerdem ist die Eigenschaftreadonly verfügbar. Eine Textarea wird in verschiedenen Browsernunterschiedlich angezeigt. In manchen Browsern wird ein fester Scroll-Balken angezeigt, in anderen nur bei Bedarf. In Firefox 7 können dieBenutzer die Textarea über die vorgegebene Anzahl an Zeilen und Spal-ten hinaus vergrößern. Dazu muss am Anfasspunkt unten rechts (sieheAbbildung 3.3) mit der Maus gezogen werden.

Ein Beispiel mit unterschiedlichen mehrzeiligen Texteingabefeldern:

<html><body><h2>Mehrzeilige Texteingabefelder</h2><form action = "textarea.php" method = "post">

<p><textarea name="eins" cols="10" rows="3"></textarea>Feld Eins</p>

<p><textarea name="zwei" cols="30" rows="5">Hier steht schon etwas</textarea> Feld Zwei</p>

<p><input type = "submit" /><input type = "reset" /></p>

112

Page 114: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Textelemente 3.1

</form></body></html>

Listing 3.3 Datei textarea.htm

Im Unterschied zum input-Element handelt es sich bei textarea umeinen Container mit Anfangs- und Endmarkierung. Daher findet sich derWert des Formularelements (und eine eventuell vorhandene Vorbele-gung) zwischen den beiden Markierungen und nicht als Eigenschaft desElements. Das Formular sehen Sie in Abbildung 3.3.

Abbildung 3.3 Zwei Textareas

Das PHP-Auswertungsprogramm:

<html><body><?php

echo "Eins: " . $_POST["eins"] . "<br />";echo "Zwei: " . $_POST["zwei"];

?></body></html>

Listing 3.4 Datei textarea.php

Die Auswertung zeigt Abbildung 3.4.

113

Page 115: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

Abbildung 3.4 Auswertung der Textareas

3.1.3 Passworteingabefeld, verstecktes Element

<input type="password" />

Ein Passworteingabefeld (<input type="password" />) ist ein speziali-siertes, einzeiliges Texteingabefeld. Es verfügt zusätzlich über die Eigen-schaft, den eingegebenen Text unlesbar darzustellen. Wie der Nameschon sagt, dient es meist der Eingabe und Übertragung eines Passworts(oder anderer geheim zu haltender Informationen).

Zum Webserver übertragen wird der vom Benutzer eingegebene Origi-naltext. Ein Abhören der Leitung würde daher das Passwort offenbaren.Falls diese Möglichkeit erschwert werden soll, kann das Passwort (undauch andere Informationen) verschlüsselt übertragen werden.

<input type="hidden" />

Ein verstecktes Element (<input type="hidden" />) erscheint nicht aufdem Bildschirm und kann vom Benutzer nicht bearbeitet werden. Esdient der versteckten Übertragung zusätzlicher Daten an den Webserver.

Ein Beispiel: Ein Benutzer meldet sich auf einer Website mit seinemNamen an. Der Name wird aus dem Anmeldeformular an ein erstes PHP-Programm übertragen. Von diesem PHP-Programm aus soll ein zweitesPHP-Programm aufgerufen werden, das ebenfalls den Namen des Benut-zers benötigt. Mit Hilfe eines versteckten Elements kann dieser Namevom ersten PHP-Programm zum zweiten PHP-Programm übertragenwerden, ohne dass eine weitere Eingabe notwendig ist. Dieses Beispielsoll nun zusammen mit einer Passworteingabe umgesetzt werden.Zunächst das Anmeldeformular:

<html><body><h2>Anmeldung</h2><form action = "pwhidden_a.php" method = "post">

<p><input name="ben" maxlength="10" />Benutzername (max. 10 Zeichen)</p>

<p><input type="password" name="pw" maxlength="6" />Passwort (max. 6 Zeichen)</p>

<p><input type = "submit" />

114

Page 116: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Textelemente 3.1

<input type = "reset" /></p></form></body></html>

Listing 3.5 Datei pwhidden.htm

Der Benutzername darf maximal 10 Zeichen umfassen und wird mit demFormularelement ben gesendet. Das Passwort darf maximal 6 Zeichenumfassen und wird mit dem Formularelement pw gesendet. Das Formu-lar (mit Beispieleintrag) sehen Sie in Abbildung 3.5.

Abbildung 3.5 Passworteingabe

Das erste PHP-Programm:

<html><body><h2>Seite 1</h2><form action = "pwhidden_b.php" method = "post"><?php

echo "<p>Name: " . $_POST["ben"] . "</p>";echo "<input type='hidden' name='benzwei'

value='" . $_POST["ben"] . "' />";if($_POST["pw"]=="bingo")

echo "<p>Zugang erlaubt</p>";else

echo "<p>Zugang eigentlich nicht erlaubt ...</p>";?>

<input type="submit" /></form></body></html>

Listing 3.6 Datei pwhidden_a.php

115

Page 117: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

VersteckteÜbertragung

Hier wird zum einen der Name des Benutzers sichtbar auf den Bildschirmgeschrieben. Zum anderen wird er als Wert des versteckten Elementseingetragen. Dieses trägt den Namen benzwei und befindet sich inner-halb eines weiteren Formulars. Das übertragene Passwort wird ebenfallsuntersucht. Die Ausgabe der Seite 1 sehen Sie in Abbildung 3.6.

Abbildung 3.6 Nach der erfolgreichen Anmeldung

Das Absenden dieses Formulars überträgt den Namen und den Wert desversteckten Elements zum nächsten PHP-Programm:

<html><body><h2>Seite 2</h2><?php

echo "Name: " . $_POST["benzwei"];?></body></html>

Listing 3.7 Datei pwhidden_b.php

Hier steht der Benutzername ebenfalls zur Verfügung, ohne dass derBenutzer ihn noch einmal eintragen muss. Die Ausgabe der Seite 2 zeigtAbbildung 3.7.

Abbildung 3.7 Nach der Weitergabe des Benutzernamens

116

Page 118: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Auswahlelemente 3.2

Somit ist diese Methode nur sehr bedingt geeignet, um geheim zu hal-tende Daten zu übertragen. Man kann nie sicher sein, ob ein angemelde-ter Benutzer nicht zwischendurch seinen Arbeitsplatz verlässt und damitanderen Personen die Möglichkeit eröffnet, den HTML-Quelltext zubetrachten.

3.2 Auswahlelemente

Auswahlelemente erleichtern dem Benutzer die Bedienung. Dadurchverringern sie gleichzeitig die Möglichkeit, Fehler bei der Eingabe zumachen. Falls möglich, sind sie den Textfeldern vorzuziehen, da derMehraufwand im PHP-Programm für das Abfangen der fehlerhaften Ein-gaben in keinem Verhältnis zum Mehraufwand der HTML-Codierung derAuswahlfelder steht. Bei den Auswahlelementen unterscheidet man:

einfache Auswahlelemente wie Radiobutton-Gruppen oder das einfa-che Auswahlmenü, bei denen der Benutzer genau einen Eintrag aus-wählen kann

mehrfache Auswahlelemente wie Kontrollkästchen oder das mehrfa-che Auswahlmenü, bei denen der Benutzer mehrere Einträge auswäh-len kann

Einfache Auswahlelemente sollten Sie vorbelegen. Auf diese Weise kön-nen Sie verhindern, dass ein Formularelement ohne Wert übertragenwird. Dies verringert gleichzeitig den Aufwand im PHP-Programm.

3.2.1 Radiobutton-Gruppe

<input type="radio" />

Eine Auswahl kann zum Beispiel über eine Gruppe von Optionsschaltfel-dern, auch Radiobuttons genannt (<input type="radio" />), getroffenwerden.

<html><body><p>Bitte treffen Sie jeweils eine Auswahl<br />und senden Sie das Formular ab:</p>

Hinweis

Falls allerdings im Browser der HTML-Quelltext des ersten PHP-Programmsbetrachtet wird, so ist das hidden-Element inklusive seines Werts lesbar.

117

Page 119: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

<form action = "radio.php" method = "post"><h3>Reiseziel</h3><p><input type="radio" name="rziel" value="Gomera"checked="checked" /> Wandern auf Gomera<br />

<input type="radio" name="rziel" value="Lanzarote" />Sonnen auf Lanzarote<br />

<input type="radio" name="rziel"value="Fuerteventura" /> Surfen auf Fuerteventura</p>

<h3>Hoteltyp</h3><p><input type="radio" name="htyp" value="Drei"checked="checked" /> Drei-Sterne-Hotel<br />

<input type="radio" name="htyp" value="Vier" />Vier-Sterne-Hotel</p>

<p><input type = "submit" /><input type = "reset" /></p>

</form></body></html>

Listing 3.8 Datei radio.htm

Radiobutton-Gruppen

In diesem Formular werden zwei Gruppen von Radiobuttons dargestellt.Die Elemente einer Gruppe haben den gleichen Namen, dadurch wirdeine logische Zusammengehörigkeit hergestellt. Optisch werden die bei-den Gruppen durch Überschriften voneinander getrennt.

checked Innerhalb der ersten Gruppe kann der Betrachter ein Reiseziel auswäh-len, innerhalb der zweiten Gruppe einen Hoteltyp. In beiden Gruppen istein Element vorbelegt: Dafür sorgt die Eigenschaft checked mit demWert checked.

Nach Absenden des Formulars erhält der Benutzer eine Antwort vomWebserver mit der Anzahl der Angebote für die von ihm gewählten Kri-terien. Das Formular, nach Bedienung durch den Benutzer, sehen Sie inAbbildung 3.8.

118

Page 120: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Auswahlelemente 3.2

Abbildung 3.8 Radiobuttons

Die Antwort wird durch das folgende Programm geliefert:

<html><body><?php

echo "Sie möchten also nach " . $_POST["rziel"];echo " in ein " . $_POST["htyp"] . "-Sterne-Hotel<br />";if ($_POST["rziel"] == "Gomera")

if ($_POST["htyp"] == "Drei") $ang = 7;else $ang = 1;

else if ($_POST["rziel"] == "Lanzarote")

if ($_POST["htyp"] == "Drei") $ang = 12;else $ang = 2;

else

if ($_POST["htyp"] == "Drei") $ang = 5;else $ang = 4;

119

Page 121: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

echo "Dazu haben wir $ang Angebote";?></body></html>

Listing 3.9 Datei radio.php

Der gemeinsame Name (Eigenschaft name) der ersten Optionsgruppe istrziel. Nach Absenden des Formulars steht dadurch die Variable$_POST["rziel"] mit dem Wert (value) des vom Benutzer ausgewähltenEintrags im PHP-Programm zur Verfügung. Falls er zum Beispiel Wandernauf Gomera auswählt, wird $_POST["rziel"] der Wert Gomera zugewie-sen.

Der gemeinsame Name der zweiten Optionsgruppe ist htyp. Falls derBenutzer beispielsweise Drei-Sterne-Hotel auswählt, wird der Varia-blen $_POST ["htyp"] der Wert Drei zugewiesen.

Aus den Informationen in den Variablen wird im PHP-Programm mitHilfe einer geschachtelten Verzweigung die Anzahl der vorliegendenAngebote ermittelt und in der Variablen $ang gespeichert. Der Wert die-ser Variablen wird dem Betrachter zusammen mit einer Bestätigung sei-ner Eingabedaten zurückgesandt. Die Antwort auf die obige Eingabezeigt Abbildung 3.9.

Abbildung 3.9 Nach Auswertung der Radiobuttons

3.2.2 Einfaches Auswahlmenü

Einfache Auswahlmenüs (select-Menüs) erfüllen den gleichen Zweckwie Gruppen von Radiobuttons. Besonders bei zahlreichen Auswahlmög-lichkeiten zeichnen sie sich durch ihren geringeren Platzbedarf innerhalbeines Formulars aus. Zum Vergleich soll daher nun das oben genannteBeispiel mit Hilfe von Auswahlmenüs dargestellt werden. Es kann in bei-den Fällen das gleiche PHP-Programm angefordert werden.

<html><body>

120

Page 122: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Auswahlelemente 3.2

<p>Bitte treffen Sie jeweils eine Auswahl<br />und senden Sie das Formular ab:</p><form action = "radio.php" method = "post">

<p><select name="rziel"><option value="Gomera">

Wandern auf Gomera </option><option value="Lanzarote" selected="selected">

Sonnen auf Lanzarote </option><option value="Fuerteventura">

Surfen auf Fuerteventura </option></select> Reiseziel</p>

<p><select name="htyp"><option value="Drei" selected="selected">

Drei-Sterne-Hotel </option><option value="Vier">

Vier-Sterne-Hotel </option></select> Hotel-Typ</p>

<p><input type = "submit" /><input type = "reset" /></p>

</form></body></html>

Listing 3.10 Datei select.htm

select, selectedZu den Unterschieden: Im Dokument erscheinen zwei aufklappbareMenüs (<select> </select>), in denen jeweils schon eine Auswahlmög-lichkeit voreingestellt ist (Eigenschaft selected mit dem Wert selected).Die Namen der beiden Auswahlmenüs sind rziel und htyp, der Wert(Eigenschaft value) wird über die jeweils vom Benutzer ausgewählteOption eingestellt. Das PHP-Programm radio.php verarbeitet diese Infor-mationen genauso wie bei den Radiobuttons.

option

Das Formular sieht im Startzustand wie in Abbildung 3.10 aus.

Hinweis

Falls im Formular die Eigenschaft value weggelassen wird, wird als Wert derdargestellte Text der ausgewählten Option (zwischen <option> und</option>) übermittelt.

121

Page 123: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

Abbildung 3.10 Zwei select-Menüs

3.2.3 Kontrollkästchen

<input type="checkbox" />

Mit Hilfe eines Kontrollkästchens (<input type="checkbox" />) kann derBenutzer eine einfache Ja-/Nein-Auswahl treffen. Soll ein Kontrollkäst-chen bereits vorbelegt sein, so wird die Eigenschaft checked mit demWert checked hinzugefügt. Falls mehrere Kontrollkästchen zusammenverwendet werden, hat der Benutzer die Möglichkeit, keinen, einen odermehrere Einträge aus einer zusammengehörigen Gruppe auszuwählen.Ein Beispiel:

<html><body><p>Wünschen Sie in Ihrem Zimmer:</p><form action = "check.php" method = "post">

<p><input type="checkbox" name="cb"value="Bad" checked="checked" /> Bad</p>

<p><input type="checkbox" name="cm"value="Meeresblick" /> Meeresblick</p>

<p><input type="checkbox" name="cz"value="Zimmertresor" /> Zimmertresor</p>

<p><input type = "submit" /><input type = "reset" /></p>

</form></body></html>

Listing 3.11 Datei check.htm

In diesem Formular kann der Betrachter drei voneinander unabhängigeEigenschaften seines Hotelzimmers auswählen. Nach Absenden des For-mulars bekommt er eine Antwort vom Webserver mit einer Bestätigungseiner Auswahl. Abbildung 3.11 zeigt das Formular.

122

Page 124: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Auswahlelemente 3.2

Abbildung 3.11 Kontrollkästchen

Die Antwort liefert das folgende Programm:

<html><body><?php

echo "<p>Danke für Ihre Anfrage, wir reservieren:</p>";if (isset($_POST["cb"]))

echo "Zimmer mit " . $_POST["cb"]. ", Aufpreis 10 &euro;/Tag<br />";

if (isset($_POST["cm"]))echo "Zimmer mit " . $_POST["cm"]

. ", Aufpreis 15 &euro;/Tag<br />";if (isset($_POST["cz"]))

echo "Zimmer mit " . $_POST["cz"]. ", Aufpreis 5 &euro;/Tag";

?></body></html>

Listing 3.12 Datei check.php

Die Namen der drei Kontrollkästchen werden wiederum zu Variablendes PHP-Programms. Sie haben hier eine doppelte Funktion.

Existenz, isset() Zum einen wird mit Hilfe der Funktion isset() überprüft, ob dasjeweilige Kontrollkästchen vom Benutzer ausgewählt wurde. Falls ja,existiert die betreffende Variable beziehungsweise das betreffendeElement des assoziativen Feldes für das PHP-Programm. Das Ergebnisder Abfrage if (isset($_POST["checkboxname"])) ist wahr, und diedarauf folgende Anweisung wird ausgeführt.

123

Page 125: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

Zum anderen beinhaltet die Variable einen Wert (Eigenschaft value).Dieser Wert kann im Programm zum Beispiel zur Ausgabe genutztwerden, wie im oben gezeigten Programm geschehen.

Falls das oberste Kontrollkästchen als einziges angekreuzt wurde, siehtdie Antwort aus wie in Abbildung 3.12.

Abbildung 3.12 Auswertung der Kontrollkästchen

3.2.4 Mehrfaches Auswahlmenü

<select multiple="multiple">

Den gleichen Zweck wie Gruppen von Kontrollkästchen erfüllen mehrfa-che Auswahlmenüs (<select multiple="multiple"> ... </select>).Auch hier gilt: Besonders bei zahlreichen Auswahlmöglichkeiten zeich-nen sie sich durch ihren geringeren Platzbedarf innerhalb eines Formu-lars aus. Zum Vergleich soll das oben gezeigte Beispiel nun mit Hilfeeines mehrfachen Auswahlmenüs dargestellt werden:

<html><body><p>Wünschen Sie in Ihrem Zimmer:</p><form action = "multiple.php" method = "post">

<p><select multiple="multiple" name="zusatz[]"><option value="Bad, Aufpreis 10 &euro;/Tag">Bad</option><option value="Meeresblick, Aufpreis 15 &euro;/Tag"selected="selected"> Meeresblick</option><option value="Zimmertresor, Aufpreis 5 &euro;/Tag"selected="selected"> Zimmertresor</option>

</select></p>

<p><input type = "submit" /><input type = "reset" /></p>

</form></body></html>

Listing 3.13 Datei multiple.htm

124

Page 126: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Auswahlelemente 3.2

Formular-elementfeld

Bei einem mehrfachen Auswahlmenü kann der Benutzer mit Hilfe der(Strg)-Taste (getrennte Einträge) beziehungsweise (ª) (benachbarte Ein-träge) seine Wahl treffen. Damit eine Auswertung durch PHP möglich ist,muss das Formularelement mit name= "zusatz[]" als Feld gekennzeich-net werden. Das Formular sehen Sie in Abbildung 3.13.

Abbildung 3.13 Select-Menü für eine Mehrfachauswahl

Die Antwort dazu sieht aus wie in Abbildung 3.14.

Abbildung 3.14 Auswertung des Select-Menüs für eine Mehrfachauswahl

Die Auswertung durch ein PHP-Programm:

<html><body><?php

echo "<p>Danke für Ihre Anfrage, wir reservieren:</p>";echo "<p>";for($i=0; $i<sizeof($_POST["zusatz"]); $i++)

if (isset($_POST["zusatz"][$i]))echo "Zimmer mit "

. $_POST["zusatz"][$i] . "<br />";

125

Page 127: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

echo "</p>";?></body></html>

Listing 3.14 Datei multiple.php

Auch hier wird die Funktion isset() verwendet, um die Existenz einerVariablen zu prüfen. Bei $_POST handelt es sich bekanntlich um ein asso-ziatives Feld. Die Daten des Formularelements zusatz werden außerdemin einem numerisch indizierten Feld geliefert. Daher ist das Feldelement$_POST["zusatz"] wiederum ein Feld.

Jedes Element dieses Feldes ist nur über die Angabe von zwei Indizeserreichbar: Zunächst muss der Name des assoziativen Feldelements ange-geben werden (zusatz), anschließend der Index des numerisch indizier-ten Feldes (0, 1, 2, …).

Falls einer oder mehrere Einträge ausgewählt wurden, existiert für PHPdas Feldelement $_POST["zusatz"]. Dessen aktuelle Größe kann mit derFunktion sizeof() ermittelt werden.

Falls genau ein Eintrag ausgewählt wurde, existiert für PHP nur dasFeldelement $_POST["zusatz"][0]. Es beinhaltet den Wert des aus-gewählten Eintrags.

Falls mehrere Einträge ausgewählt wurden, existieren für PHP dieFeldelemente $_POST["zusatz"][0], $_POST["zusatz"][1] usw. –entsprechend der Anzahl der ausgewählten Einträge. Sie beinhaltender Reihe nach die Werte der ausgewählten Einträge.

3.3 Aktionselemente

Zu den Aktionselementen gehören die bereits bekannten Buttons zumAbsenden und Zurücksetzen sowie der allgemeine Button.

3.3.1 Absenden und Zurücksetzen

Submit-Button Diese Elemente wurden bereits in den bisherigen Formularen verwen-det. Der Button zum Absenden (engl. submit) dient dem Übermittelnvon Namen und Werten der Formularelemente sowie dem Aufruf deszugehörigen PHP-Auswertungsprogramms.

126

Page 128: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Aktionselemente 3.3

Reset-ButtonDer Button zum Zurücksetzen (engl. reset) dient dem Herstellen desUrsprungszustands des Formulars, falls beispielsweise fehlerhafte Ein-träge gemacht wurden. Sofern ein Formularelement vorbelegt war, wirddiese Vorbelegung wiederhergestellt.

Die Beschriftung der beiden Buttons unterscheidet sich je nach Browserund Sprache des Benutzers. Alle Browser weisen für die verschiedenenSprachen jeweils Vorbelegungen für die Beschriftungen auf. Dies hat denVorteil, dass sich die Beschriftungen an die Umgebung des Benutzersanpassen.

Button-Beschriftung

Falls Sie jedoch Ihre Buttons abhängig von Ihrem Programm und einheit-lich für jeden Benutzer beschriften wollen, können Sie der Eigenschaftvalue einen Wert zuweisen. Dies könnten zum Beispiel die Beschriftun-gen Anmeldung, Login, Daten senden oder ähnliche sein, um demBenutzer zu verdeutlichen, welche Aktion er auslösen kann.

Die Buttons können auch einen Namen erhalten. Diese Technik wird ver-wendet, falls Sie das Formular und das PHP-Programm innerhalb einerDatei unterbringen möchten. Weitere Informationen hierzu finden Sie inAbschnitt 3.4.3, »Formular und Programm in einer Datei«.

Formularkontrollieren

Weitere Möglichkeiten ergeben sich durch den Einsatz der SkriptspracheJavaScript zur Prüfung der Formularinhalte. Dabei werden die Daten aufdem Rechner des Benutzers auf Fehler hin überprüft, bevor sie über dasInternet versendet werden. Diese Aktion sollte spätestens bei der Betäti-gung des Absende-Buttons ausgelöst werden.

Der Benutzer wird dabei durch möglichst genaue Meldungen auf seinefehlerhaften oder unvollständigen Einträge aufmerksam gemacht.Dadurch wird er beim Ausfüllen unterstützt. Außerdem wird die Über-tragung der Daten über das Internet (und damit unnötiger Netzverkehr)verhindert, solange diese für das auswertende PHP-Programm noch nichtvollständig sind. Ein Beispiel soll den Einsatz von JavaScript verdeutli-chen. Im Beispiel werden beschriftete Buttons zum Absenden undZurücksetzen verwendet:

<html><head><script type="text/javascript">function fcheck()

if (document.anm.ben.value.length < 4)

127

Page 129: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

alert("Der Benutzername muss 4-10 Zeichen haben!");return(false);

else if (document.anm.pw.value.length < 4)

alert("Das Passwort muss 4-6 Zeichen haben!");return(false);

return true;

</script></head><body><h2>Anmeldung</h2><form name="anm" action="submit_reset.php" method="post"

onSubmit="return fcheck();"><p><input name="ben" maxlength="10" />

Benutzername (4-10 Zeichen)</p><p><input name="pw" type="password"

maxlength="6" /> Passwort (4-6 Zeichen)</p><p><input type="submit" value="Login" /><input type="reset" value="Einträge löschen" /></p>

</form></body></html>

Listing 3.15 Datei submit_reset.htm

In das Formular sollen ein Benutzername (mindestens 4 Zeichen, höchs-tens 10 Zeichen) und ein Passwort (mindestens 4 Zeichen, höchstens 6Zeichen) eingetragen werden. Die maximale Länge wird durch die Eigen-schaft maxlength kontrolliert, die minimale Länge durch eine JavaScript-Funktion.

Event Handler Das Formular hat einen Namen (anm). Dieser Name wird von der Java-Script-Funktion zur Identifikation benötigt. Außerdem benutzt das For-mular einen sogenannten Event Handler (onSubmit). Falls der Benutzerdas Ereignis (engl. event) Absenden (engl. submit) auslöst, wird zunächstdie JavaScript-Funktion fcheck() aufgerufen. Das Formular zeigt Abbil-dung 3.15.

128

Page 130: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Aktionselemente 3.3

Abbildung 3.15 Formular mit Kontrolle der Eingabewerte

document … valueDie Funktion fcheck() wurde im Kopf des Dokuments definiert. Inner-halb der Funktion wird überprüft, ob der vom Benutzer eingetrageneWert (engl. value) des Formularelements ben (document.anm.ben) eineLänge von weniger als vier Zeichen hat. Falls ja, erscheint eine entspre-chende Meldung auf dem Bildschirm. Anschließend gibt die Funktionden Wert false (logisch falsch) an die aufrufende Stelle zurück. DieÜberprüfung des Passworts geschieht analog. Die beiden möglichen Feh-lermeldungen sehen Sie in den Abbildung 3.16 und Abbildung 3.17.

Abbildung 3.16 JavaScript-Kontrolle der Länge des Benutzernamens

Abbildung 3.17 JavaScript-Kontrolle der Länge des Passworts

129

Page 131: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

Daten nur voll-ständig senden

Falls eine der beiden Überprüfungen den Wert false als Wert der Funk-tion fcheck() zurückliefert, sorgt der Ausdruck return fcheck() dafür,dass das Formular nicht abgesendet wird. Es werden also keine unvoll-ständigen Daten über das Netz übertragen. Falls die Einträge lang genugwaren, wird die Funktion fcheck() bis zum Ende bearbeitet und lieferttrue zurück. Dies sorgt dafür, dass das Formular mit seinen Einträgengesendet wird. Das PHP-Auswertungsprogramm gibt hier zur Kontrolleden eingetragenen Benutzernamen aus:

<html><body><?php

echo "Name: " . $_POST["ben"];?></body></html>

Listing 3.16 Datei submit_reset.php

3.3.2 Allgemeine Buttons

Allgemeine Buttons (<input type="button" />) werden meist zum Aus-lösen von JavaScript-Code verwendet. Im Zusammenhang mit PHP erlau-ben sie es beispielsweise, das gleiche Formular mit unterschiedlichenDaten abzusenden. Im folgenden Beispiel können sich Benutzer auf einerWebsite anmelden. Dabei wird zwischen zwei Arten von Benutzernunterschieden:

Registrierte Benutzer müssen ihren Namen nicht mehr angeben, aberein Passwort. Damit gelangen sie zu einem geschützten Bereich mitspeziellen Informationen.

Nicht registrierte Benutzer müssen weder Namen noch Passwortangeben. Damit gelangen die Benutzer lediglich zu einem allgemeinzugänglichen Bereich.

Das Formular:

<html><head><script type="text/javascript">function login(jsben)

document.anm.ben.value = jsben;document.anm.submit();

130

Page 132: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Aktionselemente 3.3

function gast()

document.anm.ben.value = "";document.anm.submit();

</script></head>

<body><h2>Anmeldung</h2><form name="anm" action="button.php"

method="post" onSubmit="gast();"><p><input type="hidden" name="ben" /></p>

<table border="1"><tr>

<td><b>Name</b></td><td><b>Passwort</b></td><td><b>Reg. Benutzer</b></td>

</tr>

<tr><td>Peter</td><td><input name="pw1" type="password"

size="12" /></td><td><input type="button" value="Login"

onClick="login('Peter');" /></td></tr>

<tr><td>Julia</td><td><input name="pw2" type="password"

size="12" /></td><td><input type="button" value="Login"

onClick="login('Julia');" /></td></tr>

<tr><td>Dirk</td><td><input name="pw3" type="password"

size="12" /></td><td><input type="button" value="Login"

onClick="login('Dirk');" /></td>

131

Page 133: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

</tr>

</table><p><input type="submit" value="Login als Gast" /><input type="reset" /></p></form></body></html>

Listing 3.17 Datei button.htm

submit() Innerhalb einer Tabelle sind die registrierten Benutzer eingetragen.Jedem Benutzer stehen ein eigenes Eingabefeld für sein Passwort und eineigener Anmelde-Button zur Verfügung. Der Name muss nicht mehr ein-getragen werden. Bei Betätigung des eigenen Anmelde-Buttons wird dieJavaScript-Funktion login() aufgerufen. An diese Funktion wird derName des Benutzers übermittelt. Mit document.anm.ben.value=...wird innerhalb der Funktion der Name als Wert des versteckten Formu-larelements ben zugewiesen. Anschließend wird das Formular abgesen-det (document.anm.submit()).

Unterhalb der Tabelle gibt es einen »gewöhnlichen« Absende-Button zurAnmeldung als Gast. Bei Betätigung des Absende-Buttons wird die Java-Script-Funktion gast() aufgerufen. Innerhalb der Funktion wird derWert des versteckten Formularelements ben auf eine leere Zeichenkettegesetzt. Anschließend wird das Formular abgesendet. Das Formularsehen Sie in Abbildung 3.18.

Abbildung 3.18 Anmelden über verschiedene Buttons

132

Page 134: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Aktionselemente 3.3

Das PHP-Auswertungsprogramm:

<html><body><?phpif ($_POST["ben"] == "Peter")

if ($_POST["pw1"] == "Hamburg")echo "Spezielle Informationen für

Peter<br />und<br />";else

echo "Falsches Passwort für Peter<br />nur<br />";else if ($_POST["ben"] == "Julia")

if ($_POST["pw2"] == "Berlin")echo "Spezielle Informationen für

Julia<br />und<br />";else

echo "Falsches Passwort für Julia<br />nur<br />";else if ($_POST["ben"] == "Dirk")

if ($_POST["pw3"] == "Dresden")echo "Spezielle Informationen für Dirk<br />und<br />";

elseecho "Falsches Passwort für Dirk<br />nur<br />";

echo "Allgemeine Informationen für beliebige Benutzer";?></body></html>

Listing 3.18 Datei button.php

Falls es sich um einen der drei registrierten Benutzer handelt, ist derWert der Variablen $_POST["ben"] mit dem betreffenden Namen belegt.Im entsprechenden Zweig der mehrfachen Verzweigung wird das zuge-hörige Passwort überprüft. Bei Eingabe des richtigen Passworts stehendem Benutzer zusätzlich individuelle Informationen zur Verfügung,siehe Abbildung 3.19.

133

Page 135: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

Abbildung 3.19 Login als registrierter Benutzer

Falls man sich als Gast angemeldet hat, ist der Wert der Variablen$_POST["ben"] mit einer leeren Zeichenkette belegt. Keiner der Fälleinnerhalb der Verzweigung trifft zu. Es werden nur die allgemeinenInformationen ausgegeben, wie Sie in Abbildung 3.20 sehen.

Abbildung 3.20 Login als Gast

3.4 Weitere Möglichkeiten

In diesem Abschnitt stelle ich über die reinen Formularelemente hinausweitere Möglichkeiten zum Senden und Empfangen von Daten vor. Ichzeige Ihnen zusätzlich Einsatzmöglichkeiten für die Skriptsprache Java-Script und die Formatierungen mit Hilfe von Cascading Style Sheets (CSS).

3.4.1 Auswertung in anderem Frame

Frame, target In vielen Fällen werden zum Aufbau von Websites Frames verwendet.Die besondere Problematik für PHP kann darin bestehen, die eingegebe-nen Formulardaten in einem der übrigen Frames auszuwerten. Dazuwird die Formulareigenschaft target verwendet – ähnlich wie beiHyperlinks, deren Ziel in einem anderen Frame liegt. Im Unterschied zuden bisherigen Programmen haben Sie dadurch die Möglichkeit, die ein-gegebenen Daten und das von PHP ausgewertete Ergebnis gleichzeitig zusehen.

Im nachfolgenden Beispiel wird ein Frameset mit zwei Frames definiert.Der obere Frame beinhaltet das Eingabeformular mit zwei Eingabefel-

134

Page 136: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Weitere Möglichkeiten 3.4

dern für zwei Zahlen, der untere Frame zunächst eine leere Datei. Nachdem Eintragen von zwei Zahlen und dem Absenden werden diese Zahlenvon einem PHP-Auswertungsprogramm addiert. Das Ergebnis erscheintdann im unteren Frame. Sowohl Eingabe als auch Ausgabe sind sichtbar.Es können unmittelbar weitere Berechnungen ausgeführt werden.Zunächst die Frame-Steuerdatei:

<html><frameset rows="*,2*">

<frame src="frame_ein.htm" name="eingabe" /><frame src="frame_aus.htm" name="ausgabe" />

</frameset></html>

Listing 3.19 Datei frame.htm

Der obere Frame erhält den Namen eingabe, der untere Frame denNamen ausgabe. Diese Angaben werden für die Zielangabe des Formu-lars benötigt. Das Eingabeformular für den oberen Frame:

<html><body><form action="frame_aus.php" method="post" target="ausgabe">

<p><input name="z1" /> Zahl 1</p><p><input name="z2" /> Zahl 2</p><p><input type="submit" value="Addieren" /></p>

</form></body></html>

Listing 3.20 Datei frame_ein.htm

Durch die Angabe target="ausgabe" sorgen Sie dafür, dass das Ergebnisder Auswertung im unteren Frame erscheint. Das PHP-Auswertungspro-gramm:

<html><body><?php

$erg = $_POST["z1"] + $_POST["z2"];echo "Summe aus Zahl 1 und Zahl 2: $erg";

?></body></html>

Listing 3.21 Datei frame_aus.php

135

Page 137: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

Die beiden Frames mit Formular und Antwort sehen Sie in Abbildung 3.21.

Abbildung 3.21 Auswertung in einem anderen Frame

Eine Darstellung mit neuer Registerkarte, falls bei der Eigenschaft targetzum Beispiel aus statt ausgabe steht, sehen Sie in Abbildung 3.22.

Abbildung 3.22 Auswertung in neuer Registerkarte

3.4.2 Felder von Formularelementen

Beim mehrfachen Auswahlmenü haben wir bereits mit einem Feld alsNamen für ein Formularelement gearbeitet. Dies ermöglichte die Aus-wertung mehrerer Einträge.

Formular-elementfeld

Felder können generell zur Auswertung größerer Mengen von Formular-elementen eingesetzt werden. Dies lohnt sich vor allem, wenn die For-mularelemente ähnlich sind und eine ähnliche Auswertung verlangen.

Hinweis

Falls im Formular mit der Eigenschaft target auf einen unbekannten Frameverwiesen wird, öffnet sich ein neues Browserfenster beziehungsweiseeine neue Registerkarte im Browser. Hier wird das Ergebnis der Auswertungdargestellt. Dies kann je nach Entwurf der Website auch ein erwünschterEffekt sein.

136

Page 138: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Weitere Möglichkeiten 3.4

Bei der Bearbeitung großer Datenmengen (zum Beispiel innerhalb einerDatenbank) stößt man häufig auf dieses Problem.

Im folgenden Beispiel geht es um das Ausfüllen einer Anwesenheitsliste.Zunächst wird eine Liste derjenigen Personen auf dem Bildschirm ausge-geben, die zu einem bestimmten Termin erscheinen sollen. Diese Listewird hier aus einem Feld erzeugt, in der Praxis könnte sie aus einerDatenbank stammen.

In der Liste kann angekreuzt werden, wer tatsächlich anwesend war.Anschließend wird das Ergebnis zum Webserver zurückgesandt; die tat-sächliche Anwesenheit wird in der Datenbank gespeichert (hier wird sienur zur Kontrolle ausgegeben). Zunächst die in beide Programmteile ein-gebundene Datenquelle:

<?php/* Ergebnis einer Datenbankabfrage */$person = array("287"=>"P. Mertens",

"836"=>"A. Schuster","886"=>"T. Steger","527"=>"U. Baumann","952"=>"U. Petersen","663"=>"S. Maier");

?>

Listing 3.22 Datei elementfeld.inc.php

Die Datenquelle kann mit Hilfe einer Datenbankabfrage ermittelt und ineinem assoziativen Feld gespeichert werden. Im vorliegenden Fall wirddas Feld künstlich generiert. Es folgt das Eingabeformular:

<html><body><h2>Kontrolle der Anwesenheit</h2><form action="elementfeld_b.php" method="post"><?php

include "elementfeld.inc.php";echo "<table border='1'>";echo "<tr><td><b>ID</b></td><td><b>Name</b></td>";echo "<td><b>Anwesend</b></td></tr>";

/* Bearbeitung des ganzen Feldes */foreach($person as $id=>$name)

echo "<tr>";echo "<td>$id</td>";

137

Page 139: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

echo "<td>$name</td>";echo "<td><input type='checkbox' name='pe[$id]'></td>";echo "</tr>";

echo "</table>";

?><p><input type="submit" value="Anwesenheit speichern" /></p></form></body></html>

Listing 3.23 Datei elementfeld_a.php

Es wird eine Tabelle mit den Identifikationsnummern (ID) und denNamen der Personen ausgegeben. Hinter jedem Namen erscheint einKontrollkästchen, in dem angekreuzt werden kann, ob die betreffendePerson anwesend war. Die Namen dieser Kontrollkästchen sind Ele-mente des Feldes pe, zum Beispiel pe[287], pe[836]. Das Formularsehen Sie in Abbildung 3.23.

Abbildung 3.23 Formular mit Feld von Formularelementen

Das PHP-Auswertungsprogramm:

<html><body><h2>Kontrolle der Anwesenheit</h2>

138

Page 140: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Weitere Möglichkeiten 3.4

<?phpinclude "elementfeld.inc.php";echo "<table border='1'>";echo "<tr><td><b>ID</b></td><td><b>Name</b></td>

<td><b>Aktion</b></td></tr>";

/* Bearbeitung des ganzen Feldes */foreach($person as $id=>$name)

echo "<tr><td>$id</td><td>$name</td>";if (isset($_POST["pe"][$id]))

echo "<td>wurde gespeichert</td></tr>";else

echo "<td>&nbsp;</td></tr>";echo "</table>";

?></body></html>

Listing 3.24 Datei elementfeld_b.php

Zunächst wird wiederum die Datenquelle eingebunden. Bei jedem Ele-ment des Feldes wird geprüft, ob das zugehörige Element des Feldes$_POST["pe"] existiert, also ob das betreffende Kontrollkästchen ange-kreuzt wurde. Falls ja, wird diese Information gespeichert (hier nur aus-gegeben). Die Ausgabe ist in Abbildung 3.24 dargestellt.

Abbildung 3.24 Auswertung eines Feldes von Formularelementen

139

Page 141: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

3.4.3 Formular und Programm in einer Datei

Bisher wurden das Formular und das PHP-Programm in getrenntenDateien gespeichert. Zunächst wird dem Benutzer das Formular präsen-tiert. Er füllt es aus und sendet es ab. Anschließend wird ihm durch einPHP-Programm in einer anderen Datei eine Antwort geliefert.

In vielen Fällen erweist es sich als günstiger, sowohl das Formular alsauch das bearbeitende PHP-Programm innerhalb der gleichen Dateiunterzubringen. Ein Programm kann sich auf diese Weise selbst Datenzusenden.

Alles ineiner Datei

Dieses Verfahren kommt zum Beispiel bei einer Eingabemaske für eineDatenbank zum Einsatz. Der Benutzer trägt einen Datensatz ein, sendetihn an die Datenbank und erhält als Antwort eine Bestätigung des Ein-trags sowie das gleiche Formular zurück. Er kann sofort den nächstenDatensatz eingeben. Falls er mit der Eingabe mehrerer Datensätze fertigist, kann er zu einer anderen Datei wechseln.

Dazu müssen Sie nur als Ziel des Formulars den Namen der gleichen Dateieintragen. Das Gleiche erreichen Sie, wenn Sie das Attribut action weg-lassen. Im folgenden Beispiel demonstriere ich diese nützliche Technik:

<html><body><form action = "einedatei.php" method = "post"><?php

if (isset($_POST["gesendet"]))

echo "<p><font color='#ff0000'>Sie haben folgenden Namen eingegeben: ". $_POST["vn"] . " " . $_POST["nn"]. "</font></p><hr />";

?><p>Bitte geben Sie einen Namen ein<br />und senden Sie das Formular ab:</p>

<p><input name = "nn" /> Nachname</p><p><input name = "vn" /> Vorname</p><p><input type = "submit" name = "gesendet" /><input type = "reset" /></p>

</form></body></html>

Listing 3.25 Datei einedatei.php

140

Page 142: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Weitere Möglichkeiten 3.4

isset()Zu Beginn des Programms wird mit Hilfe der Abfrage if (isset($_POST["gesendet"])) festgestellt, ob es sich um den ersten Aufrufhandelt (die Variable $_POST["gesendet"] existiert nicht) oder um denAufruf nach einer Eingabe (die Variable $_POST["gesendet"] existiert).

Bei einem Aufruf nach einer Eingabe existiert die Variable, denn mit denDaten aus den Eingabefeldern wurde auch der Name des Absende-But-tons gesendet. Als Folge dieser Namensvergabe existiert ab dem zweitenAufruf des Programms die Variable $_POST["gesendet"]. Daherbekommt der Benutzer die Meldung: Sie haben folgenden Namen einge-geben: ... als Bestätigung seiner Eingabe.

Der erste Aufruf führt zu der Ausgabe in Abbildung 3.25.

Abbildung 3.25 Erster Aufruf

Nach dem Ausfüllen und Absenden des Formulars ergibt sich eine Aus-gabe wie in Abbildung 3.26.

Hinweis

Während der Testphase möchten Sie deutlich sehen, wie sich der erste Auf-ruf und weitere Aufrufe voneinander unterscheiden. Ein Aktualisieren derDatei im Browser führt nicht zu einem neuen ersten Aufruf, sondern zurWiederholung des letzten Aufrufs. Wechseln Sie daher zu einer anderenSeite und anschließend wieder zurück zur Seite einedatei.php, oder betätigenSie hinter der URL in der Adresszeile des Browsers die Taste (¢). Dieserzeugt einen neuen ersten Aufruf.

141

Page 143: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

Abbildung 3.26 Zweiter Aufruf

3.4.4 Submit über Hyperlink, CSS

Häufig passen die etwas einfach gestalteten Absende-Buttons nicht zumrestlichen Aussehen einer professionell aufbereiteten Website. DieUmleitung der Absendefunktion über einen Hyperlink gibt Ihnen dieMöglichkeit, den Hyperlinktext in Schriftart, Größe, Farbe usw. indivi-duell zu gestalten. Durch die Formatierung des Textes mit Hilfe von Cas-cading Style Sheets (CSS) erweitern sich Ihre Möglichkeiten. Nachfol-gend ein Beispiel hierzu:

<html><head><link rel="stylesheet" type="text/css" href="linkcss.css">

</head><body><form name="zahlen" action="linkcss.php" method="post"><p><input name="z1" /> Zahl 1</p><p><input name="z2" /> Zahl 2</p>

</form><a href="javascript:document.zahlen.submit();">Addieren</a></body></html>

Listing 3.26 Datei linkcss.htm

142

Page 144: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Weitere Möglichkeiten 3.4

Im Kopf des Dokuments ist ein Verweis zu einer externen CSS-Datei mitFormatierungsangaben notiert. Diese Formatierungsangaben werden aufdas gesamte Dokument angewendet.

Kein Submit-Button

Das Formular besitzt keinen Absende-Button. Stattdessen gibt es imDokument (nicht notwendigerweise innerhalb des Formulars) einenHyperlink. Falls dieser betätigt wird, so wird mit Hilfe von JavaScript diesubmit-Funktion für das Formular aufgerufen. Dazu ist es notwendig,dem Formular einen Namen (hier: zahlen) zu geben.

CSS-DefinitionEs folgt die Definition der Formatvorlagen in einer externen CSS-Datei:

body font-family:Verdana; font-size:10pt;color:#636363; background-color:#d3d3d3

a:link color:#636363a:visited color:#636363a:hover color:#636363; background-color:#a3a3a3

Listing 3.27 Datei linkcss.css

Zunächst werden einige Formate für das Dokument insgesamt festgelegt:

Schriftart: Verdana

Schriftgröße: 10 Punkt

Textfarbe: #636363 (Dunkelgrau)

Hintergrundfarbe: #d3d3d3 (Hellgrau)

Die Hyperlinks werden speziell formatiert:

Farbe für normale Hyperlinks: #636363 (Dunkelgrau, wie normalerText)

Farbe für bereits besuchte Hyperlinks: #636363 (Dunkelgrau, wie nor-maler Text)

Farbe für Hyperlinks, die vom Mauszeiger überstrichen werden(Hover-Effekt): #a3a3a3 (Mittelgrau)

Das formatierte Formular sehen Sie in Abbildung 3.27.

Das PHP-Auswertungsprogramm verwendet die gleiche CSS-Datei, sodass der Website ein einheitliches Aussehen verliehen wird. Die Ausgabeerfolgt somit wiederum Dunkelgrau auf Hellgrau. Auch der HyperlinkZurück zum Eingabeformular entspricht in seinem Verhalten (Hover-Effekt) und seinem Aussehen dem Absendehyperlink.

143

Page 145: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

Abbildung 3.27 Formular mit CSS und JavaScript

<html><head><link rel="stylesheet" type="text/css" href="linkcss.css">

</head><body><?php

$erg = $_POST["z1"] + $_POST["z2"];echo "<p>Summe aus Zahl 1 und Zahl 2: $erg</p>";

?><a href="linkcss.htm">Zurück zum Eingabeformular</a></body></html>

Listing 3.28 Datei linkcss.php

Das Ergebnis sehen Sie in Abbildung 3.28.

Abbildung 3.28 Ergebnis mit CSS

3.4.5 Daten an Formularziel anhängen

? … & … & Zusätzlich zur Übermittlung von Inhalten aus den Formularelementenlassen sich direkt mit der URL weitere Daten an das PHP-Auswertungs-

144

Page 146: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Weitere Möglichkeiten 3.4

programm senden. Sie werden dazu an die URL angehängt. Dies ge-schieht in der Form:

dateiname.php?variable1=wert1&variable2=wert2

$_GET

Ein Beispiel: Ein Benutzer meldet sich auf einer Website mit seinemNamen und seiner Benutzergruppe an. Name und Benutzergruppe wer-den aus dem Anmeldeformular an ein erstes PHP-Programm übertragen.

Von diesem PHP-Programm aus soll ein zweites PHP-Programm aufgeru-fen werden, das ebenfalls beide Informationen benötigt. Mit Hilfe derURL können diese Informationen vom ersten PHP-Programm zum zwei-ten PHP-Programm übertragen werden, ohne dass eine weitere Eingabenotwendig ist (ähnlich wie mit einem versteckten Element). Das Anmel-deformular:

<html><body><h2>Anmeldung</h2><form action="anh_form_a.php" method="post">

<p><input name="ben" size="13" /> Benutzername</p><p><select name="gr">

<option>Einkauf</option><option>Vertrieb</option><option>Marketing</option><option>Management</option>

</select> Gruppe</p><p><input type="password" name="pw" size="13" />

Passwort</p><p><input type="submit" value="Login" /></p>

</form></body></html>

Listing 3.29 Datei anh_form.htm

Abbildung 3.29 zeigt das Formular.

Hinweis

Beachten Sie hierbei, dass diese Daten – unabhängig von der Sendemethodedes Formulars – im Feld $_GET und nicht im Feld $_POST zur Verfügung ste-hen. Alle Variablen, die mit der URL gesendet werden, wandelt der Browserin Elemente des Feldes $_GET um.

145

Page 147: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

Abbildung 3.29 Anmeldeformular

Das erste PHP-Auswertungsprogramm:

<html><body><h2>Seite 1</h2><?php

echo "<form action='anh_form_b.php?benzwei=" . $_POST["ben"]

. "&grzwei=" . $_POST["gr"] . "' method='post'>";echo "<p>Name: " . $_POST["ben"] . "<br />";echo "Gruppe: " . $_POST["gr"] . "</p>";

?><p><input type="submit" value="Weiter" /></p></form></body></html>

Listing 3.30 Datei anh_form_a.php

Die URL des Formularziels wird im PHP-Programmteil dynamisch aus denEingabedaten zusammengesetzt. Es werden die Informationen benzwei(mit dem Wert des eingegebenen Benutzernamens in $_POST["ben"]) undgrzwei (mit dem Wert der ausgewählten Gruppe in $_POST["gr"]) mitHilfe der Zeichen ? und & angehängt.

Weitere Daten könnten Sie mit &variable=wert anhängen. Diese Datenwerden beim Absenden, zusammen mit weiteren eventuell vorhandenen

146

Page 148: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Weitere Möglichkeiten 3.4

Formularinhalten, an das zweite PHP-Programm übermittelt. Die ersteAusgabeseite sieht aus wie in Abbildung 3.30.

Abbildung 3.30 Seite 1 der Ausgabe

Das zweite PHP-Auswertungsprogramm:

<html><body><h2>Seite 2</h2><?php

echo "<p>Name: " . $_GET["benzwei"] . "<br />";echo "Gruppe: " . $_GET["grzwei"] . "</p>";

?></body></html>

Listing 3.31 Datei anh_form_b.php

Per URL gesendete Daten stehen im Feld $_GET (statt $_POST) zur Verfü-gung. Die zweite Ausgabeseite sehen Sie in Abbildung 3.31.

Abbildung 3.31 Seite 2 der Ausgabe, Weitergabe über die URL

147

Page 149: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

3.4.6 Daten an Hyperlinkziel anhängen

Hyperlinkmit Daten

Daten können auch an die URL eines Hyperlinkziels angehängt werden.In Verbindung mit den zusätzlichen Gestaltungsmöglichkeiten für Text-hyperlinks ergeben sich weitere Alternativen. Das Beispiel aus dem letz-ten Abschnitt, diesmal mit Hyperlinks:

<html><head><link rel="stylesheet" type="text/css" href="linkcss.css">

</head><body><h2>Anmeldung</h2><form name="login" action="anh_link_a.php" method="post">

<p><input name="ben" size="13" /> Benutzername</p><p><select name="gr">

<option>Einkauf</option><option>Vertrieb</option><option>Marketing</option><option>Management</option>

</select> Gruppe</p><p><input type="password" name="pw"

size="13" /> Passwort</p></form><a href="javascript:document.login.submit();">Anmelden</a></body></html>

Listing 3.32 Datei anh_link.htm

Das Formular zeigt Abbildung 3.32.

Abbildung 3.32 Anmeldeformular

148

Page 150: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Weitere Möglichkeiten 3.4

Es wurde die bereits bekannte CSS-Datei zur Formatierung eingebunden.Das Formular besitzt keinen Absende-Button. Stattdessen gibt es imDokument den Hyperlink Anmelden. Falls dieser betätigt wird, so wirddas Formular mit Hilfe von JavaScript gesendet. Dazu ist es notwendig,ihm einen Namen zu geben (hier login). Das erste PHP-Auswertungspro-gramm:

<html><head>

<link rel="stylesheet" type="text/css" href="linkcss.css"></head><body><h2>Seite 1</h2><?php

echo "<p>Name: " . $_POST["ben"] . "<br />";echo "Gruppe: " . $_POST["gr"] . "</p>";echo "<p><a href='anh_link_b.php?benzwei=" . $_POST["ben"]

. "&grzwei=" . $_POST["gr"] . "'>Weiter</a></p>";?></body></html>

Listing 3.33 Datei anh_link_a.php

Die URL des Hyperlinkziels wird im PHP-Programmteil dynamisch ausden Eingabedaten zusammengesetzt. Auch hier werden die Informatio-nen benzwei und grzwei angehängt. Diese Daten werden beim Betätigendes Hyperlinks an das zweite PHP-Programm übermittelt. Die erste Aus-gabeseite sehen Sie in Abbildung 3.33.

Abbildung 3.33 Seite 1 der Ausgabe

149

Page 151: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

Das zweite PHP-Auswertungsprogramm:

<html><head><link rel="stylesheet" type="text/css" href="linkcss.css">

</head><body><h2>Seite 2</h2><?php

echo "<p>Name: " . $_GET["benzwei"] . "<br />";echo "Gruppe: " . $_GET["grzwei"] . "</p>";

?></body></html>

Listing 3.34 Datei anh_link_b.php

Die zweite Ausgabeseite zeigt Abbildung 3.34.

Abbildung 3.34 Seite 2 der Ausgabe, Weitergabe über Hyperlink

3.4.7 Dateien auf den Server hochladen

Upload Beim Hochladen von Dateien (engl. upload) auf einen Server sollte unbe-dingt mit Hilfe eines passenden PHP-Auswertungsprogramms eine Kon-trolle stattfinden, ob die geladene Datei dem gewünschten Typ ent-spricht und eine bestimmte Maximalgröße nicht überschreitet. DieseKontrolle sollte zwar nach dem HTML-Standard bereits vom Formularaus stattfinden können, allerdings ist dies in der Praxis nicht der Fall.Nachfolgend ein Beispiel:

<html><body><form enctype="multipart/form-data"

action="upload.php" method="post"><p>Datei: <input name="upfile" type="file" size="25" /></p>

150

Page 152: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Weitere Möglichkeiten 3.4

<p><input type="submit" value="Senden" /></p></form></body></html>

Listing 3.35 Datei upload.htm

Erläuterung:

enctype Das Attribut enctype der Markierung form dient als Codierungsan-gabe für die Formulardaten. Beim Hochladen von Dateien ist hier dieAngabe multipart/form-data notwendig.

<input type="file" />

Mit Hilfe von <input type="file" /> wird ein Textfeld zur Eingabeeines Dateinamens eingeblendet und ein Button zum Durchsuchender eigenen Daten nach der Datei, die hochgeladen werden soll. Denhier angegebenen Namen upfile können Sie frei wählen.

Das Formular, nachdem bereits eine Datei zum Hochladen über den But-ton ausgewählt wurde, sehen Sie in Abbildung 3.35.

Abbildung 3.35 Datei hochladen

Nach dem Senden wird die Datei zunächst unter einem temporärenNamen in einem Serververzeichnis abgelegt. Mit Hilfe einiger vorgege-bener Variablen können Sie sich Informationen über die Datei beschaf-fen, um zu entscheiden, ob die Datei endgültig an der gewünschten Stellegespeichert werden soll. Es folgt ein PHP-Auswertungsprogramm miteinigen Kontrollausgaben:

<html><body><?php

/* Kontrolldaten */echo "<p>Zur Kontrolle:<br />";echo "Originaldateiname: "

151

Page 153: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

. $_FILES["upfile"]["name"] . "<br />";echo "Dateigröße: "

. $_FILES["upfile"]["size"] . "<br />";echo "Dateityp: "

. $_FILES["upfile"]["type"] . "<br />";

/* Dateiendung extrahieren */$dname = explode(".",$_FILES["upfile"]["name"]);$ext = $dname[count($dname)-1];echo "Dateiendung: $ext<br />";

/* Temporärer Dateiname auf dem Server */echo "Temporärer Dateiname: "

. $_FILES["upfile"]["tmp_name"] . "</p>";

/* Temporäre Datei dauerhaft an gewünschtenOrt kopieren, falls sie vorhanden ist unddie richtige Endung besitzt */

if($_FILES["upfile"]["size"]>0 && $ext=="gif")

copy($_FILES["upfile"]["tmp_name"],"im_upload.gif");echo "<p>Datei wurde kopiert in im_upload.gif<br />";echo "<img src='im_upload.gif' /></p>";

else

echo "<p>Kopierfehler: Datei nicht vorhandenoder keine GIF-Datei</p>";

?></body></html>

Listing 3.36 Datei upload.php

Erläuterung:

_name,_size,_type

Nach dem Senden werden automatisch Elemente für das Feld $_FILESerzeugt. Falls Sie (wie im vorliegenden Beispiel) das Formularelementupfile genannt haben, liefert

$_FILES["upfile"]["name"] den Originaldateinamen,

$_FILES["upfile"]["size"] die Dateigröße,

152

Page 154: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiele 3.5

$_FILES["upfile"]["type"] den Dateityp und

$_FILES["upfile"]["tmp_name"] den temporären Dateinamenauf dem Server.

Mit Hilfe der Funktionen explode() (siehe auch Abschnitt 7.2, »Zei-chenketten und Felder«) und count() wird außerdem noch die Datei-endung extrahiert.

Der temporäre Dateiname wird später zum Kopieren benötigt.

Im vorliegenden Beispiel wird die Datei endgültig an die gewünschteStelle kopiert (mit der Funktion copy()), falls sie mehr als 0 Byte großist und die Dateiendung gif hat. An dieser Stelle könnte auch eineKontrolle hinsichtlich der maximalen Dateigröße stattfinden.

Die Auswertung (mit Kontrollausgaben) zeigt Abbildung 3.36. Nach demHochladen steht die Datei damit unter dem Namen im_upload.gif imgleichen Verzeichnis wie die PHP-Datei zur Verfügung und kann darge-stellt werden. Falls die temporäre Datei nicht herüberkopiert wordenwäre, stünde sie nach der Sitzung nicht mehr zur Verfügung.

Abbildung 3.36 Auswertung nach dem Hochladen

3.5 Beispiele

In diesem Abschnitt finden Sie einige Anwendungsbeispiele für das Sen-den und Auswerten von Daten.

153

Page 155: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

3.5.1 Grundrechenarten

Es wird ein Formular erstellt, in das zwei Zahlen in zwei Eingabefeldereingetragen werden können. Diese beiden Zahlen können wahlweiseaddiert, voneinander subtrahiert, miteinander multipliziert oder durch-einander dividiert werden. Mit Hilfe von vier Optionsfeldern kann derBenutzer auswählen, welche dieser vier Grundrechenarten ausgeführtwerden soll (Datei grundrechenart.htm).

Nach dem Absenden des Formulars wird das Ergebnis von einem PHP-Programm (Datei grundrechenart.php) berechnet und ausgegeben. Inner-halb des Programms sollen vier verschiedene Funktionen die vier mögli-chen Rechenoperationen ausführen. Diese Funktionen werden bei Bedarfvom Hauptprogramm aufgerufen, erhalten als Parameter die beiden Ein-gabewerte und liefern als Rückgabewert das Ergebnis der Rechen-operationen. Dieses Ergebnis wird im Hauptprogramm ausgegeben.

Das Eingabeformular:

<html><body><p>Bitte geben Sie zwei Werte ein, wählen Sie die<br />Rechenoperation aus und senden Sie das Formular ab:</p><form action = "grundrechenart.php" method = "post">

<p><input name="w1" /> Wert 1<p><p><input name="w2" /> Wert 2<p><p><input type="radio" name="oper" value="+"

checked="checked" /> Addition</p><p><input type="radio" name="oper"

value="-" /> Subtraktion</p><p><input type="radio" name="oper"

value="*" /> Multiplikation</p><p><input type="radio" name="oper"

value="/" /> Division</p><p><input type = "submit" /><input type = "reset" /></p>

</form></body></html>

Listing 3.37 Datei grundrechenart.htm

Das Formular sehen Sie in Abbildung 3.37.

154

Page 156: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiele 3.5

Abbildung 3.37 Eingabeformular für Grundrechenarten

Die beiden Werte werden in die beiden Eingabefelder w1 und w2 einge-geben. Die Rechenoperation wird durch die Auswahl in der Radiobutton-Gruppe $oper bestimmt.

<html><head><?php

function add($x, $y)

$s = $x + $y;return $s;

function sub($x, $y)

$s = $x – $y;return $s;

function mult($x, $y)

$s = $x * $y;return $s;

function divi($x, $y)

155

Page 157: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

$s = $x / $y;return $s;

?></head><body><?php

if ($_POST["oper"] == "+")$erg = add($_POST["w1"],$_POST["w2"]);

else if ($_POST["oper"] == "-")$erg = sub($_POST["w1"],$_POST["w2"]);

else if ($_POST["oper"] == "*")$erg = mult($_POST["w1"],$_POST["w2"]);

else$erg = divi($_POST["w1"],$_POST["w2"]);

echo $_POST["w1"] . " " . $_POST["oper"]. " " . $_POST["w2"] . " = $erg";

?></body></html>

Listing 3.38 Datei grundrechenart.php

Zunächst werden die vier Funktionen add(), sub(), mult() und divi()für die vier Rechenoperationen definiert. Alle Operationen erwartenjeweils zwei Parameter und liefern einen Rückgabewert. Im Hauptpro-gramm wird abhängig vom übermittelten Operatorzeichen mit Hilfeeiner mehrfachen Verzweigung die jeweilige Funktion aufgerufen. DerRückgabewert wird in $erg gespeichert und ausgegeben. Das Ergebnisdes obigen Beispiels zeigt Abbildung 3.38.

Abbildung 3.38 Ergebnis der Berechnung

3.5.2 Pizzabestellung

Es wird ein Formular für eine Pizzabestellung erzeugt (Datei pizza.htm).Es enthält zwei Eingabefelder für Text, eine Gruppe mit zwei Radiobut-tons, ein einfaches Auswahlmenü mit fünf Einträgen sowie zwei Kon-trollkästchen, siehe Abbildung 3.39.

156

Page 158: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiele 3.5

In die beiden Eingabefelder kann der Benutzer seinen Namen bezie-hungsweise seine Adresse eintragen.

Mit Hilfe der beiden Radiobuttons kann er zwischen den AnredenHerr und Frau auswählen.

Das Menü ermöglicht ihm die Auswahl zwischen fünf Sorten Pizza(mit unterschiedlichen Preisen).

Die beiden Kontrollkästchen kann der Benutzer ankreuzen, falls erzusätzlich Thunfisch beziehungsweise Extra Käse auf seiner Pizzahaben möchte. Dadurch erhöht sich der Preis dementsprechend.

Abbildung 3.39 Eingabe der Pizzabestellung

BestellformularDas Eingabeformular:

<html><body><p>Bitte geben Sie Ihren Namen und Ihre Adresse

ein,<br />treffen Sie Ihre Auswahl und senden Siedas Formular ab:</p>

<form action = "pizza.php" method = "post"><p><input name="bst" /> Name</p><p><input name="adr" /> Adresse</p><p><input type="radio" name="anr" value="Herr"

checked="checked" /> Herr <br />

157

Page 159: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

<input type="radio" name="anr" value="Frau" /> Frau</p><p><select name="ptyp">

<option value="Napoli" selected="selected">Napoli (5,70 &euro;)</option>

<option value="Italia">Italia (6,30 &euro;)</option>

<option value="Con Tutto">Con Tutto (7,10 &euro;)</option>

<option value="4 Stagioni">4 Stagioni (6,60 &euro;)</option>

<option value="Mozzarella">Mozzarella (7,80 &euro;)</option>

</select></p><p><input type="checkbox" name="cth"

value="Thunfisch" /> Thunfisch(Aufpreis 0,60 &euro;)<br />

<input type="checkbox" name="cek"value="Extra Käse" /> Extra Käse(Aufpreis 1,10 &euro;)</p><p><input type = "submit" /><input type = "reset" /></p>

</form></body></html>

Listing 3.39 Datei pizza.htm

Name und Adresse werden in die beiden Felder bst und adr eingegeben.Die Anrede wird über die Radiobutton-Gruppe anr ausgewählt. Das ein-fache Auswahlmenü ptyp ermöglicht in Verbindung mit den beiden Kon-trollkästchen cth und cek die Wahl der gewünschten Pizza. Das PHP-Auswertungsprogramm:

<html><body><?php

/* Auswahl der Pizza */if ($_POST["ptyp"] == "Napoli")

$preis = 5.7;else if ($_POST["ptyp"] == "Italia")

$preis = 6.3;else if ($_POST["ptyp"] == "Con Tutto")

$preis = 7.1;else if ($_POST["ptyp"] == "4 Stagioni")

$preis = 6.6;

158

Page 160: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiele 3.5

else$preis = 7.8;

/* Anrede */if ($_POST["anr"] == "Herr")

echo "<p>Sehr geehrter Herr ". $_POST["bst"] . "<br />";

elseecho "<p>Sehr geehrte Frau "

. $_POST["bst"] . "<br />";

/* Ausgabe */echo "Vielen Dank für Ihre Bestellung</p>";echo "<p>Wir liefern Ihre Pizza " . $_POST["ptyp"];

/* Zusätze */if (isset($_POST["cth"]))

echo " mit " . $_POST["cth"];$preis = $preis + 0.6;

if (isset($_POST["cek"]))

echo " mit " . $_POST["cek"];$preis = $preis + 1.1;

echo "<br />in 20 Minuten an die folgende Adresse:<br />";echo $_POST["adr"] . "</p>";echo "<p>Der Preis beträgt $preis &euro;</p>";echo "<p>Ihr Pizza-Team</p>";

?></body></html>

Listing 3.40 Datei pizza.php

Zunächst wird in einer mehrfachen Verzweigung aus dem Typ der Pizzader Grundpreis ermittelt. Es folgt die Ausgabe der Anrede, abhängig vonder Auswahl in der Radiobutton-Gruppe. Die gewählte Pizza wird bestä-tigt. Falls einer der Zusätze gewählt wurde, wird dies ebenfalls bestätigt.Außerdem erhöht sich der Preis. Der Gesamtpreis wird zusammen mitden Abschlussinformationen ausgegeben. Das Ergebnis des obigen Bei-spiels sehen Sie in Abbildung 3.40.

159

Page 161: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

Abbildung 3.40 Auswertung der Pizzabestellung

3.5.3 Kopfrechnen

Kopfrechnen In diesem Abschnitt wird eine Anwendung erstellt, mit deren Hilfe dasKopfrechnen spielerisch trainiert werden kann. In einem Formular gibtder Spieler zunächst seinen Namen ein, siehe Abbildung 3.41.

Abbildung 3.41 Startformular

Nach Betätigung des Buttons Und los… startet das Kopfrechen-Spiel.Der Spieler wird mit Namen begrüßt, dann werden ihm fünf Aufgabengestellt, siehe Abbildung 3.42. Nach der Eingabe der Lösungen betätigter den Button Fertig.

160

Page 162: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiele 3.5

Abbildung 3.42 Aufgabenformular

Anschließend werden die Lösungen des Spielers ausgewertet, sieheAbbildung 3.43.

Abbildung 3.43 Auswertung

Zunächst das Eingabeformular:

<html><body><p><b>Kopfrechnen</b></p><form action="kopf_a.php" method="post"><p><input name="spielername" size="12"> Ihr Name</p><p><input type="submit" value="Und los ..."></p>

161

Page 163: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

</form></body></html>

Listing 3.41 Datei kopf.htm

Der Spielername wird zum ersten PHP-Programm kopf_a.php übertra-gen. Es folgt das Formular mit den Aufgaben:

<html><body><?php/* Initialisierung Zufallszahlengenerator */srand((double)microtime()*1000000);

/* Dokumentbeginn */echo "<p><b>Kopfrechnen</b></p>";

/* Falls kein Name eingetragen */if($_POST["spielername"] == "")

echo "<p>Kein Name, kein Spiel</p>";echo "<a href='kopf.htm'>Zurück</a>";echo "</body>";echo "</html>";exit;

/* Formularbeginn */echo "<form action='kopf_b.php' method='post'>";

/* Spielername */echo "<p>Hallo <b>" . $_POST["spielername"]

. "</b>, Ihre Aufgaben</p>";echo "<input name='spielername' type='hidden' value='"

. $_POST["spielername"] . "' />";/* Tabellenbeginn */echo "<table border='0'>";

/* 5 Aufgaben */for($i=0; $i<5; $i++)

/* Operatorauswahl */$opzahl = rand(1,5);

162

Page 164: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiele 3.5

/* Operandenauswahl */switch($opzahl)

case 1:$a = rand(-10,30);$b = rand(-10,30);$op = "+";$c = $a + $b;break;

case 2:$a = rand(1,30);$b = rand(1,30);$op = "-";$c = $a – $b;break;

case 3:$a = rand(1,10);$b = rand(1,10);$op = "*";$c = $a * $b;break;

/* Sonderfall Division */case 4:

$c = rand(1,10);$b = rand(1,10);$op = "/";$a = $c * $b;

break;case 5:

$a = rand(1,30);$b = rand(1,30);$op = "%";$c = $a % $b;break;

/* Tabellenzeile */echo "<tr>";echo "<td>" . ($i+1) . ". $a $op $b = </td>";echo "<td><input name='ein[$i]' size='12'></td>";echo "</tr>";

/* Richtiges Ergebnis senden */echo "<input name='erg[$i]' type='hidden'

value='$c'>";

163

Page 165: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

?></table><p><input type="submit" value="Fertig"></p></form></body></html>

Listing 3.42 Datei kopf_a.php

Erläuterung:

Zunächst wird der Zufallszahlengenerator mit der Systemzeit initiali-siert.

exit Falls kein Spielername eingegeben wurde, werden das Dokument unddas Programm sofort mit Hilfe der Anweisung exit beendet.

Ansonsten wird der Spieler mit Namen begrüßt. Der Name wirdzusätzlich in einem versteckten Formularelement an das nächste Pro-gramm weitergegeben.

Es folgen fünf Aufgaben:

Bei jeder Aufgabe wird ein zufälliger Operator ausgewählt.Anschließend werden die beiden Operanden ermittelt. Die Berei-che für die Zufallszahlen sind dabei abhängig vom Operator. ZumBeispiel können für eine Additionsaufgabe größere Zahlen erschei-nen als für eine Multiplikationsaufgabe.

Einen Sonderfall stellt die Division dar. Das Ergebnis soll keineNachkommastellen haben. Daher wird zunächst eine Multiplika-tion durchgeführt. Anschließend werden Ergebnis und ein Ope-rand miteinander getauscht, so dass sich eine Division ohne Restergibt.

Die Aufgabe wird zusammen mit einem Eingabefeld ausgegeben.Das richtige Ergebnis wird in einem versteckten Formularelementan das nächste Programm weitergegeben.

Da es sich um insgesamt fünf Aufgaben handelt, werden Felder vonFormularelementen benutzt, eines für die Eingaben des Benutzers,eines für die richtigen Ergebnisse. So haben Sie später die Möglich-keit, die Lösungen mit Hilfe einer Schleife zu kontrollieren.

Als Letztes wird ein Submit-Button mit der Aufschrift Fertig ausgege-ben. Dieser führt zur Auswertung.

164

Page 166: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP-Programme publizieren 3.6

Das Auswertungsprogramm:

<html><body><?php

/* Dokumentbeginn */echo "<p><b>Kopfrechnen</b></p>";

/* Spielername */echo "<p>Hallo <b>" . $_POST["spielername"]

. "</b>, Ihr Ergebnis</p>";

/* Auswertung */$richtig = 0;for($i=0; $i<5; $i++)

if($_POST["ein"][$i] == $_POST["erg"][$i])$richtig ++;

/* Ausgabe */echo "<p>$richtig von 5 richtig</p>";?><!-- Hyperlink zum Anfang --><a href="kopf.htm">Zum Start</a></p></body></html>

Listing 3.43 Datei kopf_b.php

Erläuterung:

Auch hier wird der Spieler zunächst mit Namen begrüßt.

Anschließend werden in einer Schleife die fünf Eingaben mit den fünfrichtigen Ergebnissen verglichen. Dabei wird die Anzahl der richtigenEingaben mitgezählt.

Diese Anzahl wird ausgegeben. Ein Hyperlink führt wieder zum ers-ten Formular, damit der Spieler weitermachen kann.

3.6 PHP-Programme publizieren

Bisher haben wir uns mit der Sprache PHP sowie dem Senden und Aus-werten von Daten beschäftigt. Alle Beispiele wurden in den Verzeichnis-sen des lokal installierten Webservers gespeichert und getestet. Nun

165

Page 167: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Daten senden und auswerten3

möchten Sie Ihre PHP-Programme im Internet zur Benutzung zur Verfü-gung stellen (publizieren).

Programme insInternet stellen

Zunächst benötigen Sie eine eigene Website bei einem Provider. Diemeisten Provider bieten mehrere Pakete mit unterschiedlichem Leis-tungsumfang an. Beim Basispaket verfügt man noch nicht über die Mög-lichkeit, PHP-Programme zu veröffentlichen, dies ist aber bereits beiunwesentlich teureren Paketen möglich. Am besten wählen Sie direkt einPaket aus, das auch eine MySQL-Datenbank zur dynamischen Generie-rung datenbankbasierter Seiten beinhaltet.

FTP-Server Nachdem Sie sich für eines der Pakete entschieden haben, stellt der Pro-vider die Zugangsdaten für sein Konfigurationsmenü und für seinen FTP-Zugang zur Verfügung. Der FTP-Zugang wird benötigt, um die Dateienins Internet hochzuladen. Die FTP-Zugangsdaten umfassen: Name desFTP-Servers (Host Name), Benutzerkennung (User ID) und Passwort.

Es gibt eine ganze Reihe von Programmen, mit denen Sie Ihre Dateienauf einen FTP-Server laden können. Dies kann beispielsweise eine Web-seite zum Upload sein, die der Provider zur Verfügung stellt, oder aucheiner der bekannten Browser.

FileZilla In Anhang B erläutere ich die Installation und die Bedienung des FTP-Cli-ents FileZilla (Abschnitt B.1.4, »FTP-Client FileZilla«).

166

Page 168: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

4 Datenbanken mit MySQL

In diesem Kapitel beschreibe ich die Grundlagen des Aufbaus und derStruktur von Datenbanken anhand des MySQL-Datenbankservers. Sielernen die Datenbanksprache SQL, die Benutzeroberfläche phpMyAd-min und das Zusammenspiel von PHP-Programmen mit MySQL kennen.Sie erfahren außerdem, wie Sie Ihre Datenbanken ins Internet stellen.

Datenbank, Tabelle

Eine Datenbank dient der Speicherung größerer Datenmengen und derübersichtlichen Darstellung bestimmter Daten aus diesen Datenmengen.Innerhalb einer Datenbank befinden sich verschiedene Tabellen. Ein Bei-spiel sehen Sie in Tabelle 4.1.

Datenfeld,Datensatz

Die Begriffe in der ersten Zeile nennt man die Datenfelder der Tabelle.Anschließend folgen die einzelnen Datensätze der Tabelle; in diesem Falldrei.

DatentypNatürlich legt niemand für drei Datensätze eine Datenbank mit einerTabelle an, aber die vorliegende Struktur könnte auch für mehrere Tau-send Datensätze verwendet werden. Die Datenfelder haben jeweilseinen bestimmten Datentyp. Hier sind es Texte, Zahlen und Datumsan-gaben. Beim Erzeugen einer Datenbank gehen Sie wie folgt vor:

Anlegen der Datenbank

Anlegen von Tabellen durch Angabe der Struktur

Eingeben der Datensätze in die Tabellen

Struktur, DatenDie Struktur einer existierenden Datenbank beziehungsweise einerTabelle können Sie auch dann noch verändern, wenn sich bereits Datendarin befinden. Allerdings ist es empfehlenswert, sich vorher Gedankenüber die Struktur einer Datenbank zu machen, da bei einer nachträgli-chen Änderung leicht Datenverluste auftreten können.

Name Vorname Personalnummer Gehalt Geburtstag

Maier Hans 6714 3500,00 15.03.62

Schmitz Peter 81343 3750,00 12.04.58

Mertens Julia 2297 3621,50 30.12.59

Tabelle 4.1 Beispieldaten für eine Datenbank

167

Page 169: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

4.1 MySQL und phpMyAdmin

MySQL Im Zusammenhang mit der Programmiersprache PHP wird häufig mitMySQL-Datenbanken gearbeitet. MySQL ist die Open-Source-Datenbankmit der größten Verbreitung. Es handelt sich dabei um einen SQL-basier-ten Datenbankserver. Bei den in diesem Buch empfohlenen Installatio-nen mit XAMPP oder EasyPHP ist MySQL bereits enthalten. Die Installa-tion unter Ubuntu wird in Anhang B beschrieben.

SQL SQL ist die meistverwendete Datenbanksprache der Welt. MySQL bietetSQL-Anweisungen

zum Erzeugen einer Struktur von Datenbanken und Tabellen sowie

zum Bearbeiten der Datensätze (Anlegen, Anzeigen, Ändern, Löschen).

phpMyAdmin In der PHP-Welt wird zur komfortablen Erzeugung der Struktur vonMySQL-Datenbanken und Tabellen häufig die (frei verfügbare) Bedieno-berfläche phpMyAdmin verwendet. Diese ist ebenfalls Bestandteil derbeiden Installationen mit XAMPP oder EasyPHP. Die Installation unterUbuntu wird gleichfalls in Anhang B beschrieben. phpMyAdmin wirdauch von den meisten Websiteprovidern zur Verwaltung der MySQL-Datenbanken angeboten und kann zudem für den Transfer der eigenenDatenbanken ins Internet genutzt werden.

Zum Bearbeiten der Datensätze stellt der PHP-Entwickler dem Benutzereine eigene Oberfläche zur Verfügung. Dabei handelt es sich um Websei-ten mit PHP-Programmen, in denen SQL-Befehle ausgeführt werden. DieVorgehensweise wird auch in den folgenden Abschnitten berücksichtigt:

Die wichtigsten Vorgänge zum Erzeugen der Struktur einer Daten-bank mit phpMyAdmin werden beschrieben.

Die Vorgehensweise zum Anlegen von Datensätzen wird erläutert.

4.1.1 phpMyAdmin

Die gesamte Bedienung von phpMyAdmin läuft komfortabel über dasBrowserfenster ab. Mit Hilfe von phpMyAdmin können Sie unter ande-rem Folgendes anlegen, verwalten und löschen:

Datenbanken

innerhalb der Datenbanken Tabellen

innerhalb der Tabellen Felder und Indizes zur eindeutigen Identifizie-rung

168

Page 170: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

MySQL und phpMyAdmin 4.1

In diesem Abschnitt zeige ich nur einen Teil der Möglichkeiten, diephpMyAdmin bietet. Ähnlich wie in Kapitel 2, »PHP-Programmierkurs«,erkläre ich Ihnen nicht jede Einzelheit und Komponente, sondern bietefür viele denkbare Anwendungsfälle Lösungen an, ohne Sie durch dieVielfalt zu verwirren.

phpMyAdmin, Adresse

Nach erfolgter XAMPP-Installation lässt sich der MySQL-Datenbankser-ver über das XAMPP Control Panel starten. Anschließend können Sie dieStartseite von phpMyAdmin über einen Browser aufrufen. Die einzuge-bende Adresse lautet http://localhost/phpmyadmin/index.php. Es exis-tiert auch ein Hyperlink von der XAMPP-Startseite aus.

Nach dem Aufruf von EasyPHP ist der MySQL-Datenbankserver bereitsgestartet. Die Startseite von phpMyAdmin erreichen Sie über dieAdresse: http://localhost/home/mysql.

Nach erfolgter phpMyAdmin-Installation unter Ubuntu Linux ist derDatenbankserver ebenfalls bereits gestartet. Die Startseite erreichen Sieüber http://localhost/phpmyadmin. In Abbildung 4.1 sehen Sie die Start-ansicht von phpMyAdmin.

Abbildung 4.1 phpMyAdmin, Startansicht

4.1.2 Beispieldatenbank und -tabelle

Es soll eine Datenbank firma mit einer Datenbanktabelle personenerzeugt werden, siehe Tabelle 4.2.

Feldname Datentyp

name varchar(30)

vorname varchar(25)

personalnummer int

Tabelle 4.2 Aufbau der Datenbanktabelle »personen«

169

Page 171: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

In dieser Datenbanktabelle sollen die Daten zu einzelnen Personengespeichert werden.

Name und Vorname sind Felder, in denen Zeichenketten bis zurLänge 30 beziehungsweise 25 gespeichert werden können.

Die Personalnummer dient der eindeutigen Identifizierung der ver-schiedenen Personen; sie ist eine ganze Zahl (int).

Das Gehalt ist eine Zahl, die Nachkommastellen (double) haben kann.

Für das Feld geburtstag wird ein Feld vom Typ date gewählt.

Bei diesem Beispiel werden einige häufig verwendete Datentypen einge-setzt, die für viele Anwendungen bereits ausreichen. Es werden dabei dieDaten aus der oben angegebenen Beispieltabelle verwendet.

4.1.3 Datenbank erzeugen

Zunächst wechseln Sie auf die Registerkarte Datenbanken (siehe Abbil-dung 4.1) und legen die Datenbank firma an. Bei den Namen von Daten-banken, Tabellen und Feldern sollten Sie darauf achten, keine deutschenUmlaute, kein scharfes S (ß) sowie weder Leerzeichen noch Sonderzei-chen zu verwenden.

4.1.4 Tabelle erzeugen

Nachdem Sie die Datenbank angelegt haben, ist es möglich, eine neueTabelle zu erzeugen. Hier soll dies die Tabelle personen mit fünf Feldernsein. Dazu betätigen Sie den Button Erzeuge Tabelle ganz links. Eserscheint eine Seite, in der Sie eine Tabelle mit zwei Spalten (Sprich: Fel-dern) anlegen können. Ganz unten rechts gibt es die Möglichkeit, dreiweitere Spalten einzufügen. Nach Betätigen des Buttons OK ist die Ein-gabemaske entsprechend geändert.

Tabelle erzeugen Sie tragen die Namen und Datentypen der fünf Felder wie in Abbildung4.2 ein und betätigen den Button Speichern.

gehalt double

geburtstag date

Feldname Datentyp

Tabelle 4.2 Aufbau der Datenbanktabelle »personen« (Forts.)

170

Page 172: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

MySQL und phpMyAdmin 4.1

Abbildung 4.2 Namen und Eigenschaften der Tabellenfelder

create tableDie Tabelle wird erzeugt. Nach Betätigen des Hyperlinks links nebendem Namen der neuen Tabelle personen erscheint die Tabellenstruktur-ansicht, die Sie in Abbildung 4.3 sehen.

Abbildung 4.3 Struktur der Tabelle »personen«

4.1.5 Primärschlüssel erzeugen

Für viele Vorgänge innerhalb von Tabellen ist eine eindeutige Identifizie-rung der einzelnen Datensätze hilfreich und notwendig. Dies wird mitHilfe eines Primärschlüssels realisiert.

171

Page 173: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

Im vorliegenden Beispiel soll das Feld personalnummer eindeutig sein,das heißt, keine Personalnummer darf doppelt vorhanden sein. Damitdie Eindeutigkeit von MySQL kontrolliert wird, wird das Feld personal-nummer mit einem Primärschlüssel versehen. Setzen Sie dazu in derTabellenstrukturansicht (siehe Abbildung 4.3) in der Zeile des Feldespersonalnummer die Markierung neben dem Feldnamen, und betätigenSie den Button Primärschlüssel. Das Feld personalnummer ist nun inder Ansicht unterstrichen, und weiter unten erscheint die Informationüber den Schlüssel mit dem Namen Primary.

Anschließend können in diese Tabelle nur noch Einträge aufgenommenwerden, die einen Eintrag im Feld personalnummer haben, der nichtbereits in einem anderen Datensatz existiert, da ansonsten die Eindeutig-keit verletzt wäre. Alle Datensätze können anhand des Werts im Feldpersonalnummer eindeutig voneinander unterschieden werden. Dies istbesonders beim Ändern und Löschen von Datensätzen wichtig.

4.1.6 Datensätze eintragen

Daten eintragen Auf der Registerkarte Einfügen haben Sie die Möglichkeit, Datensätzeeinzutragen.

Abbildung 4.4 Eingabe eines Datensatzes

172

Page 174: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

MySQL und phpMyAdmin 4.1

Beim Eintragen (siehe Abbildung 4.4) müssen Sie Folgendes beachten:

Bei Zahlen mit Nachkommastellen wird der Punkt anstelle des Kom-mas verwendet.

Bei Datumsangaben gilt das amerikanische Eingabeformat JJJJ-MM-TT.

insert into … values

Nach Betätigung des Buttons OK wird der Datensatz eingefügt. Geben Sieauf diese Weise alle drei Datensätze der Tabelle 4.1 ein. Anschließendkönnen Sie den Hyperlink auf dem Namen der Tabelle personen betäti-gen und sehen alle Datensätze wie in Abbildung 4.5.

Abbildung 4.5 Datensätze der Tabelle »personen«

Übung »u_db_anlegen«

Legen Sie eine zweite Datenbank mit dem Namen hardware an. Sie soll eineTabelle fp mit der Struktur aus Abbildung 4.6 und den Daten aus Abbildung4.7 enthalten. Das Feld artnummer soll einen Primärschlüssel haben. DieDatenbank enthält Hardware-Informationen, die Tabelle enthält Informatio-nen zu Festplatten, die Felder hersteller, typ und artnummer sind vom TypZeichenkette, das Feld gb gibt die Kapazität der Festplatte an, das Feld prodgibt das erste Produktionsdatum der betreffenden Festplatte an.

Abbildung 4.6 Tabelle »fp«, Struktur

173

Page 175: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

4.2 PHP und MySQL

DynamischeSchnittstelle

In diesem Abschnitt erfahren Sie, wie die dynamische Schnittstelle zwi-schen dem Betrachter einer Internetseite und den Inhalten einer MySQL-Datenbank erzeugt wird.

4.2.1 Verbindung aufnehmen, Datensätze anzeigen

Dem Benutzer kann mit Hilfe von PHP-Programmen eine komfortableSchnittstelle zum Erzeugen, Anzeigen, Ändern und Löschen von Daten-sätzen aus einer MySQL-Datenbank zur Verfügung gestellt werden. DieDatenbank und der Strukturentwurf werden vorher vom Entwickler mitphpMyAdmin erzeugt. Zunächst ein Programm zur Anzeige aller Daten-sätze aus der Datenbank firma, Tabelle personen:

<html><body><?php

/* Verbindung aufnehmen */mysql_connect("","root");

/* Datenbank auswählen */mysql_select_db("firma");

/* SQL-Abfrage ausführen */$res = mysql_query("select * from personen");/* Anzahl Datensätze ermitteln und ausgeben */$num = mysql_num_rows($res);echo "$num Datensätze gefunden<br />";

/* Datensätze aus Ergebnis ermitteln, *//* in Array speichern und ausgeben */

Abbildung 4.7 Tabelle »fp«, Daten

174

Page 176: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP und MySQL 4.2

while ($dsatz = mysql_fetch_assoc($res))

echo $dsatz["name"] . ", ". $dsatz["vorname"] . ", ". $dsatz["personalnummer"] . ", ". $dsatz["gehalt"] . ", ". $dsatz["geburtstag"] . "<br />";

?></body></html>

Listing 4.1 Datei db_anzeigen.php

Programm und Erläuterung erscheinen zunächst etwas umfangreich. Siewerden allerdings feststellen, dass die meisten Programmschritte typischfür Datenbankprogramme sind. Sie kommen in vielen PHP-Programmen,die auf Datenbanken zugreifen, vor.

Abbildung 4.8 zeigt die Ausgabe des Programms db_anzeigen.php.

Abbildung 4.8 Ausgabe aller Datensätze

Erläuterung des Programms:

mysql_connect() Die Funktion mysql_connect() öffnet eine Verbindung zum MySQL-Datenbankserver. In den Klammern können bis zu drei Parameter ste-hen: Hostname, Benutzername und Kennwort. In diesem Abschnitt sollder Einfachheit halber die Standardeinstellung von XAMPP oder Easy-

Hinweis

Sollte Ihnen die Originaldatenbank inklusive der Tabelle nicht zur Verfügungstehen, so können Sie zur Erzeugung auch einfach das PHP-Programmdb_neu.php nutzen.

175

Page 177: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

PHP nicht geändert werden. Der Hostname ist localhost (wie derWebserver), der Standardbenutzer ist root – ohne Kennwort.

Unter Ubuntu Linux müssen Sie ein Passwort vergeben, zum Beispieltoor. Der Aufruf der Funktion lautet für diesen Fall:

mysql_connect("","root","toor");

Dies müssen Sie in allen PHP-Programmen berücksichtigen, die aufMySQL zugreifen!

mysql_select_db() Die Funktion mysql_select_db() wählt die Datenbank aus, mit dergearbeitet werden soll.

mysql_query() Die Funktion mysql_query() führt eine Abfrage mit der SQL-Anwei-sung select in der aktuellen Datenbank aus. Die Abfrage soll alleDatensätze der betroffenen Tabelle liefern.

Ergebniskennung Falls die Abfrage erfolgreich war, liefert die Funktion eine Ergebnis-kennung zurück (hier in der Variablen $res). Die Ergebniskennungwird anschließend benötigt, um die einzelnen Komponenten desErgebnisses zu ermitteln. Sollten mehrere Abfragen erfolgen, so soll-ten Sie für jedes Ergebnis eine eigene Variable zur Speicherung derErgebniskennung verwenden.

mysql_num_rows()

Die Funktion mysql_num_rows() wird aufgerufen, wenn die Anzahlder Datensätze, die ermittelt wurden, ausgegeben werden soll. AlsParameter wird die Ergebniskennung ($res) übergeben, deren Daten-satzanzahl Sie ermitteln möchten.

mysql_fetch_assoc()

Die Funktion mysql_fetch_assoc() wird verwendet, um einenDatensatz des Ergebnisses zu ermitteln und in einem assoziativen Feld(hier $dsatz) zu speichern. Dabei stellt der Datenbank-Feldname denSchlüssel des Feldes dar. Die Funktion führt dazu, dass ein sogenann-ter Datensatzzeiger auf den nächsten Datensatz des Ergebnissesgesetzt wird.

Die Zuweisung des Feldes an $dsatz wird gleichzeitig dazu verwen-det, eine while-Schleife zu steuern. Die Schleife dient dazu, alleDatensätze des Ergebnisses auszugeben. Falls das Ergebnis aus min-destens einem Datensatz besteht, ist die Zuweisung $dsatz =

mysql_fetch_assoc ($res) ein wahrer Ausdruck. Daher wird diewhile-Schleife durchlaufen.

Beachten Sie: Es handelt sich nicht um einen Vergleich, sondern umeine Zuweisung! Es werden also zwei Anweisungen in einem ausge-führt: zuerst die Zuweisung des Feldes, anschließend die while-Anweisung.

176

Page 178: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP und MySQL 4.2

Datensatzzeiger Der Datensatzzeiger wird durch den wiederholten Funktionsaufrufirgendwann am Ende anlangen. Die Funktion liefert dann keinen wei-teren Datensatz mehr. Damit wird die Zuweisung $dsatz =

mysql_fetch_assoc($res) ein unwahrer Ausdruck, und die while-Schleife wird beendet.

Innerhalb der Schleife wird jeweils der Inhalt eines Elements des Fel-des $dsatz ermittelt und ausgegeben. Die Namen der Schlüssel müs-sen denen der Datenbank-Feldnamen entsprechen.

Verbindung schließen

Die Verbindung zur Datenbank wird nach Ablauf des PHP-Programmsautomatisch unterbrochen.

Im weiteren Verlauf des Abschnitts erläutere ich noch Möglichkeiten zurübersichtlicheren Ausgabe der Daten, wie zum Beispiel die Ausgabe inForm einer HTML-Tabelle.

4.2.2 Datensätze auswählen

Daten auswählenIn einem PHP-Programm können Sie Datensätze mithilfe von SQL-Anweisungen auswählen. Bei der Auswahl durch where innerhalb derselect-Anweisung können Sie, ähnlich wie bei der Programmierung mitPHP, Vergleichsoperatoren anwenden, siehe Tabelle 4.3.

LogischeOperatoren

Es lassen sich auch mehrere Auswahlbedingungen logisch miteinanderverknüpfen, und zwar mit Hilfe der folgenden logischen Operatoren,siehe Tabelle 4.4.

Operator Bedeutung

= gleich

<> ungleich

> größer als

>= größer als oder gleich

< kleiner als

<= kleiner als oder gleich

Tabelle 4.3 Vergleichsoperatoren in SQL

Operator Bedeutung

not Der Wahrheitswert einer Bedingung wird umgekehrt.

and Alle Bedingungen müssen zutreffen.

or Mindestens eine der Bedingungen muss zutreffen.

Tabelle 4.4 Logische Operatoren in SQL

177

Page 179: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

Der Operator like ist sehr nützlich beim Suchen nach Zeichenkettenoder Teilen von Zeichenketten. Dabei können auch Platzhalter (Wild-cards) eingesetzt werden. Ein % (Prozentzeichen) steht für eine beliebigeAnzahl unbekannter Zeichen, und ein _ (Unterstrich) steht für genau einunbekanntes Zeichen. Die untersuchte Zeichenkette muss dabei weiter-hin in einfache Hochkommata gesetzt werden.

Zusätzlich lässt sich die Reihenfolge der Ausgabe mit Hilfe von order bybeeinflussen. Der Zusatz desc steht für descending (= absteigend). ImNormalfall wird aufsteigend sortiert, den Zusatz asc für ascending (= auf-steigend) müssen Sie deshalb nicht gesondert angeben.

Beispiel 1

Ein Beispiel mit ausgewählten Feldern, where-Klausel, Vergleichsopera-tor, logischem Operator und sortierter Ausgabe:

<html><body><?php

mysql_connect("","root");mysql_select_db("firma");

$sqlab = "select name, gehalt from personen";$sqlab .= " where gehalt >= 3000 and gehalt <= 3700";$sqlab .= " order by gehalt desc";

$res = mysql_query($sqlab);$num = mysql_num_rows($res);echo "$num Datensätze gefunden<br />";while ($dsatz = mysql_fetch_assoc($res))

echo $dsatz["name"] . ", ". $dsatz["gehalt"] . "<br />";

?></body></html>

Listing 4.2 Datei db_zahl.php

Die Ausgabe des Programms sieht aus wie in Abbildung 4.9.

178

Page 180: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP und MySQL 4.2

Abbildung 4.9 Auswahl einzelner Felder und Datensätze

Es werden alle Personen angezeigt, deren Gehalt zwischen 3.000 € und3.700 € liegt, sortiert nach absteigendem Gehalt. Die Abfrage besteht auseiner längeren SQL-Anweisung. Aus Gründen der Übersichtlichkeitwurde sie in mehreren Schritten in einer PHP-Variablen ($sqlab) gespei-chert. Achten Sie dabei besonders auf die Leerzeichen zwischen den ein-zelnen Angaben (hier vor where und vor order by).

SQL-Anweisung speichern

SQL-Anweisungen können aufgrund ihrer Länge und der beinhaltetenSonderzeichen, vor allem im Zusammenhang mit dem Einbau von PHP-Variablen oder PHP-Feldelementen, schnell unübersichtlich werden. Siestellen sich daher häufig als die Quelle eines länger gesuchten Fehlersheraus.

Die Funktion mysql_query() wird mit der Variablen $sqlab als Parame-ter aufgerufen:

$res = mysql_query($sqlab);

Innerhalb der Schleife werden nur noch die Inhalte der Felder name undgehalt aus dem Datensatz extrahiert. Die anderen Felder stehen über dieVariable $res nicht zur Verfügung, da die SQL-Anweisung sie nicht bein-haltet.

Beispiel 2

Ein Beispiel mit dem like-Operator:

<html><body>

Hinweis

Ein weiterer Vorteil der Speicherung der SQL-Anweisung in einer Zeichen-kette besteht darin, diese Zeichenkette zunächst zu Kontrollzwecken aufdem Bildschirm ausgeben zu können (echo $sqlab;), bevor man sie späterausführen lässt.

179

Page 181: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

<?phpmysql_connect("","root");mysql_select_db("firma");

$sqlab = "select name, vorname from personen";$sqlab .= " where name like 'M%' order by name";

$res = mysql_query($sqlab);$num = mysql_num_rows($res);echo "$num Datensätze gefunden<br />";

while ($dsatz = mysql_fetch_assoc($res))

echo $dsatz["name"] . ", ". $dsatz["vorname"] . "<br />";

?></body></html>

Listing 4.3 Datei db_like.php

Die Ausgabe des Programms sehen Sie in Abbildung 4.10.

Abbildung 4.10 Auswahl mit »like« und Platzhalter

Es werden alle Personen angezeigt, deren Name mit dem Buchstaben Mbeginnt. Dabei ist besonders auf die einfachen Hochkommata (bei namelike 'M%') zu achten, da es sich bei dem Namen um eine Zeichenkettehandelt.

Übung »u_db_anzeigen«

Schreiben Sie ein PHP-Programm zur Anzeige aller Datensätze aus derTabelle fp der Datenbank hardware (Datei u_db_anzeigen.php). Sollte Ihnendie Originaldatenbank inklusive der Tabelle nicht zur Verfügung stehen, sokönnen Sie zur Erzeugung auch das PHP-Programm u_db_neu.php nutzen.

180

Page 182: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP und MySQL 4.2

Das Programm u_db_anzeigen.php soll die Ausgabe aus Abbildung 4.11haben, basierend auf den ursprünglichen Daten.

Abbildung 4.11 Ergebnis der Übung »u_db_anzeigen«

Übung »u_db_zahl«

Zeigen Sie mit einem PHP-Programm aus der oben angegebenen Tabelle nurnoch bestimmte Datensätze (Datei u_db_zahl.php) an. Es sollen alle Festplat-ten mit allen Angaben angezeigt werden, die eine Kapazität von mehr als 60GB haben und weniger als 150 € kosten, und zwar nach Kapazität absteigendsortiert. Das Programm soll die Ausgabe aus Abbildung 4.12 haben, basie-rend auf den ursprünglichen Daten.

Abbildung 4.12 Ergebnis der Übung »u_db_zahl«

Übung »u_db_datum«

Zeigen Sie mit einem PHP-Programm aus der oben angegebenen Tabelle nurnoch bestimmte Informationen an (Datei u_db_datum.php). Es sollen alleFestplatten mit den Angaben zu Hersteller, Typ, Artikelnummer und erstemProduktionsdatum angezeigt werden, die im ersten Halbjahr 2008 erstmaligproduziert wurden, und zwar sortiert nach Datum. Das Programm soll dieAusgabe aus Abbildung 4.13 haben, basierend auf den ursprünglichenDaten.

181

Page 183: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

4.2.3 Ausgabe in eine HTML-Tabelle

Tabellenausgabe Eine Ausgabe wird in Tabellenform wesentlich übersichtlicher. Dazumüssen Sie nur die HTML-Markierungen zur Erzeugung einer Tabelle angeeigneter Stelle in das PHP-Programm integrieren. Es folgt ein Beispielzur Anzeige aller Datensätze aus der Datenbank firma, Tabelle personen,in Tabellenform mit Überschrift:

<html><body><?php

mysql_connect("","root");mysql_select_db("firma");

$res = mysql_query("select * from personen");$num = mysql_num_rows($res);

// Tabellenbeginnecho "<table border='1'>";

// Überschriftecho "<tr> <td>Lfd. Nr.</td> <td>Name</td>";echo "<td>Vorname</td> <td>Personalnummer</td>";echo "<td>Gehalt</td> <td>Geburtstag</td> </tr>";$lf = 1;while ($dsatz = mysql_fetch_assoc($res))

echo "<tr>";echo "<td>$lf</td>";echo "<td>" . $dsatz["name"] . "</td>";echo "<td>" . $dsatz["vorname"] . "</td>";echo "<td>" . $dsatz["personalnummer"] . "</td>";echo "<td>" . $dsatz["gehalt"] . "</td>";echo "<td>" . $dsatz["geburtstag"] . "</td>";echo "</tr>";$lf = $lf + 1;

Abbildung 4.13 Ergebnis der Übung »u_db_datum«

182

Page 184: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP und MySQL 4.2

// Tabellenendeecho "</table>";

?></body></html>

Listing 4.4 Datei db_tabelle.php

table, tr, tdZunächst wird das Abfrageergebnis ermittelt. Es folgen der Tabellenbe-ginn (<table border="1">) und eine Zeile mit einer Überschrift (<tr> bis</tr>). Innerhalb der Schleife wird zusätzlich zu den Feldinhalten einelaufende Nummer ermittelt. Diese wird gemeinsam mit den FeldinhaltenZeile für Zeile ausgegeben. Die Tabelle wird nach der Schleife geschlos-sen (</table>). Die Ausgabe sehen Sie in Abbildung 4.14.

Abbildung 4.14 Ausgabe in einer HTML-Tabelle

4.2.4 Auswahl von Daten über ein Suchformular

SuchformularEin Benutzer möchte natürlich nicht immer die gleichen Daten aus einerDatenbank sehen, sondern selbst eine Auswahl treffen. Dies wird ihmdurch die Eingabe von Werten in Formulare ermöglicht. Die nachfolgen-den Schritte beschreiben eine typische Internetdatenbankanwendung:

Der Benutzer gibt eine Anfrage (zum Beispiel eine Suchanfrage) ein,indem er Daten in ein Formular einträgt und diese Daten an den Web-server sendet.

Beim Webserver werden die Daten von einem PHP-Programm ausge-wertet und mit Hilfe einer SQL-Anweisung an den Datenbankservergesendet.

Der Datenbankserver ermittelt eine Antwort zu der SQL-Anweisungund sendet diese an den Webserver zurück.

Das PHP-Programm verarbeitet die Antwort und sendet dem Benutzereine Antwort.

183

Page 185: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

Für den Benutzer ist nicht sichtbar, welche Programme, Sprachen bezie-hungsweise Dienste im Hintergrund für ihn tätig sind. Er kann ohneKenntnisse des Formularaufbaus, des PHP-Programms und der Daten-bank seine Anfrage stellen und das Ergebnis lesen.

Beispiel 1

Im folgenden Beispiel hat der Benutzer die Möglichkeit, zwei Zahlen ein-zugeben. Diese dienen bei einer Abfrage als Untergrenze beziehungs-weise Obergrenze für das Feld gehalt. Der Anwender kann also bei jederAbfrage festlegen, welcher Gehaltsgruppe die angezeigten Personenangehören sollen. Zunächst das Formular:

<html><body><p>Anzeige der Personen mit einem Gehalt zwischen:</p><form action = "db_eingabe.php" method = "post">

<p><input name = "ug" /> Untergrenze</p><p>und</p><p><input name = "og" /> Obergrenze</p><p><input type = "submit" /><input type = "reset" /></p>

</form></body></html>

Listing 4.5 Datei db_eingabe.htm

Innerhalb des Formulars werden die beiden Werte in die Eingabefelder ugund og aufgenommen. Das Eingabeformular sehen Sie in Abbildung 4.15.

Abbildung 4.15 Eingabeformular für den Gehaltsbereich

184

Page 186: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP und MySQL 4.2

Die Inhalte der beiden Eingabefelder stehen dem PHP-Programm nachdem Absenden zur Verfügung. Das Programm sieht folgendermaßen aus:

<html><body><?php

mysql_connect("","root");mysql_select_db("firma");

$sqlab = "select name, gehalt from personen";$sqlab .= " where gehalt >= " . $_POST["ug"]

. " and gehalt <= " . $_POST["og"];$sqlab .= " order by gehalt";

$res = mysql_query($sqlab);$num = mysql_num_rows($res);if ($num==0) echo "Keine passenden Datensätze gefunden";

while ($dsatz = mysql_fetch_assoc($res))

echo $dsatz["name"] . ", ". $dsatz["gehalt"] . "<br />";

?></body></html>

Listing 4.6 Datei db_eingabe.php

Innerhalb der SQL-Anweisung finden sich nach der where-Klausel dieFeldelemente $_POST["ug"] und $_POST["og"], um die ausgegebeneDatenmenge einzuschränken. Die Feldelemente beinhalten die beidenEingabewerte des Benutzers. Die Ausgabe zum oben angegebenen Bei-spiel zeigt Abbildung 4.16.

Abbildung 4.16 Ausgabe, passend zur Beispieleingabe

Falls ein Bereich angegeben wurde, in dem sich kein Datensatz befindet,hat die Variable $num den Wert 0, und es wird die Meldung Keine pas-

185

Page 187: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

senden Datensätze gefunden ausgegeben. Dies empfiehlt sich anstelleeines leeren Ausgabebildschirms, um dem Benutzer zu zeigen, dass seineAnfrage bearbeitet wurde und korrekt war.

Beispiel 2

like % _ Bei der Abfrage von Zeichenkettenfeldern müssen Sie besonders auf dieeinfachen Hochkommata achten. Den Operator like und die Platzhalter% sowie _ können Sie in gewohnter Weise verwenden. Mit Hilfe des For-mulars aus dem folgenden Beispiel kann der Benutzer nach allen Perso-nen suchen, deren Namen mit den eingegebenen Anfangsbuchstabenbeginnen. Hier zunächst das Formular:

<html><body><p>Anzeige der Personen mit folgendem Namensanfang:</p><form action = "db_platzhalter.php" method = "post">

<p><input name = "anfang" /></p><p><input type = "submit" /><input type = "reset" /></p>

</form></body></html>

Listing 4.7 Datei db_platzhalter.htm

Innerhalb des Formulars werden die Anfangsbuchstaben in das Eingabe-feld anf aufgenommen. Das Eingabeformular ist in Abbildung 4.17 dar-gestellt.

Abbildung 4.17 Eingabe der Anfangsbuchstaben

Das PHP-Programm sieht wie folgt aus:

<html><body>

186

Page 188: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP und MySQL 4.2

<?phpmysql_connect("","root");mysql_select_db("firma");

$sqlab = "select name, vorname from personen";$sqlab .= " where name like '" . $_POST["anfang"] . "%'";

$res = mysql_query($sqlab);$num = mysql_num_rows($res);if ($num==0) echo "Keine passenden Datensätze gefunden";

while ($dsatz = mysql_fetch_assoc($res))

echo $dsatz["name"] . ", ". $dsatz["vorname"] . "<br />";

?></body></html>

Listing 4.8 Datei db_platzhalter.php

Innerhalb der SQL-Anweisung wird das Feldelement $_POST["anfang"]durch den aktuellen Inhalt des Eingabefeldes ersetzt. Das Prozentzeichensteht für beliebig viele nachfolgende Buchstaben.

Sie sollten besonders auf die einfachen Hochkommata achten. Das öff-nende einfache Hochkomma steht in der ersten Zeichenkette hinter demOperator like, das schließende einfache Hochkomma steht in der zwei-ten Zeichenkette hinter dem Prozentzeichen. Die Ausgabe für das obenangegebene Beispiel zeigt Abbildung 4.18.

Abbildung 4.18 Ausgabe zur Beispieleingabe

Beispiel 3

Eine Abfrage kann dem Benutzer durch die Verwendung von weiterenFormularelementen (Radiobutton-Gruppen, Kontrollkästchen, Auswahl-

187

Page 189: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

menüs usw.) erleichtert werden. Diese Formularelemente habe ichbereits vorgestellt. Mit Hilfe des folgenden Beispiels können Personenaus bestimmten Gehaltsgruppen angezeigt werden. Jede der Gehalts-gruppen ist mit einem Radiobutton verknüpft. Zunächst das Formular:

<html><body><p>Anzeige der Personen aus der gewählten Gehaltsgruppe:</p><form action = "db_radio.php" method = "post">

<p><input type="radio" name="geh" value="1"checked="checked" /> bis 3000 &euro; einschl.<br />

<input type="radio" name="geh" value="2" />ab 3000 &euro; ausschl. bis 3500 &euro; einschl.<br /><input type="radio" name="geh" value="3" />ab 3500 &euro; ausschl. bis 5000 &euro; einschl.<br /><input type="radio" name="geh" value="4" />ab 5000 &euro; ausschl.</p><p><input type="submit" /><input type="reset" /></p>

</form></body></html>

Listing 4.9 Datei db_radio.htm

Radiobuttons Die verwendeten Radiobuttons haben alle den gleichen Namen (geh),dadurch bilden sie eine Gruppe. Der vom Benutzer ausgewählte Buttonist mit einem der Werte 1, 2, 3 oder 4 verbunden. Dieser Wert wird demPHP-Programm beim Absenden übermittelt. Das Formular mit Auswahleines Bereichs sehen Sie in Abbildung 4.19.

Abbildung 4.19 Eingabeformular mit Radiobuttons

188

Page 190: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP und MySQL 4.2

Das PHP-Programm lautet:

<html><body><?php

mysql_connect("","root");mysql_select_db("firma");$sqlab = "select name, gehalt from personen where ";

switch($_POST["geh"])

case 1:$sqlab .= "gehalt <= 3000";break;

case 2:$sqlab .= "gehalt > 3000 and gehalt <= 3500";break;

case 3:$sqlab .= "gehalt > 3500 and gehalt <= 5000";break;

case 4:$sqlab .= "gehalt > 5000";

$res = mysql_query($sqlab);$num = mysql_num_rows($res);if ($num==0) echo "Keine passenden Datensätze gefunden";

while ($dsatz = mysql_fetch_assoc($res))

echo $dsatz["name"] . ", ". $dsatz["gehalt"] . "<br />";

?></body></html>

Listing 4.10 Datei db_radio.php

switch, caseDas übermittelte Feldelement $_POST["geh"] wird mit Hilfe einerswitch/case-Verzweigung untersucht. Je nach Wert des Feldelementswird eine von mehreren möglichen SQL-Anweisungen gebildet. Diesewird ausgeführt und liefert die gewünschten Daten. Die Ausgabe zuroben angegebenen Option zeigt Abbildung 4.20.

189

Page 191: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

Abbildung 4.20 Ausgabe zur Beispieleingabe

Übung »u_db_radio«

Zeigen Sie mit einem PHP-Programm aus der Tabelle fp der Datenbank hard-ware Festplatten aus bestimmten Preisgruppen an. Die Preisgruppen soll derBenutzer über Radiobuttons auswählen können (Dateien u_db_radio.htm undu_db_radio.php).

Es gelten die folgenden Preisgruppen:

bis 120 € einschließlich

ab 120 € ausschließlich und bis 140 € einschließlich

ab 140 € ausschließlich

Es sollen nur die Angaben zu Hersteller, Typ und Preis geliefert werden. MitHilfe eines Kontrollkästchens soll der Benutzer entscheiden können, ob ereine Sortierung der Ausgabe nach Preis wünscht. Das Formular soll aussehenwie in Abbildung 4.21.

Abbildung 4.21 Formular der Übung »u_db_radio«

Die Ausgabe zur oben angegebenen Beispieleingabe zeigt Abbildung 4.22.

190

Page 192: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP und MySQL 4.2

4.2.5 Datensätze erzeugen

Bestimmten Benutzern kann es gestattet werden, weitere Datensätze zuerzeugen. Die Berechtigung dazu lässt sich über den Benutzernamen und

Abbildung 4.22 Ergebnis der Übung »u_db_radio«

Übung »u_db_select«

Zeigen Sie mit einem PHP-Programm aus der oben angegebenen Tabelle nurnoch Festplatten eines Herstellers an (Dateien u_db_select.htm undu_db_select.php). Der Benutzer soll den gewünschten Hersteller (Fujitsu,Quantum oder Seagate) in einem Select-Menü auswählen. Die Daten sollenin Form einer HTML-Tabelle mit einer Überschrift angezeigt werden. DasFormular sehen Sie in Abbildung 4.23. Die Ausgabe zur Beispielauswahlzeigt Abbildung 4.24.

Abbildung 4.23 Formular der Übung »u_db_select«

Abbildung 4.24 Ergebnis der Übung »u_db_select«

191

Page 193: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

das Kennwort beim Aufbau der Datenbankverbindung oder über einezusätzliche Passworteingabe festlegen.

Datensätzehinzufügen

Es soll der Einfachheit halber angenommen werden, dass jeder BenutzerDatensätze hinzufügen (und in den nachfolgenden Abschnitten auchändern und löschen) kann. Es folgt ein Beispiel für eine Eingabeseite, diesich selbst aufruft (siehe auch Abschnitt 3.4.3, »Formular und Programmin einer Datei«). Das Formular und der PHP-Programmcode werden ineiner Datei zusammengefasst:

<html><head><?php

if (isset($_POST["gesendet"]))

mysql_connect("","root");mysql_select_db("firma");

$sqlab = "insert personen". "(name, vorname, personalnummer,". " gehalt, geburtstag) values ". "('" . $_POST["na"] . "', ". "'" . $_POST["vn"] . "', ". $_POST["pn"] . ", ". $_POST["ge"] . ", ". "'" . $_POST["gt"] . "')";

mysql_query($sqlab);

$num = mysql_affected_rows();if ($num>0)

echo "<p><font color='#00aa00'>";echo "Es wurde 1 Datensatz hinzugefügt";echo "</font></p>";

else

echo "<p><font color='#ff0000'>";echo "Es ist ein Fehler aufgetreten, ";echo "es wurde kein Datensatz hinzugefügt";echo "</font></p>";

?></head>

192

Page 194: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP und MySQL 4.2

<body><p>Geben Sie bitte einen vollständigen Datensatz ein<br />und senden Sie das Formular ab:</p><form action = "db_erzeugen.php" method = "post">

<p><input name="na" /> Name</p><p><input name="vn" /> Vorname</p><p><input name="pn" />

Personalnummer (eine ganze Zahl)</p><p><input name="ge" /> Gehalt

(Nachkommastellen mit Punkt)</p><p><input name="gt" /> Geburtsdatum

(in der Form JJJJ-MM-TT)</p><p><input type="submit" name="gesendet" /><input type="reset" /></p>

</form>

<p>Alle Datensätze <a href="db_tabelle.php">anzeigen</a></p></body></html>

Listing 4.11 Datei db_erzeugen.php

Innerhalb des Programms wird zunächst festgestellt, ob es sich um denersten Aufruf handelt oder um eine weitere Eingabe. Dazu wird demAbsende-Button ein Name gegeben (hier: gesendet). Als Folge hiervonexistiert ab dem zweiten Aufruf des Programms das Feldelement$_POST["gesendet"]. Mit der Abfrage if (isset($_POST["gesen-

det"])) wird zu Beginn festgestellt, ob das Feldelement existiert.

Beim ersten Aufruf der Datei trifft dies noch nicht zu. Daher wird derPHP-Teil der Datei nicht weiter ausgeführt. Bei einem späteren Aufrufder Datei existiert das Feldelement, daher wird der PHP-Teil der Dateiweiter ausgeführt.

insert … intoDie SQL-Anweisung insert dient der Erzeugung von Datensätzen, siewird (wie die select-Anweisung) mit Hilfe von mysql_query() gesen-det. Die Angaben hinter values entsprechen den Namen der Formular-elemente. Auf die Hochkommata für Zeichenketten oder Datumsangabenmüssen Sie besonders achten.

mysql_affected_rows()

Die Funktion mysql_affected_rows() können Sie bei Aktionsabfrageneinsetzen. Unter den Begriff Aktionsabfragen fallen alle Abfragen zumErzeugen (wie hier), Ändern und Löschen von Datensätzen. Die Funktionermittelt die Anzahl der von der Aktion betroffenen (engl. affected)Datensätze.

193

Page 195: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

In diesem Fall muss lediglich geprüft werden, ob diese Anzahl größer als0 war. Ist dies der Fall, so war die Aktion erfolgreich, und der Benutzerwird über den Erfolg informiert. Ein unvollständiger oder falsch einge-tragener Datensatz führt dazu, dass er nicht hinzugefügt wird. Falls einDatensatz mit einer Personalnummer eingegeben wird, die bereits vor-handen ist, führt dies ebenfalls zu einem Fehler. Im Fehlerfall wird derBenutzer hierüber informiert.

Innerhalb des Formulars sind fünf Eingabefelder für die Inhalte der fünfDatenbankfelder vorhanden. Ihre Namen werden im PHP-Programmverwendet. Nach dem Formular folgt ein Hyperlink auf das PHP-Pro-gramm, das zur Auflistung aller Datensätze führt. Auf diese Weise kannman sich bei Bedarf schnell über die eingetragenen Werte informieren.Abbildung 4.25 zeigt das Formular beim ersten Aufruf und mit einem zuspeichernden Datensatz.

Abbildung 4.25 Erster Aufruf

Nach dem Absenden und erfolgreichen Eintragen sieht der obere Teil derSeite aus wie in Abbildung 4.26.

Hinweis

Während der Testphase möchten Sie deutlich sehen, wie sich der erste Auf-ruf und weitere Aufrufe voneinander unterscheiden. Ein Aktualisieren derDatei im Browser führt nicht zu einem neuen ersten Aufruf, sondern zurWiederholung des letzten Aufrufs.

194

Page 196: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP und MySQL 4.2

Abbildung 4.26 Nach dem Eintragen (Ausschnitt)

Dabei wird versucht, den gleichen Datensatz noch einmal einzutragen! Dieskann natürlich nicht gelingen, da die Personalnummer dann doppelt vorhan-den wäre.

Wechseln Sie daher zu einer anderen Seite und anschließend wieder zurückzur Seite db_erzeugen.php, oder betätigen Sie hinter der URL in der Adress-zeile des Browsers die Taste (¢). Dies erzeugt einen neuen ersten Aufruf.

Übung »u_db_erzeugen«

Ermöglichen Sie mit einem PHP-Programm das Hinzufügen von Datensätzenzu der Tabelle fp der Datenbank hardware (Datei u_db_erzeugen.php).

Das Formular soll aussehen wie in Abbildung 4.27.

Abbildung 4.27 Formular der Übung »u_db_erzeugen«

195

Page 197: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

4.2.6 Ändern mehrerer Datensätze

Datensätze ändern Beim Ändern von Datensätzen sollten Sie genau überlegen, welcheÄnderungen Sie bei welchen Datensätzen vornehmen wollen. Handelt essich um eine Änderung bei genau einem Datensatz, der eventuell einenfalschen Eintrag hat, oder soll eine Gruppe von Datensätzen durch eineÄnderung aktualisiert werden? Beide Vorgänge zeige ich anhand vonBeispielen.

Nehmen wir an, dass aufgrund eines günstigen Geschäftsverlaufs dieGehälter aller Mitarbeiter um 5 % erhöht werden sollen. Die folgendeHTML-Datei stellt zwei Möglichkeiten zur Verfügung:

Die Erhöhung soll durchgeführt werden (Aufruf des PHP-Programmsüber einen Hyperlink).

Alle Datensätze sollen zur Kontrolle angezeigt werden.

<html><body><p>Alle Gehälter um 5% <a href="db_alle.php">erhöhen</a></p><p>Alle Datensätze <a href="db_tabelle.php">anzeigen</a></p></body></html>

Listing 4.12 Datei db_alle.htm

Abbildung 4.28 zeigt das Formular.

Abbildung 4.28 Änderung aller Datensätze

Beim Aufruf des PHP-Programms wird die Änderung jedes Mal (!) durch-geführt:

<html><body><?php

mysql_connect("","root");mysql_select_db("firma");

196

Page 198: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP und MySQL 4.2

$sqlab = "update personen set gehalt = gehalt * 1.05";mysql_query($sqlab);

$num = mysql_affected_rows();echo "<p>Es wurden $num Datensätze geändert</p>";

?><p>Alle Datensätze <a href="db_tabelle.php">anzeigen</a></p></body></html>

Listing 4.13 Datei db_alle.php

update … setDer Inhalt des Feldes gehalt wird mit Hilfe der SQL-Anweisung updatebei allen Datensätzen verändert. Der alte Wert wird mit dem Faktor 1.05multipliziert. Das Ergebnis wird als neuer Wert in die Datenbankgeschrieben.

4.2.7 Ändern eines bestimmten Datensatzes

Datensatzauswählenund ändern

Um einen einzelnen Datensatz zu ändern, muss dieser zuvor identifiziertwerden. Dies ist möglich, falls auf einem Feld der Tabelle ein Primär-schlüssel liegt. Es empfiehlt sich folgende Vorgehensweise für eine kom-fortable Benutzerführung bei einer Änderung:

Dem Benutzer werden alle Datensätze angezeigt.

Er wählt denjenigen Datensatz aus, den er ändern möchte.

Der gewählte Datensatz wird in einem Formular angezeigt.

Der Benutzer gibt die Änderungen ein und führt sie aus.

In der Tabelle personen liegt der eindeutige Index auf dem Feld perso-nalnummer. Die beschriebene Vorgehensweise wird in einem Beispiel infolgenden Dateien realisiert:

Datei db_einzel_a.php zur Anzeige aller Datensätze und zur Auswahl

Datei db_einzel_b.php zur Anzeige eines Datensatzes und zur Eingabeder Änderungen

Datei db_einzel_c.php zur Durchführung der Änderungen

Anzeige und Auswahl

Zunächst zeigt Abbildung 4.29 die Anzeige aller Datensätze in Tabellen-form, mit Radiobuttons zur Auswahl eines bestimmten Datensatzes.

197

Page 199: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

Abbildung 4.29 Auswahlformular

Der Programmcode lautet:

<html><body><p>Wählen Sie aus, welcher Datensatz

geändert werden soll:</p><form action = "db_einzel_b.php" method = "post"><?php

mysql_connect("","root");mysql_select_db("firma");

$res = mysql_query("select * from personen");$num = mysql_num_rows($res);

// Tabellenbeginnecho "<table border='1'>";

// Überschriftecho "<tr> <td>Auswahl</td> <td>Name</td>";echo "<td>Vorname</td> <td>P-Nr</td>";echo "<td>Gehalt</td> <td>Geburtstag</td> </tr>";

while ($dsatz = mysql_fetch_assoc($res))

echo "<tr>";echo "<td><input type='radio' name='auswahl'";echo " value='"

. $dsatz["personalnummer"] . "' /></td>";echo "<td>" . $dsatz["name"] . "</td>";echo "<td>" . $dsatz["vorname"] . "</td>";echo "<td>" . $dsatz["personalnummer"] . "</td>";

198

Page 200: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP und MySQL 4.2

echo "<td>" . $dsatz["gehalt"] . "</td>";echo "<td>" . $dsatz["geburtstag"] . "</td>";echo "</tr>";

// Tabellenendeecho "</table>";

?><p><input type="submit" value="Datensatz anzeigen" /></p></form></body></html>

Listing 4.14 Datei db_einzel_a.php

Zusätzlich zur bisherigen Tabelle gibt es eine Spalte mit Radiobuttons.Diese Radiobuttons bilden eine Optionsgruppe, da sie alle den gleichenNamen (auswahl) haben. Als Wert der Radiobuttons wird die jeweiligePersonalnummer verwendet. Der Benutzer wählt über den Radiobuttoneinen Datensatz aus. Die Personalnummer des ausgewählten Datensatzeswird beim Absenden an die Datei db_einzel_b.php übermittelt.

Anzeigen eines Datensatzes

Der ausgewählte Datensatz wird mit allen Daten innerhalb eines Formu-lars angezeigt. Es folgt der Programmcode:

<html><body><?phpif (isset($_POST["auswahl"]))

mysql_connect("","root");mysql_select_db("firma");$sqlab = "select * from personen where

personalnummer = " . $_POST["auswahl"];$res = mysql_query($sqlab);$dsatz = mysql_fetch_assoc($res);

echo "<p>Führen Sie die Änderungen durch,<br />";echo "betätigen Sie anschließend den Button</p>";echo "<form action = 'db_einzel_c.php' method = 'post'>";

echo "<p><input name='nn' value='" . $dsatz["name"]. "' /> Nachname</p>";

echo "<p><input name='vn' value='" . $dsatz["vorname"]

199

Page 201: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

. "' /> Vorname</p>";echo "<p><input name='pn' value='" . $_POST["auswahl"]

. "' /> Personalnummer</p>";echo "<p><input name='ge' value='" . $dsatz["gehalt"]

. "' /> Gehalt</p>";echo "<p><input name='gt' value='" . $dsatz["geburtstag"]

. "' /> Geburtstag</p>";echo "<input type='hidden' name='oripn' value='"

. $_POST["auswahl"] . "' />";echo "<p><input type='submit'

value='Änderungen in Datenbank speichern' />";echo " <input type='reset' /></p>";echo "</form>";

else

echo "<p>Es wurde kein Datensatz ausgewählt</p>";?></body></html>

Listing 4.15 Datei db_einzel_b.php

Wenn ein Datensatz ausgewählt wurde, erfolgt die Auswahl mit Hilfe desübermittelten Feldelements $_POST["auswahl"]. Das Ergebnis umfasstgenau einen Datensatz. Die aktuellen Inhalte der Felder aus diesemDatensatz werden innerhalb der Eingabefelder des Formulars angezeigt,siehe Abbildung 4.30. Im Programmcode müssen Sie besonders auf dieeinfachen Hochkommata achten.

Abbildung 4.30 Anzeige des Datensatzes (mit Änderung)

200

Page 202: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP und MySQL 4.2

Der Benutzer kann die Inhalte teilweise oder insgesamt ändern, darunterauch die Personalnummer. Beim Absenden werden die geändertenInhalte der Eingabefelder an die Datei db_einzel_c.php übermittelt.

Gleichzeitig wird der Inhalt eines weiteren, versteckten Formularfeldes(oripn) mit der Originalpersonalnummer übermittelt, die zur eindeuti-gen Identifizierung benötigt wird. Falls der Benutzer die Personalnum-mer geändert hat, stünde diese Originalinformation andernfalls nichtmehr zur Verfügung.

Durchführen der Änderung

Nach der Durchführung wird die Änderung bestätigt, siehe Abbildung4.31.

Abbildung 4.31 Bestätigung der Änderung

Der Programmcode sieht wie folgt aus:

<html><body><?php

mysql_connect("","root");mysql_select_db("firma");

$sqlab = "update personen set". " name = '" . $_POST["nn"] . "',". " vorname = '" . $_POST["vn"] . "',". " personalnummer = " . $_POST["pn"] . ",". " gehalt = " . $_POST["ge"] . ",". " geburtstag = '" . $_POST["gt"] . "'". " where personalnummer = " . $_POST["oripn"];

mysql_query($sqlab);

$num = mysql_affected_rows();if ($num>0)

echo "<p>Der Datensatz wurde geändert</p>";else

201

Page 203: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

echo "<p>Der Datensatz wurde nicht geändert</p>";?><p>Zurück zur <a href="db_einzel_a.php">Auswahl</a></p></body></html>

Listing 4.16 Datei db_einzel_c.php

update … set Die SQL-Anweisung update führt die Änderung mit den neuen Inhaltendurch. Die Identifizierung des zu ändernden Datensatzes geschiehtanhand der Originalpersonalnummer. Falls die Änderung nicht durchge-führt werden konnte (zum Beispiel aufgrund einer bereits vorhandenenPersonalnummer), wird dies gemeldet. Über den Hyperlink kann derBenutzer zurück zum Anfang gehen, um weitere Datensätze zu ändern.

4.2.8 Datensätze löschen

Datensatzauswählen

und löschen

Beim Löschen von Datensätzen sollten Sie noch genauer als beim Ändernaufpassen, welche Datensätze betroffen sind. Zum Löschen eines einzel-nen Datensatzes muss (wie beim Ändern) der betreffende Datensatzzuvor über das Feld ermittelt werden, auf dem der Primärschlüssel liegt.Es empfiehlt sich folgende Vorgehensweise für eine sichere Benutzerfüh-rung bei einer Löschung:

Dem Benutzer werden alle Datensätze angezeigt.

Er wählt denjenigen Datensatz aus, den er löschen möchte.

Er führt die Löschung durch.

Die beschriebene Vorgehensweise wird an einem Beispiel in folgendenDateien realisiert:

Datei db_loeschen_a.php zur Anzeige aller Datensätze und zur Aus-wahl, siehe Abbildung 4.32

Datei db_loeschen_b.php zur Durchführung der Änderungen

Die Datei db_loeschen_a.php wird hier nicht gesondert aufgeführt, da siesich nur an den folgenden drei Stellen von der Datei db_einzel_a.phpunterscheidet:

Im Text oberhalb der Tabelle wird das Wort geändert durch das Wortgelöscht ersetzt.

Die Aufschrift des Submit-Buttons wird von Datensatz anzeigen aufDatensatz löschen geändert.

202

Page 204: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP und MySQL 4.2

Bei dem aufgerufenen PHP-Programm handelt es sich um die Dateidb_loeschen_b.php anstelle der Datei db_einzel_b.php.

Abbildung 4.32 Auswahlformular

Nach der Durchführung wird die Löschung bestätigt, siehe Abbildung4.33. Der Programmcode des Löschvorgangs sieht wie folgt aus:

<html><body><?phpif (isset($_POST["auswahl"]))

mysql_connect("","root");mysql_select_db("firma");

$sqlab = "delete from personen where". " personalnummer = " . $_POST["auswahl"];

mysql_query($sqlab);

$num = mysql_affected_rows();if ($num>0)

echo "<p>Der Datensatz wurde gelöscht</p>";else

echo "<p>Der Datensatz wurde nicht gelöscht</p>";else

echo "<p>Es wurde kein Datensatz ausgewählt</p>";?><p>Zurück zur <a href="db_loeschen_a.php">Auswahl</a></p>

203

Page 205: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

</body></html>

Listing 4.17 Datei db_loeschen_b.php

delete … from Das Feldelement $_POST["auswahl"] beinhaltet die Personalnummerdes ausgewählten Eintrags. Der mit delete zu löschende Datensatz kanndamit eindeutig identifiziert werden.

Abbildung 4.33 Bestätigung der Löschung

Falls kein Datensatz ausgewählt wurde, existiert das Feldelement$_POST["auswahl"] nicht, und es wird eine entsprechende Meldungangezeigt.

4.2.9 Benutzeroberfläche mit JavaScript und CSS

GUI, JavaScript,CSS

Die in diesem Abschnitt vorgestellten SQL-Anweisungen zum Anzeigen,Erzeugen, Ändern und Löschen von Datensätzen sollen in einem Pro-gramm zu einer komfortabel zu bedienenden Benutzeroberfläche füreine Tabelle vereinigt werden. Es werden Hyperlinks mit JavaScript-Code zum Erzeugen dynamischer Abfragen sowie CSS-Formatierungen

Übung »u_db_einzel«

Ermöglichen Sie (ähnlich wie in den Dateien db_einzel_a.php, db_einzel_b.phpund db_einzel_c.php) mit Hilfe eines PHP-Programms das Ändern von Daten-sätzen in der Tabelle fp der Datenbank hardware (Dateien u_db_einzel_a.phpbis u_db_einzel_c.php).

Übung »u_db_loeschen«

Ermöglichen Sie (ähnlich wie in den Dateien db_loeschen_a.php unddb_loeschen_b.php) mit Hilfe eines PHP-Programms das Löschen von Daten-sätzen in der Tabelle fp der Datenbank hardware (Dateien u_db_loeschen_a.phpund u_db_loeschen_b.php).

204

Page 206: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP und MySQL 4.2

zur optischen Verbesserung eingesetzt. Sie sehen eine Darstellung inAbbildung 4.34.

Abbildung 4.34 Benutzeroberfläche mit JavaScript und CSS

Die einzelnen Elemente der Darstellung:

In der ersten Zeile finden sich, wie gewohnt, die Feldnamen.

Neu eintragen In der zweiten Zeile stehen fünf leere Eingabefelder zum Eintragender Daten eines neuen Datensatzes bereit. Nach dem Eintragen kannder Hyperlink neu eintragen betätigt werden. Dieser führt zu einerinsert-Anweisung zum Erzeugen des neuen Datensatzes und zurerneuten Anzeige aller Datensätze.

Ändern In den darauffolgenden Zeilen stehen die Daten aller Datensätze inEingabefeldern zum Ändern bereit. Nach dem Ändern der Dateneines bestimmten Datensatzes kann der zugehörige Hyperlink ändernbetätigt werden. Dieser führt zu einer update-Anweisung zumÄndern des Datensatzes und zur erneuten Anzeige aller Datensätze.

Löschen Falls innerhalb einer Zeile der zugehörige Hyperlink löschen betätigtwird, erscheint eine Rückfrage, ob der betreffende Datensatz tatsäch-lich gelöscht werden soll (siehe Abbildung 4.35). Wird die Rückfragebestätigt, führt dies zu einer delete-Anweisung zum Löschen desDatensatzes und zur erneuten Anzeige aller Datensätze.

Abbildung 4.35 Bestätigung zur Löschung eines Datensatzes

205

Page 207: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

Dieses Programm (db_linkcss.php) ist etwas umfangreicher. Es soll daherin einzelnen Teilen dargestellt und erläutert werden.

CSS-Formatierung Innerhalb des Dokuments wird eine CSS-Formatierungsdatei benötigt:

body,td font-family:Verdana; font-size:10pt;color:#636363; background-color:#d3d3d3

a:link color:#636363a:visited color:#636363a:hover color:#636363; background-color:#a3a3a3

Listing 4.18 Datei db_linkcss.css

Für den Inhalt des Dokuments und für den Inhalt der Tabellenzellen wer-den Schriftart, Schriftgröße, Schriftfarbe und Hintergrundfarbe bestimmt.Anschließend wird das Verhalten der Hyperlinks eingestellt. Es folgt dererste Teil des PHP-Programms – der Kopf des Dokuments mit CSS undJavaScript:

<html><head><link rel="stylesheet" type="text/css"

href="db_linkcss.css">

<script type="text/javascript">function send(ak,id)

if(ak==0)document.f.ak.value = "in";

else if(ak==1)document.f.ak.value = "up";

else if(ak==2)

if (confirm("Datensatz mit id " + id + " löschen?"))document.f.ak.value = "de";

elsereturn;

document.f.id.value = id;document.f.submit();

</script></head>

Listing 4.19 Datei db_linkcss.php (Teil 1 von 4)

206

Page 208: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP und MySQL 4.2

Zunächst wird die externe CSS-Formatierungsdatei db_linkcss.css einge-bunden.

JavaScriptEs folgt die JavaScript-Funktion send(), die zwei Parameter erwartet undüber einen der drei Hyperlinks im Dokument aufgerufen wird. Sie dientdem Absenden der Daten, zur Übermittlung der gewünschten Aktionsowie zur Identifizierung des betroffenen Datensatzes.

Der Parameter ak kann einen der drei folgenden Werte annehmen:

Wert 0: Ein neuer Datensatz soll eingetragen werden.

Wert 1: Ein Datensatz soll geändert werden.

Wert 2: Ein Datensatz soll gelöscht werden.

Der betreffende Wert führt zu einer Zuweisung eines Werts (in, up oderde) an das versteckte Formularfeld ak.

confirm()Falls ein Datensatz gelöscht werden soll, wird als Rückfrage die vordefi-nierte JavaScript-Funktion confirm() aufgerufen. Falls diese Rückfragemit OK bestätigt wird, liefert die Funktion confirm() den Wert truezurück. Falls bei dieser Rückfrage der Button Abbrechen betätigt wird,liefert die Funktion confirm() den Wert false zurück. Die Funktionsend() wird daraufhin abgebrochen, und das Formular wird nicht gesen-det.

Der Parameter id dient der Identifikation des Datensatzes, falls diesergeändert oder gelöscht werden soll. Sein Wert wird dem versteckten For-mularfeld id zugewiesen. Anschließend wird das Formular gesendet.

Es folgt der zweite Teil – das Auslösen einer Aktion:

<body><?php

mysql_connect("","root");mysql_select_db("firma");

/* Aktion ausführen */if(isset($_POST["ak"]))

/* neu eintragen */if($_POST["ak"]=="in")

$sqlab = "insert personen". "(name, vorname, personalnummer,". " gehalt, geburtstag) values ('"

207

Page 209: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

. $_POST["na"][0] . "', '"

. $_POST["vo"][0] . "', '"

. $_POST["pn"][0] . "', '"

. $_POST["gh"][0] . "', '"

. $_POST["gb"][0] . "')";mysql_query($sqlab);

/* ändern */else if($_POST["ak"]=="up")

$id = $_POST["id"];$sqlab = "update personen set "

. "name = '" . $_POST["na"][$id] . "', "

. "vorname = '" . $_POST["vo"][$id] . "', "

. "personalnummer = '" . $_POST["pn"][$id] . "', "

. "gehalt = '" . $_POST["gh"][$id] . "', "

. "geburtstag = '" . $_POST["gb"][$id] . "'"

. " where personalnummer = $id";mysql_query($sqlab);

/* löschen */else if($_POST["ak"]=="de")

$sqlab = "delete from personenwhere personalnummer = " . $_POST["id"];

mysql_query($sqlab);

Listing 4.20 Datei db_linkcss.php (Teil 2 von 4)

Nach der Aufnahme der Verbindung und der Wahl der Datenbank wirduntersucht, ob das Feldelement $_POST["ak"] existiert. Dies ist beim ers-ten Aufruf des Dokuments noch nicht der Fall, daher wird der folgendeBlock übergangen. Falls das Dokument erneut aufgerufen wird, weil eineder drei genannten Aktionen ausgelöst wurde, existiert das Feldelement$_POST["ak"] und kann untersucht werden:

Neu eintragen Falls neu eingetragen werden soll (if($_POST["ak"] == "in")), wirddie SQL-Anweisung insert zusammengesetzt. Dabei werden dieWerte der Formularelemente aus der zweiten Zeile (direkt unter derÜberschrift) genommen. Diese haben die Namen na[0], vo[0] usw.,

208

Page 210: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP und MySQL 4.2

sie werden also als Elemente eines zweidimensionalen Feldes an dasPHP-Programm übermittelt.

Ändern Falls ein Datensatz geändert werden soll (if($_POST["ak"] == "up")),wird die SQL-Anweisung update benutzt. Dabei werden die Werteder Formularelemente aus der betreffenden Zeile genommen. Beieinem Datensatz, dessen Personalnummer 4711 ist, haben diese For-mularelemente die Namen na[4711], vo[4711] usw. Sie sind für PHPebenso Elemente des zweidimensionalen Feldes. Der Datensatz wirdüber den Wert des Feldelements $_POST["id"] identifiziert, der indem versteckten Formularelement übermittelt wurde.

Löschen Falls ein Datensatz gelöscht werden soll (if($_POST["ak"] == "de")),wird die SQL-Anweisung delete verwendet. Der Datensatz wirdebenso über den Wert des Feldelements $_POST["id"] identifiziert.

Es folgt der dritte Teil – der Beginn der Anzeige:

/* Formularbeginn */echo "<form name='f' action='db_linkcss.php'

method='post'>";echo "<input name='ak' type='hidden' />";echo "<input name='id' type='hidden' />";

/* Tabellenbeginn */echo "\n\n<table border>". "<tr>". "<td>Name</td>". "<td>Vorname</td>". "<td>Pnr</td>". "<td>Gehalt</td>". "<td>Geb.</td>". "<td>Aktion</td>". "</tr>";

/* Neuer Eintrag */echo "\n\n<tr>". "<td><input name='na[0]' size='8' /></td>". "<td><input name='vo[0]' size='6' /></td>". "<td><input name='pn[0]' size='6' /></td>". "<td><input name='gh[0]' size='6' /></td>". "<td><input name='gb[0]' size='10' /></td>". "<td><a href='javascript:send(0,0);'>

neu eintragen</a></td>". "</tr>";

Listing 4.21 Datei db_linkcss.php (Teil 3 von 4)

209

Page 211: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

Das Formular ruft sich selbst auf. Es beinhaltet die beiden verstecktenFormularelemente ak und id, die von der genannten JavaScript-Funk-tion ihre Werte erhalten. Es folgt die Tabellenüberschrift.

Die erste Zeile mit den Eingabefeldern für einen neuen Datensatz wirdzusammengesetzt. Die Felder erhalten die Namen na[0], vo[0] usw. DieInhalte werden für die SQL-Anweisung insert benötigt.

Der Hyperlink neu eintragen löst den Aufruf der JavaScript-Funktionsend() aus. Der erste Parameter ist 0. Dies setzt den Wert des verstecktenFormularelements ak auf in. Der zweite Parameter ist für diesen Aufrufunwichtig, muss aber besetzt werden, da die Funktion zwei Parametererwartet. Vor den HTML-Markierungen table und tr steht jeweils zwei-mal \n. Dieses Sonderzeichen wird am Ende des Abschnitts erläutert.

Es folgt der vierte Teil – die Ausgabe der Datensätze:

/* Anzeigen */$res = mysql_query("select * from personen");

/* Alle vorhandenen Datensätze */while ($dsatz = mysql_fetch_assoc($res))

$id = $dsatz["personalnummer"];echo "\n\n<tr>". "<td><input name='na[$id]' value='". $dsatz["name"] . "' size='8' /></td>". "<td><input name='vo[$id]' value='". $dsatz["vorname"] . "' size='6' /></td>". "<td><input name='pn[$id]' value='". $dsatz["personalnummer"] . "' size='6' /></td>". "<td><input name='gh[$id]' value='". $dsatz["gehalt"] . "' size='6' /></td>". "<td><input name='gb[$id]' value='". $dsatz["geburtstag"] . "' size='10' /></td>". "<td><a href='javascript:send(1,$id);'>ändern</a>". " <a href='javascript:send(2,$id);'>". " löschen</a></td>". "</tr>";

echo "</table>";echo "</form>";

?></body></html>

Listing 4.22 Datei db_linkcss.php (Teil 4 von 4)

210

Page 212: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP und MySQL 4.2

Nachdem die Aktion ausgeführt worden ist, sollen alle aktuellen, vorhan-denen Datensätze angezeigt werden. Dies betrifft auch die neuen bezie-hungsweise geänderten Datensätze, nicht aber die gelöschten. Dazudient die SQL-Anweisung select.

Innerhalb der Schleife, bei der jeweils ein Datensatz ausgegeben wird,erhält die Variable $id den Wert der Personalnummer des aktuellenDatensatzes. Diese Variable wird zur Indizierung der verschiedenen Fel-der von Formularelementen und für den Aufruf der JavaScript-Funktio-nen benötigt.

In der darauffolgenden Ausgabe der input-Elemente werden bei einemDatensatz, dessen Personalnummer 4711 ist, diese Formularelementena[4711], vo[4711] usw. genannt. Sie sind damit für PHP Elementeeines numerisch indizierten Feldes. Die aktuellen Werte jedes Datensat-zes werden als Inhalt der input-Elemente eingetragen.

Auf jeden Datensatz folgen zwei Hyperlinks. Sie rufen jeweils die Java-Script-Funktion send() auf. Der erste Parameter hat den Wert 1 (fürändern) beziehungsweise 2 (für löschen). Der zweite Parameter hat denWert der Personalnummer, im obigen Beispiel also 4711. Jeder Hyper-link ändern beziehungsweise löschen ist also individuell und dient derÜbermittlung eigener Daten.

Zwei Hinweise

Sie können kontrollieren, ob die richtigen Ziele für die Hyperlinks ändern undlöschen eingetragen wurden, indem Sie sie mit dem Mauszeiger überstrei-chen. Das Ziel wird dann unten im Browser angezeigt.

Das Sonderzeichen \n führt zu einem Zeilenumbruch im HTML-Code. Zwei\n hintereinander erzeugen somit einen Zeilenumbruch und eine Leerzeile.Dies kann Ihnen zur besseren Orientierung dienen, falls Sie bei einer Fehler-suche den von PHP generierten HTML-Code im Quelltext der Seite kontrol-lieren möchten. Sie gelangen (zum Beispiel in Mozilla Firefox 7 unter Win-dows) über das Menü Web-Entwickler Seitenquelltext anzeigen zu dieserAnzeige. In Mozilla Firefox 7 unter Ubuntu geht es über das Menü Extras Web-Entwickler Seitenquelltext anzeigen. Ein Beispiel zeigt Abbildung 4.36.

211

Page 213: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

4.2.10 Ein Datenbankbrowser

Alle Datenbankenund Tabellen

In diesem Abschnitt beschreibe ich ein Projekt, das aus zwei Program-men besteht und mit dessen Hilfe sich die Strukturen und Inhalte alleraktuell vorhandenen Datenbanken unter MySQL übersichtlich darstellenlassen.

Sie können das Projekt vom Buch-Datenträger kopieren (db_browser_a.php und db_browser_b.php) und als Übersichts-Tool wäh-rend der Bearbeitung und Programmierung der eigenen Datenbankennutzen.

Außerdem werden viele MySQL-Funktionen und SQL-Befehle hiernicht nur an einem kleinen Beispiel gezeigt, sondern im Zusammen-spiel innerhalb eines größeren Projekts.

Alle Daten Innerhalb des ersten Programms werden die Strukturen der Datenban-ken ermittelt und ausgegeben. Im zweiten Programm werden bei Bedarfdie Inhalte der ausgewählten Tabelle dargestellt.

Struktur aller Datenbanken

Die Ausgabe der Struktur aller Datenbanken ist umfangreich. In Abbil-dung 4.37 sehen Sie beispielhaft einen Ausschnitt, nämlich die Strukturder Datenbank firma.

Die einzelnen Teile des ersten Programms sind zur besseren Übersichtnummeriert und werden anschließend erläutert.

Abbildung 4.36 HTML-Seitenquelltext von db_linkcss.php (Auszug)

212

Page 214: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP und MySQL 4.2

Abbildung 4.37 Datenbank »firma«

<html><body><?php

/* 1: Verbindung aufnehmen */$con = mysql_connect("","root");

/* 2: Liste der Datenbanken */$dbresult = mysql_query("show databases");

/* 3: Anzahl der Datenbanken, Überschrift */$numdbs = mysql_num_rows($dbresult);echo "<h3 align='center'>MySQL, Informationen über

Struktur und Inhalt aller $numdbs vorhandenenDatenbanken</h3>";

/* 4: Schleife über alle Datenbanken */$d = 0;while($dbdsatz = mysql_fetch_array($dbresult))

/* 5: Nummer und Name der Datenbank */$d++;$dbname = $dbdsatz[0];

/* 6: Datenbank auswählen */mysql_select_db($dbname);

/* 7: Liste der Tabellen der akt. Datenbank */

213

Page 215: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

$tabresult = mysql_query("show tables from $dbname");

/* 8: Anzahl der Tabellen */$numtabs = mysql_num_rows($tabresult);if ($numtabs==1) $tabtext = "Tabelle";else $tabtext = "Tabellen";

/* 9: Tabelle beginnen, Überschrift */echo "<table border='1' width='100 %'><tr>"

. "<td colspan='8' bgcolor='#c3c3c3'>"

. "<b>Datenbank $d: $dbname</b><br />"

. "$numtabs $tabtext</td></tr>";

/* 10: Schleife über alle Tabellen */$t = 0;while($tabdsatz = mysql_fetch_array($tabresult))

/* 11: Nummer und Name der Tabelle */$t++;$tabname = $tabdsatz[0];

/* 12: Liste der Felder der akt. Tabelle */$fdresult =

mysql_query("show columns from $tabname");

/* 13: Anzahl der Felder */$numfds = mysql_num_rows($fdresult);if ($numfds==1) $fdtext = "Feld";else $fdtext = "Felder";

/* 14: Anzahl der Datensätze */$dataresult = mysql_query("select * from $tabname");

if (!$dataresult) $numdata = –1;else $numdata = mysql_num_rows($dataresult);

if ($numdata==1) $datatext = "Datensatz";else $datatext = "Datensätze";

/* 15: Anzeigebutton */if ($numdata==0) $ft = "&nbsp;";elseif ($numdata==-1) $ft = "Anzeige-<br />problem";else

$ft = "<form action='db_browser_b.php'

214

Page 216: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP und MySQL 4.2

method='post'>". "<input type='hidden' name='dbname'

value='$dbname' />". "<input type='hidden' name='tabname'

value='$tabname' />". "<input type='submit' value='ansehen' />". "</form>";

/* 16: Tabelle der Felder, Überschrift */echo "<tr>"

. "<td width='24%' bgcolor='#c3c3c3'>Tabelle $d / $t : $tabname<br />"

. "$numfds $fdtext, $numdata $datatext</td>"

. "<td width='16%' align='center'bgcolor='#c3c3c3'>$ft</td>"

. "<td width='16%' bgcolor='#c3c3c3'>Name:</td>"

. "<td width='16%' bgcolor='#c3c3c3'>Typ:</td>"

. "<td width='7%' bgcolor='#c3c3c3'>Null:</td>"

. "<td width='7%' bgcolor='#c3c3c3'>Key:</td>"

. "<td width='7%' bgcolor='#c3c3c3'>Default:</td>"

. "<td width='7%' bgcolor='#c3c3c3'>Extra:</td>"

. "</tr>";

/* 17: Schleife über alle Felder */$f = 0;while($fddsatz = mysql_fetch_array($fdresult))

/* 18: Nummer des Feldes, Feldname,-typ, – länge und -flags */

$f++;$fdname = $fddsatz[0];$fdtype = $fddsatz[1];$fdnull = $fddsatz[2];$fdkey = $fddsatz[3];$fddefault = $fddsatz[4];$fdextra = $fddsatz[5];

if (!$fdkey) $fdkey = "&nbsp;";if (!$fddefault) $fddefault = "&nbsp;";if (!$fdextra) $fdextra = "&nbsp;";

/* 19: Ausgabe der Feldinformationen */echo "<tr>". "<td colspan='2'>Feld $d / $t / $f :</td>"

215

Page 217: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

. "<td>$fdname</td>"

. "<td>$fdtype</td>"

. "<td>$fdnull</td>"

. "<td>$fdkey</td>"

. "<td>$fddefault</td>"

. "<td>$fdextra</td>"

. "</tr>";

/* 20: Tabelle beenden */echo "</table><p>&nbsp;</p>";

?></body></html>

Listing 4.23 Datei db_browser_a.php

1. Die Verbindung zur Datenbank wird aufgenommen, Ergebnis ist eineVerbindungskennung.

show databases 2. Mit Hilfe der SQL-Anweisung show databases wird eine Abfragegestartet, deren Ergebnis eine Liste der verfügbaren Datenbanken aufdem Datenbankserver ist.

3. Mit Hilfe der Funktion mysql_num_rows() wird die Anzahl der verfüg-baren Datenbanken auf dem Server in $numdbs gespeichert. Es wirdeine Überschrift mit dieser Anzahl ausgegeben.

4. Das Abfrageergebnis für die Datenbanken wird in einer Schleifedurchlaufen.

5. Der Inhalt des ersten Feldes jedes Ergebnisdatensatzes ist der Nameder Datenbank. Dieser wird in $dbname gespeichert.

6. Mit der Funktion mysql_select_db() wird die aktuelle Datenbankausgewählt.

show tables 7. Mit Hilfe der Funktion mysql_query() und der SQL-Anweisung showtables wird eine Liste der Tabellen, die sich innerhalb der aktuellenDatenbank befinden, in $tabresult gespeichert.

8. Mit Hilfe der Funktion mysql_num_rows() wird die Anzahl der Tabel-len, die sich innerhalb der aktuellen Datenbank befinden, in $numtabsgespeichert.

216

Page 218: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP und MySQL 4.2

9. Die Ausgabe der Struktur der aktuellen Datenbank in Form einerHTML-Tabelle wird begonnen. Es werden der Name der Datenbankund die Anzahl der Tabellen ausgegeben.

10. Das Abfrageergebnis für die Tabellen wird in einer Schleife durchlau-fen.

11. Der Inhalt des ersten Feldes jedes Ergebnisdatensatzes ist der Nameder Tabelle. Dieser wird in $tabname gespeichert.

show columns12. Mit Hilfe der Funktion mysql_query() und der SQL-Anweisung showcolumns wird eine Liste der Felder, die sich innerhalb der aktuellenDatenbank befinden, in $fdresult gespeichert.

13. Mit Hilfe der Funktion mysql_num_rows() wird die Anzahl der Fel-der, die sich innerhalb der aktuellen Tabelle befinden, in $numfdsgespeichert.

14. Mit Hilfe der Funktionen mysql_query() und mysql_num_rows()wird die Anzahl der Datensätze, die sich innerhalb der aktuellenTabelle befinden, in $numdata gespeichert.

15. Falls es Datensätze innerhalb der Tabelle gibt, soll ein Button darge-stellt werden. Zur Anzeige aller Datensätze kann dieser Button betä-tigt werden, es wird dann das zweite Programm des Projekts aufgeru-fen (db_browser_b.php). Beim Aufruf werden der Name derDatenbank und der Name der Tabelle als versteckte Formularele-mente an das ausführende Programm übermittelt.

16. Die Ausgabe der Struktur der aktuellen Tabelle wird begonnen. Ineiner Kopfzeile werden ausgegeben: Nummer der Datenbank sowieNummer und Name der Tabelle, Anzahl der Felder, Anzahl derDatensätze, eventuell der Anzeige-Button für die Datensätze, derName der Felder sowie weitere Feldeigenschaften.

17. Das Abfrageergebnis für die Felder wird in einer Schleife durchlaufen.

18. Die Ergebnisdatensätze beinhalten der Reihe nach:

Feldname,

Felddatentyp,

Null-Eigenschaft des Feldes (das Feld darf leer bleiben oder nicht),

Schlüssel-Eigenschaft des Feldes (auf dem Feld liegt ein eindeuti-ger Schlüssel oder ein Primärschlüssel),

Default-Wert des Feldes und

Extra-Eigenschaften (zum Beispiel on update current timestampoder auto_increment).

217

Page 219: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

19. Es werden die laufende Nummer des Feldes und die gesammeltenFeldeigenschaften ausgegeben.

20. Nach Beendigung der beiden inneren Schleifen wird die HTML-Tabelle zur Ausgabe einer Datenbank beendet.

Inhalt aller Datenbanken

Falls jemand im oben angegebenen Programm den Button ansetzen fürdie Datenbank firma betätigt, ergibt sich eine Ausgabe wie in Abbildung4.38.

Abbildung 4.38 Anzeige der Inhalte

Das zweite Programm zur Darstellung der Inhalte der ausgewähltenTabelle beinhaltet keine neu hinzugekommenen Funktionen:

<html><body><?php

/* Verbindung aufnehmen */$con = mysql_connect("","root");

/* Datenbank auswählen */mysql_select_db($_POST["dbname"]);

/* Datensätze ermitteln */$dataresult = mysql_query("select * from "

. $_POST["tabname"]);

/* Anzahl der Datensätze ermitteln */$numdata = mysql_num_rows($dataresult);

218

Page 220: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PHP und MySQL 4.2

/* Überschrift ausgeben */echo "<h3>Datenbank " . $_POST["dbname"] . "</h3>";echo "<h4>Tabelle " . $_POST["tabname"] . "</h4>";echo "<p>$numdata Datensätze:</p>";

/* Felder ermitteln */$fdresult = mysql_query("show columns from "

. $_POST["tabname"]);

/* Anzahl der Felder ermitteln */$numfds = mysql_num_rows($fdresult);

/* Tabelle beginnen, alle Feldnamen ausgeben */echo "<table width='100%' border><tr>";while($fddsatz = mysql_fetch_array($fdresult))

echo "<td bgcolor='#c3c3c3'>$fddsatz[0]</td>";echo "</tr>";

/* Schleife über alle Datensätze */while($datadsatz = mysql_fetch_array($dataresult))

/* Schleife über alle Felder */echo "<tr>";for ($f=0; $f<$numfds; $f++)

/* Feldinhalt ermitteln, ausgeben*/$data = $datadsatz[$f];if ($data=="")

$data = "&nbsp;";echo "<td>$data</td>";

echo "</tr>";

echo "</table>";?></body></html>

Listing 4.24 Datei db_browser_b.php

Beim Aufruf wurden der Name der Datenbank ($dbname) und der Nameder Tabelle ($tabname) als versteckte Formularelemente (hidden) an das

219

Page 221: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

Programm übergeben. Es werden alle Datensätze aus allen Feldern derTabelle ausgewählt, die Ergebniskennung ist $dataresult. Die Anzahlder Felder wird aus der Abfrage mit der SQL-Anweisung show columsgewonnen.

Während der Ausgabe sollten Sie in beiden Programmen (db_browser_a.php und db_browser_b.php) darauf achten, dass leere Einträgein der HTML-Tabelle mit einem expliziten Leerzeichen (&nbsp;) abgebil-det werden.

4.3 MySQL-Datenbanken publizieren

Datenbankenins Internet

In Abschnitt 3.6, »PHP-Programme publizieren«, wurde bereits beschrie-ben, wie Sie PHP-Programme im Internet zur Benutzung bereitstellen.Sollen diese Programme auf Informationen aus MySQL-Datenbankenzugreifen, so müssen diese Informationen ebenfalls auf der Websitebereitgestellt werden. Voraussetzung ist natürlich, dass Sie beim Provi-der ein Paket ausgewählt haben, das auch eine MySQL-Datenbank zurdynamischen Generierung datenbankbasierter Seiten beinhaltet.

Provider,Zugangs-

informationen

Auf diese Datenbank hat nur der Entwickler Zugriff. Sie liegt auf einemDatenbankserver bereit. Der Provider stellt dem Entwickler neben denZugangsdaten zum Konfigurationsmenü der Website und für den FTP-Zugang die Zugangsinformationen zur Datenbank zur Verfügung. Dieseumfassen den Namen des Datenbankservers (Host Name), die Benutzer-kennung (User ID) und das Passwort.

Häufig besteht nicht die Möglichkeit, eigene Datenbanken auf demDatenbankserver anzulegen. Es wird nur eine einzelne Datenbank miteinem festgelegten Namen bereitgestellt, in der eigene Tabellen erzeugtwerden können. Der Name dieser Datenbank wird ebenfalls vom Provi-der übermittelt.

Es bestehen zwei Möglichkeiten, um die Struktur sowie Daten von Tabel-len auf einen Datenbankserver im Internet zu transferieren:

phpMyAdminim Internet

Sie installieren und benutzen phpMyAdmin auf der Website im Inter-net. Dies sollte in jedem Fall in einem passwortgeschützten Verzeich-nis auf der Website geschehen, damit phpMyAdmin nur von befugtenPersonen ausgeführt werden kann. Außerdem muss phpMyAdminmit den Datenbankzugangsdaten passend konfiguriert werden.

220

Page 222: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

MySQL-Datenbanken publizieren 4.3

Programmezum Erstellender Tabellen

Sie erstellen eigene PHP-Programme, die die SQL-Anweisungen cre-ate table und insert verwenden, und führen diese Programme aufder Website im Internet aus. Dies sollte ebenfalls in einem geschütz-ten Verzeichnis erfolgen. Die Programme sollten Sie per Programm-code sichern, damit Tabellen nicht versehentlich überschrieben wer-den. Falls keine Möglichkeit zum Verzeichnisschutz existiert, solltenSie die Programme unmittelbar nach der Benutzung wieder löschen.

Beide Möglichkeiten werden nachfolgend am Beispiel der Tabelle perso-nen aus der Datenbank firma beschrieben.

VerzeichnisschutzDie Erzeugung eines Verzeichnisschutzes wird über das Konfigurations-menü des Providers ermöglicht. Sie werden selten den direkten Zugangzur Konfigurationsdatei des Webservers im Internet haben.

Die Aufnahme der Verbindung zu einer MySQL-Datenbank im Internetsetzt bestimmte Modifikationen in den zugehörigen PHP-Programmenvoraus, die ich zunächst erläutere.

4.3.1 Verbindung aufnehmen

Die Funktion mysql_connect() stellt die Verbindung zu einem Daten-bankserver her. Bisher wurde diese Verbindung ohne die Parameter fürDatenbankserver (Host Name), Benutzerkennung (User ID) und Passwortvorgenommen, da der Datenbankserver über localhost erreichbar warund keine Einschränkung der Benutzerrechte vorgenommen wurde.

Bei einer Datenbank, die auf dem Datenbankserver eines Providers imInternet liegt, ist dies natürlich anders. Der Datenbankserver ist nureiner von vielen bei dem Provider; jeder Datenbankserver hat seineneigenen Namen. Jeder Kunde, dem eine Datenbank bei diesem Providerzur Verfügung steht, besitzt einen eigenen Benutzernamen und ein eige-nes Passwort.

mysql_connect()Der Aufruf der Funktion zur Verbindungsaufnahme lautet dann zum Bei-spiel:

mysql_connect("dbxyz.meinprovider.de","meinname","meinpasswort")

Der Name der Datenbank ist meist vorbestimmt und kann nicht freigewählt werden. Die Anweisung zur Auswahl einer Datenbank lautetzum Beispiel:

mysql_select_db("db987654")

221

Page 223: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

Damit nun nicht alle PHP-Programme, die auf die Datenbank zugreifen,für den Einsatz im Internet geändert werden müssen, empfiehlt sich fol-gende Vorgehensweise:

Die beiden Anweisungen zur Verbindungsaufnahme und zur Aus-wahl einer Datenbank lagern Sie in eine include-Datei aus, zum Bei-spiel in connect.inc.php.

Sie erstellen zwei Versionen der Datei: eine für den Einsatz währendder Entwicklung, eine andere für den Einsatz im Internet. Am bestenlegen Sie Letztgenannte in ein geschütztes Verzeichnis. Dadurch wer-den die Kundendaten und Passwörter zusätzlich abgesichert.

In den PHP-Programmen wird die include-Datei zu Beginn, das heißtvor dem ersten Datenbankzugriff, eingebunden.

Ein Beispiel für ein Programm, das sowohl lokal als auch im Internet dieFelder name und vorname für alle Datensätze der Tabelle personen aus-liest:

<html><body><?php

include "db_connect.inc.php";$res = mysql_query("select * from personen");while ($dsatz = mysql_fetch_assoc($res))

echo $dsatz["name"] . ", ". $dsatz["vorname"] . "<br />";

?></body></html>

Listing 4.25 Datei db_connect.php

Die include-Datei auf dem lokalen Rechner:

<?phpmysql_connect("","root");mysql_select_db("firma");

?>

Listing 4.26 Datei db_connect.inc.php (lokal)

222

Page 224: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

MySQL-Datenbanken publizieren 4.3

Ein Beispiel für die include-Datei auf dem Server im Internet:

<?phpmysql_connect("dbxyz.meinprovider.de",

"meinname", "meinpasswort");mysql_select_db("db987654");

?>

Listing 4.27 Datei db_connect.inc.php (im Internet)

Sie müssen lediglich beachten, dass die Tabelle personen im Internet inder Datenbank db987654 liegt und lokal in der Datenbank firma. Siekönnten es sich sogar noch leichter machen, indem Sie die lokale Daten-bank in db987654 umbenennen. Auf dem Buch-Datenträger heißt dieDatei zur besseren Unterscheidung db_connect.inc.php_remote.

4.3.2 Export einer Tabelle

Dump erzeugenBei den oben genannten Möglichkeiten zum Kopieren einer Tabelle aufeinen Datenbankserver im Internet müssen Sie zunächst die betreffendeTabelle aus phpMyAdmin heraus exportieren. In Version 3.4.5 gelangenSie über die Registerkarte Exportieren (siehe Abbildung 4.39) zu derSeite, auf der Sie einen sogenannten Dump, das heißt eine Exportversionder Tabelle, erzeugen können.

Abbildung 4.39 Registerkarte »Exportieren«

Auf dieser Seite sollten Sie im Abschnitt Art des Exports umstellen aufAngepasst. Anschließend sollten Sie im Abschnitt Ausgabe umstellenauf Ausgabe als Text. Ganz unten ist der Ok-Button zu finden.

223

Page 225: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

Nach seiner Betätigung erscheint das Ergebnis. Im oberen Teil steheneinige Kommentare, der untere Teil beinhaltet die SQL-Anweisungen,wie sie Sie in Abbildung 4.40 sehen.

Dabei handelt es sich um die SQL-Anweisungen

zum Erzeugen der Struktur der Tabelle und

zum Erzeugen der Datensätze der Tabelle.

Diese Anweisungen können Sie

in die Zwischenablage kopieren, um sie unmittelbar in phpMyAdminzu benutzen, oder

in eine Datei kopieren, verändern beziehungsweise angepassen undspeichern, um ein eigenes PHP-Programm zu erstellen.

Abbildung 4.40 Ergebnis des Dumps

Häufig wird das Programm phpMyAdmin bereits vom Provider einerWebsite zur Verfügung gestellt. Falls nicht, sollten Sie es mit Hilfe einesFTP-Clients in ein Verzeichnis auf der Website laden. Dieses Verzeichnissollten Sie zuvor mittels Passwort schützen, so dass das Programm nurvon befugten Personen ausgeführt werden kann.

224

Page 226: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

MySQL-Datenbanken publizieren 4.3

Zur Konfiguration der Zugangsdaten wird in dem Verzeichnis zusätzlicheine Datei mit dem Namen config.inc.php benötigt. Diese hat folgendenInhalt:

<?php$i = 0;$i++;$cfg['Servers'][$i]['auth_type'] = 'config';$cfg['Servers'][$i]['host'] = 'xxx';$cfg['Servers'][$i]['user'] = 'xxx';$cfg['Servers'][$i]['password'] = 'xxx';

?>

Listing 4.28 Datei config.inc.php

An die Stelle von xxx setzen Sie den Namen bzw. die IP-Adresse des vomProvider genannten Datenbankservers, den Benutzernamen und dasPasswort ein.

Sobald phpMyAdmin installiert ist, kann der Export einer Tabelle leichtdurchgeführt werden:

Sie erzeugen auf dem lokalen Webserver einen Dump der gewünsch-ten Tabelle.

Den unteren Teil mit den SQL-Anweisungen kopieren Sie in die Zwi-schenablage.

Anschließend rufen Sie in phpMyAdmin auf der Website im Internetdie Datenbankstrukturansicht auf und betätigen den Hyperlink SQL.

Im Eingabefenster fügen Sie den Inhalt der Zwischenablage ein undlassen die Befehle ausführen. Damit ist die Tabelle erstellt.

drop table

Dump kopierenEs ist auch leicht möglich, Veränderungen an der Struktur und an denDaten vorzunehmen, bevor diese übernommen werden sollen. Ein Bei-spiel: Es kann vorkommen, dass die Tabelle im Internet einen anderenNamen haben soll als auf dem lokalen Server. Dazu erzeugen Sie denDump, kopieren ihn über die Zwischenablage in das Textfenster einesEditors, ändern dort den Namen der Tabelle per Suchen und Ersetzen,

Hinweis

In der Voreinstellung wird der Dump ohne drop table erzeugt. Das heißt,die alte Tabelle wird nicht versehentlich überschrieben, sondern es erfolgteine Fehlermeldung. Somit werden Sie dazu angehalten, die alte Tabellebewusst zu löschen.

225

Page 227: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

kopieren den Dump wiederum über die Zwischenablage in das SQL-Fenster von phpMyAdmin und führen den Befehl aus.

4.3.3 Tabelle und Daten per Programm erzeugen

create table, insert Die im Folgenden beschriebene Methode dient dazu, zu einem beliebi-gen Zeitpunkt sowohl während der Entwicklung auf der lokalen Websiteals auch auf der Website im Internet die Struktur und gegebenenfalls dieBasisdaten einer Tabelle zu erzeugen.

Das Erstellen eines eigenen PHP-Programms beinhaltet:

den Export einer Tabelle, wie weiter oben beschrieben

das Speichern der Anweisungen in einer PHP-Datei

das Einbetten der SQL-Anweisungen in MySQL-Funktionen

Im Folgenden sind die SQL-Anweisungen des Beispiels aus Abschnitt4.3.2, »Export einer Tabelle«, als PHP-Programm umgeschrieben:

<html><body><?php

include "db_connect.inc.php";

$sqlab = "drop table if exists " . $_GET["tname"];echo "<p>$sqlab</p>";mysql_query($sqlab);

$sqlab = "create table " . $_GET["tname"]. "(name varchar(30),". " vorname varchar(25),". " personalnummer int(11),". " gehalt double,". " geburtstag date,". " primary key personalnummer (personalnummer)". " )";

echo "<p>$sqlab</p>";mysql_query($sqlab);

$sqlab = "insert ". $_GET["tname"] . " values". " ('Maier', 'Hans', 6714, '3500', '1962-03-15');";

echo "<p>$sqlab<br />";mysql_query($sqlab);

$sqlab = "insert ". $_GET["tname"] . " values"

226

Page 228: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

MySQL-Datenbanken publizieren 4.3

. " ('Schmitz', 'Peter', 81343, '3750', '1958-04-12');";echo "$sqlab<br />";mysql_query($sqlab);

$sqlab = "insert ". $_GET["tname"] . " values". " ('Mertens', 'Julia', 2297, '3621.5',". " '1959-12-30');";

echo "$sqlab<br />";mysql_query($sqlab);

?></body></html>

Listing 4.29 Datei db_gesamt.php

Das PHP-Programm setzt die richtige connect-Datei voraus, wie es inAbschnitt 4.3.1, »Verbindung aufnehmen«, beschrieben wird. Auf demlokalen Webserver sollte diese Datei folgenden Inhalt haben:

<?phpmysql_connect();mysql_select_db("firma");

?>

Listing 4.30 Lokale connect-Datei

Das obige Programm ist per Programmcode gesichert. Falls nur derName des PHP-Programms aufgerufen wird (http://localhost/db_gesamt.php), führt keiner der Aufrufe der Funktion mysql_query() zumErfolg, da die Variable $tname unbekannt ist. Die Tabelle wird wedergelöscht noch neu erzeugt.

Daten an URL anhängen

Falls dagegen weitere Informationen über die URL gesendet werden(hier http://localhost/db_gesamt.php?tname=personen), wird der Varia-blen $tname der Wert personen zugewiesen. Die Tabelle personen wirdgelöscht und neu erzeugt, siehe Abbildung 4.41.

Zur Kontrolle werden alle SQL-Anweisungen ausgegeben. Bei dergenannten Methode ist es leicht möglich, der Tabelle einen anderenNamen zu geben. Falls keine Möglichkeit zum Verzeichnisschutz exis-tiert, sollten Sie dieses Programm zur Erhöhung der Sicherheit unmittel-bar nach der Benutzung auf der Website im Internet wieder löschen.

227

Page 229: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit MySQL4

Abbildung 4.41 Erzeugen von Tabelle und Datensätzen

228

Page 230: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

5 Objektorientierung in PHP

Dieses Kapitel zur objektorientierten Programmierung ist insbesonderefür fortgeschrittene Programmierer geeignet. Als Einsteiger können Siees zunächst übergehen. Den Abschluss dieses Kapitels bildet ein umfang-reicheres Beispiel zur Anwendung der Objektorientierung.

5.1 Was ist objektorientierte Programmierung?

OOPDie objektorientierte Programmierung (OOP) bietet zusätzliche Möglich-keiten zum verbesserten Aufbau und zur vereinfachten Wartung undErweiterung von Programmen. Mit Hilfe der Objektorientierung wirdversucht, Objekte aus der realen Welt und ihre Interaktion »originalge-treu« abzubilden.

Klassen und Objekte

Man erschafft sogenannte Klassen, in denen die Eigenschaften vonObjekten und die Funktionen, die auf diese Objekte angewendet werdenkönnen (sogenannte Methoden), festgelegt werden. Man hat nun dieMöglichkeit, viele verschiedene Objekte dieser Klassen zu erzeugen, denEigenschaften unterschiedliche Werte zuzuweisen und die Methodenanzuwenden. Die Definitionen aus der Klasse und die zugewiesenenWerte begleiten diese Objekte über ihren gesamten »Lebensweg« hin-weg während der Dauer des Programms. Objekte werden auch Instanzen(einer Klasse) genannt.

Ein Beispiel: Es wird die Klasse Fahrzeug gebildet, in der Eigenschaftenund Methoden verschiedener Fahrzeuge bestimmt werden können. EinFahrzeug hat unter anderem die Eigenschaften Bezeichnung, Geschwin-digkeit und Fahrtrichtung. Außerdem kann man ein Fahrzeugbeschleunigen und lenken. Innerhalb eines Programms können vieleunterschiedliche Fahrzeuge erschaffen und eingesetzt werden.

VererbungKlassen können ihre Eigenschaften und Methoden zudem vererben. Siedienen in diesem Zusammenhang als Basisklasse, ihre Erben nennt manabgeleitete Klassen. Dadurch lässt sich die Definition ähnlicher Objekte,die über eine Reihe von gemeinsamen Eigenschaften und Methoden ver-fügen, vereinfachen.

229

Page 231: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Objektorientierung in PHP5

Ein Beispiel: Es werden die Klassen PKW und LKW gebildet. Beide Klassensind von der Basisklasse Fahrzeug abgeleitet und erben alle ihre Eigen-schaften und Methoden. Zusätzlich verfügen sie über eigene Eigenschaf-ten und Methoden, die bei der jeweiligen Klasse besonders wichtig sind.Ein PKW hat zum Beispiel eine bestimmte Anzahl an Insassen; und mankann einsteigen und aussteigen. Ein LKW hat zum Beispiel eine Ladung;man kann ihn beladen beziehungsweise entladen.

5.2 Klassen und Objekte

Eigenschaftenund Methoden

Als Beispiel wird die Klasse Fahrzeug definiert. Zunächst verfügt einObjekt dieser Klasse nur über die Eigenschaft geschwindigkeit und dieMethoden beschleunigen() und ausgabe(). Die Methode ausgabe()soll den Anwender über den aktuellen Zustand des jeweiligen Fahrzeugsinformieren. Zunächst die Klassendefinition:

<html><body><?php/* Definition der Klasse Fahrzeug */class Fahrzeug

private $geschwindigkeit = 0; /* Eigenschaft */

function beschleunigen($wert) /* Methode */

$this->geschwindigkeit += $wert;

function ausgabe() /* Methode */

echo "Geschwindigkeit: $this->geschwindigkeit<br />";

Listing 5.1 Datei oop_klasse.php (Klassendefinition)

Hinweis

Die in diesem Abschnitt dargestellten Programme sind ein Kompromiss,denn die Vorteile der objektorientierten Programmierung sind erst bei grö-ßeren Programmierprojekten erkennbar. Bei einem kleinen Problem fragtman sich womöglich, warum man hierfür ein derart aufwendiges bezie-hungsweise umständliches Programm schreiben soll. Anhand der hier vorlie-genden Programme lassen sich die Prinzipien der objektorientierten Pro-grammierung erschließen, ohne dabei den Überblick zu verlieren.

230

Page 232: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Klassen und Objekte 5.2

Erläuterung:

class Die Definition der Klasse wird eingeleitet durch das Schlüsselwortclass, gefolgt vom Namen der Klasse. Anschließend folgt die eigent-liche Definition.

Die private-Eigenschaft (Erläuterung siehe Abschnitt 5.2.1, »private,protected und public«) geschwindigkeit wird definiert und auf denWert 0 gesetzt. Eigenschaften können auf diese Weise nur mit kon-stanten Werten initialisiert werden. Zur Initialisierung sollten SieKonstruktoren (siehe Abschnitt 5.3, »Konstruktor«) verwenden.

function Methoden sind Funktionen, die nur innerhalb einer Klasse gelten. Siewerden mit Hilfe des Schlüsselworts function definiert. Methodenkönnen ebenso wie Funktionen Parameter besitzen.

$this-> Methoden werden für ein bestimmtes Objekt aufgerufen (sieheHauptprogramm in Abschnitt 5.2.2). Innerhalb der Methode ist daherbekannt, um welches Objekt es sich handelt. »Dieses Objekt«, also das»aktuelle Objekt« wird über $this-> angesprochen. Dabei wird demNamen der Eigenschaft kein weiteres $ (Dollar-Zeichen) vorangestellt!

Die Methode beschleunigen() hat einen Parameter: den Wert für dieÄnderung der Geschwindigkeit. Innerhalb der Methode wird dieserWert genutzt, um die Eigenschaft des Objekts zu ändern.

Die Methode ausgabe() besitzt keinen Parameter. Sie dient der Aus-gabe der Geschwindigkeit des Objekts.

Bisher beinhaltete das Programm nur eine Klassendefinition, es führtenoch nichts aus. Das vollständige Programm folgt noch.

5.2.1 private, protected und public

In PHP 5 wurde das Prinzip der Kapselung eingeführt, das auch aus ande-ren objektorientierten Sprachen bekannt ist. Die Sichtbarkeit von Eigen-schaften und Methoden lässt sich über die Schlüsselwörter public, pro-tected und private festlegen:

private private: Private Eigenschaften und Methoden sind nur innerhalb derKlassendefinition erreichbar. Dies wird häufig auf Eigenschaften, sel-tener auf Methoden angewendet. Bei einem Zugriff auf eine privateEigenschaft oder Methode außerhalb der eigenen Klassendefinitiontritt ein Fehler auf. Man nennt private Eigenschaften oder Methodenauch gekapselt.

231

Page 233: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Objektorientierung in PHP5

protected protected: protected-Eigenschaften und Methoden sind nur inner-halb der Klasse erreichbar, in der sie erzeugt wurden, und in davonabgeleiteten Klassen (siehe Abschnitt 5.7, »Vererbung«). Man sprichtauch von einem eingeschränkten Zugriff.

public public: Diese Eigenschaften und Methoden sind von überall hererreichbar. Man spricht auch von einem öffentlichen Zugriff.

Vorteil des Kapselungsprinzips: Gekapselte oder eingeschränkt erreich-bare Eigenschaften können nicht »versehentlich« an beliebiger Stelledurch den Benutzer der Klasse verändert werden, sondern nur durchAktionen, die der Klassenentwickler definiert und somit »erlaubt« hat.

Analog können Sie dies auf Methoden anwenden. Bestimmte Methodensollen nur intern beziehungsweise innerhalb der Klassenhierarchiegenutzt werden und nicht »versehentlich« vom Benutzer der Klasse.Daher können auch sie als private oder protected gekennzeichnet wer-den.

5.2.2 Anwendung der Klasse

Im folgenden Hauptprogramm wird die oben genannte Klasse angewen-det. Es wird auch ein (nicht erlaubter) Zugriff auf eine private Eigenschaftdargestellt:

<html><body><?php/* Definition der Klasse Fahrzeug */class Fahrzeug

/*... Definition siehe oben ... */

/* Objekte der Klasse Fahrzeug erzeugen */$vespa = new Fahrzeug();$scania = new Fahrzeug();

/* Erstes Objekt betrachten beziehungsweise verändern */

Hinweis

Eigenschaften, die mit dem Schlüsselwort var (aus PHP 4) deklariert werden,und Methoden, die ohne Schlüsselwort definiert werden, sind automatischpublic.

232

Page 234: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Klassen und Objekte 5.2

$vespa->ausgabe();$vespa->beschleunigen(20);$vespa->ausgabe();

/* Zweites Objekt betrachten */$scania->ausgabe();

/* Private Eigenschaft, nicht erreichbar */echo "Private Eigenschaft: . $scania->geschwindigkeit";?></body></html>

Listing 5.2 Datei oop_klasse.php (Hauptprogramm)

Erläuterung:

new Im Hauptprogramm werden zunächst (mit Hilfe des Schlüsselwortsnew) zwei Objekte der Klasse Fahrzeug erzeugt, hier mit den Namenvespa und scania.

Methoden werden für ein bestimmtes Objekt aufgerufen. Man sagtauch: Eine Methode wird auf ein Objekt angewendet. Eine Methode(oder eine Eigenschaft) wird über Objektname-> angesprochen.

Die Geschwindigkeit des Objekts vespa wird ausgegeben, einmal vorund einmal nach der Beschleunigung. Die Geschwindigkeit desObjekts scania wird nur einmal ausgegeben. Zu Beginn, also nachihrer Erzeugung, haben die Objekte die Geschwindigkeit 0, wie in derDefinition angegeben.

Es wird versucht, auf die private Eigenschaft geschwindigkeit desObjekts scania direkt zuzugreifen, und zwar außerhalb der Klassen-definition. Dies ist nicht erlaubt. Abhängig von der gewählten Fehler-anzeige (vergleiche Kapitel 6, »Fehler behandeln, Sicherheit erhö-hen«) wird daher eine Fehlermeldung angezeigt.

Die Ausgabe des Programms sehen Sie in Abbildung 5.1.

Hinweis

Theoretisch können Sie Eigenschaften von Objekten auch erst im Hauptpro-gramm erzeugen. Es wäre also möglich, im Hauptprogramm des obengezeigten Programms die Anweisung $vespa->leistung = 15; zu notieren.Damit würde das Objekt $vespa der Klasse Fahrzeug über eine weitere(öffentliche) Eigenschaft verfügen. Dies ist allerdings aus zwei Gründen nichtzu empfehlen:

233

Page 235: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Objektorientierung in PHP5

Abbildung 5.1 Erstes Programm mit der Klasse »Fahrzeug«

5.3 Konstruktor

__construct() Es gibt eine besondere Methode, die im Zusammenhang mit einer Klassedefiniert werden kann: die Konstruktormethode. Sie wird genutzt, umeinem Objekt zu Beginn seiner Lebensdauer Anfangswerte zuzuweisen.Für den Konstruktor wird der festgelegte Name __construct() genutzt(mit zwei Unterstrichen vor dem Wort »construct«).

Die Klasse Fahrzeug wird nachfolgend verändert:

Ein Fahrzeug bekommt neben der Eigenschaft geschwindigkeit dieEigenschaft bezeichnung.

Die Klasse beinhaltet eine Konstruktormethode zur Festlegung vonAnfangswerten für die beiden Eigenschaften.

Das Programm:

<html><body><?php/* Definition der Klasse Fahrzeug */class Fahrzeug

Es widerspricht dem Gedanken der objektorientierten Programmierung,da die Eigenschaften von Objekten einer Klasse Ergebnis eines Entwurfssind und zum Zeitpunkt der Definition der Klasse festgelegt sein sollten.

Ein anderes Objekt der gleichen Klasse verfügt nicht über diese Eigen-schaft. Somit ähneln sich die Objekte nicht mehr.

234

Page 236: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Konstruktor 5.3

private $geschwindigkeit;private $bezeichnung;

function __construct($bez, $ge)

$this->bezeichnung = $bez;$this->geschwindigkeit = $ge;

function beschleunigen($wert)

$this->geschwindigkeit += $wert;

function ausgabe()

echo $this->bezeichnung;echo " $this->geschwindigkeit km/h<br />";

/* Objekte der Klasse Fahrzeug erzeugen */$vespa = new Fahrzeug("Vespa Piaggio",25);$scania = new Fahrzeug("Scania TS 360",62);

/* Objekte betrachten */$vespa->ausgabe();$scania->ausgabe();

/* Objekt verändern */$vespa->beschleunigen(20);$vespa->ausgabe();

?></body></html>

Listing 5.3 Datei oop_konstruktor.php

Erläuterung:

Der Methodenname __construct() bezeichnet die Konstruktorme-thode für die jeweilige Klasse. Es werden im vorliegenden Fall derKlasse Fahrzeug zwei Parameter übergeben. Diese beiden Parameter

235

Page 237: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Objektorientierung in PHP5

werden genutzt, um die beiden Eigenschaften mit Anfangswerten zuversorgen.

Die Methode ausgabe() dient der Ausgabe beider Eigenschaften.

Es werden zwei Objekte erzeugt. Dabei werden die Anfangswerte anden Konstruktor übergeben, hier zum Beispiel die Werte »Vespa Piag-gio« und 25 für das Objekt vespa und »Scania TS 360« und 62 für dasObjekt scania.

Anschließend werden die Eigenschaften der Objekte verändert bezie-hungsweise ausgegeben.

Die Ausgabe des Programms zeigt Abbildung 5.2.

Abbildung 5.2 Klasse mit Konstruktor

Konstruktoren werden häufig eingesetzt. Sie ermöglichen eine bewuss-tere Erzeugung von Objekten. Im Unterschied zu vielen anderen objekt-orientierten Sprachen kann in PHP eine Konstruktormethode auch expli-zit aufgerufen werden. Im obigen Programm wäre also einenachträgliche »Neuinitialisierung« des Objekts $vespa in folgender Formmöglich:

$vespa->__construct("Vespa Formosa", 35);

Der Nutzen einer solchen Vorgehensweise erschließt sich besonders imZusammenhang mit der Vererbung (siehe Abschnitt 5.7, »Vererbung«).

5.4 Destruktor

Sie können auch einen Destruktor definieren. Falls Sie keinen eigenenDestruktor definieren, wird ein Standarddestruktor aufgerufen.

Beim Destruktor handelt es sich sozusagen um das Gegenstück zum Kon-struktor. Es ist eine Methode, die automatisch aufgerufen wird, sobalddie Existenz eines Objekts endet:

236

Page 238: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Destruktor 5.4

Falls ein Objekt im Hauptprogramm erzeugt wurde, stellt das Endedes Hauptprogramms den Zeitpunkt des Destruktoraufrufs dar.

Falls ein Objekt innerhalb einer Funktion erzeugt wurde, wird derDestruktor am Ende der Funktion aufgerufen.

__destruct()Die Destruktormethode hat den festgelegten Namen __destruct() (mitzwei Unterstrichen vor dem Wort »destruct«). Der Zweck eines Destruk-tors besteht im »Aufräumen«. Es können Aktionen angestoßen, Ressour-cen freigegeben oder Informationen, die mit dem speziellen Objektzusammenhängen, festgehalten werden. Es folgt ein Programm mit einerKlasse, die über einen Konstruktor und einen Destruktor verfügt:

<html><body><?phpclass Fahrzeug

private $geschwindigkeit;

function __construct($ge)

$this->geschwindigkeit = $ge;

function beschleunigen($wert)

$this->geschwindigkeit += $wert;

function ausgabe()

echo "Geschwindigkeit: $this->geschwindigkeit <br />";

function __destruct()

echo "Destruktor<br />";

$vespa = new Fahrzeug(20);$vespa->ausgabe();$vespa->beschleunigen(30);$vespa->ausgabe();

237

Page 239: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Objektorientierung in PHP5

?></body></html>

Listing 5.4 Datei oop_destruktor.php

Die Ausgabe des Programms sehen Sie in Abbildung 5.3.

Abbildung 5.3 Klasse mit Destruktor

Erläuterung:

Es wurde eine eigene Destruktormethode definiert. Diese liefert im vor-liegenden Fall nur eine Ausgabe vom Typ: »Hallo, hier bin ich.« Sie wirdam Ende des Hauptprogramms aufgerufen.

5.5 Optionale Parameter

Sowohl Funktionen als auch Methoden können optionale Parameterbeinhalten. Sie erweitern die Möglichkeiten von Methoden und somitauch der Konstruktormethode, wenn Sie optionale Parameter verwen-den.

Default-Werte Optionale Parameter sollten immer am Ende der Parameterreihe stehen.Falls bei einem Methodenaufruf optionale Parameter weggelassen wer-den, kann dies nur von rechts nach links innerhalb der Parameterreihegeschehen. Es ist nicht möglich, Parameter am Anfang der Reihe wegzu-lassen und gleichzeitig Parameter am Ende der Reihe anzugeben.

Hinweis

Ein Destruktor kann auch explizit aufgerufen werden (hier zum Beispiel mit:$vespa->__destruct();). Dies führt dazu, dass der Speicherplatz desObjekts während des Programmlaufs wieder freigegeben wird und ander-weitig genutzt werden kann.

238

Page 240: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Optionale Parameter 5.5

Es bleibt dem Programmierer der Klassendefinition überlassen, ob undin welchem Umfang er alternative Aufrufmöglichkeiten für seine Metho-den zur Verfügung stellen möchte. Im folgenden Beispiel werden bei derKonstruktormethode optionale Parameter angewendet. Damit könnenObjekte dieser Klasse auf verschiedene Art und Weise erzeugt werden.

Das Programm:

<html><body><?php/* Definition der Klasse Fahrzeug */class Fahrzeug

private $geschwindigkeit;private $bezeichnung;

/* Konstruktor mit optionalen Parametern */function __construct($bez = "xxx", $ge = 0)

$this->bezeichnung = $bez;$this->geschwindigkeit = $ge;

function beschleunigen($wert)

$this->geschwindigkeit += $wert;

function ausgabe()

echo "Name: $this->bezeichnung,Geschwindigkeit: $this->geschwindigkeitkm/h<br />";

/* Objekte der Klasse Fahrzeug erzeugen */$vespa = new Fahrzeug("Vespa Piaggio");

Hinweis

Optionale Parameter eröffnen die einzige Möglichkeit, eine Funktion bezie-hungsweise Methode auf verschiedene Arten aufzurufen. Die Möglichkeitdes Überladens von Methoden, wie aus anderen objektorientierten Spra-chen bekannt, existiert in PHP nicht.

239

Page 241: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Objektorientierung in PHP5

$scania = new Fahrzeug("",62);$jeep = new Fahrzeug("Jeep Cherokee",45);$hyundai = new Fahrzeug();

/* Objekte betrachten */$vespa->ausgabe();$scania->ausgabe();$jeep->ausgabe();$hyundai->ausgabe();?></body></html>

Listing 5.5 Datei oop_optional.php

Erläuterung:

Die beiden Parameter der Konstruktormethode der Klasse Fahrzeugsind optional, da bei der Definition jeweils bereits ein fester Wertzugewiesen wurde. Für den Parameter $bez wird die Zeichenkette"xxx" als Vorgabewert angegeben, für den Parameter $ge der Wert 0.

Somit können bei der Erzeugung von Fahrzeugen kein, ein oder zweiParameter angegeben werden, wie die Beispiele zeigen.

Bei der Erzeugung des Objekts $vespa wird nur eine Zeichenketteübergeben. Diese wird als erster Parameter der Eigenschaft bezeich-nung zugewiesen. Der zweite Parameter wird nicht geliefert, daherwird der Vorgabewert 0 übernommen.

Bei der Erzeugung des Objekts $scania werden beide Parameterübergeben, obwohl nur der Wert 62 für die Eigenschaft geschwindig-keit zugewiesen werden soll. Falls nur ein Parameter (die Zahl 62)übergeben worden wäre, so wäre dieser (als erster Parameter) derEigenschaft bezeichnung zugewiesen worden. Daher musste als ersterParameter eigens eine leere Zeichenkette übergeben werden. Die Zahl62 wurde somit zum zweiten Parameter.

Bei der Erzeugung des Objekts $jeep werden beide Parameter mitsinnvollen Werten übergeben.

Bei der Erzeugung des Objekts $hyundai wird kein Parameter überge-ben. Beide Eigenschaften werden daher auf die Vorgabewerte (Zei-chenkette "xxx" beziehungsweise 0) gesetzt.

Die Ausgabe des Programms zeigt Abbildung 5.4.

240

Page 242: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Handles und Kopien 5.6

Abbildung 5.4 Konstruktor mit optionalen Parametern

5.6 Handles und Kopien

Seit PHP 5.0 bieten sich mehrere Möglichkeiten, auf ein Objekt zuzugrei-fen beziehungsweise ein Objekt zu kopieren. Beides kann sich währendder Entwicklung eines objektorientierten Programms als sehr nützlicherweisen.

Objekt-HandleEine einfache Zuweisung eines Objekts zu einer Variablen erzeugt ledig-lich ein zweites Handle auf das gleiche Objekt; es wird kein zweitesObjekt erzeugt. Eine Änderung des Objekts über das Original-Handlekann auch bei Benutzung des zweiten Handles festgestellt werden. EineÄnderung über das zweite Handle kann umgekehrt auch bei Benutzungdes Original-Handles festgestellt werden. Das Gleiche gilt bei der Über-gabe eines Objekts an eine Funktion. Eine Änderung innerhalb der Funk-tion wirkt sich auf das Originalobjekt aus.

KopieSie können aber auch eine Kopie, das heißt ein zweites Objekt, anlegen.Dieses hat zunächst die Eigenschaften und Eigenschaftswerte des Origi-nalobjekts. Es existieren anschließend zwei individuelle Objekte. DieKopie kann ohne Auswirkungen auf das Original verändert werden undumgekehrt.

cloneDieser Kopiervorgang wird auch Klonen genannt. Dazu wird das Schlüs-selwort clone benutzt.

__clone() Falls in der Klasse des Objekts eine Methode __clone() existiert, wirddiese benutzt (benutzerdefiniertes Klonen). Diese Methode kannnicht direkt aufgerufen werden.

Falls in der Klasse des Objekts keine Methode dieses Namens exis-tiert, wird eine PHP-Standardmethode aufgerufen, und die Eigen-schaftswerte werden vollständig übernommen (vordefiniertes Klo-nen).

241

Page 243: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Objektorientierung in PHP5

In den drei folgenden Programmen sollen diese Zusammenhänge ver-deutlicht werden.

5.6.1 Vordefiniertes Klonen

Zunächst ein Programm, in dem ein Objekt, ein Handle auf das gleicheObjekt sowie ein Klon erzeugt werden:

<html><body><?phpclass Fahrzeug

private $geschwindigkeit = 0;private $farbe = "rot";

function beschleunigen($wert)

$this->geschwindigkeit += $wert;

function lackieren($wert)

$this->farbe = $wert;

function ausgabe()

echo "Geschwindigkeit: $this->geschwindigkeit,Farbe: $this->farbe <br />";

/* Originalobjekt */echo "Vor Veränderung:<br />";$vespa = new Fahrzeug();$vespa->beschleunigen(20);$vespa->ausgabe();

/* Neues Handle zu Originalobjekt */$honda = $vespa;$honda->ausgabe();

242

Page 244: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Handles und Kopien 5.6

/* Zweites Objekt, durch Standardklonen */$yamaha = clone $vespa;$yamaha->ausgabe();echo "<p> </p>";

/* Original verändern */echo "Nach Veränderung:<br />";$vespa->beschleunigen(35);$vespa->lackieren("gelb");$vespa->ausgabe();

/* Benutzung des anderen Handles: Änderung */$honda->ausgabe();

/* Klon: Keine Änderung */$yamaha->ausgabe();?></body></html>

Listing 5.6 Datei oop_klonen.php

Erläuterung:

Zunächst wird das Objekt $vespa erzeugt und eine Eigenschaft verän-dert. Der Name $vespa ist eigentlich nur ein Handle für das Objekt,das im Speicher abgelegt ist.

Das zweite Handle $honda auf das gleiche Objekt wird erzeugt. Damitkönnen Sie sowohl über $vespa als auch über $honda auf das gleicheObjekt zugreifen.

Das Objekt $yamaha wird als Kopie des Objekts $vespa angelegt.Dabei wird die Standard-Klonmethode aufgerufen, da in der Klassedes Objekts $vespa keine Methode mit diesem Namen existiert. DasObjekt $yamaha hat zunächst die gleichen Eigenschaftswerte wie dasObjekt $vespa.

Das Originalobjekt wird verändert. Diese Änderung ist sichtbar,unabhängig davon, ob Sie über das erste Handle ($vespa) oder überdas zweite Handle ($honda) zugreifen. Das Objekt $yamaha ist unab-hängig und verändert sich nicht.

Die Ausgabe sehen Sie in Abbildung 5.5.

243

Page 245: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Objektorientierung in PHP5

Abbildung 5.5 Zweites Handle und geklontes Objekt

5.6.2 Benutzerdefiniertes Klonen

Die Klassendefinition wird um eine eigene Methode __clone() erwei-tert. Ansonsten bleibt das Programm unverändert. Nachfolgend die Klas-senmethode __clone():

...class Fahrzeug

...function __clone()

$this->geschwindigkeit += 10;$this->farbe = "grün";

...

...

Listing 5.7 Datei oop_clone.php (nur Veränderung in der Klassendefinition)

Erläuterung:

Beim Klonen eines Objekts der Klasse Fahrzeug wird die dargestellteMethode __clone() aufgerufen. Die Eigenschaft geschwindigkeit

bekommt einen neuen Wert, der auf dem Wert des Originalobjektsbasiert. Die Eigenschaft farbe bekommt einen neuen Wert.

Falls die zweite Anweisung nicht vorhanden wäre, würde die Eigenschaft$farbe für das geklonte Objekt inklusive des alten Wertes übernommen.

244

Page 246: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Handles und Kopien 5.6

Es ergeben sich somit drei Möglichkeiten für die Eigenschaftswerte einesgeklonten Objekts:

Ein Eigenschaftswert wird vom Originalobjekt übernommen.

Ein Eigenschaftswert basiert auf dem ursprünglichen Wert des Origi-nalobjekts.

Eine Eigenschaft wird mit einem völlig neuen Wert belegt.

Die Ausgabe zeigt Abbildung 5.6.

Abbildung 5.6 Anwendung von __clone()

5.6.3 Übergabe eines Objekts an eine Funktion

Das Verhalten bei der Übergabe eines Objekts an eine Funktion soll imfolgenden Beispiel gezeigt werden. Es wird eine zusätzliche Funktiontest() außerhalb der Klasse Fahrzeug definiert. Innerhalb dieser Funk-tion wird das Objekt verändert. Diese Veränderung hat Auswirkungenauf das Original, denn auch $v ist lediglich ein zweites Handle für$vespa. Dies zeigt Abbildung 5.7.

Abbildung 5.7 Veränderung nach Übergabe

245

Page 247: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Objektorientierung in PHP5

<html><body><?phpclass Fahrzeug

private $geschwindigkeit = 0;

function beschleunigen($wert)

$this->geschwindigkeit += $wert;

function ausgabe()

echo "Geschwindigkeit: $this->geschwindigkeit <br />";

function test($v)

$v->beschleunigen(15);

$vespa = new Fahrzeug;$vespa->beschleunigen(20);$vespa->ausgabe();test($vespa);$vespa->ausgabe();?></body></html>

Listing 5.8 Datei oop_uebergabe.php

5.7 Vererbung

Klassenhierarchie Eine Klasse kann ihre Eigenschaften und Methoden an eine andere Klassevererben. In diesem Abschnitt erfahren Sie, wie das funktioniert.

5.7.1 Grundlagen

Der Vererbungsmechanismus wird häufig angewendet, um bereits vor-handene Definitionen zu übernehmen. Sie erzeugen dadurch eine Hier-

246

Page 248: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Vererbung 5.7

archie von miteinander verwandten Klassen. Diese ermöglichen die Dar-stellung von Objekten, die teilweise übereinstimmende sowie auchunterschiedliche Merkmale aufweisen.

Im folgenden Beispiel wird eine Klasse PKW definiert, mit deren Hilfe dieEigenschaften und Methoden von Personenkraftwagen dargestellt wer-den sollen. Bei der Erzeugung bedient man sich der existierenden KlasseFahrzeug, in der ein Teil der gewünschten Eigenschaften und Methodenbereits vorhanden ist. Bei der Klasse PKW kommen noch einige Merkmalehinzu. Hierbei handelt es sich um eine spezialisierte Klasse – im Gegen-satz zu der allgemeinen Klasse Fahrzeug.

Basisklasse, abgeleitete Klasse

Von der Klasse PKW aus gesehen ist die Klasse Fahrzeug eine Basisklasse.Von der Klasse Fahrzeug aus gesehen ist die Klasse PKW eine abgeleiteteKlasse. Zunächst die beiden Klassendefinitionen:

/* Definition der Klasse Fahrzeug */class Fahrzeug

private $geschwindigkeit = 0;

function beschleunigen($wert)

$this->geschwindigkeit += $wert;

function ausgabe()

echo "Geschwindigkeit: $this->geschwindigkeit<br />";

/* Definition der abgeleiteten Klasse PKW */class PKW extends Fahrzeug

private $insassen = 0;

function einsteigen($anzahl)

$this->insassen += $anzahl;

function aussteigen($anzahl)

$this->insassen -= $anzahl;

247

Page 249: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Objektorientierung in PHP5

function ausgabe() /* überschriebene Methode */

echo "Insassen: $this->insassen ";parent::ausgabe(); /* geerbte Methode */

Listing 5.9 Datei oop_vererbung.php (Basisklasse und abgeleitete Klasse)

Erläuterung:

Die abgeleitete Klasse PKW erbt von der Klasse Fahrzeug und beinhal-tet insgesamt fünf Methoden und zwei Eigenschaften:

die von der Klasse Fahrzeug geerbten Methoden ausgabe() undbeschleunigen()

die eigenen Methoden einsteigen() und aussteigen()

die eigene Ausgabemethode ausgabe(), die unter anderem diegeerbte Methode ausgabe() der Basisklasse aufruft

die von der Klasse Fahrzeug geerbte Eigenschaft geschwindigkeit

die eigene Eigenschaft insassen; sie wird zu Beginn auf 0 gesetzt

extends Falls eine Klasse von einer anderen Klasse abgeleitet wird, folgen nachdem Schlüsselwort class und dem Namen der abgeleiteten Klasse dasSchlüsselwort extends (erweitert) und der Name der Basisklasse. Dieabgeleitete Klasse erweitert somit die Eigenschaften und Methodender Basisklasse.

Eigenschaften und Methoden werden zunächst in der Klasse desObjekts gesucht. Sollten sie dort nicht vorhanden sein, wird die Suchein der zugehörigen Basisklasse fortgesetzt.

Eine Methode einer Basisklasse kann in einer abgeleiteten Klasse miteiner gleichnamigen Methode überschrieben werden. Wird eine sol-che Methode für ein Objekt einer abgeleiteten Klasse aufgerufen, sowird nur der Programmcode der »neuen« Methode verarbeitet, nichtaber der Programmcode der gleichnamigen Methode der Basisklasse.

parent:: Falls dieser Programmcode zusätzlich genutzt werden soll, hilft derOperator :: (doppelter Doppelpunkt). Der Aufruf parent::aus-gabe() innerhalb der Methode ausgabe() der Klasse PKW führt dazu,dass für das aktuelle Objekt die gleichnamige Methode der Basisklasse

248

Page 250: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Vererbung 5.7

aufgerufen wird. Eine solche »Verkettung« von Aufrufen ist in einerKlassenhierarchie durchaus sinnvoll und erwünscht.

Sie könnten die Basisklasse hier auch mit Fahrzeug::ausgabe() auf-rufen. Der Vorteil von parent liegt allerdings darin, dass Sie bei einerspäteren Veränderung der Klassenhierarchie den Programmcodenicht ändern müssen.

Im Hauptprogramm wird ein Objekt der Klasse PKW erzeugt und mehr-mals verändert. Der jeweilige Zustand des Objekts wird ausgegeben:

/* Objekt der abgeleiteten Klasse Fahrzeug */$fiat = new PKW();$fiat->ausgabe();

$fiat->einsteigen(3);$fiat->beschleunigen(30);$fiat->ausgabe();

$fiat->beschleunigen(-30);$fiat->ausgabe();

$fiat->aussteigen(1);$fiat->ausgabe();

Listing 5.10 Datei oop_vererbung.php (Hauptprogramm)

Erläuterung:

Es wird das Objekt fiat erzeugt.

Es werden die Methoden einsteigen() und aussteigen() aufgeru-fen. Diese werden unmittelbar in der Klasse PKW gefunden und verän-dern die Eigenschaft insassen.

Es wird die Methode beschleunigen() aufgerufen. Diese wird nichtunmittelbar in der Klasse PKW gefunden, daher wird in der Basisklasseweitergesucht. Dort wird sie gefunden und dient der Veränderungder Eigenschaft geschwindigkeit.

Es werden mehrmals die Eigenschaften des Objekts ausgegeben. DieEigenschaft insassen wird durch die eigene Methode ausgabe() aus-gegeben, die Eigenschaft geschwindigkeit durch die geerbteMethode ausgabe().

Die Ausgabe des Programms sehen Sie in Abbildung 5.8.

249

Page 251: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Objektorientierung in PHP5

Abbildung 5.8 Eigenschaften eines Objekts einer abgeleiteten Klasse

5.7.2 Konstruktoren bei Vererbung

Auch Objekte von abgeleiteten Klassen sollten Sie nur mit Hilfe einesKonstruktors erzeugen. Im folgenden Programm wird daher die Defini-tion der Klasse PKW verändert. Voraussetzung für eine sinnvolle Initiali-sierung ist ein passender Konstruktor der Basisklasse. Daher sollten Sieauch hier einen Konstruktor einsetzen.

parent::__construct()

Der Konstruktor der abgeleiteten Klasse sollte den Konstruktor der Basis-klasse explizit aufrufen, damit dieser seinen Anteil an den Initialisie-rungsdaten erhält. Bei einer späteren Veränderung der Klassenhierarchiestellt der explizite Aufruf des Konstruktors kein Problem dar, da diesermit parent::__construct() geschieht. Die Veränderungen im Pro-gramm:

...class Fahrzeug

private $geschwindigkeit;function __construct($ge)

$this->geschwindigkeit = $ge;

...class PKW extends Fahrzeug

private $insassen;function __construct($ge, $anz)

$this->insassen = $anz;parent::__construct($ge);

...

Listing 5.11 Datei oop_vkonstruktor.php (nur Veränderungen)

250

Page 252: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Dereferenzierung von Objekten 5.8

Erläuterung:

Hauptprogramm und Ausgabe des Programms bleiben gleich.

Die abgeleitete Klasse PKW beinhaltet einen Konstruktor, der insge-samt zwei Parameter erwartet. Einer der Parameter wird unmittelbarder Eigenschaft insassen zugewiesen. Der andere Parameter wird anden Konstruktor der Basisklasse Fahrzeug weitergeleitet, indem die-ser explizit mit parent::__construct() aufgerufen wird.

Bei der Erschaffung eines Objekts der abgeleiteten Klasse PKW müssenalso beide Startwerte für die Eigenschaften angegeben werden.

5.8 Dereferenzierung von Objekten

Objekte können als Parameter an Funktionen übergeben werden, ebensokönnen sie auch als Rückgabewert einer Funktion oder Klassenmethodedienen. Auf das zurückgegebene Objekt kann unmittelbar eine Methodeangewendet werden, wie das folgende Beispiel zeigt.

<html><body><?phpclass bruch

private $zaehler;private $nenner;

function __construct($z,$n)

$this->zaehler = $z;$this->nenner = $n;

function aus()

return $this->zaehler . "/" . $this->nenner;

function mult($a)

$erg = new bruch(1,1);$erg->zaehler = $this->zaehler * $a->zaehler;$erg->nenner = $this->nenner * $a->nenner;

251

Page 253: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Objektorientierung in PHP5

return $erg;

$x = new bruch(3,7);$y = new bruch(4,5);

echo $x->aus() . " * " . $y->aus(). " = " . $x->mult($y)->aus();

?></body></html>

Listing 5.12 Datei oop_deref.php

Das Programm arbeitet mit der Klasse bruch. Ein Objekt der Klasse bruch(ein mathematischer Bruch) hat zwei Eigenschaften: Zähler und Nenner.Mit Hilfe eines Konstruktors wird jeder Bruch bei der Erzeugung mitWerten versorgt.

Zusätzlich wird noch eine Methode mult() zur Multiplikation von zweiBrüchen definiert. Dabei wird der Bruch, für den die Methode aufgeru-fen wird (im Programm $x), mit demjenigen Bruch multipliziert, der alsParameter übermittelt wird (im Programm ist dies $y). Ergebnis ist wie-derum ein Bruch, der als Rückgabewert dient (im Programm ist dies$erg). Auf diesen Bruch wird unmittelbar die Methode aus() angewen-det: $x->mult($y)->aus(). Die Ausgabe zeigt Abbildung 5.9.

Abbildung 5.9 Direkte Ausgabe des Rückgabewerts einer Methode

5.9 Konstanten, statische Eigenschaften und Methoden

Neben den bisher erwähnten Eigenschaften und Methoden können Sieeiner Klasse noch weitere Elemente hinzufügen.

252

Page 254: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Konstanten, statische Eigenschaften und Methoden 5.9

KlassenkonstanteEine Klassenkonstante ist grundsätzlich öffentlich, die Sichtbarkeit kannnicht mit public, protected oder private spezifiziert werden. Es darfkein Dollar-Zeichen (wie bei einer Variablen) vor dem Namen stehen.Der Wert einer Konstanten kann sich nicht ändern. Eine Konstante istunabhängig von der Existenz einzelner Objekte der Klasse, sie ist nur ein-mal vorhanden.

Innerhalb der Klasse kann die Klassenkonstante mit self:: Konstanten-name angesprochen werden. Außerhalb der Klasse kann sie nur mit Klas-senname::Konstantenname angesprochen werden. Einsatzzweck: Sie istthematisch einer Klasse zugeordnet. Zum Beispiel würden Sie eine Kon-stante g (als Größe für die Schwerkraft) einer Klasse zuordnen, die mitphysikalischen Werten und Methoden arbeitet.

StatischeEigenschaft

Eine statische Eigenschaft ist ebenfalls unabhängig von der Existenz ein-zelner Objekte der Klasse. Sie ist nur einmal vorhanden. Allerdings kannsich ihr Wert ändern. Sie kann und sollte unmittelbar zu Beginn initiali-siert werden. Innerhalb der Klasse kann eine statische Eigenschaft mitself:: Eigenschaftsname oder mit Klassenname::Eigenschaftsnameangesprochen werden. Außerhalb der Klasse kann sie natürlich nur ange-sprochen werden, falls sie public ist, und dann auch nur über Klassen-name:: Eigenschaftsname.

Der Wert einer statischen Eigenschaft steht allen Objekten der Klassegemeinschaftlich zur Verfügung und kann dem Datenaustausch zwischenObjekten dienen, beispielsweise der Zählung beziehungsweise Numme-rierung von Objekten.

Statische Methode

Eine statische Methode ist ebenfalls unabhängig von der Existenz einzel-ner Objekte der Klasse. Innerhalb der Klasse kann sie mit self:: Metho-denname oder Klassenname::Methodenname angesprochen werden.Außerhalb der Klasse kann sie natürlich nur angesprochen werden, fallssie public ist, und nur über Klassenname:: Methodenname.

Thematisch ist eine statische Methode sinnvoll einer Klasse zugeordnet.Zum Beispiel würde man eine Methode AnziehungBerechnen() einerKlasse zuordnen, die allgemein mit physikalischen Werten und Metho-den arbeitet. Ein Beispiel:

<html><body><?phpclass math

253

Page 255: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Objektorientierung in PHP5

const pi = 3.1415926;private $id;public static $nummer=0;

function __construct()

self::$nummer = self::$nummer + 1;$this->id = self::$nummer;

static function quadrat($p)

return $p * $p;

function aus()

echo "Nr.: $this->id, " . self::pi . "<br />";echo self::quadrat(3.2) . "<br />";

$z = 2.5;echo math::quadrat($z) . "<p> </p>";

$x = new math();$x->aus();echo "Anzahl: " . math::$nummer . "<p> </p>";

$y = new math();$y->aus();echo "Anzahl: " . math::$nummer . "<p> </p>";

echo math::pi;?></body></html>

Listing 5.13 Datei oop_statisch.php

Erläuterung:

Innerhalb der Klasse math wird die Klassenkonstante pi mit dem Wert3.1415926 definiert. Sie wird innerhalb der Klasse mit dem Namenself::pi angesprochen, außerhalb der Klasse mit dem Namen

254

Page 256: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Abstrakte Klassen und Methoden 5.10

math::pi. Sie ist thematisch mit der Klasse math verbunden und kei-nem bestimmten Objekt zugeordnet.

self:: Innerhalb der Klasse math wird die öffentliche, statische Eigenschaft$nummer mit dem Startwert 0 definiert. Sie wird innerhalb der Klassemit dem Namen self::$nummer angesprochen, außerhalb der Klassemit dem Namen math::$nummer. Sie dient der Nummerierung dereinzelnen Objekte. Bei jeder Erzeugung eines Objekts der Klasse wirdihr Wert um 1 erhöht. Dieser Wert wird der objektspezifischen Eigen-schaft $id zugewiesen. Somit erhält jedes Objekt eine individuelle ID,und zwar in der Reihenfolge der Erzeugung. Außerdem ist stets dieAnzahl der existierenden Objekte bekannt.

Innerhalb der Klasse math wird die öffentliche, statische Methodequadrat() definiert. Sie wird innerhalb der Klasse mit dem Namenself::quadrat() angesprochen, außerhalb der Klasse mit demNamen math::quadrat(). Mit ihr lassen sich Zahlen quadrieren. Sieist thematisch mit der Klasse math verbunden und keinem bestimm-ten Objekt zugeordnet.

Die Ausgabe sehen Sie in Abbildung 5.10.

Abbildung 5.10 Konstanten, statische Eigenschaften und Methoden

5.10 Abstrakte Klassen und Methoden

abstractMit Hilfe des Schlüsselworts abstract kann eine Klasse definiert wer-den, die sozusagen nicht »fertig« ist. Innerhalb dieser Klasse gibt es eine

255

Page 257: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Objektorientierung in PHP5

oder mehrere Methoden, die nur aus der Deklaration bestehen, aber kei-nen Methodenkörper haben.

Eine abstrakte Klasse

dient nur als gemeinsame Basis für abgeleitete Klassen, damit bereitsgemeinsame Eigenschaften gesammelt und festgelegt werden kön-nen, und

muss abgeleitet werden, damit die abstrakten Methoden konkret defi-niert werden können.

Es kann keine Objekte (Instanzen) von abstrakten Klassen geben. EinBeispiel:

<html><body><?phpabstract class test_daddy

protected $x;

function __construct($p)

$this->x = $p;

abstract function aus();

class test_son extends test_daddy

function aus()

echo "$this->x<br />";

$a = new test_son(35);$a->aus();?></body></html>

Listing 5.14 Datei oop_abstrakt.php

256

Page 258: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Magische Konstanten 5.11

Erläuterung:

Innerhalb der Klasse test_daddy gibt es eine Methode aus(). Dieseist abstrakt.

Da es mindestens eine abstrakte Methode gibt, muss die Klassetest_daddy ebenfalls als abstrakt gekennzeichnet werden. Es kannkeine Instanzen der Klasse test_daddy geben.

Die Klasse test_son ist von der Klasse test_daddy abgeleitet. DamitInstanzen dieser Klasse erzeugt werden können, müssen Sie die abs-trakte Methode aus() konkret definieren. Würden Sie dies nicht tun,so wäre test_son ebenfalls eine abstrakte Klasse.

Im Hauptprogramm wird eine Instanz der Klasse test_son mit demStartwert 35 erzeugt. Die Klasse test_son hat keinen eigenen Kon-struktor, daher wird der Konstruktor der Klasse aufgerufen, von derdie Klasse test_son erbt. Die Eigenschaft $x wird mit dem Startwertversorgt.

Die Methode aus() wird aufgerufen. Die geerbte Eigenschaft $x wirdausgegeben. Diese muss in diesem Fall protected sein, da dieMethode aus() eine Methode der abgeleiteten Klasse ist.

5.11 Magische Konstanten

Es gibt einige »magische« Konstanten, die sowohl innerhalb von objekt-orientierten Programmen als auch innerhalb von prozeduralen Program-men nützliche Informationen liefern. Ihr aktueller Wert hängt von demZusammenhang ab, in dem sie auftreten. Es handelt sich dabei um:

__METHOD__ __METHOD__: Sie liefert den Namen der Klasse und der Methode, dieaktuell angewendet wird. Sie ist nur innerhalb einer Methode sinn-voll.

__FILE__ __FILE__: Sie liefert den Namen der aktuellen Datei mit Angabe desVerzeichnisses auf dem Webserver.

__LINE__ __LINE__: Sie liefert den Namen der aktuellen Zeile innerhalb desQuellcodes.

Ein Beispiel:

<html><body><?php

257

Page 259: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Objektorientierung in PHP5

class Fahrzeug

private $geschwindigkeit;

function __construct($wert)

echo "Methode: " . __METHOD__ . "<br />";$this->geschwindigkeit = $wert;

function beschleunigen($wert)

echo "Methode: " . __METHOD__ . "<br />";$this->geschwindigkeit += $wert;

function ausgabe()

echo "Methode: " . __METHOD__ . "<br />";echo "Geschwindigkeit: $this->geschwindigkeit<br />";

echo "Datei: " . __FILE__ . "<br />";echo "Zeile: " . __LINE__ . "<br />";

$vespa = new Fahrzeug(20);$vespa->ausgabe();$vespa->beschleunigen(20);$vespa->ausgabe();

echo "Zeile: " . __LINE__ . "<br />";?></body></html>

Listing 5.15 Datei oop_magisch.php

Die Ausgabe zeigt Abbildung 5.11.

258

Page 260: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Operator instanceof 5.12

Abbildung 5.11 __METHOD__, __FILE__ und __LINE__

5.12 Operator instanceof

instanceofDer Operator instanceof gibt an, ob ein Objekt eine Instanz einerbestimmten Klasse ist. Ein kleines Beispiel:

<html><body><?phpclass atestclass btest

$x = new atest();

if($x instanceof atest)echo "Dies ist ein Objekt der Klasse atest<br />";

elseecho "Dies ist kein Objekt der Klasse atest<br />";

if($x instanceof btest)echo "Dies ist ein Objekt der Klasse btest";

elseecho "Dies ist kein Objekt der Klasse btest";

?></body></html>

Listing 5.16 Datei oop_instanz.php

259

Page 261: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Objektorientierung in PHP5

Die Ausgabe sehen Sie in Abbildung 5.12.

Abbildung 5.12 Anwendung von »instanceof«

5.13 Hilfsfunktionen

Einige Hilfsfunktionen können Ihre Arbeit, besonders mit größeren Klas-senhierarchien, vereinfachen, siehe Tabelle 5.1.

get_declared_classes(),

get_class_methods()

Im folgenden Programm wird mit Hilfe der Methoden get_declared_classes() und get_class_methods() eine Übersicht über die im aktuel-len Programm verfügbaren Klassen und Methoden gegeben. DieMethode get_declared_classes() liefert auch die Standardklassen,

Funktionsname Erläuterung

call_user_func() Ruft eine benutzerdefinierte Funktion oder Methode auf.

class_exists() Prüft die Existenz einer Klasse.

get_class() Liefert den Klassennamen eines Objekts als Zeichen-kette.

get_class_methods() Liefert die Namen aller Methoden einer Klasse als Array.

get_class_vars() Liefert die Standardelemente einer Klasse als Array.

get_declared_classes() Liefert die Namen aller definierten Klassen als Array, inklusive der Standardklassen.

get_object_vars() Liefert die Elemente eines Objekts, denen bereits ein Wert zugewiesen wurde, als Array.

get_parent_class() Liefert den Namen der übergeordneten Klasse eines Objekts als Zeichenkette.

is_subclass_of() Prüft, ob ein Objekt von der angegebenen Klasse abstammt.

method_exists() Prüft, ob eine bestimmte Methode in einer Klasse existiert.

Tabelle 5.1 Hilfsfunktionen

260

Page 262: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Hilfsfunktionen 5.13

daher beginnt die Ausgabe mit diesen Klassen. Dargestellt wird nur dasHauptprogramm. Es wird die Klassendefinition aus dem vorherigen Pro-gramm verwendet.

/* Klassenübersicht */$ak = get_declared_classes();

for($k=0; $k<sizeof($ak); $k++)

echo "<p>Klasse: " . $ak[$k] . "<br />";

/* Methodenübersicht */$am = get_class_methods($ak[$k]);

for($m=0; $m<sizeof($am); $m++)

echo "Methode: " . $am[$m] . "<br />";echo "</p>";

Listing 5.17 Datei oop_hilf.php (Hauptprogramm)

In Abbildung 5.13 sehen Sie den Bildausschnitt mit den benutzerdefi-nierten Klassen.

Abbildung 5.13 Benutzerdefinierte Klassen

261

Page 263: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Objektorientierung in PHP5

5.14 Ausgabemethode __toString()

__toString() Jede Klasse erbt, ähnlich wie die Methoden __construct() und__clone(), eine Methode __toString() zur Ausgabe der Daten einesObjekts.

Falls Sie die Methode __toString() für eine bestimmte Klasse defi-nieren, führt eine Anweisung des Typs echo <Objektname> zu einemAufruf der Methode __toString().

Falls Sie die Methode __toString() nicht definieren, führt diegenannte Anweisung zu einem Fehler.

Ein Beispiel hierzu:

<html><body><?phpclass Fahrzeug

private $geschwindigkeit;private $farbe;

function __toString()

$erg = "Geschwindigkeit: $this->geschwindigkeit,Farbe: $this->farbe";

return $erg;

function __construct($g, $f)

$this->geschwindigkeit = $g;$this->farbe = $f;

$vespa = new Fahrzeug(130,"rot");echo $vespa;?></body></html>

Listing 5.18 Datei oop_ausgabe.php

262

Page 264: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Serialisierung 5.15

Die Methode __toString() liefert ein Objekt der Klasse Fahrzeug mitseinen Eigenschaften und Eigenschaftswerten in lesbarer Form, sieheAbbildung 5.14.

Abbildung 5.14 Ausgabe des Objekts

5.15 Serialisierung

Objekt speichernDie Serialisierung dient dazu, die Daten eines Objekts dauerhaft zu spei-chern. Es werden nur die Eigenschaften gespeichert, nicht die Metho-den. Mit Hilfe der Deserialisierung kann der umgekehrte Vorgang durch-geführt werden. Die gespeicherten Daten können also wieder gelesenund nutzbar gemacht werden.

Bei den Vorgängen der Serialisierung und der Deserialisierung mussjeweils die Klasse des Objekts definiert sein. Am besten notieren Sie dieKlassendefinition in einer eigenen Datei und binden diese Datei bei bei-den Vorgängen jeweils ein. Ein Beispiel, zunächst die Klassendefinition:

<html><body><?phpclass Fahrzeug

function __construct($b, $g, $f)

$this->bezeichnung = $b;$this->geschwindigkeit = $g;$this->farbe = $f;

function __toString()

return "$this->bezeichnung". " $this->geschwindigkeit km/h". " $this->farbe";

263

Page 265: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Objektorientierung in PHP5

?></body></html>

Listing 5.19 Datei oop_serial_class.inc.php

Es wird die Klasse Fahrzeug mit drei Eigenschaften notiert. Im Konstruk-tor werden alle drei Eigenschaften initialisiert. Die Methode__toString() dient der Ausgabe des Objekts. Es folgt das Programm zurSpeicherung des Objekts mit Hilfe der Serialisierung:

<html><body><?php/* Klasse einbinden */include "oop_serial_class.inc.php";

/* Objekt erzeugen und ausgeben */$vespa = new Fahrzeug("Vespa Piaggio", 25, "rot");echo $vespa;

/* Objekt serialisieren und speichern */$s = serialize($vespa);file_put_contents('oop_serial.dat', $s);?></body></html>

Listing 5.20 Datei oop_serial_put.php

Erläuterung:

Zunächst wird die Datei mit der Definition der Klasse Fahrzeug ein-gebunden.

Es wird ein Objekt der Klasse Fahrzeug erzeugt und zur Kontrolle ein-mal ausgegeben.

serialize() Die Funktion serialize() dient der Serialisierung des Objekts. Rück-gabewert ist eine Zeichenkette, die alle Daten des Objekts enthält.

file_put_contents()

Mit Hilfe der Funktion file_put_contents() kann eine Zeichenketteauf einfache Weise in einer Datei gespeichert werden.

Zu guter Letzt das Programm zur Wiederherstellung des Objekts mitHilfe der Deserialisierung:

264

Page 266: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

autoload-Funktion 5.16

<html><body><?php/* Klasse einbinden */include "oop_serial_class.inc.php";

/* Objekt lesen und deserialisieren */$s = file_get_contents('oop_serial.dat');$vespa = unserialize($s);

/* Objekt ausgeben */echo $vespa;?></body></html>

Listing 5.21 Datei oop_serial_get.php

Erläuterung:

Zunächst wird wiederum die Datei mit der Definition der KlasseFahrzeug eingebunden. Ansonsten könnte die Klasse des Objektsnicht erkannt werden.

file_get_contents()

Der Inhalt der Datei wird mit Hilfe der Funktion file_get_ con-tents() in eine Zeichenkette gelesen.

unserialize() Die Funktion unserialize() dient der Deserialisierung des Objekts.Aus der Zeichenkette wird ein Objekt mit all seinen Daten erzeugt.

Zur Kontrolle wird das Objekt noch einmal ausgegeben (siehe Abbil-dung 5.15).

Abbildung 5.15 Ausgabe des Objekts

5.16 autoload-Funktion

__autoload()Die Funktion __autoload() eröffnet Ihnen die Möglichkeit, eine Klas-sendefinition bei Bedarf einzubinden. Wenn ein Objekt einer Klasse, die

265

Page 267: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Objektorientierung in PHP5

nicht definiert ist, erzeugt wird, so führt dies normalerweise zu einemFehler. Falls jedoch die autoload-Funktion definiert wurde, kann dasEinbinden der Klassendefinition nachgeholt werden. Ein Beispiel:

<html><body><?phpfunction __autoload($classname)

include_once "oop_autoload_" . $classname . ".inc.php";

$x = new mambo();$y = new salsa();?></body></html>

Listing 5.22 Datei oop_autoload.php

Im Hauptprogramm werden zwei neue Objekte der Klassen mambo undsalsa erzeugt. Diese sind hier beide unbekannt. Es existiert aber eineautoload-Funktion, der der Name der gesuchten Klasse implizit als Para-meter übergeben wird.

Dies führt zum einmaligen Einbinden der beiden Dateienoop_autoload_mambo.inc.php und oop_autoload_salsa.inc.php mit Hilfeder Funktion include_once(). In den beiden Dateien finden sich diegesuchten Klassendefinitionen.

<?phpclass mambo

function __construct()

echo "Neues Objekt der Klasse mambo erzeugt<br />";

?>

Listing 5.23 Datei oop_autoload_mambo.inc.php

<?phpclass salsa

function __construct()

266

Page 268: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiel Scheck 5.17

echo "Neues Objekt der Klasse salsa erzeugt<br />";

?>

Listing 5.24 Datei oop_autoload_salsa.inc.php

Die Ausgabe zeigt Abbildung 5.16.

Abbildung 5.16 Anwendung der autoload-Funktion

5.17 Beispiel Scheck

In diesem Abschnitt verdeutliche ich die Anwendung der Objektorientie-rung an einem umfangreicheren Beispiel. Wir betrachten ein Unterneh-men, in dem mehrere Mitarbeiter beschäftigt sind. Die Daten der Mitar-beiter stehen in einer Textdatei als Datenquelle zur Verfügung.Außerdem gibt es eine Textdatei, in der die Arbeitsstunden der Mitarbei-ter erfasst werden. Das Einlesen von Daten aus Textdateien erläutere ichgenauer in Kapitel 8, »Dateien und Verzeichnisse«.

Aufgabe des Programms ist es, die Verbindung zwischen den Daten her-zustellen, sodass für jeden Mitarbeiter ein Lohnscheck ausgedruckt wer-den kann. Im Programm wird mit zwei Klassen gearbeitet:

Klasse»mitarbeiter«

mit einer Klasse mitarbeiter, in der die Eigenschaften und Methodeneines einzelnen Mitarbeiters definiert werden

Klasse»unternehmen«

mit einer Klasse unternehmen, in der die Eigenschaften und Methodeneines Unternehmens definiert werden; da der wichtigste Bestandteileines Unternehmens seine Mitarbeiter sind, wird hier eine Verbin-dung zwischen den Klassen hergestellt.

Die Definition der Klasse mitarbeiter:

class mitarbeiter

/* Eigenschaften eines Mitarbeiters */

267

Page 269: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Objektorientierung in PHP5

private $id;private $nachname;private $vorname;private $bank;private $blz;private $konto;private $stundenlohn;private $summe_stunden;

/* Daten eines Mitarbeiters erzeugen */function __construct($info)

$this->id = $info[0];$this->nachname = $info[1];$this->vorname = $info[2];$this->bank = $info[3];$this->blz = $info[4];$this->konto = $info[5];$this->stundenlohn = $info[6];$this->summe_stunden = 0;

/* Stunden eines Mitarbeiters erfassen */function stunden_erfassen($anzahl)

$this->summe_stunden += $anzahl;

/* Scheck eines Mitarbeiters ausdrucken */function scheck_ausdruck()

$summe_lohn =$this->summe_stunden * $this->stundenlohn;

echo "<p>Scheck:<br />". "Name: $this->nachname, $this->vorname<br />". "Konto: $this->konto, BLZ: $this->blz<br />". "Bank: $this->bank,". "Betrag: $summe_lohn &euro;</p>";

Listing 5.25 Datei oop_scheck.php, Klasse »mitarbeiter«

Erläuterung:

Eigenschaften: Ein Mitarbeiter wird durch eine eindeutige ID gekenn-zeichnet. Er hat einen Namen und Vornamen, Daten zur Bankverbin-

268

Page 270: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiel Scheck 5.17

dung, er erhält einen bestimmten Stundenlohn und hat eine gewisseAnzahl an Stunden gearbeitet.

Dem Konstruktor wird ein Feld mit den Initialisierungsdaten dieserEigenschaften übermittelt. Die Inhalte dieses Feldes stammen auseiner Datei, in der die Daten aller Mitarbeiter des Unternehmens ste-hen.

Die Methode stunden_erfassen() dient der Summierung der geleis-teten Arbeitsstunden.

Die Methode scheck_ausdruck() dient dazu, aus den Daten einesMitarbeiters und den gesammelten Stunden den Gesamtlohn zuermitteln und einen Lohnscheck auszudrucken.

Es folgt die Definition der Klasse unternehmen:

class unternehmen

/* Eigenschaften eines Unternehmens */private $name;private $belegschaft;private $summe_stunden_unbekannt;

/* Daten eines Unternehmens erzeugen */function __construct($na)

/* Name der Firma */$this->name = $na;$this->summe_stunden_unbekannt = 0;

/* Mitarbeiter-Datei lesen */$dp = fopen("oop_scheck_belegschaft.txt", "r");$zeile = fgets($dp, 100);while(!feof($dp))

$info = explode(",",$zeile);$id = $info[0];$this->belegschaft[$id] = new mitarbeiter($info);$zeile = fgets($dp, 100);

fclose($dp);

/* Stunden-Datei lesen */function stunden_erfassen()

$dp = fopen("oop_scheck_stunden.txt", "r");

269

Page 271: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Objektorientierung in PHP5

$zeile = fgets($dp, 100);while(!feof($dp))

$info = explode(",", $zeile);$id = $info[0];if(array_key_exists($id,$this->belegschaft))

$this->belegschaft[$id]->stunden_erfassen($info[1]);

else$this->summe_stunden_unbekannt += $info[1];

$zeile = fgets($dp, 100);fclose($dp);

/* Alle Schecks ausdrucken */function scheck_ausdruck()

foreach ($this->belegschaft as $schluessel=>$wert)

$this->belegschaft[$schluessel]->scheck_ausdruck();

Listing 5.26 Datei oop_scheck.php, Klasse »unternehmen«

Erläuterung:

Die Eigenschaften: Ein Unternehmen wird durch seinen Namen iden-tifiziert, es verfügt über eine Belegschaft (eine Gruppe von Mitarbei-tern) und eine Hilfsvariable, die für die Stunden benötigt wird, dienicht eindeutig einem Mitarbeiter zuzuordnen sind.

Im Konstruktor werden die Daten des Unternehmens initialisiert,indem unter anderem die Mitarbeiterdatei gelesen wird. Jede Zeileder Datei beinhaltet die Daten eines Mitarbeiters; die einzelnen Datensind durch Kommata voneinander getrennt. Mit Hilfe der Funktionexplode() (siehe auch Abschnitt 7.2, »Zeichenketten und Felder«)werden die Daten einzeln im Feld $info gespeichert. Das erste Feld-element ist die eindeutige ID des Mitarbeiters. Es wird ein Objekt derKlasse mitarbeiter erzeugt. Dabei wird das Feld $info mit den Datendieses Mitarbeiters dem Konstruktor der Klasse übergeben.

270

Page 272: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiel Scheck 5.17

In der Methode stunden_erfassen() wird die Stundendatei gelesen.Sie beinhaltet eine Reihe von Zeilen mit jeweils zwei Einträgen: die IDdes Mitarbeiters und die Anzahl der Stunden, die von diesem Mitar-beiter an einem Tag geleistet wurden. Falls es sich um eine bekannteID handelt (if(array_key_exists()), werden die Stunden demjeweiligen Mitarbeiter gutgeschrieben. Ansonsten werden sie zur»Summe unbekannt« addiert.

Die Methode scheck_ausdruck() der Klasse unternehmen ruft diegleichnamige Methode für alle Mitarbeiter des Unternehmens auf.

Das Hauptprogramm ist recht kurz:

$un = new unternehmen("MacroHard");$un->stunden_erfassen();$un->scheck_ausdruck();

Listing 5.27 Datei oop_scheck.php, Hauptprogramm

Erläuterung:

Es wird ein Unternehmen mit dem Namen »MacroHard« gegründet.

Die Stunden, die für dieses Unternehmen gearbeitet wurden, werdenerfasst.

Die Schecks werden ausgedruckt.

Die Ausgabe zeigt Abbildung 5.17.

Abbildung 5.17 Scheckausdruck

271

Page 273: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Objektorientierung in PHP5

5.18 Beispiel Kopfrechnen

Das Ihnen bereits bekannte Spiel »Kopfrechnen« (siehe Abschnitt 3.5.3,»Kopfrechnen«) wird nachfolgend in einer objektorientierten Versionvorgestellt. Die Dateien des Beispiels haben das einheitliche Präfix kopf-oop.

Klasse »Spiel« Es gibt eine Klasse Spiel, deren Definition in eine eigene Datei ausgela-gert wurde. Von dieser Klasse wird ein einzelnes Objekt erzeugt. DiesesObjekt beinhaltet alle Daten des Spiels. Es wird zwischenzeitlich seriali-siert, damit es von den verschiedenen PHP-Programmen während desSpiels genutzt werden kann.

Klasse »Aufgabe« Eine Eigenschaft der Klasse Spiel sind verschiedene Objekte der KlasseAufgabe. Die Definition dieser Klasse wurde ebenfalls in eine Datei aus-gelagert. Die Anzahl der Aufgaben, und damit die Anzahl der Aufgaben-objekte, bestimmt der Benutzer zu Beginn des Spiels. Die Aufgabenob-jekte werden als Eigenschaften des Spielobjekts gemeinsam mit diesemObjekt serialisiert.

5.18.1 Programmablauf

Zunächst das Eingabeformular (siehe auch Abbildung 5.18):

<html><body><p><b>Kopfrechnen</b></p><form action="kopfoop_a.php" method="post"><p><input name="spielername" size="12"> Ihr Name</p><p><select name="anzahl">

<option value="3">3</option><option value="6" selected="selected">6</option><option value="10">10</option>

</select> Anzahl Aufgaben</p><p><input type="submit" value="Und los ..."></p></form></body></html>

Listing 5.28 Datei kopfoop.htm

272

Page 274: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiel Kopfrechnen 5.18

Erläuterung:

Im Formular gibt der Spieler seinen Namen ein und wählt die Anzahlder Aufgaben (3, 6 oder 10).

Das Formular verweist auf das PHP-Programm in kopfoop_a.php.

Abbildung 5.18 Eingabeformular

Es folgen die Aufgaben (siehe auch Abbildung 5.19):

<html><body><?php

include "kopfoop_spiel.inc.php";include "kopfoop_aufgabe.inc.php";

/* Spiel erzeugen */$s = new Spiel($_POST["spielername"],

$_POST["anzahl"], "kopfoop.htm", "kopfoop_b.php");

/* Spiel darstellen */$s->anzeigen();

/* Spieldaten speichern */$s->speichern();

?></body></html>

Listing 5.29 Datei kopfoop_a.php

273

Page 275: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Objektorientierung in PHP5

Abbildung 5.19 Aufgaben, mit Beispieleingaben

Erläuterung:

Zunächst werden die beiden Dateien mit den Klassendefinitionen ein-gebunden.

Spielobjekt Anschließend wird ein neues Spielobjekt erzeugt. Der Konstruktorbenötigt vier Parameter: den Namen des Spielers und die Anzahl derAufgaben (aus dem Formular) sowie den Namen der Startdatei undden Namen der Auswertungsdatei.

Serialisierung Nach der Erzeugung des Spielobjekts wird es angezeigt. Außerdemwerden die bisher bekannten Daten des Objekts mit Hilfe der Seriali-sierung gespeichert, damit sie später vom Auswertungsprogrammgelesen werden können.

Es folgt die Auswertung (siehe auch Abbildung 5.20):

<html><body><?phpinclude "kopfoop_spiel.inc.php";include "kopfoop_aufgabe.inc.php";

/* Spiel laden */$zk = file_get_contents('kopfoop.dat');$s = unserialize($zk);

/* Ergebnis des Spiels */$s->auswerten($_POST["eingabe"]);

?>

274

Page 276: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiel Kopfrechnen 5.18

<!-- Hyperlink zum Anfang --><a href="kopfoop.htm">Zum Start</a></p></body></html>

Listing 5.30 Datei kopfoop_b.php

Abbildung 5.20 Auswertung

Erläuterung:

Auch hier werden die beiden Dateien mit den Klassendefinitioneneingebunden.

Deserialisierung Mit Hilfe der Deserialisierung wird ein Spielobjekt erzeugt. DiesesSpielobjekt beinhaltet die Daten, die im vorherigen Programm gespei-chert wurden.

Als Letztes folgt die Auswertung aller Eingaben, inklusive der Anzeigeder Ergebnisse.

5.18.2 Klasse »Spiel«

Die Definition der Klasse Spiel, zunächst der Konstruktor:

<?php/* Klasse "Spiel" */class Spiel

function __construct($sp, $an, $st, $zi)

/* Start des Spiels */srand((double)microtime()*1000000);$this->richtig = 0;

275

Page 277: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Objektorientierung in PHP5

$this->spieler = $sp;$this->anzahl = $an;$this->start = $st;$this->ziel = $zi;

. . .

?>

Listing 5.31 Datei kopfoop_spiel.inc.php, Konstruktor

Erläuterung:

Zunächst wird der Zufallszahlengenerator initialisiert.

Die Anzahl der richtig gelösten Aufgaben wird auf 0 gesetzt.

Konstruktor Die vier Parameter, die bei Erzeugung eines Spielobjekts übergebenwerden, dienen der Einstellung des Spielernamens, der Anzahl derAufgaben und der Adressen der Start- und der Auswertungsdatei.

Es folgt die Methode zur Anzeige der Aufgaben:

<?phpclass Spiel

. . .function anzeigen()

/* Überschrift */echo "<p><b>Kopfrechnen</b></p>";

/* Falls kein Name eingetragen */if($this->spieler == "")

echo "<p>Kein Name, kein Spiel</p>";echo "<a href='$this->start'>Zurück</a>";return;

/* Formularbeginn */echo "<form action='$this->ziel' method='post'>";

/* Spielername */echo "<p>Hallo <b>$this->spieler</b>,"

. " Ihre Aufgaben:</p>";

276

Page 278: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiel Kopfrechnen 5.18

/* Tabellenbeginn */echo "<table border='0'>";

/* Aufgaben erzeugen und stellen */for($i=1; $i<=$this->anzahl; $i++)

$this->aufgabe[$i] =new Aufgabe($i, $this->anzahl);

/* Tabellenende */echo "</table>";

/* Formularende */echo "<p><input type='submit' value='Fertig'></p>";echo "</form>";

. . .?>

Listing 5.32 Datei kopfoop_spiel.inc.php, Anzeige-Methode

Erläuterung:

Nach der Anzeige der Überschrift wird überprüft, ob ein Spielernameeingegeben wurde. Ist dies nicht der Fall, so wird nur noch ein Linkzur Startdatei angezeigt.

Falls ein Spielername vorhanden ist, wird der Spieler begrüßt. DasFormular und eine Tabelle beginnen. Formularziel ist die Auswer-tungsdatei.

Aufgabenobjekte Es wird eine Schleife entsprechend der gewünschten Anzahl Aufga-ben durchlaufen. Bei jedem Durchlauf wird ein neues Aufgabenobjekterzeugt. Um die Einzelheiten jeder Aufgabe kümmert sich die KlasseAufgabe.

Feld von Referenzen

Die Referenz auf das Aufgabenobjekt wird in ein Feld eingegliedert,das wiederum eine Eigenschaft des Spielobjekts ist. Somit sind alleAufgabenobjekte dem Spielobjekt zugeordnet und können später mitdiesem gemeinsam gespeichert werden.

Die Methoden zum Speichern und zum Auswerten:

<?phpclass Spiel

. . .

277

Page 279: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Objektorientierung in PHP5

function speichern()

$zk = serialize($this);file_put_contents('kopfoop.dat', $zk);

function auswerten($eingabe)

/* Überschrift */echo "<p><b>Kopfrechnen</b></p>";

/* Spielername */echo "<p>Hallo <b>$this->spieler</b>,"

. " Ihr Ergebnis:</p>";

/* Auswertung */for($i=1; $i<=$this->anzahl; $i++)

$this->richtig += $this->aufgabe[$i]->pruefen($eingabe[$i]);

/* Ausgabe */echo "<p>$this->richtig von"

. " $this->anzahl richtig</p>";

?>

Listing 5.33 Datei kopfoop_spiel.inc.php, Speichern, Auswerten

Erläuterung:

serialize() Die Funktion serialize() serialisiert »dieses Objekt«, also das Spiel-objekt inklusive aller Aufgaben.

Bei der Auswertung wird der Spieler wieder mit Namen begrüßt.

Die Anzahl der richtig gelösten Aufgaben wird mit Hilfe des Rückga-bewerts der Methode pruefen() errechnet. Dieser ist entweder 0oder 1. Diese Methode wird für jede Aufgabe des Spiels aufgerufen.Als Parameter wird dabei die Eingabe des Benutzers übergeben.

Als Letztes folgt die Ausgabe des Ergebnisses.

278

Page 280: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiel Kopfrechnen 5.18

5.18.3 Klasse »Aufgabe«

Die Definition der Klasse Aufgabe:

<?php/* Klasse "Aufgabe" */class Aufgabe

function __construct($i, $anzahl)

$this->nr = $i;$this->gesamt = $anzahl;$this->stellen();

function stellen()

$a = rand(10,30);$b = rand(10,30);$this->ergebnis = $a + $b;echo "<tr><td>Aufgabe $this->nr von"

. " $this->gesamt: $a + $b = </td>"

. "<td><input name='eingabe[$this->nr]'"

. " size='12'></td></tr>";

function pruefen($eingabe)

if($eingabe == $this->ergebnis)return 1;

elsereturn 0;

?>

Listing 5.34 Datei kopfoop_aufgabe.inc.php

Hinweis

Ein Nachteil dieser Serialisierungsmethode soll nicht unerwähnt bleiben. DieDatei mit den Objektdaten hat immer den gleichen Namen. Falls also meh-rere Benutzer gleichzeitig spielen, kann es passieren, dass die Objektdatenfalsch zugeordnet werden. Wenn Sie im Dateinamen Session-Informationen(siehe Kapitel 12, »Sessions und Cookies«) festhalten würden, ließe sich die-ses Problem aber auch lösen.

279

Page 281: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Objektorientierung in PHP5

Erläuterung:

Bei der Erzeugung eines Aufgabenobjekts mit Hilfe des Konstruktorswurden seine »laufende Nummer« und die Gesamtanzahl der Aufga-ben übergeben. Diese Werte werden als Eigenschaften übernommen.

Die Methode stellen() dient dem Ermitteln und Ausgeben der Auf-gabenstellung. Zwei Zufallszahlen werden ermittelt. Das Ergebnis derAddition dieser beiden Zahlen wird als Eigenschaft der Aufgabe über-nommen.

Die Aufgabe wird zusammen mit einem Eingabefeld ausgegeben. DieBezeichnung des Eingabefeldes beinhaltet die »laufende Nummer«der Aufgabe.

In der Methode pruefen() wird die Eingabe für diese Aufgabe mitdem Ergebnis dieser Aufgabe verglichen. Es wird entweder eine 1oder eine 0 zurückgeliefert.

280

Page 282: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

6 Fehler behandeln, Sicherheit erhöhen

In diesem Kapitel geht es um das Anzeigen von Fehlern und die Konfigu-ration der Fehleranzeige auf Ihrem System. Ich erläutere, wie IhnenInformationen zu Fehlern zugesendet werden können. Außerdem nenneich Ihnen verschiedene Möglichkeiten, um die Sicherheit Ihrer Pro-gramme auf dem Webserver zu erhöhen.

6.1 Anzeige von Fehlern

Bei der Entwicklung von Programmen werden in der Regel Fehlergemacht. Während der Entwicklungszeit ist es wichtig, diese Fehler früh-zeitig zu erkennen, aus ihnen zu lernen, sie zur Verbesserung des Pro-gramms zu nutzen und sie zu beseitigen.

AngriffeZur Ausführungszeit auf einem Produktionssystem sollten verbliebeneFehler nicht mehr angezeigt werden. Solche Anzeigen bieten einemBetrachter eventuell Informationen, mit deren Hilfe er Angriffe auf dasSystem ausführen könnte. Zur Verdeutlichung folgt ein PHP-Programmmit unterschiedlich schweren Fehlern:

<html><body><?php

echo mktime();echo $a;echo 1/0;echo f();echo 1/0;

?></body></html>

Listing 6.1 Datei er_mehrere.php

281

Page 283: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Fehler behandeln, Sicherheit erhöhen6

Falls die Fehleranzeige sehr genau eingestellt wurde (siehe weiter untenim Abschnitt), sieht die Anzeige aus, wie in Abbildung 6.1 dargestellt.

Abbildung 6.1 Anzeige von Fehlern

Erläuterung der Fehleranzeigen:

Strict Standards Strict Standards: Dies sind Hinweise auf eventuelle Probleme bei derVorwärtskompatibilität einer Anweisung. Es könnte also zum Beispielsein, dass die betreffende Anweisung bei einer zukünftigen PHP-Ver-sion möglicherweise zu einem Fehler führt. Es gibt Funktionen, dieals »deprecated« gekennzeichnet sind. Dies bedeutet, dass sie veraltetsind und in Zukunft nicht mehr existieren.

Notice Notice: Ein Hinweis auf einen leichten Fehler, der eventuell zu einemgrößeren Fehler führen kann.

Warning Warning: Eine Warnung vor einem mittelschweren Fehler.

Fatal Error Fatal Error: Dies ist ein schwerer Fehler, der zum Abbruch des Pro-gramms führt.

Zum oben genannten Programm:

mktime() Sie sollten die Funktion mktime() nicht ohne Parameter aufrufen.Falls Sie lediglich die aktuelle Systemzeit wünschen, sollten Sie dieFunktion time() benutzen. Die Funktion mktime() sollten Sie dage-gen nur zur Erzeugung eines definierten Timestamps mit Datums-und Uhrzeitangabe verwenden.

Variableexistiert nicht

Auf die Ausgabe der Variablen $a, die noch keinen Wert hat, wird miteinem Hinweis reagiert. Ein solcher Hinweis wird bei vielen Installa-tionsformen unterdrückt. Bei einer Entwicklungsumgebung solltenSie dies ändern, damit Sie den Hinweis sehen können.

282

Page 284: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Dauerhafte Konfiguration der Anzeige von Fehlern 6.2

Division durch 0 Auf die Division durch 0 wird mit einer Warnung reagiert.

Unbekannte Funktion

Der Aufruf einer unbekannten Funktion führt zu einer Fehleranzeigeund zum unmittelbaren Abbruch des Programms. Daher wird diezweite Division durch 0 nicht mehr durchgeführt.

AngriffWarnungen und Fehler können den Namen der Datei inklusive des Pfadsund die Nummer der Zeile enthalten. Hier kann ein potenzieller Angrei-fer bereits Rückschlüsse auf das verwendete System ziehen. In einer Pro-duktionsumgebung sollten Sie dies ändern.

6.2 Dauerhafte Konfiguration der Anzeige von Fehlern

php.iniEine Möglichkeit, die Anzeige von Fehlern zu steuern, bieten die Para-meter in der Konfigurationsdatei php.ini. Diese Datei befindet sich unterXAMPP im Verzeichnis C:\xampp\php. Unter EasyPHP finden Sie sie imVerzeichnis C:\EasyPHP\conf_files und unter Ubuntu Linux im Verzeich-nis /etc/php5/apache2. Sie beinhaltet unter anderem die folgenden Para-meter (mit Beispielwerten):

error_reporting = E_ALL & ~E_NOTICEdisplay_errors = Onlog_errors = Offerror_log = "php_error.log"

Erläuterung:

error_reporting Der Parameter error_reporting filtert die anzuzeigenden Fehler.Bei den Werten handelt es sich um Konstanten bzw. Kombinationenvon Konstanten (siehe Tabelle 6.1), die mit Bit-Operatoren (sieheTabelle 6.2) verbunden werden.

Konstante Zahlenwert Bedeutung

E_ERROR 1 Anzeige schwerer Fehler

E_WARNING 2 Anzeige mittelschwerer Fehler

E_NOTICE 8 Anzeige von Hinweisen

E_DEPRECATED 8192 Anzeige von Warnungen über Code-teile, die in zukünftigen PHP-Versionen nicht mehr funktionieren werden

E_ALL 32767 alles anzeigen

Tabelle 6.1 Wichtige Konstanten und Kombinationen

283

Page 285: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Fehler behandeln, Sicherheit erhöhen6

display_errors Mit dem Parameter display_errors wird entschieden, ob Fehler aufdem Bildschirm ausgegeben werden. Mögliche Werte sind On undOff.

log_errors Der Parameter log_errors entscheidet darüber, ob Fehler in einerLog-Datei (mit Datum und Uhrzeit) gespeichert werden. Die mögli-chen Werte sind On und Off.

error_log Mit Hilfe des Parameters error_log wird festgelegt, in welcher Datei(inklusive Pfad) auf dem Webserver Fehler gespeichert werden, fallslog_errors auf On steht. Nach einer Installation von XAMPP verweistdieser Wert auf die Datei C:\xampp\php\logs\php_error.log. UnterEasyPHP ist error_log nicht festgelegt. In beiden Fällen können Sieden Wert natürlich selbst festlegen.

Nachfolgend ein Beispiel für einen Eintrag in der Log-Datei. Das Beispielgilt für eine XAMPP-Installation:

[16-Dec-2010 10:44:49] PHP Strict Standards: mktime()[<a href='function.mktime'>function.mktime</a>]: You shouldbe using the time() function instead inC:\xampp\htdocs\er_mehrere.php on line 4[16-Dec-2010 10:44:49] PHP Notice: Undefined variable: a inC:\xampp\htdocs\er_mehrere.php on line 5[16-Dec-2010 10:44:49] PHP Warning: Division by zero in

E_ALL &~E_NOTICE

32759 (=32767 – 8) alles anzeigen, außer Hinweisen

E_STRICT 2048 Hinweise zur Vorwärtskompatibilität des Codes

E_ERROR |E_WARNING

3 (=1 + 2) schwere und mittelschwere Fehler

Operator Bedeutung

| Bit-weises Oder

& Bit-weises Und

~ Bit-weises Nicht

! Boolesches Nicht

Tabelle 6.2 Bit-Operatoren

Konstante Zahlenwert Bedeutung

Tabelle 6.1 Wichtige Konstanten und Kombinationen (Forts.)

284

Page 286: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Dauerhafte Konfiguration der Anzeige von Fehlern 6.2

C:\xampp\htdocs\er_mehrere.php on line 6[16-Dec-2010 10:44:49] PHP Fatal error: Call to undefinedfunction f() in C:\xampp\htdocs\er_mehrere.php on line 7

Listing 6.2 Beispiel eines Eintrags in einer Log-Datei

Erläuterung:

Es werden die verschiedenen Fehler wie in Abbildung 6.1 notiert,zusammen mit Datum und Uhrzeit.

Tabelle 6.3 enthält die empfohlenen Einstellungen für ein Entwicklungs-system und ein Produktivsystem.

ini_get()Falls Sie feststellen möchten, welche aktuellen Einstellungen gelten, hilftdas folgende Programm, das sich der Funktion ini_get() bedient.

<html><body><?php

echo "error_reporting: ". ini_get("error_reporting") . "<br />";

echo "display_errors: ". ini_get("display_errors") . "<br />";

echo "log_errors: ". ini_get("log_errors") . "<br />";

echo "error_log: ". ini_get("error_log");

?></body></html>

Listing 6.3 Datei er_get.php

Die Ausgabe sieht, je nach Einstellung, wie in Abbildung 6.2 aus.

Parameter Entwicklung Produktion

error_reporting E_ALL | E_STRICT E_ALL & ~E_DEPRECATED

display_errors On Off

log_errors Off On

error_log – php_error.log

Tabelle 6.3 Verschiedene Einstellungen

285

Page 287: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Fehler behandeln, Sicherheit erhöhen6

Abbildung 6.2 Einstellungen der Fehleranzeige

Erläuterung:

Der Parameter error_reporting steht auf E_ALL, daher wird der Wert32767 ausgegeben.

Die Parameter display_errors und log_errors stehen auf On, daherwird jeweils eine 1 ausgegeben.

Bei error_log steht der Name der Log-Datei, gegebenenfalls inklusivePfad. Das Beispiel zeigt die Voreinstellung für das Paket EasyPHP,ohne Dateiname.

6.3 Temporäre Konfiguration der Anzeige von Fehlern

ini_set() Falls Sie keine Möglichkeit haben, die Datei php.ini zu verändern, kön-nen Sie die Parameter auch über die Funktion ini_set() verändern. Diesgilt allerdings nur für das aktuelle Programm. Ein Beispiel:

<html><body><?phpini_set("error_reporting", 1);ini_set("display_errors", 1);ini_set("log_errors", 1);ini_set("error_log", "log.txt");

echo mktime();echo $a;echo 1/0;echo f();echo 1/0;

?>

286

Page 288: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Angriffe und Sicherheit 6.4

</body></html>

Listing 6.4 Datei er_set.php

Erläuterung:

Es werden nur schwere Fehler angezeigt (siehe Abbildung 6.3) undgleichzeitig in der Log-Datei log.txt im gleichen Verzeichnis wieer_set.php notiert.

Die entsprechenden Anweisungen können natürlich auch in eineinclude-Datei ausgelagert werden. Damit haben Sie auf dem Entwick-lungssystem und dem Produktionssystem jeweils die passende Feh-leranzeige zur Verfügung.

Abbildung 6.3 Anzeige des schweren Fehlers

6.4 Angriffe und Sicherheit

Webserver im Internet sind häufig Angriffen ausgesetzt. Es gibt eineReihe von Möglichkeiten, diese Angriffe abzuwehren. Eines muss aller-dings klar sein: Es gibt keine völlige Sicherheit. Sie sollten aber versu-chen, den Grad an Sicherheit so weit wie möglich zu erhöhen, ohne dassdie Benutzbarkeit des Systems eingeschränkt wird. Dies gilt für kleineSysteme genauso wie für große. Viele Angriffe sind automatisiert undunterscheiden nicht nach Systemgröße.

Untersuchungen zeigen, dass ein beachtlicher Anteil der Sicherheits-lücken durch unzureichende Programmierung entsteht. Neben den Ad-ministratoren, Providern und sonstigen Personen bzw. Institutionen, dieeinen Zugang zu einem Webserver ermöglichen, ist also auch der PHP-Programmierer gefordert, seinen Anteil zur Erhöhung der Sicherheit bei-zutragen. In diesem Abschnitt beschreibe ich bewusst keine Angriffstech-niken, sondern nenne nur Maßnahmen zur Verbesserung der Sicherheit.

287

Page 289: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Fehler behandeln, Sicherheit erhöhen6

6.4.1 Programmpakete

Es existieren fertige Programmpakete, die dem PHP-Programmierereinen Teil seiner Arbeit abnehmen können. Bei diesen Paketen solltenSie sich darüber im Klaren sein, dass ihr hoher Verbreitungsgrad auchdazu führen kann, dass ihre Sicherheitslücken ebenfalls verbreitet sind.Sie sollten darauf achten, dass die Pakete weiterhin vom Herstellergepflegt werden und dass auch an der Beseitigung der Sicherheitslückengearbeitet wird.

6.4.2 Sichtbare Daten

Daten, die nur der Programmierer benötigt, die aber für den Benutzerunwichtig sind, sollten Sie nicht sichtbar machen. Alle sichtbaren Datenergeben Informationen, die zu Angriffen genutzt werden können. ImEinzelnen bedeutet dies:

Daten, die von einem PHP-Programm gesendet werden, sollten mög-lichst nicht (mit den Zeichen & und ?) an die URL angehängt werden($_GET[...]), da sie anschließend lesbar in der Adresszeile des Brow-sers erscheinen.

Daten sollten nicht mit Hilfe von Formularelementen des Typs hiddenvon einem PHP-Programm zum nächsten übertragen werden. Sie sindin der Quellcodeansicht des Browsers lesbar.

Zur Datenübermittlung sollten Sie Sessions verwenden (siehe dennächsten Abschnitt).

Hinweise, Warnungen und Fehlermeldungen sollten Sie auf einemProduktionssystem nicht ausgeben lassen.

Das Zeichen @ (der sogenannte silence operator) direkt vor einemFunktionsnamen dient dazu, eine eventuelle Ausgabe der Funktion zuunterdrücken. Ein Beispiel: @fopen(test.txt).

6.4.3 Sessions

Bei der Übermittlung von Daten zwischen PHP-Programmen bieten Ses-sions eine recht hohe Sicherheit. Aber auch hier gibt es Verbesserungs-möglichkeiten:

Informationen über die Session werden in einem Cookie auf dem Cli-ent-PC festgehalten. Die Lebensdauer der Cookies können Sie mit Hilfeder Funktion session_set_cookie_params() beeinflussen, sodassdiese nur eine begrenzte Zeit auf dem PC verbleiben. Allerdings gelten

288

Page 290: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Angriffe und Sicherheit 6.4

die Einstellungen nur für das aktuelle PHP-Programm. Die Funktionmuss vor der Funktion session_start() aufgerufen werden.

Situation: Der Benutzer entfernt sich während einer Session vomArbeitsplatz und hinterlässt seinen PC unbeaufsichtigt. Abhilfe: DenStartzeitpunkt einer Session in einer Datenbank auf dem Server fest-halten und die Gültigkeit einer Session nach Ablauf einer maximalerlaubten Zeit automatisch beenden.

Die Funktion session_regenerate_id() erzeugt eine neue Sessionmit einer neuen ID, dabei werden alle Daten der alten Session über-nommen. So ist es einem Angreifer nicht mehr möglich, mit einer ihmbekannt gewordenen Session-ID oder einer von außen vorgegebenenSession-ID an weitere Daten zu kommen.

Mit Hilfe der Funktion session_cache_limiter() können Sie dasSpeichern von Seiten, die auch Session-Daten beinhalten, im Cachedes Client-PCs oder auf einem Proxy vermeiden.

6.4.4 Variablen

Der Zugriff, das Hinzufügen oder das Auslesen von Variablen der PHP-Pro-gramme sollte nicht möglich sein. Sie sollten daher Folgendes beachten:

Falls die Möglichkeit besteht, sollten Sie den Schalter register_glo-bals in der Datei php.ini auf Off stellen. Seit PHP 5.4 gibt es diesenSchalter nicht mehr. Sie können ihn also nicht mehr (sicherheitsge-fährdend) auf On stellen. Die Inhalte von Formularelementen könnendann im empfangenden PHP-Programm nur noch über das Array$_POST[...] verarbeitet werden.

Variablen können vor ihrer Nutzung initialisiert und nach Ende ihrerNutzung mit der Funktion unset() wieder gelöscht werden.

Den Gültigkeitsbereich von Variablen können Sie kleinhalten, wennein Programm stark modularisiert, das heißt in Funktionen zerlegtwird.

6.4.5 Eingaben prüfen

Formulare bieten viele Angriffsmöglichkeiten, da es hier notwendig ist,Daten vom Client zum Server zu übertragen. Abhilfe kann Folgendesschaffen:

Sie sollten die Eingaben vor deren Weiterverarbeitung auf Typ undPlausibilität hin überprüfen. Entsprechen sie dem erwarteten Daten-

289

Page 291: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Fehler behandeln, Sicherheit erhöhen6

typ? Liegen sie im erlaubten Wertebereich? Handelt es sich um eineder vorgegebenen Möglichkeiten?

Eingaben sollten Sie mit Hilfe der Funktion htmlspecialchars() oderder Funktion htmlentities() vor der weiteren Verarbeitung umwan-deln, sodass kein schädlicher HTML-Code oder JavaScript-Code ein-gebettet werden kann. Die Funktion wandelt zum Beispiel die Zei-chen < , > und Anführungszeichen in die entsprechenden HTML-Entities um (&lt;, &gt;, &quot; usw.).

Sie sollten prüfen, woher die Daten kommen. Handelt es sich um dieerwartete Quelle?

Bei den übermittelten Werten sollte es sich nicht um Funktionsnamenoder Dateinamen handeln, die anschließend direkt aufgerufen oderanderweitig bearbeitet werden. Dies spart zwar Code, setzt aber dieSicherheit herab.

Falls Sie Eingaben benötigen, um anschließend eine Datenbankab-frage zu generieren, sollten Sie mit der Funktion mysql_real_escape_string() arbeiten. Diese setzt unter anderem jedes Hochkomma inder Eingabe in die Kombination Backslash und Hochkomma um.Dadurch wird das Einbetten von zusätzlichem, eventuell schädlichemSQL-Code verhindert.

6.4.6 Passwörter

Häufig kann der Zugang zu bestimmten Seiten nur mit einem Passworterreicht werden. Die Sicherheit lässt sich hierbei durch folgende Maß-nahmen erhöhten:

Passwörter sollten eine bestimmte Mindestlänge haben. Sie solltensowohl kleine Zeichen als auch große Zeichen sowie Ziffern, gegebe-nenfalls auch bestimmte Sonderzeichen beinhalten.

Diese Regeln sollten in beiden möglichen Fällen beachtet werden:

falls der Benutzer sein Passwort selbst wählen kann

falls der Betreiber des Webservers ein per PHP-Programm gene-riertes Passwort vorgibt

Die Speicherung des Passworts in einer Datenbank sollte in verschlüs-selter Form erfolgen, zum Beispiel mit Hilfe der Funktion md5(). EinVergleich wird dann zwischen der verschlüsselten Eingabe und demverschlüsselt gespeicherten Passwort vorgenommen.

290

Page 292: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

7 Zeichenketten

StringsAus Formulareingabefeldern, Dateien und Datenbanken gelangen Zei-chenketten (Strings), die analysiert und bearbeitet werden müssen, in einPHP-Programm. Zur Weiterverarbeitung dieser Zeichenketten stehenzahlreiche Funktionen zur Verfügung, einige nützliche davon stelle ichIhnen hier vor.

7.1 Länge und Umwandlungsfunktionen

In dem folgenden Formular soll eine beliebige Zeichenkette eingegebenwerden, die anschließend von einem Programm mit Hilfe verschiedenerMethoden umgewandelt wird.

Länge messen Die Länge einer eingegebenen Zeichenkette wird mit strlen() ge-messen.

Klein/groß Alle eingegebenen Zeichen werden in Kleinbuchstaben (strtolo-wer()) oder in Großbuchstaben (strtoupper()) umgewandelt.

Erster Buchstabe Der erste Buchstabe einer Zeichenkette (ucfirst()) beziehungsweisejedes einzelnen Worts (ucwords()) wird in einen Großbuchstabenumgewandelt.

Umdrehen Die Zeichenkette wird umgedreht (strrev()).

Zeichen ersetzen Bestimmte Zeichen (strtr()) oder Teilzeichenketten (str_replace())können durch andere Zeichen beziehungsweise andere Teilzeichen-ketten ersetzt werden.

Zunächst das Eingabeformular (siehe auch Abbildung 7.1):

<html><body><p>Tragen Sie bitte einen Testsatz ein, und senden

Sie das Formular ab</p><form action = "text_umwandlung.php" method = "post">

<p><input name="test" size="50" /></p><p><input type="submit" value="Absenden" /></p>

</form>

291

Page 293: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Zeichenketten7

</body></html>

Listing 7.1 Datei text_umwandlung.htm

Abbildung 7.1 Beispieleingabe zur Umwandlung

Das Ergebnis der einzelnen Umwandlungen sehen Sie in Abbildung 7.2.

Abbildung 7.2 Ergebnis der Umwandlung

Hier das Programm:

<html><body><?php$test = $_POST["test"];echo "<p>Umwandlungsfunktionen:</p>";echo "<table border='1'>";

292

Page 294: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Länge und Umwandlungsfunktionen 7.1

echo "<tr> <td>Funktion</td> <td>Erläuterung</td><td>Ergebnis</td> </tr>";

echo "<tr> <td>-</td> <td>Original</td><td>$test</td> </tr>";

$lg = strlen($test);echo "<tr> <td>strlen</td>

<td>Länge</td> <td>$lg</td> </tr>";

$kl = strtolower($test);echo "<tr> <td>strtolower</td>

<td>alles klein</td> <td>$kl</td> </tr>";

$gr = strtoupper($test);echo "<tr> <td>strtoupper</td>

<td>alles groß</td> <td>$gr</td> </tr>";

$uf = ucfirst($test);echo "<tr> <td>ucfirst</td>

<td>erstes Zeichen groß</td> <td>$uf</td> </tr>";

$uw = ucwords($test);echo "<tr> <td>ucwords</td>

<td>erstes Zeichen jedes Worts groß</td><td>$uw</td> </tr>";

$rv = strrev($test);echo "<tr> <td>strrev</td>

<td>umdrehen</td> <td>$rv</td> </tr>";

$tr = strtr($test,"ao", "AO");echo "<tr> <td>strtr</td>

<td>alle 'a' und 'o' ersetzt durch 'A' und 'O'</td><td>$tr</td> </tr>";

$rp = str_replace("hallo","hi",$test);echo "<tr> <td>str_replace</td>

<td>alle 'hallo' ersetzt durch 'hi'</td><td>$rp</td> </tr>";

echo "</table>";?></body></html>

Listing 7.2 Datei text_umwandlung.php

293

Page 295: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Zeichenketten7

Die Funktionen strlen(), strtolower(), strtoupper(), ucfirst(),ucwords() und strrev() erhalten jeweils einen Parameter, und zwar dieOriginalzeichenkette. Sie liefern die umgewandelte Zeichenkette alsRückgabewert zurück. Die Funktion strtr() bekommt drei Parameter:

die Originalzeichenkette

eine Zeichenkette mit allen einzelnen Zeichen, die zu ersetzen sind

eine Zeichenkette mit den jeweiligen neuen Zeichen

Alle zu ersetzenden Zeichen werden durch die entsprechenden neuenZeichen ausgetauscht.

Die Funktion str_replace() bekommt ebenfalls drei Parameter:

eine einzelne zu ersetzende Teilzeichenkette

eine neue Teilzeichenkette

die Originalzeichenkette

Alle zu ersetzenden Teilzeichenketten werden durch die entsprechendenneuen Teilzeichenketten ersetzt.

7.2 Zeichenketten und Felder

Zerlegen Mit Hilfe der Funktion explode() lässt sich eine Zeichenkette in ein Feldumwandeln. Die Zeichenkette wird bei jedem Auftreten einer sogenann-ten Separatorzeichenkette getrennt. Diese Separatorzeichenkette kann auseinem einzelnen Zeichen, wie zum Beispiel einem Leerzeichen odereinem Semikolon, oder auch aus mehreren Zeichen bestehen. Anschlie-ßend können Sie die einzelnen Elemente des Feldes mit den bekanntenOperationen für Felder weiter bearbeiten. Diese Methode wird häufigangewendet und erleichtert die Analyse einer Eingabe.

Zusammensetzen Den umgekehrten Vorgang, nämlich das Erzeugen einer Zeichenkette auseinem Feld zusammen mit einer Separatorzeichenkette, ermöglicht dieFunktion implode(). Eine solche Zeichenkette mit Separatoren kann alseine CSV-Datei geschrieben werden. CSV steht für kommaseparierteWerte (engl. comma-separated values). Dabei handelt es sich um ein sehruniverselles Format, das von vielen Programmen unter vielen Betriebs-systemen gelesen werden kann.

Es folgt der Programmcode eines Beispiels:

294

Page 296: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Zeichenketten und Felder 7.2

<html><body><?php

/* explode */$test = "Dies ist ein kurzer Satz";$worte = explode(" ", $test);$lg = sizeof($worte);for($i=0; $i<$lg; $i++)

echo "Wort $i: $worte[$i]<br />";echo "<p> </p>";

/* implode */$feld = array(17.5, 19.2, 21.8, 21.6, 17.5);$test = implode(";", $feld);echo "Eine Zeichenkette:<br />$test";

?></body></html>

Listing 7.3 Datei text_feld.php

Mit Hilfe der Funktion explode() wird die Zeichenkette $test in einFeld verwandelt. Jedes Leerzeichen wird als Separator vom nächstenFeldelement angesehen. Anschließend wird mit Hilfe der Feldfunktionsizeof() die Größe des Feldes festgestellt. Eine for-Schleife dient dazu,jedes Element des Arrays einzeln und nummeriert auszugeben.

Das Feld $feld umfasst fünf Elemente. Diese Elemente werden mit Hilfeder Funktion implode() und des Separatorzeichens ; (Semikolon) in derZeichenkette $test zusammengeführt. Die Ausgabe sieht aus wie inAbbildung 7.3.

Abbildung 7.3 explode() und implode()

295

Page 297: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Zeichenketten7

7.3 Teilzeichenketten

Teile extrahieren Teile von Zeichenketten können mit verschiedenen Funktionen extra-hiert werden. Bei der Funktion substr() wird angegeben, ab welcherPosition innerhalb der Zeichenkette und über welche Länge hinwegextrahiert werden soll:

Falls der zweite Parameter der Funktion substr() positiv ist, beginntdie zurückgegebene Teilzeichenkette bei der angegebenen Nummer,vom Beginn der Originalzeichenkette aus gemessen. Die Nummer desersten Zeichens der Originalzeichenkette ist 0.

Falls der zweite Parameter der Funktion substr() negativ ist, beginntdie zurückgegebene Teilzeichenkette bei der angegebenen Nummer,vom Ende der Originalzeichenkette aus gemessen.

Falls der dritte Parameter der Funktion substr() existiert und positivist, werden dementsprechend viele Zeichen zurückgegeben.

Bei der Funktion strstr() wird ein Zeichen oder eine Zeichenketteangegeben, ab dem beziehungsweise ab dessen erstem Auftreten bis zumEnde der Zeichenkette extrahiert werden soll. Die Funktion stristr()liefert das Gleiche, in diesem Falle unabhängig von der Groß- und Klein-schreibung der Vergleichszeichenkette.

Die Funktion strrchr() sucht nach dem letzten Auftreten eines einzel-nen Zeichens und extrahiert ab dieser Stelle. Es folgt ein Beispiel:

<html><body><?php

$test = "[email protected]";echo "<p>Teil-Zeichenketten:</p>";echo "<table border='1'>";echo "<tr> <td>Nr.</td> <td>Funktion</td>

<td>Erläuterung</td> <td>Ergebnis</td> </tr>";echo "<tr> <td>&nbsp;</td> <td>-</td>

<td>Original</td><td>$test</td> </tr>";

$sub1 = substr($test,3);echo "<tr> <td>1</td> <td>substr</td>

<td>ab Zeichen 3 bis Ende</td><td>$sub1</td> </tr>";

$sub2 = substr($test,3,5);echo "<tr> <td>2</td> <td>substr</td>

296

Page 298: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Teilzeichenketten 7.3

<td>ab Zeichen 3 5 Zeichen</td><td>$sub2</td> </tr>";

$sub3 = substr($test,-5);echo "<tr> <td>3</td> <td>substr</td>

<td>ab 5.letztem Zeichen bis Ende</td><td>$sub3</td> </tr>";

$sub4 = substr($test,-5,2);echo "<tr> <td>4</td> <td>substr</td>

<td>ab 5.letztem Zeichen 2 Zeichen</td><td>$sub4</td> </tr>";

$domain = strstr($test, "@");echo "<tr> <td>5</td> <td>strstr</td>

<td>ab Zeichen @ bis Ende</td><td>$domain</td> </tr>";

$country = strrchr($test, ".");echo "<tr> <td>6</td> <td>strrchr</td>

<td>ab letztem Punkt bis Ende</td><td>$country</td> </tr>";

echo "</table>";?></body></html>

Listing 7.4 Datei text_teil.php

Die Ausgabe sehen Sie in Abbildung 7.4.

Abbildung 7.4 Teilzeichenketten

297

Page 299: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Zeichenketten7

In den Zeilen 1 bis 4 werden Teilzeichenketten extrahiert, abhängig vonihrer Position in der Originalzeichenkette, gezählt ab Zeichen 0 bezie-hungsweise ab dem letzten Zeichen. In den Zeilen 5 und 6 werden Teil-zeichenketten extrahiert, abhängig vom Vorkommen eines bestimmtenZeichens. Dieses Zeichen wird vom Beginn beziehungsweise vom Endeder Originalzeichenkette aus gesucht.

7.4 Suchen nach Position

Zeichen suchen Die Funktionen strpos() und strrpos() dienen dem Suchen nachbestimmten Zeichen oder Zeichenketten innerhalb anderer Zeichenket-ten. Es wird die Position zurückgeliefert, an der etwas gefunden wurde.Dabei sucht

die Funktion strpos() ohne Offset-Angabe nach dem ersten Vorkom-men des Zeichens oder der Zeichenkette,

die Funktion strpos() mit Offset-Angabe nach dem ersten Vorkom-men des Zeichens oder der Zeichenkette ab dem Offset und

die Funktion strrpos() nach dem letzten Vorkommen eines Zeichens(keiner Zeichenkette).

Hierzu ein Beispiel:

<html><body><?php

$test = "[email protected]";echo "Suchen in Zeichenketten:<p>";echo "<table border='1'>";echo "<tr> <td>Funktion</td>

<td>Erläuterung</td> <td>Ergebnis</td> </tr>";echo "<tr> <td>-</td> <td>Original: $test</td>

<td>-</td> </tr>";

$pos1 = strpos($test,"@");echo "<tr> <td>strpos</td>

<td>Position des 1. Zeichens '@'</td><td>$pos1</td> </tr>";

$pos2 = strpos($test,".",$pos1+1);echo "<tr> <td>strpos</td>

<td>Position des 1. Punkts nach Zeichen '@'</td>

298

Page 300: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Vergleich von Zeichenketten 7.5

<td>$pos2</td> </tr>";

$pos3 = strrpos($test,".");echo "<tr> <td>strrpos</td>

<td>Position des letzten Zeichens 'Punkt'</td><td>$pos3</td> </tr>";

echo "</table>";?></body></html>

Listing 7.5 Datei text_position.php

Eine Zeichenkette kann nach verschiedenen Zeichen untersucht undanschließend mit der Funktion substr() zerlegt werden. Im vorliegen-den Beispiel wird das erste Vorkommen des Zeichens @ gesucht.Anschließend wird der erste Punkt gesucht. Außerdem wird noch derletzte Punkt gesucht. Die Ausgabe zeigt Abbildung 7.5.

Abbildung 7.5 Suchen nach Position

7.5 Vergleich von Zeichenketten

Die Funktionen strcmp() und strcasecmp() dienen dem Vergleichzweier Zeichenketten gemäß ihrer Reihenfolge in der Zeichencode-Tabelle. Dabei wird bei der Funktion strcmp() auf die Groß- und Klein-schreibung geachtet, bei der Funktion strcasecmp() hingegen nicht.

Strings vergleichen

Die Funktion similar_text() stellt fest, wie viele Zeichen innerhalbzweier Zeichenketten übereinstimmen, also wie ähnlich sich zwei Zei-chenketten sind.

299

Page 301: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Zeichenketten7

Ein Beispielprogramm:

<html><body><?php

$ErsterName = "Maier";$ZweiterName = "Mertens";$DritterName = "maier";

echo "<p>Mit Beachtung der Groß- undKleinschreibung (strcmp):<br />";

if (strcmp($ErsterName,$ZweiterName) < 0)echo "$ErsterName steht vor $ZweiterName<br />";

elseecho "$ZweiterName steht vor $ErsterName<br />";

if (strcmp($ZweiterName,$DritterName) < 0)echo "$ZweiterName steht vor $DritterName</p>";

elseecho "$DritterName steht vor $ZweiterName</p>";

echo "<p>Ohne Beachtung der Groß- undKleinschreibung (strcasecmp):<br />";

if (strcasecmp($ZweiterName,$DritterName) < 0)echo "$ZweiterName steht vor $DritterName</p>";

elseecho "$DritterName steht vor $ZweiterName</p>";

echo "<p>Ähnlichkeit (similar_text):<br />";$erg1 = similar_text($ErsterName,$ZweiterName);echo "Zwischen $ErsterName und $ZweiterName:

$erg1 gleiche Buchstaben<br />";$erg2 = similar_text($ErsterName,$DritterName);echo "Zwischen $ErsterName und $DritterName:

$erg2 gleiche Buchstaben";?></body></html>

Listing 7.6 Datei text_vergleich.php

Die Ausgabe sehen Sie in Abbildung 7.6.

300

Page 302: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Codierung von Zeichen 7.6

Abbildung 7.6 Vergleich von Zeichenketten

In der Zeichencode-Tabelle stehen Großbuchstaben vor Kleinbuchsta-ben, daher steht bei einer Verwendung von strcmp()der Wert Mertensvor maier. Die Funktion strcasecmp() ignoriert die Groß- und Klein-schreibung, daher stehen die Namen in der üblichen, alphabetischen Rei-henfolge.

7.6 Codierung von Zeichen

Zeichen zuZahlen

Jedem Zeichen einer Zeichenkette entspricht ein Zahlenwert gemäß derZeichencode-Tabelle. Dieser Code wird beim Speichern einer Zeichen-kette intern verwendet. Vergleichsfunktionen wie strcmp() basieren aufdieser Reihenfolge innerhalb der Zeichencode-Tabelle. Die Tabelle teiltsich in folgende Bereiche auf:

Die Zeichen 0 bis 31 sind hauptsächlich Steuerzeichen zur Bildschirm-steuerung, also keine sichtbaren Zeichen.

Die Zeichen 32 bis 127 beinhalten unter anderem die Ziffern 0 bis 9(Code 48 bis 57), die Großbuchstaben (Code 65 bis 90), die Kleinbuch-staben (Code 97 bis 122) sowie Sonderzeichen, wie zum BeispielKomma, Doppelpunkt und Semikolon.

Die Zeichen 128 bis 255 beinhalten weitere Sonderzeichen, abhängigvon der für den Rechner gewählten Codeseite und Ländereinstellung.

Zahlen zuZeichen

Die Zeichenkettenfunktion chr() liefert als Rückgabewert das Codezei-chen des angegebenen Zahlenwerts. Die Funktion ord() macht das

301

Page 303: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Zeichenketten7

Gegenteil: Sie liefert die Codenummer zu dem angegebenen Zeichen.Das folgende Beispielprogramm benutzt die Funktion chr() und liefertdem Benutzer eine HTML-Tabelle der Zeichen 32 bis 127. Zunächst derProgrammcode:

<html><body><?php

echo "<table>";for ($i=4; $i<16; $i++)

echo "<tr>";for ($k=0; $k<8; $k++)

echo "<td align='right'>" . ($i*8+$k). ":</td><td><b>" . chr($i*8+$k). "</b></td>";

echo "</tr>";

echo "</table>";

?></body></html>

Listing 7.7 Datei text_code.php

Die Ausgabe zeigt Abbildung 7.7.

Abbildung 7.7 Zeichen mit Codes von 32 bis 127

302

Page 304: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Einfache Verschlüsselung 7.7

7.7 Einfache Verschlüsselung

Im folgenden Programm wird mit Hilfe der oben angegebenen Zeichen-kettenfunktionen eine einfache Verschlüsselung eines eingegebenenTextes durchgeführt. Der Benutzer wird aufgefordert, einen Text einzu-geben. Jedes einzelne Zeichen des Textes wird um einen Wert in der Zei-chencode-Tabelle nach vorne verschoben und anschließend auf demBildschirm ausgegeben. Aus einem g wird ein h, aus einer 4 wird eine 5,aus einem X wird ein Y usw.

GeheimcodeSchon diese einfache Verschlüsselung führt zu einem schwer lesbarenText. Die Entschlüsselung ist nur möglich, wenn man die Verschlüsse-lungsmethode kennt. Diese ist in diesem Fall noch recht einfach. Sie kön-nen sich sicher leicht vorstellen, dass aufwendigere Methoden zu einemErgebnis führen, das nicht mehr so einfach zu entschlüsseln ist.

Zunächst das Formular zum Eintragen des Satzes:

<html><body><p>Tragen Sie bitte einen Satz zum Verschlüsseln ein,<br />und senden Sie das Formular ab</p><form action="text_verschluesseln.php" method="post">

<p><input name="test" size="50" /></p><p><input type="submit" value="Absenden" /></p>

</form></body></html>

Listing 7.8 Datei text_verschluesseln.htm

Das Programm mit der Verschlüsselung:

<html><body><?php

$test = $_POST["test"];echo "Original: $test<br />";$lg = strlen($test);

echo "verschlüsselt: ";for($i=0; $i<$lg; $i++)

// ein Zeichen extrahieren$char = substr($test,$i,1);// Code des Zeichens feststellen

303

Page 305: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Zeichenketten7

$code = ord($char);// Code des neuen Zeichens ermitteln$newcode = $code + 1;// Neues Zeichen erzeugen, ausgeben$newchar = chr($newcode);echo $newchar;

?></body></html>

Listing 7.9 Datei text_verschluesseln.php

Nach der Eingabe aus Abbildung 7.8 …

Abbildung 7.8 Eingabe eines Satzes

… erfolgt die Ausgabe aus Abbildung 7.9.

Abbildung 7.9 Ausgabe des verschlüsselten Satzes

Jedes Zeichen des eingegebenen Textes wird einzeln mit der Funktionsubstr() extrahiert. Der Codewert des Zeichens wird mit der Funktionord() festgestellt. Dieser Codewert wird um 1 erhöht. Das Zeichen zumneuen Codewert wird mit der Funktion chr() ermittelt und ausgegeben.

Eine Verschlüsselungsmethode lässt sich dazu nutzen, eingegebeneDaten in schwer lesbarer Form über das Internet zu übertragen. BeimWebserver können die Daten wiederum als Klartext entschlüsselt wer-den. Eine weitere Anwendung: Falls es sich zum Beispiel um ein ver-

304

Page 306: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Weitere Verschlüsselungsmethoden 7.8

schlüsselt übermitteltes Passwort handelt, kann es mit vorhandenenPasswörtern verglichen werden, die auf dem Webserver mit der gleichenMethode verschlüsselt und abgespeichert wurden.

7.8 Weitere Verschlüsselungsmethoden

PHP stellt noch einige weitere Funktionen zur Verschlüsselung bereit:crc32(), crypt(), md5() und str_rot13(). Die vier Methoden zeige ichIhnen nachfolgend an einem Beispiel.

md5()Das Formular in der Datei text_crypt.htm zum Eintragen des Satzes, derverschlüsselt werden soll, sieht wie im vorherigen Beispiel aus. Das Pro-gramm zur Verschlüsselung:

<html><body><?php

$test = $_POST["test"];echo "Ihr Satz: $test<br />";echo "CRC32-Prüfsumme: " . crc32($test) . "<br />";echo "DES-Verschlüsselung, mit Salt-Zeichenkette: "

. crypt($test,"xy") . "<br />";echo "MD5-Verschlüsselung: " . md5($test) . "<br />";echo "ROT13-Verschlüsselung: " . str_rot13($test);

?></body></html>

Listing 7.10 Datei text_crypt.php

Die Funktion crc32() liefert eine Prüfsumme, die anderen drei Funktio-nen liefern eine Zeichenkette zurück. Das Ergebnis, mit dem gleichenSatz wie im vorherigen Beispiel, ist in Abbildung 7.10 dargestellt.

Abbildung 7.10 Verschlüsselungsmethoden

305

Page 307: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet
Page 308: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

8 Dateien und Verzeichnisse

Dateien lesenund schreiben

In vielen Fällen muss zur Speicherung kleinerer Datenmengen keineDatenbank angelegt werden. Für einen Seitenzugriffszähler beispiels-weise reicht es aus, eine einfache Textdatei zu verwenden. In diesemAbschnitt behandele ich die Funktionen zum Öffnen, Lesen, Schreibenund Schließen von Dateien. Darüber hinaus erläutere ich Funktionen, dieInformationen über Dateien und Verzeichnisse bereitstellen.

8.1 Dateitypen

Bei der Ein- und Ausgabe von Daten in Dateien sollten Sie sich bewusstsein, welcher Dateityp vorliegt und welche Zugriffsart Sie verwendenkönnen. Man unterscheidet zwischen folgenden Zugriffsarten:

Sequenziell Sequenzieller Zugriff: Diese Möglichkeit wird bei einer Datei bevor-zugt, deren einzelne Zeilen unterschiedlich lang sind und jeweils miteinem Zeilenumbruch beendet werden. Ihren Inhalt können Sie miteinem einfachen Editor bearbeiten. Die Zeilen werden rein sequenzi-ell gelesen beziehungsweise geschrieben. Es ist nicht möglich, aufeine bestimmte Zeile direkt zuzugreifen, da Sie nicht wissen können,wie lang die Vorgängerzeilen sind.

Wahlfrei Wahlfreier Zugriff: Diese Möglichkeit haben Sie bei einer Datei, diegrößtenteils gleich lange Datensätze beinhaltet. Es können Zeilenum-brüche existieren, müssen aber nicht. Die Länge und Struktur einesDatensatzes sollten bekannt sein oder innerhalb der Datei an einervereinbarten Stelle stehen. Sie können direkt gelesen beziehungsweiseverändert werden, da Sie den Ort jedes Datensatzes berechnen kön-nen.

Binär Binärer Zugriff: Diese Zugriffsmöglichkeit haben Sie bei jeder Datei.Sie arbeiten mit reinen Byte-Folgen. Diese können mit Hilfe eines dar-auf angepassten Programms gelesen oder verändert werden. Aller-dings kann dies zur Folge haben, dass die Dateien nicht mehr mit denzugehörigen Anwendungsprogrammen gelesen werden können. Bei-spiel: Sie überschreiben in einer Oracle-Datenbank die Stelle, an der

307

Page 309: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Dateien und Verzeichnisse8

die Anzahl der Datensätze einer bestimmten Tabelle steht. Dies kanndazu führen, dass diese Tabelle oder sogar die ganze Datenbank zer-stört wird.

Es gibt Mischformen bei den genannten Typen. Ohne Kenntnis derStruktur einer Datei ist es nicht möglich, diese korrekt zu bearbeiten.

8.2 Lesen einer Zeile aus einer sequenziellen Datei

Es folgt ein einfaches Beispiel, in dem die erste Zeile einer sequenziellenDatei gelesen und auf dem Bildschirm ausgegeben wird.

Öffnen und lesen Die Datei lesen.txt wurde zuvor mit einem Texteditor erzeugt und imgleichen Verzeichnis wie die Datei lesen_zeile.php abgespeichert. Siebeinhaltet mehrere unterschiedlich lange Zeilen mit Text, wie Sie inAbbildung 8.1 sehen.

Abbildung 8.1 Datei, aus der eingelesen wird

Mit Hilfe des Programms wird die erste Zeile der Datei gelesen und wiein Abbildung 8.2 auf dem Bildschirm ausgegeben.

Abbildung 8.2 Lesen aus Datei

Es folgt der Programmcode:

<html><body><?php

if(!file_exists("lesen.txt"))

308

Page 310: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Lesen einer Zeile aus einer sequenziellen Datei 8.2

echo "Datei konnte nicht gefunden werden";exit;

$fp = fopen("lesen.txt","r");if(!$fp)

echo "Datei konnte nicht geöffnet werden";exit;

$zeile = fgets($fp, 100);echo "Inhalt der ersten Zeile der

Datei lesen.txt:<br />$zeile";fclose($fp);

?></body></html>

Listing 8.1 Datei lesen_zeile.php

Innerhalb des PHP-Programms werden die Funktionen file_exists(),fopen(), fgets() und fclose() verwendet.

file_exists()Mit Hilfe der Funktion file_exists() wird zunächst festgestellt, ob dieangegebene Datei existiert. Ist dies nicht der Fall, muss das PHP-Pro-gramm mit Hilfe von exit beendet werden.

fopen()Die Funktion fopen() dient dem Öffnen einer Datei.

Der erste Parameter gibt den Namen der Datei an. In unserem Beispielhandelt es sich um die Datei mit dem Namen lesen.txt, die im gleichenVerzeichnis wie das PHP-Programm steht.

read Der zweite Parameter gibt den Öffnungsmodus an. Hier ist es r (fürread), das heißt, die Datei wird zum Lesen geöffnet. Andere Öff-nungsmodi sind zum Beispiel w (für write, Schreiben in eine Datei)und a (für append, Anhängen an eine Datei).

Der Rückgabewert der Funktion ist ein sogenannter Dateizeiger. Erwird in der Variablen $fp gespeichert. Dieser Dateizeiger wird fürweitere Zugriffe auf die Datei benötigt. Sollte die Datei am angegebe-nen Ort nicht existieren, so gibt die Funktion fopen() den Wert falsezurück.

309

Page 311: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Dateien und Verzeichnisse8

Vor der weiteren Benutzung der Datei muss geprüft werden, ob derDateizeiger auf eine erfolgreich geöffnete Datei verweist. Hier geschiehtdies mit if ($fp). Existiert die Datei nicht, so muss das PHP-Programmabgebrochen werden.

fgets() Die Funktion fgets() dient dem Lesen einer Zeichenkette aus einerDatei.

Der erste Parameter gibt an, aus welcher Datei gelesen werden soll.Dabei muss es sich um den Dateizeiger einer zuvor geöffneten Dateihandeln. Hier ist dies $fp.

Der zweite Parameter gibt die Länge der einzulesenden Zeichenkettean. Es werden entweder (Länge – 1) Zeichen aus der Datei gelesen(hier 99) oder bis zum Zeilenumbruch oder bis zum Ende der Datei.Dies gilt je nachdem, was zuerst eintritt. Sie sollten zum Lesen ganzerZeilen eine Leselänge wählen, die auf jeden Fall für die betreffendeDatei ausreicht.

Der Rückgabewert der Funktion ist die gelesene Zeichenkette (ein-schließlich des Zeilenumbruchs). Sie wird hier in der Variablen$zeile gespeichert. Diese Variable wird auf dem Bildschirm ausgege-ben.

fclose() Die Funktion fclose() dient dem Schließen einer Datei.

Der Parameter gibt an, welche Datei geschlossen werden soll. Dabeimuss es sich um den Dateizeiger einer zuvor geöffneten Datei han-deln. Hier ist dies $fp.

Sie sollten geöffnete Dateien immer schließen, auch wenn nach Beendi-gung eines PHP-Programms alle beteiligten Dateien geschlossen werden.Andernfalls könnte das Betriebssystem weitere Zugriffe auf diese Dateiverwehren, da es diese Datei für noch geöffnet hält.

8.3 Lesen aller Zeilen einer sequenziellen Datei

Im folgenden Beispiel werden alle Zeilen einer sequenziellen Datei gele-sen und auf dem Bildschirm ausgegeben:

<html><body><?php

if(!file_exists("lesen.txt"))

310

Page 312: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Lesen aller Zeilen einer sequenziellen Datei 8.3

echo "Datei konnte nicht gefunden werden";exit;

$fp = fopen("lesen.txt","r");if(!$fp)

echo "Datei konnte nicht geöffnet werden";exit;

while (!feof($fp))

$zeile = fgets($fp, 100);echo "Zeile: $zeile<br />";

fclose($fp);

?></body></html>

Listing 8.2 Datei lesen_alles.php

Die Ausgabe sehen Sie in Abbildung 8.3.

Abbildung 8.3 Alle Zeilen der Datei

feof()Die Funktion feof() dient dazu, das Ende einer Datei anzuzeigen.

Der Parameter gibt an, welche Datei geprüft werden soll. Dabei musses sich um den Dateizeiger einer zuvor geöffneten Datei handeln. Hierist dies $fp.

Der Rückgabewert der Funktion ist true, falls das Ende der Datei fest-gestellt wurde, andernfalls false, falls dies nicht der Fall ist.

311

Page 313: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Dateien und Verzeichnisse8

Im Programm wurde eine bedingungsgesteuerte Schleife verwendet.Diese wird wiederholt, solange das Ende der Datei noch nicht erreicht ist(while (!feof($fp)). Nach dem Lesen einer Zeile durch die Funktionfgets() wird der Dateizeiger $fp automatisch auf den Anfang der nächs-ten Zeile gesetzt.

Im vorliegenden Fall wurde vorausgesetzt, dass die Datei lesen.txt miteinem Texteditor in folgender Weise erzeugt wurde:

Schreiben der ersten Zeile (¢)

Schreiben der zweiten Zeile (¢)

Schreiben der vorletzten Zeile (¢)

Schreiben der letzten Zeile (Abspeichern und Schließen der Datei)ohne (¢)

Wenn Sie nach der letzten Zeile noch einen oder mehrere Zeilenumbrü-che erzeugt und die Datei anschließend gespeichert und geschlossenhaben, werden beim Lesen diese unnötigen leeren Zeilen ebenfallserfasst und können zu Fehlausgaben führen (zum Beispiel einer falschenZeilenanzahl).

Übung »u_lesen«

Schreiben Sie mit Hilfe eines Texteditors mehrere Namen in eine Datei(u_lesen.txt). Jeder Name soll zweizeilig geschrieben werden: in der erstenZeile der Vorname, in der zweiten Zeile der Nachname, siehe Abbildung 8.4.

Abbildung 8.4 Daten für Übung »u_lesen«

Erstellen Sie ein PHP-Programm (Datei u_lesen.php), das diese Datei öffnet,liest und die Namen in einer HTML-Tabelle in der folgenden Form (zusätz-lich mit laufender Nummer) auf dem Bildschirm ausgibt, wie Sie in Abbil-dung 8.5 sehen.

312

Page 314: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Vereinfachtes Lesen einer Datei 8.4

8.4 Vereinfachtes Lesen einer Datei

Die Funktionen readfile() und file() liefern eine Möglichkeit zumvereinfachten Lesen einer Datei:

readfile() readfile() liest den vollständigen Inhalt einer Datei und gibt ihn aufdem Bildschirm aus. Zeilenumbrüche werden im generierten HTML-Code als Zeilenumbrüche notiert. Dies führt im Browser dazu, dassein Leerzeichen abgebildet wird.

file() file() liest den vollständigen Inhalt einer Datei zeilenweise in eineindimensionales Feld ein. Die Elemente dieses Feldes könnenanschließend bearbeitet beziehungsweise ausgegeben werden. Imvorliegenden Fall wurde nach jeder Zeile ein <br /> ausgegeben.

Beide Funktionen werden im folgenden Beispiel benutzt, um eine Dateivollständig wiederzugeben:

<html><body><?php

if(!file_exists("lesen.txt"))

echo "Datei konnte nicht gefunden werden";exit;

readfile("lesen.txt");

$dfeld = file("lesen.txt");echo "<p> </p>";for($i=0; $i<sizeof($dfeld); $i++)

Abbildung 8.5 Ergebnis der Übung »u_lesen«

313

Page 315: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Dateien und Verzeichnisse8

echo $dfeld[$i] . "<br />";?></body></html>

Listing 8.3 Datei lesen_einfach.php

8.5 Überschreiben einer sequenziellen Datei

Öffnen undSchreiben

Im folgenden Beispiel werden einige Zahlen und Zeichenketten in eineDatei geschrieben:

<html><body><?php

$fp = fopen("schreiben.txt","w");if (!$fp)

echo "Datei nicht zum Schreiben geöffnet";exit;

fputs ($fp, "Autor: Max Maier\n");for ($i=10; $i<=50; $i+=10)

fputs ($fp, "$i\n");fputs ($fp, "Autor: Max Maier", 8);

echo "Ausgabe in Datei geschrieben";fclose($fp);

?></body></html>

Listing 8.4 Datei schreiben.php

write Die Datei schreiben.txt wird mit der Funktion fopen(), im Öffnungsmo-dus w (für write), zum Schreiben geöffnet. Falls die Datei bereits exis-tiert, wird sie ohne Warnung überschrieben. Weitere Vorgänge solltenauch hier erst erfolgen, nachdem Sie kontrolliert haben, ob das Öffnenerfolgreich war.

fputs() Die Funktion fputs() dient der Ausgabe von Zeichenketten in eineDatei.

314

Page 316: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Anhängen an eine sequenzielle Datei 8.6

Der erste Parameter gibt an, in welche Datei ausgegeben werden soll.Dabei muss es sich um den Dateizeiger einer zuvor geöffneten Dateihandeln. Hier ist dies $fp.

Der zweite Parameter beinhaltet die auszugebende Zeichenkette. DieZeichenfolge \n dient der Erstellung eines Zeilenumbruchs.

Der dritte Parameter ist optional, er begrenzt die Länge der Ausgabeauf die angegebene Anzahl. Hier wurde der dritte Parameter lediglichzu Demonstrationszwecken bei der letzten Ausgabe verwendet. DieseAusgabe wird nach dem achten Zeichen abgeschnitten.

Die Ausgabedatei hat nach Durchlauf des Programms den Inhalt, den Siein Abbildung 8.6 sehen.

Abbildung 8.6 Schreiben in Datei

8.6 Anhängen an eine sequenzielle Datei

Fortlaufendschreiben

Im folgenden Beispiel werden die Inhalte einiger Formularfelder fortlau-fend in eine Datei geschrieben. Zunächst die Datei mit dem Eingabe-formular:

<html><body><p>Bitte geben Sie Ihre Adresse ein:</p><form action = "anh_csv.php" method = "post">

<p><input size="20" name="nn" /> Nachname</p><p><input size="20" name="vn" /> Vorname</p><p><input size="20" name="sr" /><input size="10" name="hn" /> Straße und Hausnummer</p><p><input size="10" name="pz" /><input size="20" name="st" /> PLZ und Stadt</p><p><input type="submit" value="Senden" /><input type="reset" /></p>

315

Page 317: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Dateien und Verzeichnisse8

</form></body></html>

Listing 8.5 Datei anh_csv.htm

In Abbildung 8.7 sehen Sie das Formular mit einer Beispieleingabe.

Abbildung 8.7 Eingabeformular

Nach dem Absenden werden die Daten von dem folgenden PHP-Pro-gramm weiterverarbeitet:

<html><body><?php$fp = fopen("anh_csv.csv","a");if (!$fp)

echo "<p>Datei konnte nicht zumSchreiben geöffnet werden</p>";

exit;

fputs ($fp, $_POST["nn"] . ";". $_POST["vn"] . ";". $_POST["sr"] . ";". $_POST["hn"] . ";". $_POST["pz"] . ";". $_POST["st"] . ";\n");

echo "<p>Vielen Dank, " . $_POST["vn"]

316

Page 318: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Anhängen an eine sequenzielle Datei 8.6

. " " . $_POST["nn"] . "<br />";echo "Ihre Angaben wurden gespeichert</p>";

fclose($fp);?><p>Zurück zur <a href="anh_csv.htm">Eingabe</a></p></body></html>

Listing 8.6 Datei anh_csv.php

Die Ausgabe nach obiger Beispieleingabe sehen Sie in Abbildung 8.8.

Abbildung 8.8 Ausgabe mit Bestätigung

appendDie Datei anh_csv.csv wird mit der Funktion fopen(), Öffnungsmodus a(für append), zum Schreiben am Ende der Datei geöffnet. Weitere Vor-gänge sollten auch hier erst erfolgen, nachdem kontrolliert wurde, obdas Öffnen erfolgreich war.

CSV-DateiDie Daten aus dem Formular werden, jeweils durch ein Semikolon von-einander getrennt, in die Ausgabedatei geschrieben. Am Ende der Zeilewird ein Zeilenvorschub mit \n erzeugt. Man erzeugt auf diese Weiseeine Datei im CSV-Format, siehe Abbildung 8.9.

Abbildung 8.9 CSV-Datei im Editor

Viele Anwendungsprogramme (wie zum Beispiel Microsoft Excel unterWindows oder Libre Office Calc unter Ubuntu) können das CSV-Formatlesen und in eine Tabelle umsetzen. Dabei werden die einzelnen Infor-mationen, die durch Semikola voneinander getrennt sind, jeweils in

317

Page 319: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Dateien und Verzeichnisse8

einer Tabellenspalte dargestellt, siehe Abbildung 8.10 für Windows. InLibre Office Calc unter Ubuntu Linux können Sie die Einstellungen desTextimport-Dialogfeldes, das beim Import angezeigt wird, einfach mit ok

bestätigen.

Abbildung 8.10 CSV-Datei in Excel

Im Ausgabeprogramm kann der Benutzer mit Hilfe eines Hyperlinks zumEingabeformular zurückgelangen und weitere Eingaben vornehmen.Jede weitere Eingabe wird an die vorhandene Datei angehängt.

Übung »u_schreiben«

In einer Datei (u_schreiben.txt) stehen mehrere Datensätze in der folgendenForm (siehe Abbildung 8.11):

erste Zeile: laufende Nummer

zweite Zeile: Nachname

dritte Zeile: Vorname

Abbildung 8.11 Daten der Übung »u_schreiben«

318

Page 320: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Ein einfacher Zugriffszähler 8.7

8.7 Ein einfacher Zugriffszähler

Web CounterIm folgenden Beispiel wird ein Zähler realisiert, der die Anzahl derZugriffe auf eine Datei festhält. Ein solcher Web Counter wird im Inter-net oft eingesetzt, um die Beliebtheit beziehungsweise den Erfolg einerWebseite zu messen und anzuzeigen.

<html><body><?phpif(file_exists("schreiben_zaehler.txt"))

/* Kann Datei geöffnet werden? */$fp = fopen("schreiben_zaehler.txt","r");if($fp)

$zahl = fgets($fp,10);fclose($fp);

Schreiben Sie ein PHP-Programm (Datei u_schreiben.php), das diese Dateiöffnet, liest und die Datensätze in der gleichen Form in zwei verschiedeneDateien ausgibt:

Datensätze mit einer laufenden Nummer kleiner als 1.000 in Dateiu_schreiben_a.txt

alle anderen Datensätze in die Datei u_schreiben_b.txt

Die Dateien sollen bei jedem Programmaufruf überschrieben werden. Aufdem Bildschirm soll eine Kontrollausgabe wie in Abbildung 8.12 erscheinen(hier mit den oben angegebenen Beispieldaten).

Abbildung 8.12 Ergebnis der Übung »u_schreiben«

Hinweis

Die Funktion fgets() liest die Zeilen einschließlich des Zeilenumbruchs ineine Variable ein. Wird diese Variable in eine Datei ausgegeben, so wirdauch der Zeilenumbruch ausgeführt. Er braucht nicht zusätzlich ausgegebenzu werden.

319

Page 321: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Dateien und Verzeichnisse8

else

$zahl = 0;else

$zahl = 0;

/* Zahl erhöhen */$zahl = $zahl + 1;echo "Der Zugriffszähler steht auf $zahl";

/* neue Zahl schreiben */$fp = fopen("p626data.txt", "w");

if(!$fp)

echo "Der Zähler kann nicht geschrieben werden ";exit;

fputs($fp,$zahl);fclose($fp);?></body></html>

Listing 8.7 Datei schreiben_zaehler.php

Falls es sich um den ersten Zugriff auf die Datei handelt, existiert sie nochnicht (Funktion file_exists()), und der Zähler wird auf 0 gesetzt. Eswird versucht, die Datei zu öffnen. Falls dies gelingt, wird der aktuelleZählerstand aus der Datei in die Variable $zahl eingelesen. Falls diesnicht gelingt, wird der Zähler auf 0 gesetzt.

Anschließend hat die Variable in jedem Fall einen Wert. Dieser Wert wirdum 1 erhöht, ausgegeben und anschließend in die Datei geschrieben,sodass sie für den nächsten Zugriff den aktuellen Wert bereitstellt. DieAusgabe nach einigen weiteren Zugriffen sehen Sie in Abbildung 8.13.

Abbildung 8.13 Zugriffszähler

320

Page 322: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Wahlfreier Zugriff 8.8

8.8 Wahlfreier Zugriff

Datensätzefester Größe

Ein wahlfreier Zugriff auf eine Datei kann erfolgen, wenn in einer DateiDatensätze fester Größe stehen. Durch die feste Größe ist gewährleistet,dass die Position jedes einzelnen Datensatzes eindeutig berechnet wer-den kann.

Die Funktion fseek() versetzt den Dateizeiger einer zuvor geöffnetenDatei an die angegebene Position. Damit erreichen Sie schnell jedenDatensatz, ohne alle vorhergehenden Datensätze zu lesen. Beim wahl-freien Zugriff können außerdem noch die beiden folgenden Funktionennützlich sein:

ftell()

Gibt die aktuelle Position an.

rewind()

Setzt den Dateizeiger an den Anfang der Datei.

Als einfaches Beispiel soll eine Datei bearbeitet werden, die insgesamt 15Datensätze beinhaltet. Jeder Datensatz besteht aus einer ganzen Zahl.Jede Zahl wird formatiert in die Datei geschrieben, sodass sie stets diegleiche Breite hat. Zur Formatierung dient die Funktion sprintf().

Zunächst das Programm, das 15 zufällige Zahlen zwischen 1 und 30.000formatiert in eine Datei schreibt. Damit wird eine »Datenbank« mit 15Datensätzen erzeugt.

<html><body><?php

srand((double)microtime()*1000000);

$fp = fopen("beliebig.txt","w");if (!$fp)

echo "Datei kann nicht zum Schreiben geöffnet werden";exit;

for($i=1; $i<=15; $i++)

$zz = rand(1,30000);$zztext = sprintf("%6d",$zz);fputs($fp,$zztext);

321

Page 323: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Dateien und Verzeichnisse8

fclose($fp);echo "15 Daten geschrieben";

?></body></html>

Listing 8.8 Datei schreiben_beliebig.php

Die Funktion sprintf() wandelt die Zahl $zz in die Zeichenkette$zztext um (Breite 6, mit führenden Leerzeichen). Die Variable $zz wirddabei als ganze Zahl interpretiert, ähnlich wie bei der Funktion printf()in der Programmiersprache C. Eine Zeichenkette der Länge 6 bean-sprucht 6 Byte Speicherplatz in einer Datei. Das Ergebnis sieht aus wie inAbbildung 8.14 (hier nur die Datensätze 1 bis 8).

Abbildung 8.14 Datei mit Datensätzen gleicher Länge

Zum Lesen in der Datenbank kann der Benutzer in einem Formular dieNummer des gewünschten Datensatzes eingeben, wie Sie in Abbildung8.15 sehen.

Abbildung 8.15 Eingabe der Datensatznummer

Der Code des Formulars:

<html><body><?phpif(!file_exists("beliebig.txt"))

322

Page 324: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Wahlfreier Zugriff 8.8

echo "Datei konnte nicht gefunden werden";exit;

?><p>Wählen Sie die Nummer des gewünschten Datensatzes aus:</p><form action="lesen_beliebig_b.php" method="post">

<p><select name="nummer" /><?php

$anz = filesize("beliebig.txt") / 6;for($i=1; $i<=$anz; $i++)

echo "<option value='$i'>$i</option>";

?></select></p><p><input type="submit" value="Absenden" /></p>

</form></body></html>

Listing 8.9 Datei lesen_beliebig_a.php

filesize()Das Formular wird dynamisch erstellt: Mit Hilfe der Funktion file-size() wird die Größe der Datei in Byte (hier 90 Byte) berechnet. Ausdiesem Wert und der Größe eines einzelnen Datensatzes (hier 6 Byte)wird die Anzahl der Datensätze (hier 90 Byte/6 Byte = 15) errechnet.

Es wird ein Select-Menü erstellt, das entsprechend viele Einträge hat.Somit kann der Benutzer keinen Fehler bei der Auswahl machen. DasPHP-Programm zur Auswertung der Eingabe:

<html><body><?php

$fp = fopen("beliebig.txt","r");if (!$fp)

echo "Datei konnte nicht zum Lesen geöffnet werden<p>";exit;

fseek($fp, ($_POST["nummer"]-1)*6, SEEK_SET);$wert = fgets($fp,7);fclose($fp);

323

Page 325: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Dateien und Verzeichnisse8

echo $_POST["nummer"] . ": $wert";?></body></html>

Listing 8.10 Datei lesen_beliebig_b.php

fseek() Die Funktion fseek() hat bis zu drei Parameter:

Der erste Parameter gibt an, aus welcher Datei gelesen werden soll.Dabei muss es sich um den Dateizeiger einer zuvor geöffneten Dateihandeln. Hier ist dies $fp.

Der zweite Parameter gibt den Offset an, das heißt die Position inByte. Diese wird über die eingegebene Nummer und die Größe einesDatensatzes berechnet.

Der dritte Parameter gibt an, ab welcher Position der Offset gerechnetwird. Dabei können Sie die Konstanten SEEK_SET (Dateianfang),SEEK_CUR (aktuelle Position) und SEEK_END (Dateiende) benutzen.

Anschließend wird mit der Funktion fgets() an der neuen Position desDateizeigers gelesen. Es werden die nächsten (Länge der einzulesendenZeichenkette – 1) Zeichen gelesen, also 6. Damit ist gewährleistet, dassnur die unmittelbar folgende ganze Zahl gelesen wird. Die Ausgabe mitder oben ausgewählten Nummer sehen Sie in Abbildung 8.16.

Abbildung 8.16 Ausgabe des gewünschten Datensatzes

8.9 Informationen über Dateien

stat() Die Funktion stat() liefert eine Reihe von Informationen zu einer Dateiin Form eines Feldes. Im folgenden Beispiel werden die Feldelemente 7bis 10 ausgegeben. Diese liefern die in Abbildung 8.17 dargestelltenInformationen.

Timestamp Die drei Zeitpunkte werden als Unix-Timestamps geliefert. Sie müssennoch in eine lesbare Form gebracht werden.

324

Page 326: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Informationen über Dateien 8.9

Abbildung 8.17 Dateiinformationen

<html><body><?php

$fn = "beliebig.txt";$info = stat($fn);echo "Datei: $fn<br />";echo "Größe in Byte: $info[7]<br />";echo "Datum des letzten Zugriffs: "

. date("d.m.Y", $info[8]) . "<br />";echo "Zeitpunkt der letzten Modifizierung: "

. date("d.m.Y H:i:s", $info[9]) . "<br />";echo "Zeitpunkt der letzten Änderung: "

. date("d.m.Y H:i:s", $info[10]);?></body></html>

Listing 8.11 Datei datei_info.php

Im Feld $info wird der Rückgabewert der Funktion stat() gespeichert.Die drei Zeitangaben werden mit Hilfe der Funktion date() umgeformt.Genaue Informationen über die Formatierungsmöglichkeiten der Funk-tion date() und ähnlicher Funktionen finden Sie in Kapitel 10, »Datumund Zeit«.

Hinweis

Je nachdem, wie PHP bezüglich der Anzeige von Warnungen und Fehlerneingestellt ist (siehe auch Kapitel 6, »Fehler behandeln, Sicherheit erhö-hen«), erhalten Sie in der Ausgabe des Programms eine Meldung. Darin wirdempfohlen, vor der Benutzung der Funktion date() die richtige Zeitzoneeinzustellen.

325

Page 327: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Dateien und Verzeichnisse8

8.10 Informationen über ein einzelnes Verzeichnis

Verzeichnisöffnen und lesen

Bisher wurde immer eine einzelne Datei bearbeitet, deren Name bekanntist. Häufig stellt sich aber die Aufgabe, eine ganze Reihe von Dateien zubearbeiten, deren exakte Namen und deren Anzahl unbekannt sind. Zudiesem Zweck können Sie unter anderem die Verzeichnisfunktionenopendir(), readdir() und closedir() benutzen. Sie werden im folgen-den Programm eingesetzt, um Informationen über Dateien und Ver-zeichnisse zu generieren, die sich in einem bestimmten Verzeichnisbefinden. Zunächst das Programm:

<html><body><?php$verz = "C:\\EasyPHP\\www";chdir($verz);

echo "<h2>Verzeichnis $verz</h2>";echo "<table border='1'>";

/* Überschrift */echo "<td>Name</td>";echo "<td>Datei /<br />Verz.</td>";echo "<td>Readable /<br />Writeable</td>";echo "<td align='right'>Größe<br />in Byte</td>";echo "<td>Letzte<br />Modifizierung</td>";

/* Öffnet Handle */$handle = opendir($verz);

/* Liest alle Objektnamen */while ($dname = readdir($handle))

Öffnen Sie hierzu die Datei php.ini. Diese befindet sich bei einer XAMPP-Installation unter Windows im Verzeichnis C:\xampp\php. In EasyPHP unterWindows finden Sie sie im Verzeichnis C:\EasyPHP\conf_files und unterUbuntu Linux im Verzeichnis /etc/php5/apache2.

Suchen Sie in der Datei nach der Zeile mit date.timezone =. Dort sollte ste-hen: date.timezone = Europe/Paris oder date.timezone = Europe/Berlin,ohne ein Semikolon am Anfang der Zeile. Speichern Sie die Datei, und füh-ren Sie für den Apache Webserver einen Neustart durch, damit die Einstel-lung wirksam wird.

326

Page 328: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Informationen über ein einzelnes Verzeichnis 8.10

echo "<tr>";echo "<td>$dname</td>";

/* Datei oder Verzeichnis ? */if(is_file($dname))

echo "<td>D</td>";else if(is_dir($dname))

echo "<td>V</td>";else

echo "<td>&nbsp;</td>";

/* Lesbar beziehungsweise schreibbar ? */echo "<td>";if(is_readable($dname)) echo "R";else echo "-";if(is_writeable($dname)) echo "W";else echo "-";echo "</td>";

/* Zugriffsdaten */$info = stat($dname);echo "<td align='right'>$info[7]</td>";echo "<td>" . date("d.m.y H:i", $info[9]) . "</td>";echo "</tr>";

/* Schließt Handle */closedir($handle);?>

</table></body></html>

Listing 8.12 Datei verzeichnis.php

Im vorliegenden Fall soll der Inhalt des Verzeichnisses C:\EasyPHP\wwwunter Windows ermittelt werden. Bei einer XAMPP-Installation unterWindows ändern Sie den Verzeichnisnamen am besten auf C:\xampp\htdocs ab. Unter Ubuntu wäre zum Beispiel /var/www geeignet. Inner-halb der Zeichenkette wird mit einem doppelten Backslash (\\) gearbei-tet, damit beispielsweise \x nicht als Präfix einer hexadezimalen Zahlinterpretiert wird.

327

Page 329: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Dateien und Verzeichnisse8

chdir() Das genannte Verzeichnis wird mit der Funktion chdir() zum aktuellenVerzeichnis gemacht. Es folgt die Ausgabe der Tabellenüberschrift.

opendir(),readdir()

Die Funktion opendir() dient dem Öffnen eines Zugriffs-Handles für dasaktuelle Verzeichnis. Über dieses Handle wird mit Hilfe der Funktionreaddir() jeweils ein Objektname aus dem Verzeichnis ermittelt. Dabeiwird unsortiert vorgegangen. Gleichzeitig wird durch readdir() ein Zei-ger weitergesetzt, sodass beim nächsten Aufruf der nächste Objektnamegeliefert wird usw. Dies kann so lange wiederholt werden, wie Objektna-men vorhanden sind.

Im vorliegenden Programm wird die Wiederholung mit einer while-Schleife realisiert. Alle Objekte eines Verzeichnisses werden ermittelt.Für jedes Objekt werden insgesamt fünf Funktionen zur Lieferung vonInformationen über das Objekt aufgerufen:

Die Funktion is_file() sagt aus, ob es sich um eine Datei handelt.

Die Funktion is_dir() sagt aus, ob es sich um ein Verzeichnis han-delt.

Die Funktion is_readable() sagt aus, ob das Objekt lesbar ist.

Die Funktion is_writeable() sagt aus, ob das Objekt beschreibbarist.

Die Funktion stat() liefert eine Reihe weiterer Daten in Form einesFeldes.

closedir() Nach Abschluss der while-Schleife wird mit der Funktion closedir()das Zugriffs-Handle wieder geschlossen. Einen Ausschnitt der Ausgabedes Programms sehen Sie in Abbildung 8.18.

Abbildung 8.18 Infos über das Verzeichnis www (Ausschnitt)

328

Page 330: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Informationen über den Verzeichnisbaum 8.11

8.11 Informationen über den Verzeichnisbaum

Zur Ermittlung von Informationen über einen ganzen Verzeichnisbaum,also über die Unterverzeichnisse und deren Unterverzeichnisse usw.,bedienen Sie sich der Funktionen aus dem vorherigen Abschnitt undeines rekursiven Aufrufs.

getcwd()Diese Funktion wird vom Hauptprogramm aus erstmalig mit einem Start-verzeichnis aufgerufen. Dies ist im vorliegenden Beispiel bei einer Easy-PHP-Installation C:\EasyPHP\phpmyadmin. Bei einer XAMPP-Installationkönnten Sie zum Beispiel C:\xampp\phpmyadmin nehmen und unterUbuntu /var/www. Innerhalb der Funktion wird mit der Verzeichnis-funktion getcwd() das aktuelle Arbeitsverzeichnis (engl. current workingdirectory, abgekürzt: cwd) ermittelt.

Anschließend werden die Objekte innerhalb dieses Verzeichnisses ermit-telt. Dabei steht das Kürzel . (Punkt) für das aktuelle Verzeichnis und dasKürzel .. (zwei Punkte) für das übergeordnete Verzeichnis. Für diese bei-den Fälle erfolgt keine Aktion. Falls es sich bei dem Objekt um eine Dateihandelt, wird diese mit Namen ausgegeben.

RekursiveFunktion

Falls es sich bei dem Objekt um ein Unterverzeichnis handelt,

wird in dieses Verzeichnis gewechselt,

ruft sich die Funktion selbst auf (rekursiv) und

wird wieder in das übergeordnete Verzeichnis zurückgewechselt.

Mit dieser Methode gelingt die Bearbeitung des gesamten Verzeichnis-baums:

<html><body><table border="1"><?phpfunction objektliste()

/* Aktuelles Verzeichnis ermitteln */$verz = getcwd();

/* Handle für aktuelles Verzeichnis */$handle = opendir(".");

while ($dname = readdir($handle))

if($dname!="." && $dname!="..")

329

Page 331: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Dateien und Verzeichnisse8

/* Falls Unterverzeichnis */if(is_dir($dname))

chdir($dname); // nach untenobjektliste(); // rekursivchdir(".."); // nach oben

/* Falls Datei */else

echo "<tr><td>$verz</td><td>$dname</td></tr>";

closedir($handle);

/* Startverzeichnis */chdir("C:\\EasyPHP\\phpmyadmin");/* Erster Aufruf der Funktion */objektliste();?></table></body></html>

Listing 8.13 Datei verzeichnisbaum.php

Die Ausgabe des Programms sehen Sie in Abbildung 8.19.

Abbildung 8.19 Infos über Verzeichnisbaum (Ausschnitt)

In der linken Spalte der Tabelle wird der Name des Verzeichnisses ausge-geben, in der rechten Spalte der Name des Objekts.

330

Page 332: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

9 Felder

In Kapitel 2, »PHP-Programmierkurs«, habe ich Ihnen bereits eindimen-sionale numerisch indizierte beziehungsweise assoziative Felder vorge-stellt. In diesem Kapitel erhalten Sie weiterführende Informationen zuFeldern.

9.1 Operationen für numerisch indizierte Felder

Es gibt einige Operationen, die häufig mit Feldern ausgeführt werden.Sie sollen zunächst besprochen werden.

9.1.1 Sortierung

Feld sortierenIm folgenden Beispiel wird ein Feld, das Temperaturwerte beinhaltet,aufsteigend sortiert und ausgegeben. Anschließend wird das Feld abstei-gend sortiert und ausgegeben.

<html><body><?php

$tp = array(17.5, 19.2, 21.8, 21.6, 20.2, 16.6);$gr = sizeof($tp);

/* unsortiert ausgeben */for($i=0; $i<$gr; $i++)

echo "$tp[$i] &nbsp; ";echo " unsortiert<br />";

/* aufsteigend sortieren */sort($tp,SORT_NUMERIC);

/* ausgeben */for($i=0; $i<$gr; $i++)

echo "$tp[$i] &nbsp; ";echo "aufsteigend sortiert<br />";

/* absteigend sortieren */

331

Page 333: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Felder9

rsort($tp,SORT_NUMERIC);/* ausgeben */for($i=0; $i<$gr; $i++)

echo "$tp[$i] &nbsp; ";echo "absteigend sortiert";

?></body></html>

Listing 9.1 Datei num_sortieren.php

sizeof() Die Funktion sizeof() ermittelt die Größe eines Feldes, also die Anzahlder Feldelemente.

Die beiden Funktionen

sort() für aufsteigende Sortierung und

rsort() für absteigende Sortierung (engl. reverse sort)

haben jeweils zwei Parameter. Der erste Parameter ist der Name des Fel-des, der zweite Parameter gibt den Typ der Sortierung an.

Dabei gibt es folgende Möglichkeiten:

SORT_REGULAR: normale Sortierung

SORT_NUMERIC: Sortierung nach Zahlenwerten

SORT_STRING: Sortierung nach Zeichen

Die Ausgabe des Programms sehen Sie in Abbildung 9.1.

Abbildung 9.1 Sortierung eines Feldes

Die Temperaturextremwerte, also der größte und der kleinste Wert desFeldes, lassen sich leicht ermitteln. Sie entsprechen dem ersten und demletzten Wert des Feldes nach der Sortierung.

332

Page 334: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Operationen für numerisch indizierte Felder 9.1

9.1.2 Wert und Position der Extrema

Minimum,Maximum

Falls die Elemente des Feldes nicht sortiert werden sollen, also ihreursprüngliche Sortierung erhalten bleiben soll, ist die Ermittlung derTemperaturextrema etwas aufwendiger.

Für das oben angegebene Feld sollen Wert und Position der Temperatur-extrema ermittelt werden. Dazu wählen wir folgende Vorgehensweise:

Zunächst wird angenommen, dass der erste Wert gleichzeitig derMaximalwert ist.

Die anderen Werte werden mit diesem Maximalwert verglichen. Fallseiner der Werte größer ist als der bisherige Maximalwert, ist dieserWert der neue Maximalwert. Die Position und der Wert werdengespeichert. Nach der Bearbeitung des gesamten Feldes steht dasgewünschte Ergebnis fest.

Die gleiche Methode wird für das Minimum durchgeführt.

Das Programm:

<html><body><?php

$tp = array(17.5, 19.2, 21.8, 21.6, 20.2, 16.6);$gr = sizeof($tp);

/* erste Annahme */$maxpos = 0;$minpos = 0;$max = $tp[0];$min = $tp[0];

/* restliche Elemente untersuchen */for($i=1; $i<$gr; $i++)

if($tp[$i] > $max)

$max = $tp[$i];$maxpos = $i;

if($tp[$i] < $min)

333

Page 335: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Felder9

$min = $tp[$i];$minpos = $i;

/* unverändert ausgeben */for($i=0; $i<$gr; $i++)

echo "<b>$i:</b> $tp[$i] &nbsp; ";echo "<br />Maximum: $max bei Position $maxpos<br />";echo "Minimum: $min bei Position $minpos";

?></body></html>

Listing 9.2 Datei num_extrema.php

Zur Kontrolle wird das Feld nach der Ermittlung der Extrema noch ein-mal mit Position und Wert in Abbildung 9.2 ausgegeben.

Abbildung 9.2 Wert und Position der Extrema

Zur schnellen Extremwertbestimmung stehen auch die mathematischenFunktionen max() und min() zur Verfügung. Allerdings liefern diese nurden Wert, nicht aber die Position des Extremwerts.

9.1.3 Statistische Auswertung

Mit Hilfe des folgenden Programms wird festgestellt, welcher Anteileiner Menge von Temperaturwerten oberhalb einer definierten Grenzeliegt. Diese Grenze kann vom Benutzer gewählt werden. Die Werte wer-den aus einer sequenziellen Datei eingelesen (siehe Kapitel 8, »Dateienund Verzeichnisse«), in der sie zeilenweise gespeichert wurden, sieheAbbildung 9.3.

334

Page 336: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Operationen für numerisch indizierte Felder 9.1

Abbildung 9.3 Eingabedatei

Zunächst das Formular:

<html><body><p>Bitte geben Sie den Grenzwert ein:</p><form action = "num_statistik.php" method = "post">

<p><input name="gr" /> Grenzwert</p><p><input type="submit" /><input type="reset" /></p>

</form></body></html>

Listing 9.3 Datei num_statistik.htm

Das Formular sehen Sie in Abbildung 9.4.

Abbildung 9.4 Eingabeformular für den Grenzwert

Der PHP-Programmcode zur Auswertung:

<html><body><?php

335

Page 337: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Felder9

if(!file_exists("num_statistik.txt"))echo "Datei konnte nicht gefunden werden";exit;

$fp = fopen("num_statistik.txt","r");if(!$fp)echo "Datei konnte nicht geöffnet werden";exit;

// Alle Werte in ein Feld lesen$i = 0;while (!feof($fp))

$zeile = fgets($fp, 100);$tp[$i] = doubleval($zeile);$i++;

fclose($fp);

// Anzahl feststellen$anzahl = sizeof($tp);

// Werte oberhalb der Grenze zählen$c = 0;$grenze = doubleval($_POST["gr"]);for($i=0; $i<$anzahl; $i++)

if ($tp[$i] > $grenze)$c++;

// Ausgabeif ($anzahl > 0)

$anteil = $c / $anzahl * 100;$ausgabe = number_format($anteil,2);echo "$ausgabe Prozent der Werte

liegen oberhalb von $grenze";else

echo "Die Datei beinhaltete keine Werte";

336

Page 338: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Operationen für numerisch indizierte Felder 9.1

?></body></html>

Listing 9.4 Datei num_statistik.php

Nach einem erfolgreichen Öffnen der Textdatei num_statistik.txt wer-den die Werte zeilenweise gelesen, mit Hilfe der Funktion doubleval()in Zahlen verwandelt und im Feld $tp gespeichert. Der Index des Feldessteht zunächst auf 0; nach dem Lesen jeder Zeile vergrößert er sich um 1.Es kann also das nächste Element des numerischen Feldes eingelesenwerden.

Der Einsatz der Funktion doubleval() ist hier notwendig, da die Werteaus der Datei zunächst als Zeichenketten eingelesen werden und in Zah-len mit Nachkommastellen umgewandelt werden müssen.

$zeile = fgets($fp, 100);$tp[$i] = doubleval($zeile);

Falls Sie schon Erfahrungen mit anderen Programmiersprachen haben,wird Ihnen spätestens an dieser Stelle auffallen, dass das Feld dynamischvergrößert wird. Sie müssen zu Beginn des Programms daher keine stati-sche Feldgröße festlegen.

Der vom Benutzer eingegebene Grenzwert steht im Programm in derVariablen $_POST["gr"] zur Verfügung. Auch diese Zeichenkette wird ineine Zahl mit Nachkommastellen (Variable $grenze) umgewandelt.

$grenze = doubleval($_POST["gr"]);

Innerhalb einer for-Schleife über alle Elemente des Feldes wird der Zäh-ler (Variable $c) erhöht, falls ein Element gefunden wird, das oberhalbder eingegebenen Grenze liegt.

if ($tp[$i] > $grenze)$c++;

Der prozentuale Anteil dieser Werte an der Gesamtzahl der Elementewird berechnet (Variable $anteil). Diese Variable wird auf zwei Stellennach dem Komma formatiert.

$ausgabe = number_format($anteil,2);

Die Ausgabe des Programms zeigt Abbildung 9.5.

337

Page 339: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Felder9

Abbildung 9.5 Statistische Auswertung

9.1.4 Feld verändern

Es gibt zahlreiche Funktionen zum komfortablen Umgang mit Feldern.Ihre Namen beginnen jeweils mit array_. Als Beispiel sollen vier Funkti-onen dienen, die zur schnellen Veränderung eines Feldes führen. Diessind im Einzelnen:

Übung »u_num«

In einer Textdatei (u_num.txt) sind Namen und Altersangaben aller Mitarbei-ter einer Firma gespeichert. In der ersten Zeile steht der Name des erstenMitarbeiters, in der zweiten Zeile das Alter des ersten Mitarbeiters, in derdritten Zeile der Name des zweiten Mitarbeiters usw., siehe Abbildung 9.6.

Abbildung 9.6 Eingabedatei der Übung »u_num«

Schreiben Sie ein Programm (Datei u_num.php), mit dem Informationen überdie Altersstruktur ermittelt und wie in Abbildung 9.7 ausgegeben werden.

Abbildung 9.7 Ausgabe der Übung »u_num«

338

Page 340: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Operationen für numerisch indizierte Felder 9.1

array_push() array_push() zum Hinzufügen von Elementen am Ende des Feldes

array_pop() array_pop() zum Entfernen von Elementen am Ende des Feldes

array_unshift() array_unshift() zum Hinzufügen von Elementen am Anfang desFeldes

array_shift() array_shift() zum Entfernen von Elementen am Anfang des Feldes

Die Anzahl der Elemente des Feldes verändert sich dabei jedes Mal. Diebeiden letzten Funktionen führen zusätzlich zu einer Verschiebung derrestlichen Feldelemente. Ein Beispiel:

<?phpfunction ausgabe($x)$gr = sizeof($x);for($i=0; $i<$gr; $i++)

echo "$x[$i] ";echo "<br /> <br />";

$st = array("Berlin", "Rom");ausgabe($st);

array_push($st, "Bern", "Brüssel");echo "array_push<br />";ausgabe($st);

$stadt = array_pop($st);echo "array_pop<br />";ausgabe($st);

array_unshift($st, "Madrid", "London");echo "array_unshift<br />";ausgabe($st);

$stadt = array_shift($st);echo "array_shift<br />";ausgabe($st);

?>

Listing 9.5 Datei num_aendern.php

Erläuterung:

Zunächst wird ein Feld mit zwei Elementen erzeugt und ausgegeben.Nach jeder Veränderung innerhalb des Programms wird das Feld zurKontrolle erneut ausgegeben.

339

Page 341: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Felder9

Mit array_push() werden zwei Elemente am Ende angefügt. Mitarray_unshift() werden zwei Elemente am Anfang eingefügt. DieAnzahl der Elemente, die angefügt werden können, ist beliebig. Dieneuen Elemente stehen anschließend in der gleichen Reihenfolge wieim Aufruf der Funktion.

Mit array_pop() wird das letzte Element des Feldes entfernt und alsRückgabewert geliefert. Das Gleiche passiert bei array_shift(), nuram Anfang des Feldes.

Nach Aufruf der Funktionen array_unshift() und array_shift()haben die restlichen Feldelemente ihre Position und ihren Index ver-ändert.

Eine Darstellung der jeweils aktuellen Feldelemente inklusive Indexsehen Sie in Abbildung 9.8.

Abbildung 9.8 Feld ändern

9.2 Sortierung eines assoziativen Feldes

Key, Value Assoziative Felder lassen sich nach Key (= Schlüssel) beziehungsweisenach Value (= Wert) sortieren. Dazu dienen die Funktionen asort(),arsort(), ksort() und krsort(). Im folgenden Programm stelle ichIhnen diese Sortierfunktionen in einem Beispiel vor:

<html><body>

340

Page 342: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Sortierung eines assoziativen Feldes 9.2

<?phpfunction ausgabe($tpfunc, $kommentar)

foreach($tpfunc as $name=>$wert)echo "$name: $wert &nbsp; ";

echo "$kommentar<br />";

$tp["Mo"] = 17.5;$tp["Di"] = 19.2;$tp["Mi"] = 21.8;$tp["Do"] = 21.6;$tp["Fr"] = 17.5;$tp["Sa"] = 20.2;$tp["So"] = 16.6;ausgabe($tp, "unsortiert");

asort($tp, SORT_NUMERIC);ausgabe($tp, "aufsteigend nach Werten");

arsort($tp, SORT_NUMERIC);ausgabe($tp, "absteigend nach Werten");

ksort($tp, SORT_STRING);ausgabe($tp, "aufsteigend nach Keys");

krsort($tp, SORT_STRING);ausgabe($tp, "absteigend nach Keys");?></table></body></html>

Listing 9.6 Datei assoz_sortieren.php

Es wird ein assoziatives Feld mit sieben Werten erzeugt – ein Wert proWochentag. Anschließend erfolgen die Sortierungen:

Die Funktion asort() sortiert das Feld nach aufsteigendem Wert.

Die Funktion arsort() sortiert das Feld nach absteigendem Wert.

Die Funktion ksort() sortiert das Feld nach aufsteigendem Schlüssel.

Die Funktion krsort() sortiert das Feld nach absteigendem Schlüssel.

341

Page 343: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Felder9

Die Sortierung nach Wert erfolgt numerisch. Die Sortierung nach Schlüs-sel erfolgt anhand von Zeichen, da der Schlüssel eine Zeichenkette ist.Zur Kontrolle wird das Feld nach der jeweiligen Sortierung ausgegeben.In allen Fällen bleibt die Zuordnung von Key zu Value erhalten. Das Feldwird sowohl unsortiert als auch nach jedem Sortiervorgang ausgegeben,siehe Abbildung 9.9.

Abbildung 9.9 Sortierung eines assoziativen Feldes

9.3 Zweidimensionale Felder, allgemein

Bei mehrdimensionalen Feldern können Sie sowohl numerische undassoziative Felder als auch gemischte Felder anwenden. Ein gemischtesFeld beinhaltet sowohl numerische als auch assoziative Komponenten.

Betrachten wir einmal die folgende Tabelle 9.1. Sie ist Ihnen bereits ausKapitel 4, »Datenbanken mit MySQL«, bekannt und soll hier der Einfüh-rung von zweidimensionalen Feldern dienen. Es wurde nur das FeldGeburtstag weggelassen, um das Programm nicht zu aufwendig werdenzu lassen.

Die oben angegebenen Daten sollen in einem zweidimensionalen Feldabgelegt werden, um sie innerhalb eines Programms bearbeiten zu kön-nen. Im ersten Beispiel ist dies ein rein numerisches Feld, im zweitenBeispiel ein gemischtes Feld.

Name Vorname Personalnummer Gehalt

Maier Hans 6714 3500,00

Schmitz Peter 81343 3750,00

Mertens Julia 2297 3621,50

Tabelle 9.1 Inhalt einer Datenbanktabelle

342

Page 344: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Zweidimensionale numerische Felder 9.4

Später erläutere ich Ihnen, wie Sie die Daten aus einer Datenbank in einzweidimensionales assoziatives Feld einlesen können. Dadurch ergibtsich innerhalb des Programms eine permanente Zugriffsmöglichkeit aufdie gesamten Daten, ohne erneut eine Datenbankabfrage durchführen zumüssen.

9.4 Zweidimensionale numerische Felder

Zwei IndizesEin zweidimensionales numerisches Feld hat zwei Indizes statt einesIndexes. Der erste Index stellt die Nummer der Zeile dar, der zweiteIndex die Nummer der Spalten. Dies ist nur ein mögliches Vorstellungs-modell, genauso gut könnte es umgekehrt sein. Sie sollten allerdings beieinem einmal gewählten Modell bleiben, dies erleichtert die Bearbeitungzweidimensionaler Probleme (und später die Bearbeitung höherdimensi-onaler Probleme).

Im folgenden Beispiel sind die Daten der oben angegebenen Tabelle(ohne Überschrift) in einem zweidimensionalen Feld abgelegt:

<html><body><?php

// 1. Zeile und 2. Zeile$pers = array(array("Maier", "Hans", 6714, 3500),

array("Schmitz", "Peter", 81343, 3750));

// 3. Zeile$pers[2][0] = "Mertens";$pers[2][1] = "Julia";$pers[2][2] = 2297;$pers[2][3] = 3621.50;

echo "<table border='1'>";for($i=0; $i<3; $i++)

echo "<tr>";for($k=0; $k<4; $k++)

echo "<td>" . $pers[$i][$k] . "</td>";echo "</tr>";

echo "</table>";

343

Page 345: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Felder9

?></body></html>

Listing 9.7 Datei num_zweidim.php

Es werden zwei Techniken zur Erzeugung eines zweidimensionalen Fel-des gezeigt:

Mit Hilfe der Funktion array() wird die Variable $pers zu einem Feldmit zwei Elementen. Diese Elemente sind wiederum Teilfelder, habendie Namen $pers[0] und $pers[1] und bestehen jeweils aus vier Ele-menten. Die Nummerierung der Elemente beginnt sowohl beim ers-ten als auch beim zweiten Index bei 0. Jedes Teilfeld wurde ebenfallsmit Hilfe der Funktion array() erzeugt.

Mehrdimensionale Felder können Sie, genau wie eindimensionaleFelder, einfach durch die Zuweisung einzelner Elemente erzeugenoder vergrößern. Dies ist hier mit den Zuweisungen in der Form$pers[2][0] = "Mertens"; usw. geschehen. Dabei müssen Sie die bis-herige Nummerierung beachten, andernfalls könnten auch hier vor-handene Elemente überschrieben werden.

Insgesamt hat das Feld nun zwölf Elemente, drei Teilfelder mit je vierElementen. Die Struktur erkennen Sie in Tabelle 9.2.

Name desElements

Zeilenindex des Elements

Spaltenindex des Elements

Wert desElements

$pers[0][0] 0 0 "Maier"

$pers[0][1] 0 1 "Hans"

$pers[0][2] 0 2 6714

$pers[0][3] 0 3 3500

$pers[1][0] 1 0 "Schmitz"

$pers[1][1] 1 1 "Peter"

$pers[1][2] 1 2 81343

$pers[1][3] 1 3 3750

$pers[2][0] 2 0 "Mertens"

$pers[2][1] 2 1 "Julia"

$pers[2][2] 2 2 2297

$pers[2][3] 2 3 3621,50

Tabelle 9.2 Zweidimensionales numerisches Feld

344

Page 346: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Zweidimensionale numerische Felder 9.4

Diese Elemente werden anschließend mit Hilfe einer geschachtelten for-Schleife ausgegeben. Eine Zeile der Tabelle wird als eine Zeile auf demBildschirm dargestellt. Dabei nimmt die Schleifenvariable $i nacheinan-der die verwendeten Werte für den Zeilenindex (0 bis 2) an. Die Schlei-fenvariable $k nimmt nacheinander die verwendeten Werte für den Spal-tenindex (0 bis 3) an. Die Ausgabe des Programms sehen Sie inAbbildung 9.10.

Abbildung 9.10 Zweidimensionales numerisches Feld

Hinweis

Einfache Variablen, Elemente von eindimensionalen numerischen Feldernund Objekteigenschaften lassen sich auch innerhalb von Zeichenkettennotieren, um zum Beispiel eine Ausgabeanweisung übersichtlicher zu gestal-ten. Elemente von assoziativen Feldern oder von Feldern mit mehr als einerDimension müssen Sie außerhalb von Zeichenketten notieren.

Übung »u_num_zweidim«

Speichern Sie die Daten aus der Tabelle der Festplatten aus Kapitel 4,»Datenbanken mit MySQL«, in einem zweidimensionalen Feld ab, ohne dasFeld prod. Geben Sie anschließend die Daten dieses zweidimensionalen Fel-des wie in Abbildung 9.11 auf dem Bildschirm aus (u_num_zweidim.php).

Abbildung 9.11 Ergebnis der Übung »u_num_zweidim«

345

Page 347: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Felder9

9.5 Zweidimensionale gemischte Felder

Ein Index undein Schlüssel

Ein zweidimensionales gemischtes Feld hat ebenfalls zwei Indizes. Dererste Index stellt die Nummer der Zeile dar, der zweite Index dieBezeichnung der Spalten als Schlüssel. Dies ist lediglich ein möglichesVorstellungsmodell:

<html><body><?php

// 1. Zeile und 2. Zeile$pers = array(array("Name"=>"Maier", "Vorname"=>"Hans",

"Pnr"=>6714, "Gehalt"=>3500),array("Name"=>"Schmitz", "Vorname"=>"Peter","Pnr"=>81343, "Gehalt"=>3750));

// 3. Zeile$pers[2]["Name"] = "Mertens";$pers[2]["Vorname"] = "Julia";$pers[2]["Pnr"] = 2297;$pers[2]["Gehalt"] = 3621.50;echo "<table border='1'>";for($i=0; $i<3; $i++)

echo "<tr>";foreach($pers[$i] as $name=>$wert)

echo "<td>$name: $wert</td>";echo "</tr>";

echo "</table>";

?></body></html>

Listing 9.8 Datei num_assoz.php

In dem Feld $pers sind die Daten aus der Tabelle, außerdem die Spalten-überschriften (als Schlüssel) abgelegt. Es werden zwei Techniken zurErzeugung eines Feldes gezeigt:

Mit Hilfe der Funktion array() wird die Variable $pers zu einemnumerischen Feld mit zwei Elementen. Die Nummerierung desnumerischen Feldes beginnt bei 0.

346

Page 348: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Zweidimensionale gemischte Felder 9.5

Die beiden Elemente des Feldes sind assoziative Teilfelder, haben dieNamen $pers[0] und $pers[1] und bestehen jeweils aus vier Ele-menten. Die einzelnen assoziativen Teilfelder werden genauso wieeindimensionale assoziative Felder (mit Schlüssel und Wert) erzeugt.

Gemischte Felder können auch einfach durch die Zuweisung einzel-ner Elemente erzeugt oder vergrößert werden. Dies ist hier mit denZuweisungen in der Form $pers[2]["Name"] = "Mertens"; usw.geschehen.

Insgesamt hat das Feld nun zwölf Elemente, drei Teilfelder mit je vierElementen. Die Struktur erkennen Sie in Tabelle 9.3.

Diese Elemente werden anschließend mit Hilfe einer geschachteltenSchleife ausgegeben. Eine Zeile der Tabelle wird als eine Zeile auf demBildschirm dargestellt. Dabei nimmt die Schleifenvariable $i nacheinan-der die verwendeten Werte für die Nummer des Teilfeldes an (0 bis 2).

Innerhalb der for-Schleife werden, jeweils mit Hilfe einer foreach-Schleife, die Elemente der Teilfelder ausgegeben. Jedes Teilfeld ent-spricht einem eindimensionalen assoziativen Feld. Es muss allerdingsdarauf geachtet werden, dass foreach auf den Namen des Teilfeldesangewendet wird ($pers[$i]). Die Ausgabe des Programms zeigt Abbil-dung 9.12.

Name des Elements Index des Teilfeldes

Key des Elements inner-halb des Teilfeldes

Wert desElements

$pers[0]["Name"] 0 "Name" "Maier"

$pers[0]["Vorname"] 0 "Vorname" "Hans"

$pers[0]["Pnr"] 0 "Pnr" 6714

$pers[0]["Gehalt"] 0 "Gehalt" 3500

$pers[1]["Name"] 1 "Name" "Schmitz"

$pers[1]["Vorname"] 1 "Vorname" "Peter"

$pers[1]["Pnr"] 1 "Pnr" 81343

$pers[1]["Gehalt"] 1 "Gehalt" 3750

$pers[2]["Name"] 2 "Name" "Mertens"

$pers[2]["Vorname"] 2 "Vorname" "Julia"

$pers[2]["Pnr"] 2 "Pnr" 2297

$pers[2]["Gehalt"] 2 "Gehalt" 3621,50

Tabelle 9.3 Zweidimensionales gemischtes Feld

347

Page 349: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Felder9

Abbildung 9.12 Zweidimensionales gemischtes Feld

9.6 Zweidimensionale assoziative Felder

Im folgenden Programm wird eine Abfrage an eine Datenbank gesendet.Das Ergebnis der Abfrage wird vollständig in einem zweidimensionalenassoziativen Feld gespeichert. Auf alle Elemente des Feldes kann zueinem späteren Zeitpunkt des Programms zugegriffen werden.

Zwei Schlüssel Als Key der ersten Dimension des Feldes wird eine eindeutige Bezeich-nung benötigt. Dazu bietet sich das eindeutige Feld der Tabelle an. Imvorliegenden Fall ist dies das Feld personalnummer aus der Tabelle per-sonen. Jeder beliebige Feldinhalt aus jedem Datensatz steht dann überdie Personalnummer auf komfortable Weise zur Verfügung.

Übung »u_num_assoz«

Speichern Sie die Daten aus der Tabelle der Festplatten aus Kapitel 4,»Datenbanken mit MySQL«, in einem zweidimensionalen Feld ab, ohne dasFeld prod. Benutzen Sie die Feldnamen als Schlüssel. Geben Sie anschlie-ßend die Daten dieses zweidimensionalen Feldes wie in Abbildung 9.13 aufdem Bildschirm aus (Datei u_num_assoz.php). Beachten Sie besonders dieAufteilung: Die Schlüssel stehen in der Überschrift, die Werte danach.

Abbildung 9.13 Zweidimensionales gemischtes Feld

348

Page 350: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Zweidimensionale assoziative Felder 9.6

<html><body><?php

// Die Informationen werden aus der Datenbank geholtmysql_connect("","root");mysql_select_db("firma");$res = mysql_query("select * from personen");

// Die Datensätze werden einzeln gelesenwhile($dsatz = mysql_fetch_assoc($res))

// Der Key für das zweidim. Array wird ermittelt$ax = $dsatz["personalnummer"];

// Die Informationen aus dem Datensatz werden// über den Key in dem zweidim. Feld gespeichert$tab[$ax]["name"] = $dsatz["name"];$tab[$ax]["vorname"] = $dsatz["vorname"];$tab[$ax]["gehalt"] = $dsatz["gehalt"];

// Alle Datensätze werden mit allen Inhalten angezeigtecho "<table border='1'>";foreach($tab as $dsname=>$dswert)

echo "<tr>";// Der Key wird ausgegebenecho "<td>$dsname:</td>";

// Die Infos aus dem Datensatz werden ausgegebenforeach($dswert as $name=>$wert)

echo "<td>$wert</td>";echo "</tr>";

echo "</table>";

// Einzelne Beispielinformationen werden angezeigtecho "<p>";echo $tab["2297"]["name"] . "<br />";echo $tab["6714"]["gehalt"] . "<br />";echo $tab["6715"]["vorname"] . "</p>";

?></body></html>

Listing 9.9 Datei assoz_zweidim.php

349

Page 351: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Felder9

Jeder Datensatz des Abfrageergebnisses wird kurzfristig in dem assozia-tiven Feld $dsatz gespeichert. Das Element personalnummer dient demzweidimensionalen assoziativen Feld $tab als erster Schlüssel. Mit die-sem Schlüssel werden die restlichen Inhalte (außer personalnummer)jedes Datensatzes in dem Feld $tab gespeichert.

foreach Die Ausgabe jedes Feldelements gelingt über eine doppelte foreach-Schleife. In der äußeren Schleife wird nur der erste Schlüssel ermittelt.Der Wert dieses ersten Schlüssels dient wiederum als zweiter Schlüssel.

Am Ende werden zu Demonstrationszwecken einige einzelne Feldele-mente ausgegeben. Ein Zugriff auf einen nicht existierenden Schlüsselwird ignoriert beziehungsweise führt zu einer Meldung, je nach Einstel-lung der Fehleranzeige. Die Ausgabe des Programms sieht aus wie inAbbildung 9.14.

Abbildung 9.14 Zweidimensionales assoziatives Feld

Übung »u_assoz_zweidim«

Aus der Tabelle fp der Datenbank hardware sollen alle Datensätze gelesenund mit Hilfe der Funktion mysql_fetch_assoc() in einem zweidimensiona-len assoziativen Feld gespeichert werden (Datei u_assoz_zweidim.php).Anschließend soll eine HTML-Tabelle mit folgenden Spalten ausgegebenwerden:

Artikelnummer

Kapazität in GB

Preis und Preis-Leistungs-Verhältnis (PLV = Preis in €/GB)

350

Page 352: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Zweidimensionale assoziative Felder 9.6

Das Ergebnis für PLV soll nicht nur temporär berechnet und unmittelbar aus-gegeben werden. Stattdessen soll für die zweite Dimension des assoziativenFeldes eine weitere Spalte mit dem Key plv angelegt werden. Der Wertsteht somit für die gesamte Dauer des Programms innerhalb des assoziativenFeldes zur Verfügung. Nutzen Sie die Funktion number_format() zur Darstel-lung des PLV-Werts. Die Ausgabe sollte aussehen wie in Abbildung 9.15.

Abbildung 9.15 Ergebnis der Übung »u_assoz_zweidim«

351

Page 353: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet
Page 354: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

10 Datum und Zeit

In diesem Kapitel stelle ich Ihnen die wichtigsten Funktionen zur Verar-beitung und Formatierung von Datums- und Zeitangaben und nützlicheTechniken in diesem Zusammenhang vor.

Auf vielen Betriebssystemen gilt der 1. Januar 1970 00:00 Uhr als Null-punkt für die Verarbeitung von Datums- und Zeitangaben. Die Zeit wirdin Sekunden ab diesem Zeitpunkt gerechnet. Sie sollten in jedem Fall diegültige Zeitzone einstellen (siehe Abschnitt 8.9, »Informationen überDateien«).

10.1 Zeit ermitteln und ausgeben

SystemzeitDie beiden Funktionen time() und microtime() ermitteln die System-zeit des Rechners. Ein Beispielprogramm:

<html><body><?php

/* time */$jetzt = time();echo "Sekunden seit 01.01.1970: $jetzt<br />";

/* microtime */echo "Mit Sekundenbruchteilen:<br />";for($i=0; $i<20e6; $i++)

if($i%2e6==0)

$msfeld = explode(" ",microtime());$genau = doubleval($msfeld[0])

+ doubleval($msfeld[1]);echo "$genau<br />";

?></body></html>

Listing 10.1 Datei zeit_ausgabe.php

353

Page 355: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datum und Zeit10

Erläuterung:

time() Die Funktion time() liefert die aktuelle Zeit in Sekunden seit dem1.1.1970. Diese Zeitangabe wird auch Unix-Timestamp genannt.

microtime() Es folgt eine Schleife, die mehrere Sekunden benötigt. Innerhalb derSchleife wird mehrmals die Zeit genau festgestellt. Die Funktionmicrotime() liefert eine Zeichenkette in der Form »MikrosekundenSekunden«. Die Funktion explode() dient hier der Zerlegung in zweiFeldelemente. Diese werden anschließend in Zahlen verwandelt,addiert und ausgegeben.

Eine mögliche Ausgabe sehen Sie in Abbildung 10.1.

Abbildung 10.1 Zeit ermitteln und ausgeben

Diese Angaben in Sekunden und Sekundenbruchteilen können beispiels-weise dazu genutzt werden, mit Zeitangaben zu rechnen. Viele andereDatums- und Zeitfunktionen benötigen einen Timestamp als Parameter.

10.2 Zeit formatiert ausgeben

Zeit formatieren Die Funktionen strftime() und date() benötigen Sie zur formatiertenAusgabe von Datum und Uhrzeit. Sie liefern diese Angaben in vielen ver-schiedenen Formen. Beide Funktionen haben einen festen und einenoptionalen Parameter:

354

Page 356: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Zeit formatiert ausgeben 10.2

In jedem Fall gibt es eine Formatierungszeichenkette für diegewünschte Ausgabe. Innerhalb dieser Zeichenketten werden ein-zelne Klein- beziehungsweise Großbuchstaben verwendet, die diegewünschte Teilinformation liefern.

Optional existiert ein Timestamp. Falls dieser nicht existiert, wird dieaktuelle Systemzeit verwendet.

Zusätzlich zu den reinen Datums- und Zeitangaben werden allgemeineInformationen bereitgestellt, zum Beispiel:

Zeit im Zwölf-Stunden-Format, mit Angabe von AM beziehungsweisePM

Jahresangabe nur mit zwei Ziffern

Name des Wochentags, abgekürzt beziehungsweise ausgeschrieben,und die Nummer des Wochentags

Name des Monats, abgekürzt beziehungsweise ausgeschrieben

Kalenderwoche des Jahres, bezogen auf verschiedene Systeme (Sonn-tag oder Montag als erster Tag der Woche)

Angabe der Zeitzone

Ein Beispielprogramm:

<html><body><?php

$jetzt = time();

/* strftime */echo "<p>Formatiert mit strftime():<br />";echo strftime("%d.%m.%Y %H:%M:%S",$jetzt) . "<br />";echo strftime("%j.",$jetzt) . " Tag des Jahres<br />";setlocale(LC_ALL, 'german');echo strftime("%A, %d.%B",$jetzt) . "</p>";

/* date */echo "<p>Formatiert mit date():<br />";echo date("d.m.Y H:i:s",$jetzt) . "<br />";echo intval(date("z",$jetzt))+1

. ". Tag des Jahres<br />";

/* Feld mit deutschen Wochentagen */$wtag = array("Sonntag","Montag","Dienstag",

"Mittwoch","Donnerstag","Freitag","Samstag");

355

Page 357: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datum und Zeit10

$wt = intval(date("w",$jetzt));echo "$wtag[$wt]</p>";

?></body></html>

Listing 10.2 Datei zeit_formatieren.php

Sie sehen die Ausgabe in Abbildung 10.2.

Abbildung 10.2 Zeit formatiert ausgeben

Alle Zeitangaben werden mit dem gleichen Timestamp vorgenommen,um die Vergleichbarkeit zu wahren. Mit den beiden Funktionen werdenje vier Ausgabezeilen erzeugt.

strftime(), date() Die erste Zeile liefert Datum und Zeit im »klassischen« Format. Die dabeiverwendeten Formatierungen sind in Tabelle 10.1 dargestellt.

strftime() date() Erläuterung

%d d Tag des Monats, zweistellig, 00 bis 31

%m m Monat, zweistellig, 01 bis 12

%Y Y Jahr, vierstellig

%H H Stunde, zweistellig, 00 bis 23

%M i Minute, zweistellig, 00 bis 59

%S s Sekunde, zweistellig, 00 bis 59

Tabelle 10.1 Wichtige Formate der Funktionen strftime() und date()

356

Page 358: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Zeitangabe auf Gültigkeit prüfen 10.3

Die Angabe »zweistellig« bedeutet, dass gegebenenfalls führende Nullenvorangestellt werden, um ein einheitliches Format zu erzeugen. Punkte,Leerzeichen und Doppelpunkte werden zur Vervollständigung der Zeit-angabe zwischen den einzelnen Formatierungszeichen eingesetzt.

Bei strftime() könnten Sie weitere Sonderzeichen oder Zeichenkettenintegrieren. Die Funktion date() reagiert wesentlich empfindlicher.Falls die Ausgabe nicht, wie gewünscht, erscheint, sollten Sie die zusätz-lichen Zeichen außerhalb der Formatierungszeichenkette hinzufügen.

Die Formatierung für »Tag des Jahres« wird bei strftime() mit %j undbei date() mit z vorgenommen. Dabei liefert strftime() einen dreistel-ligen Wert von 001 bis 366. Die Funktion date() liefert einen Wert mitunterschiedlicher Stellenanzahl von 0 bis 365 (!), daher muss nach derUmrechnung der Angabe in eine Zahl noch 1 hinzuaddiert werden. Eswerden auch der Wochentagsname beziehungsweise der Monatsnameausgegeben:

Bei der Funktion strftime() ist dies mit %A und %B ein wenig einfa-cher, da Sie vorher mit Hilfe der Funktion setlocale() die Lokalitäteinstellen können. Auf Windows-Systemen geht dies über die Zei-chenkette "german" für Deutschland.

Für die Funktion date() muss zunächst die Nummer des Wochentagsermittelt werden. Die Formatierung w liefert eine Zeichenkette, dieeinen Wert von 0 (= Sonntag) bis 6 (= Samstag) beinhaltet. Da dieserWert als Feldindex benötigt wird, muss er zunächst mit intval() ineine Zahl umgewandelt werden. Diese Zahl wird als Index für das Feld$wtag (mit Wochentagsnamen) genutzt.

10.3 Zeitangabe auf Gültigkeit prüfen

Zeitangabe prüfenDie Funktion checkdate() überprüft eine Zeitangabe auf ihre Gültigkeithin gemäß dem gregorianischen Kalender. Sie erhält ihre drei Parameterin der Form Monat, Tag, Jahr und liefert wahr oder falsch. Dabei wirdkontrolliert,

ob die Jahresangabe zwischen 1 und 32767 liegt,

ob die Monatsangabe zwischen 1 und 12 liegt und

ob die Tagesangabe zwischen 1 und dem größten erlaubten Wert fürdiesen Monat liegt (Schaltjahre werden berücksichtigt).

357

Page 359: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datum und Zeit10

Ein Beispielprogramm:

<html><body><?php

/* checkdate */for($jahr=2006; $jahr<=2013; $jahr++)

echo "29.02.$jahr";if (checkdate(2,29,$jahr)) echo " gültig<br />";else echo " nicht gültig<br />";

?></body></html>

Listing 10.3 Datei zeit_check.php

Es wird geprüft, ob der 29. Februar der Jahre 2006 bis 2013 ein gültigesDatum darstellt. Dies trifft natürlich nur für die Schaltjahre zu, wie dieAusgabe in Abbildung 10.3 zeigt.

Abbildung 10.3 Zeitangabe auf Gültigkeit hin überprüfen

10.4 Absolute Zeitangabe erzeugen

Zeitangabeerzeugen

Zur Erzeugung einer bestimmten, absoluten Zeitangabe nutzen Sie dieFunktion mktime(). Sie benötigt als Parameter bis zu sieben Angaben inder folgenden Reihenfolge:

Stunde

Minute

358

Page 360: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Absolute Zeitangabe erzeugen 10.4

Sekunde

Monat

Tag

Jahr

Sommerzeitwert

Den Wert für die Sommerzeit können Sie mit 0 (= Winterzeit bezie-hungsweise Normalzeit), 1 (= Sommerzeit) oder –1 (= PHP findet selbstheraus, ob Sommer- oder Winterzeit herrscht) besetzen. Von rechts ausfehlende Angaben werden durch die Werte des aktuellen Datums, deraktuellen Uhrzeit beziehungsweise mit –1 für den Sommerzeitwertersetzt.

Die Funktion liefert einen Timestamp, der zur lesbaren Ausgabe nochformatiert werden muss, zum Beispiel mit date(). Ungültige Angabenfür einzelne Parameter werden korrigiert, wie auch das Beispiel zeigt:

<html><body><?php

/* mktime */for($minute=58; $minute<=62; $minute++)

$dz = mktime(13,$minute,0);echo date("H:i:s", $dz) . "<br />";

echo "<p> </p>";

for($tag=26; $tag<=32; $tag++)

$dz = mktime(0,0,0,2,$tag,2012);echo date("d.m.Y", $dz) . "<br />";

?></body></html>

Listing 10.4 Datei zeit_absolut.php

Innerhalb der ersten Schleife werden nur die Angaben für Stunde,Minute und Sekunde besetzt. Die restlichen Angaben werden mit demheutigen Datum besetzt; dieses wird hier nicht benötigt. Die Angaben fürdie Minute (58 bis 62) werden bei Bedarf automatisch korrigiert.

359

Page 361: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datum und Zeit10

Innerhalb der zweiten Schleife werden nur die Angaben für Monat, Tagund Jahr benötigt. Die Angaben für Stunde, Minute und Sekunde wer-den mit 0 besetzt; sie sind hier nicht wichtig. Die Angaben für den Tag(26 bis 32) werden bei Bedarf automatisch korrigiert. Die Ausgabe zeigtAbbildung 10.4.

Abbildung 10.4 Absolute Zeitangabe erzeugen

10.5 Relative Zeitangabe erzeugen

Die Funktion strtotime() können Sie nutzen, um relative Zeitangabenzu erzeugen. Sie benötigt bis zu zwei Parameter:

Im ersten Parameter geben Sie mit Hilfe englischer Begriffe dengewünschten zeitlichen Abstand zum Bezugspunkt an.

Beim zweiten Parameter nennen Sie den Bezugspunkt in Form einesTimestamps. Falls kein Bezugspunkt vorhanden ist, wird die aktuelleSystemzeit verwendet.

Ein Beispiel, in dem mehrere relative Angaben, bezogen auf die Datums-angabe 12.02.2011, erzeugt werden:

<html><body><?php

$jetzt = mktime(0,0,0,2,12,2012);

360

Page 362: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Relative Zeitangabe erzeugen 10.5

echo date("d.m.Y",$jetzt) . " jetzt<br /><br />";

$dann = strtotime("+1 day",$jetzt);echo date("d.m.Y",$dann) . " +1 day<br />";

$dann = strtotime("+2 week",$jetzt);echo date("d.m.Y",$dann) . " +2 week<br />";

$dann = strtotime("+2 week +2 day",$jetzt);echo date("d.m.Y",$dann) . " +2 week +2 day<br />";

$dann = strtotime("-5 month",$jetzt);echo date("d.m.Y",$dann) . " –5 month<br />";

$dann = strtotime("Tuesday",$jetzt);echo date("d.m.Y",$dann) . " Tuesday<br />";

$dann = strtotime("next Monday",$jetzt);echo date("d.m.Y",$dann) . " next Monday<br />";

$dann = strtotime("last Monday",$jetzt);echo date("d.m.Y",$dann) . " last Monday<br />";

?></body></html>

Listing 10.5 Datei zeit_relativ.php

Von Zeitpunkten ausgehen

Im Programm wird eine Reihe von Timestamps erzeugt. Dem ersten Ele-ment wird eine absolute Zeitangabe zugewiesen. In Abhängigkeit vondiesem Element werden die weiteren Elemente erzeugt. Dabei könnendie Angaben week, day, month, year wie folgt benutzt werden:

mit positivem oder negativem Vorzeichen

einzeln oder zu mehreren zusammen

mit oder ohne s am Ende (days)

Außerdem ist die Angabe eines englischen Wochentags möglich:

ohne Zusatz: gleiche Woche des Jahres

mit dem Zusatz next: nächste Woche des Jahres

mit dem Zusatz last: vorhergehende Woche des Jahres

Im Programm werden alle Elemente des Feldes anschließend mit date()formatiert und ausgegeben, wie Sie in Abbildung 10.5 sehen.

361

Page 363: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datum und Zeit10

Abbildung 10.5 Relative Zeitangabe erzeugen

10.6 Mit Zeitangaben rechnen

Mit Zeit rechnen Zur Berechnung eines Zeitraums, also der Differenz zwischen zwei Zeit-angaben, müssen beide Zeitangaben einzeln erzeugt werden. Anschlie-ßend können Sie die Differenz in Sekunden (als Timestamp) berechnen.Daraus lässt sich die Differenz in Minuten, Stunden beziehungsweiseTagen berechnen.

Im folgenden Programm wird die Differenz zwischen dem 15. Februar2011, 23:55:00 Uhr und dem 16. Februar 2011, 00:05:15 Uhr berechnet:

<html><body><?php

/* Zwei Zeitangaben erzeugen */$zeit1 = mktime(23,55,0,2,15,2012);echo date("d.m.Y H:i:s",$zeit1) . "<br />";$zeit2 = mktime(0,5,15,2,16,2012);echo date("d.m.Y H:i:s",$zeit2) . "<br /><br />";

/* Differenz berechnen */$diff_sek = $zeit2 – $zeit1;echo "Differenz: $diff_sek Sekunden<br />";

$diff_min = $diff_sek / 60;echo "das sind: $diff_min Minuten<br />";

$diff_std = $diff_min / 60;

362

Page 364: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Mit Zeitangaben rechnen 10.6

echo "das sind: $diff_std Stunden<br />";

$diff_tag = $diff_std / 24;echo "das sind: $diff_tag Tage";

?></body></html>

Listing 10.6 Datei zeit_rechnen.php

Erläuterung:

In der Variablen $diff_sek wird die Differenz zwischen den beidenZeitangaben $zeit1 und $zeit2 in Sekunden berechnet.

Zur Ermittlung der Minuten wird diese Zahl durch 60 geteilt.

Zur Ermittlung der Stunden wird dieses Ergebnis durch 60 geteilt.

Zur Ermittlung der Tage wird das letzte Ergebnis durch 24 geteilt.

Die Ausgabe zeigt Abbildung 10.6.

Abbildung 10.6 Mit Zeitangaben rechnen

Die Differenz lässt sich natürlich auf diese Weise nicht in Monaten oderJahren ermitteln, da Monate beziehungsweise Jahre nicht einheitlichlang sind. Um zum Beispiel das Alter einer Person zu berechnen, müssenSie daher einen anderen Weg beschreiten. Dies will ich Ihnen im folgen-den Programm zeigen:

<html><body><?php

/* Geburtstag */

363

Page 365: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datum und Zeit10

$geburt = mktime(0,0,0,11,7,1979);echo "Geburt: " . date("d.m.Y",$geburt) . "<br />";

/* Aktuell */$heute = time();echo "Heute: " . date("d.m.Y",$heute) . "<br />";

/* Alter berechnen */$hy = intval(date("Y",$heute));$gy = intval(date("Y",$geburt));$alter = $hy – $gy;

/* Noch keinen Geburtstag gehabt dieses Jahr ? */$hm = intval(date("m",$heute));$hd = intval(date("d",$heute));$gm = intval(date("m",$geburt));$gd = intval(date("d",$geburt));

if ($hm<$gm || $hm==$gm && $hd<$gd)$alter = $alter – 1;

echo "Alter: " . $alter;?></body></html>

Listing 10.7 Datei zeit_alter.php

Erläuterung:

Die Zeitangabe für den Geburtstag, zum Beispiel für den 7. November1979, wird mit Hilfe der Funktion mktime() erzeugt.

Die aktuelle Zeitangabe wird mit der Funktion time() erzeugt.

Das Alter wird zunächst aus der Differenz der Jahresangaben errech-net.

Falls die Person dieses Jahr noch nicht Geburtstag hatte, also entwe-der der Geburtsmonat noch nicht erreicht oder innerhalb desGeburtsmonats der Geburtstag noch nicht erreicht wurde, so wird dasAlter um 1 reduziert.

Die Ausgabe sehen Sie in Abbildung 10.7.

364

Page 366: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Zeitangaben in Datenbanken 10.7

Abbildung 10.7 Berechnung des Alters

10.7 Zeitangaben in Datenbanken

Datentyp»timestamp«

Bei vielen Datenbanksystemen besteht die Möglichkeit, Zeitangaben zuspeichern. MySQL bietet einen eigenen Datentyp timestamp an. DerWert für ein Feld dieses Typs wird automatisch besetzt, wenn ein Daten-satz erzeugt wird. Somit wird festgehalten, zu welchem Zeitpunkt derDatensatz entstanden ist. Diese Angabe können Sie später zu vielen Zwe-cken (Sortierung, Filterung) nutzen. Ein Eintrag in einem solchen Daten-bankfeld hat die Form JJJJ-MM-TT HH:MM:SS. Das sieht für den15.02.1979 23:55:12 Uhr zum Beispiel wie folgt aus: 1979–02–1523:55:12.

IP-Adresse, LogIm folgenden Programm wird die Tabelle log der Datenbank logdatenmit sogenannten Log-Einträgen gefüllt. Jedes Mal, wenn auf die Seitezugegriffen wird, werden eine automatisch erzeugte, eindeutige ID zurIdentifizierung, ein Timestamp sowie die IP-Adresse des Benutzersgespeichert. Die IP-Adresse lässt sich über die PHP-Systemvariable$_SERVER["REMOTE_ADDR"] ermitteln. Die Struktur der Tabelle log zeigtAbbildung 10.8.

Abbildung 10.8 Tabellenstruktur

Das Feld id erhält in phpMyAdmin den Datentyp serial. Damiterscheint es in der Anzeige mit dem Datentyp bigint und demZusatzattribut auto_increment. Das bedeutet, dass jeder neu eingefügteDatensatz automatisch die nächsthöhere Nummer bekommt. Die Num-

365

Page 367: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datum und Zeit10

merierung erfolgt also automatisch. Außerdem wurde ein Primärschlüs-sel für das Feld id definiert.

Das Feld tstamp erhält den Datentyp timestamp. Das bedeutet, dass fürjeden neu eingefügten oder geänderten Datensatz in diesem Feld deraktuelle Zeitstempel gespeichert wird.

Das Programm zeit_db.php:

<html><body><?php

$jetzt = time();echo "Zugriff " . date("d.m.Y H:i:s",$jetzt) . "<br />";

$ip = $_SERVER["REMOTE_ADDR"];echo "über IP-Adresse: $ip";

mysql_connect("","root");mysql_select_db("logdaten");$sql = "insert log (ipaddr) values('$ip')";mysql_query($sql);

?></body></html>

Listing 10.8 Datei zeit_db.php

Zunächst wird (lediglich zu Kontrollzwecken) die aktuelle Zeit bestimmtund ausgegeben. Anschließend wird die IP-Adresse des Benutzers ermit-telt und ausgegeben. Im Normalfall sind dies Informationen, die demBenutzer nicht gezeigt werden.

In der Datenbanktabelle wird ein neuer Datensatz mit Hilfe der folgen-den SQL-Anweisung erzeugt: insert log (ipaddr) values('$ip').

Dabei muss nur das Feld ipaddr belegt werden. Die ID und der Time-stamp werden automatisch erzeugt. Die beiden Zeiten (Clientzeit undServerzeit) können sich unterscheiden, da es sich jeweils um die Ortszeithandelt.

Hinweis

Zur Erzeugung der Datenbank inklusive der Tabelle mit einigen Beispielda-ten können Sie statt phpMyAdmin auch einfach das PHP-Programmzeit_db_neu.php benutzen.

366

Page 368: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiel Feiertagsberechnung 10.8

127.0.0.1Die IP-Adresse des lokalen Webservers localhost ist 127.0.0.1. Bei Aufrufüber diese Adresse sieht die Ausgabe aus wie in Abbildung 10.9.

Abbildung 10.9 Kontrollausgabe bei Zugriff

Abbildung 10.10 zeigt die Datenbanktabelle nach einigen Zugriffen.

Abbildung 10.10 Daten mit Timestamp

10.8 Beispiel Feiertagsberechnung

In Kapitel 2, »PHP-Programmierkurs«, wurde bereits eine Funktionerstellt, die den Termin des Ostersonntags mit der Formel nach Gaußberechnet. Diese Funktion nutzen wir nun dazu, alle Feiertage einesbeliebigen Jahres zu berechnen. Eine solche Berechnung wird häufig imZusammenhang mit der Ermittlung von Arbeitstagen und der Betriebsda-tenerfassung benötigt.

Feiertageberechnen

Die Feiertage sind je nach Bundesland unterschiedlich. Sie teilen sich infeste und bewegliche Feiertage auf. Die beweglichen Feiertage hängenmit dem Termin des Ostersonntags zusammen. Tabelle 10.2 zeigt diebeweglichen Feiertage im Bundesland Nordrhein-Westfalen (NRW):

Feiertag Zeitpunkt

Karfreitag 2 Tage vor Ostersonntag

Ostermontag 1 Tag nach Ostersonntag

Christi Himmelfahrt 39 Tage nach Ostersonntag

Pfingstsonntag 49 Tage nach Ostersonntag

Tabelle 10.2 Bewegliche Feiertage in NRW

367

Page 369: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datum und Zeit10

Das Programm liefert nach der Eingabe der Jahreszahl 2012 die sortierteListe aller Feiertage in NRW, wie Sie in Abbildung 10.11 sehen.

Abbildung 10.11 Feiertagsberechnung

Zunächst das Eingabeformular:

<html><body><h2>Feiertage in NRW</h2><p>Bitte geben Sie eine Jahreszahl ein:</p><form action="zeit_feiertag.php" method="post"><p><input name="jahr" /> Jahreszahl</p><p><input type="submit" /><input type="reset" /></p>

</form>

Pfingstmontag 50 Tage nach Ostersonntag

Fronleichnam 60 Tage nach Ostersonntag

Feiertag Zeitpunkt

Tabelle 10.2 Bewegliche Feiertage in NRW (Forts.)

368

Page 370: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiel Feiertagsberechnung 10.8

</body></html>

Listing 10.9 Datei zeit_feiertag.htm

Es liefert den Wert des Formularfeldes jahr an das PHP-Programm:

<html><body><?php

include "zeit_feiertag.inc.php";echo "<h2>Feiertage in NRW " . $_POST["jahr"] . "</h2>";

/* Feiertage ermitteln */feiertagNRW($_POST["jahr"], $ftag);

/* Liste ausgeben */echo "<table border='1'>";foreach($ftag as $name=>$wert)

$datum = date("d.m.Y", $wert);echo "<tr><td>$datum</td><td>$name</td></tr>";

echo "</table>";

?></body></html>

Listing 10.10 Datei zeit_feiertag.php

OstersonntagIm PHP-Programm wird die Datei zeit_feiertag.inc.php eingebunden.Hier stehen die bereits bekannte Funktion ostersonntag() (sieheAbschnitt 2.10.4, »Bestimmung des Ostersonntags«) und die FunktionfeiertagNRW() zur Verfügung.

Die Funktion feiertagNRW() benutzt intern die Funktion ostersonn-tag() und liefert ein assoziatives Feld mit den Namen und Daten allerFeiertage zurück. Das Feld ist nach Daten aufsteigend sortiert, und dieDaten werden in Form von Timestamps geliefert. Das Feld wird inner-halb einer foreach-Schleife formatiert in einer Tabelle ausgegeben. DieFunktion feiertagNRW() sieht wie folgt aus:

function feiertagNRW($jahr, &$ftag)

/* Die festen Feiertage */

369

Page 371: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datum und Zeit10

$ftag["Neujahr"] = mktime(0,0,0,1,1,$jahr);$ftag["Tag der Arbeit"] = mktime(0,0,0,5,1,$jahr);$ftag["Tag der deutschen Einheit"] =

mktime(0,0,0,10,3,$jahr);$ftag["Allerheiligen"] = mktime(0,0,0,11,1,$jahr);$ftag["1. Weihnachtsfeiertag"] =

mktime(0,0,0,12,25,$jahr);$ftag["2. Weihnachtsfeiertag"] =

mktime(0,0,0,12,26,$jahr);

/* Ostersonntag berechnen */ostersonntag($jahr, $t_ostern, $m_ostern);$ostern = mktime(0, 0, 0, $m_ostern, $t_ostern, $jahr);

/* Die beweglichen Feiertage,abhängig vom Ostersonntag */

$ftag["Karfreitag"] = strtotime("-2 day",$ostern);$ftag["Ostersonntag"] = strtotime("0 day",$ostern);$ftag["Ostermontag"] = strtotime("+1 day",$ostern);$ftag["Christi Himmelfahrt"] =

strtotime("+39 day",$ostern);$ftag["Pfingstsonntag"] = strtotime("+49 day",$ostern);$ftag["Pfingstmontag"] = strtotime("+50 day",$ostern);$ftag["Fronleichnam"] = strtotime("+60 day",$ostern);

/* Liste nach Werten sortieren */asort($ftag);

?>

Listing 10.11 Datei zeit_feiertag.inc.php, Funktion feiertagNRW()

Die Timestamps für die festen Feiertage werden mit der Funktionmktime() erzeugt. Sie werden Elementen des assoziativen Feldes $ftagzugewiesen. Als Schlüssel wird jeweils die Bezeichnung des Feiertagsverwendet.

Nach dem Aufruf der Funktion ostersonntag() stehen in $t_osternund $m_ostern Tag und Monat des Ostersonntags bereit. Diese Angabenwerden zusammen mit dem Jahr in den Timestamp $ostern umgeformt.

Die beweglichen Feiertage werden mit der Funktion strtotime() relativzu Ostern bestimmt und dem assoziativen Feld hinzugefügt. Anschlie-ßend wird das Feld mit Hilfe der Funktion asort() nach Werten aufstei-gend sortiert.

370

Page 372: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Kopfrechnen mit Zeitmessung 10.9

10.9 Kopfrechnen mit Zeitmessung

Das Ihnen bereits bekannte Beispiel Kopfrechnen (siehe Abschnitt 5.18,»Beispiel Kopfrechnen«) wird um eine Zeitmessung und eine Speiche-rung erweitert. Name und erreichte Zeit des Spielers werden nach demSpiel in einer MySQL-Datenbank festgehalten. Die Dateien des Beispielshaben das einheitliche Präfix kopfzeit. Es geht also los mit kopfzeit.htm,siehe Abbildung 10.12.

Abbildung 10.12 Kopfrechnen, mit Zeitmessung

Es folgen die Aufgaben, siehe Abbildung 10.13.

Abbildung 10.13 Kopfrechnen, die Aufgaben

Als Letztes folgt die Auswertung, inklusive der Zeitangabe und High-score-Liste, siehe Abbildung 10.14.

371

Page 373: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datum und Zeit10

Abbildung 10.14 Kopfrechnen, die Auswertung

Nachfolgend erläutere ich nur die Unterschiede zu der Version ohneZeitmessung und Datenbankspeicherung. Der Programmablauf und dieEinbindung der Klassendateien bleiben gleich. Innerhalb der KlasseSpiel gibt es folgende Veränderungen:

<?phpinclude "kopfzeit_highscore.inc.php";

/* Klasse "Spiel" */class Spiel

function __construct($sp, $st, $zi)

. . ./* Startzeit messen */$msfeld = explode(" ",microtime());$this->startzeit = doubleval($msfeld[0])

+ doubleval($msfeld[1]);. . .function auswerten($eingabe)

/* Spieldauer messen */$msfeld = explode(" ",microtime());$endzeit = doubleval($msfeld[0])

+ doubleval($msfeld[1]);$this->dauer = number_format(

372

Page 374: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Kopfrechnen mit Zeitmessung 10.9

$endzeit – $this->startzeit, 1, ".", "");. . ./* Falls alles richtig: Highscore speichern in DB,

Highscore anzeigen */if($this->richtig == $this->anzahl)

new Highscore($this->spieler, $this->dauer);

?>

Listing 10.12 Datei kopfzeit_spiel.inc.php

Erläuterung:

Zunächst wird die Datei mit der Definition der neuen Klasse High-score eingebunden.

Am Ende des Konstruktors wird mit Hilfe der Funktion microtime()die aktuelle Zeit genommen. Sie wird in der Eigenschaft startzeitder Klasse Spiel festgehalten.

Zeitdifferenz Zu Beginn der Auswertefunktion wird das Gleiche noch einmal für dieEndzeit durchgeführt. Die Zeitdifferenz zwischen Startzeit und End-zeit wird ermittelt und, gerundet auf eine Stelle nach dem Komma, alsEigenschaft dauer der Klasse Spiel festgehalten.

Falls alle Aufgaben richtig gelöst wurden, wird ein neues Objekt derKlasse Highscore erzeugt. Name und Spieldauer werden dabei über-geben, den Rest erledigt das Highscore-Objekt.

Klasse »Highscore«

Die Definition der neuen Klasse Highscore:

<?php/* Klasse "Highscore" */class Highscore

function __construct($spieler, $dauer)

/* Verbindung zum DB-Server */mysql_connect("", "root");

/* Falls keine DB vorhanden:DB mit Tabelle erstellen */

if(!mysql_select_db("kopfzeit"))

mysql_query("create database kopfzeit");mysql_select_db("kopfzeit");

373

Page 375: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datum und Zeit10

mysql_query("create table highscore". " (name varchar(20), zeit double)");

/* Datensatz einfügen */mysql_query("insert highscore (name, zeit)"

. " values ('$spieler', $dauer)");

/* Datensätze anzeigen */$this->anzeigen();

function anzeigen()

/* Datensätze anzeigen */echo "<p><b>Highscore:</b></p>";echo "<p><table>";echo "<tr><td><b>Name</b></td>"

. " <td><b>Zeit</b></td></tr>";$res = mysql_query("select * from highscore"

. " order by zeit limit 10");while($dsatz = mysql_fetch_assoc($res))

echo "<tr><td>" . $dsatz["name"]. "</td><td align='right'>" . $dsatz["zeit"]. " Sek.</td></tr>";

echo "</table></p>";

?>

Listing 10.13 Datei kopfzeit_spiel.inc.php

Erläuterung:

Im Konstruktor wird zunächst eine Verbindung zum Datenbankserveraufgenommen.

Anschließend wird versucht, die Datenbank kopfzeit auszuwählen.Falls der Versuch nicht gelingt, wird die Datenbank neu erzeugt, aus-gewählt und mit einer neuen Tabelle bestückt.

Nach dem Einfügen eines neuen Datensatzes in die Tabelle, die jetztauf jeden Fall existiert, wird die Methode anzeigen() aufgerufen.

In der Methode anzeigen() werden die maximal zehn besten Ergeb-nisse aus der Datenbanktabelle abgerufen und in einer kleinen Tabelleauf dem Bildschirm ausgegeben.

374

Page 376: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

11 Mathematische Funktionen

Mathematischen Berechnungen dienen die mathematischen Funktionenund Konstanten. In den folgenden Beispielprogrammen werden zweiunterschiedliche Methoden verwendet. Diese beiden Methoden könnenSie generell bei allen Funktionsaufrufen anwenden. Die erste Methodewird insbesondere bei mathematischen Funktionen genutzt.

Ausgabe Methode 1: Das Ergebnis der mathematischen Funktion wird unmit-telbar ausgegeben, das heißt, Berechnung und Ausgabe finden ineinem Schritt statt. Vorteil dieser Methode ist ihre kompakte Schreib-weise.

Rückgabe Methode 2: Das Ergebnis der mathematischen Funktion wird in einerVariablen gespeichert. Diese Variable wird anschließend oder erstspäter ausgegeben, das heißt, Berechnung und Ausgabe finden inzwei Schritten statt. Diese Methode hat den Vorteil, dass das Ergebnismehrmals verwendet werden kann, ohne dafür die Funktion erneutaufrufen zu müssen und dabei Rechenzeit zu beanspruchen.

11.1 Taschenrechnerfunktionen

EinfacheFunktionen

Im folgenden Programm werden »Taschenrechnerfunktionen« (Berech-nung der Wurzel, Potenz, e-Funktion, natürlicher Logarithmus, 10er-Logarithmus) eingesetzt:

<html><body><?php

echo "<p><b>Wurzel, Potenz, e-Funktion,Logarithmus:</b></p>";

$a = 4.75;echo "Variable a: $a <br />";echo "&radic;a: " . sqrt($a) . "<br />";echo "a<sup>2</sup>: " . pow($a,2) . "<br />";echo "a<sup>3</sup>: " . pow($a,3) . "<br />";echo "log(a) = Nat. Logarithmus von a: "

. log($a) . "<br />";

375

Page 377: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Mathematische Funktionen11

echo "e<sup>a</sup> : " . exp($a) . "<br />";echo "e<sup>1/a</sup> :" . exp(1/$a) . "<br />";echo "log<sub>10</sub>(a), 10er-Logarithmus von a: "

. log10($a);?></body></html>

Listing 11.1 Datei math_rechner.php

Die Ausgabe sehen Sie in Abbildung 11.1.

Abbildung 11.1 Taschenrechnerfunktionen

11.2 Mathematische Konstanten

pi, e Häufig genutzte Werte stehen als mathematische Konstanten zur Verfü-gung. Sie können allerdings, ebenso wie Funktionsaufrufe, nicht direktinnerhalb einer Zeichenkette ausgegeben werden.

<html><body><h2>Math. Konstanten</h2><?php

echo "&pi;: " . M_PI . "<br />";echo "Eulersche Zahl e: " . M_E . "<br />";echo "log<sub>10</sub>(e): " . M_LOG10E . "<br />";echo "log(2): " . M_LN2 . "<br />";echo "log(10): " . M_LN10 . "<br />";echo "&pi;/2: " . M_PI_2 . "<br />";

376

Page 378: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Ganzzahlermittlung 11.3

echo "&pi;/4: " . M_PI_4 . "<br />";echo "1/&pi;: " . M_1_PI . "<br />";echo "2/&pi;: " . M_2_PI . "<br />";echo "2/&radic;(&pi;): " . M_2_SQRTPI . "<br />";echo "&radic;(2): " . M_SQRT2 . "<br />";echo "&radic;(1/2): " . M_SQRT1_2;

?></body></html>

Listing 11.2 Datei math_konstanten.php

Die Ausgabe zeigt Abbildung 11.2.

Abbildung 11.2 Mathematische Konstanten

11.3 Ganzzahlermittlung

In diesem Abschnitt beschäftigen wir uns damit, eine Zahl mit Dezimal-stellen durch verschiedene Rundungsarten in eine Ganzzahl umzuwan-deln. Das Programm:

<html><body><?php

echo "<p><b>Zahlen in Ganzzahlen verwandeln:</b><br />";

377

Page 379: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Mathematische Funktionen11

$a = 4.75;echo "Variable a: $a<br />";echo "nächstniedrigere ganze Zahl zu a: "

. floor($a) . "<br />";echo "nächsthöhere ganze Zahl zu a: "

. ceil($a) . "<br />";echo "a kaufmännisch gerundet: " . round($a) . "</p>";

$b = –4.75;echo "<p>Variable b: $b<br />";echo "nächstniedrigere ganze Zahl zu b: "

. floor($b) . "<br />";echo "nächsthöhere ganze Zahl zu b: "

. ceil($b) . "<br />";echo "b kaufmännisch gerundet: " . round($b) . "</p>";

?></body></html>

Listing 11.3 Datei math_ganzzahl.php

Eine Zahl mit Nachkommastellen kann auf verschiedene Weise gerundetwerden:

nach unten – Funktion floor()

nach oben – Funktion ceil()

kaufmännisch (bei positiven Zahlen bis 0.4999… zur 0, ab 0.5000 zur1) – Funktion round()

Die Ausgabe sehen Sie in Abbildung 11.3.

Abbildung 11.3 Ganzzahlermittlung

378

Page 380: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Extremwerte 11.4

11.4 Extremwerte

In diesem Abschnitt wird das Maximum beziehungsweise das Minimumunterschiedlich vieler Werte ermittelt. Das Programm:

<html><body><?php

echo "<p><b>Maxima, Minima:</b><br />";$a = 4.75;$b = –4.75;$c = 30;echo "a: $a, b: $b, c: $c<br />";echo "Maximum von a, b und c: "

. max($a,$b,$c) . "<br />";echo "Minimum von a, b und c: " . min($a,$b,$c) . "</p>";

$f = array(-4.75, 5.37, 30, –6.2, 0.05);echo "<p>Feld: ";for($i=0; $i<count($f); $i++)

echo "$f[$i] &nbsp; ";echo "<br />";echo "Feld-Maximum: " . max($f) . "<br />";echo "Feld-Minimum: " . min($f) . "</p>";

?></body></html>

Listing 11.4 Datei math_extrema.php

Die Funktionen max() beziehungsweise min() ermitteln aus einer belie-bigen Menge Zahlen die größte beziehungsweise die kleinste Zahl. DieFunktionen können auch bei Feldern angewendet werden. Die Ausgabezeigt Abbildung 11.4.

Abbildung 11.4 Extremwerte

379

Page 381: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Mathematische Funktionen11

11.5 Winkelfunktionen

sin(), cos(), tan() In diesem Abschnitt stelle ich Ihnen einige Winkelfunktionen (Sinus,Cosinus, Tangens usw.) vor. Dabei ist zu beachten, dass ein Winkel, derin Grad angegeben wird, zunächst in Bogenmaß umgerechnet werdenmuss. Erst anschließend können Sie eine Winkelfunktion anwenden. DieUmrechnung von Winkel in Bogenmaß erfolgt mit der Funktiondeg2rad().

Umgekehrt muss das Ergebnis einer Arcusfunktion (Arcussinus, Arcus-cosinus, Arcustangens) anschließend wieder von Bogenmaß in Grad um-gewandelt werden. Dies wird durch die Funktion rad2deg() ermöglicht.

<html><body><?php

echo "<h2>Winkelfunktionen:</h2>";

$w = 30;echo "<p>Winkel w: $w (in Grad)<br />";$wbm = deg2rad($w);echo "Winkel w: $wbm (in Bogenmaß)<br />";echo "sin(w): " . sin($wbm) . "<br />";echo "cos(w): " . cos($wbm) . "<br />";echo "tan(w): " . tan($wbm) . "</p>";$x = 0.9;echo "<p>Wert x: $x<br />";echo "arcussinus(x): " . rad2deg(asin($x))

. " (in Grad)<br />";echo "arcuscosinus(x): " . rad2deg(acos($x))

. " (in Grad)";?></body></html>

Listing 11.5 Datei math_winkel.php

Die Ausgabe sehen Sie in Abbildung 11.5.

380

Page 382: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Prüffunktionen für Zahlen 11.6

Abbildung 11.5 Winkelfunktionen

11.6 Prüffunktionen für Zahlen

finit, NaNMit den Prüffunktionen is_finite() und is_infinite() lässt sich fest-stellen, ob eine Zahl finit (= endlich) oder infinit (= unendlich) ist. Aller-dings liefert die Funktion is_infinite() nicht immer korrekte Ergeb-nisse. Daher ist auch für die Feststellung der Unendlichkeit die Funktionis_finite() zu bevorzugen. Die Prüffunktion is_nan() stellt für Zahlen(nicht für Zeichenketten!) fest, ob diese gültig sind.

Prüffunktionen können Sie dazu nutzen, fehlerhafte beziehungsweiseverwirrende Ausgaben zu vermeiden. Einige Beispiele sollen die Zahlen-und Gültigkeitsbereiche und die Prüffunktionen verdeutlichen:

<html><body><?php

echo "<h2>Prüffunktionen:</h2>";

echo "<p>";for($i=307; $i<=309; $i++)

echo "10 hoch $i, ";echo pow(10,$i);if(is_finite(pow(10,$i)))

echo ", endlich für PHP<br />";else

381

Page 383: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Mathematische Funktionen11

echo ", unendlich für PHP<br />";echo "</p>";

echo "<p>";for($i=322; $i<=324; $i++)

echo "10 hoch -$i, ";echo pow(10,-$i);if(is_finite(pow(10,-$i)))

echo ", endlich für PHP<br />";else

echo ", unendlich für PHP<br />";echo "</p>";

echo "<p>";for($i=0.001; $i>=0; $i=$i-0.0005)

echo "Nat. Log.: ln($i), ";echo log($i);if(is_finite(log($i)))

echo ", endlich für PHP<br />";else

echo ", unendlich für PHP<br />";echo "</p>";

echo "<p>";for($i=0.99; $i<=1.01; $i=$i+0.01)

echo "arcussinus($i), ";echo rad2deg(asin($i)) . " Grad";if(is_nan(asin($i)))

echo ", nicht gültig für PHP<br />";else

echo ", gültig für PHP<br />";echo "</p>";

?></body></html>

Listing 11.6 Datei math_pruefen.php

382

Page 384: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Zufallszahlen 11.7

Die Ausgabe zeigt Abbildung 11.6.

Abbildung 11.6 Prüffunktionen für Zahlen

Der Zahlenbereich von PHP geht »nur« bis 1E+308, also 10308 (10 hoch308). Alle Zahlen darüber gelten als unendlich. Sie können daher nichtmehr für Berechnungen genutzt werden. In der anderen Richtung gehtder Zahlenbereich von PHP bis 1E–324, also 10–324 (10 hoch –324) AlleZahlen, die kleiner sind, zählen als 0.

Der Sinus beziehungsweise der Cosinus beliebiger Winkel liegt im Zah-lenbereich von –1 bis +1. Somit können die Umkehrfunktionen ArcusSinus und Arcus Cosinus nur für Zahlen aus diesem Bereich berechnetwerden. Daher ist zum Beispiel der Arcus Sinus von 1.01 eine nicht gül-tige Zahl. Dies können Sie mit der Funktion is_nan() feststellen.

11.7 Zufallszahlen

In vielen Programmen (Spiele, Simulationen, Tests usw.) werden zufäl-lige Zahlen gebraucht. Wie in fast jeder anderen Programmierspracheexistieren diese Zufallszahlen auch in PHP. Allerdings handelt es sichimmer um Quasi-Zufallszahlen und keine mathematisch echten Zufalls-

383

Page 385: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Mathematische Funktionen11

zahlen. Normalerweise genügen diese zufälligen Werte allerdings für diegenannten Aufgaben. In PHP gibt es insgesamt drei sogenannte Zufalls-zahlengeneratoren:

rand(), srand() Der einfache Zufallszahlengenerator arbeitet mit der Funktion rand()und stellt Folgendes zur Verfügung:

entweder beliebige Zahlen zwischen 0 und dem systemabhängi-gen Wert von getrandmax(), Aufruf: rand()

oder beliebige Zahlen zwischen den angegebenen Grenzen,jeweils einschließlich, Aufruf zum Beispiel: rand(1,6)

Diesen einfachen Zufallszahlengenerator müssen Sie nach Aufruf desProgramms zunächst mit srand() initialisieren, andernfalls würdenbei jedem Programmaufruf die gleichen Abfolgen mit nicht mehrzufälligen Zahlen produziert.

mt_rand(),mt_srand()

Der verbesserte Zufallszahlengenerator arbeitet mit der Funktionmt_rand() und stellt beliebige Zahlen zwischen 0 und dem system-abhängigen Wert von mt_getrandmax() zur Verfügung. Es wird hierein schnellerer und verbesserter Algorithmus zur Ermittlung der Zah-len verwendet. Den Zufallszahlengenerator müssen Sie mitmt_srand() initialisieren.

lcg_value() Die Funktion lcg_value() arbeitet mit zwei kombinierten, linearkongruenten Zufallszahlengeneratoren auf der Basis von Primzahlen.Eine Initialisierung ist nicht erforderlich.

Beide Initialisierungsfunktionen srand() und mt_srand() benutzen dieFunktion microtime(), die die Systemzeit als absolute Zahl in Mikrose-kunden ermittelt. Diese Zeit ist zu jedem Zeitpunkt unterschiedlich,daher ergibt sich bei jedem Aufruf ein anderer Startwert für den Zufalls-zahlengenerator.

<html><body><?php

echo "<p><b>Seite bitte mehrmals neu laden</b></p>";

echo "<p>3 Zufallszahlen mit rand():<br />";srand((double)microtime()*1000000);echo "Größte mögliche Zufallszahl: "

. getrandmax() . "<br />";for ($i=1; $i<=3; $i++)

echo rand() . " &nbsp; ";

384

Page 386: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Zufallszahlen 11.7

echo "</p>";

echo "<p>3 Zufallszahlen mit mt_rand():<br />";mt_srand((double)microtime()*1000000);$zz = mt_getrandmax();echo "Größte mögliche Zufallszahl: "

. number_format($zz,0,",",".") . "<br />";for ($i=1; $i<=3; $i++)

$zz = mt_rand();echo number_format($zz,0,",",".") . " &nbsp;";

echo "</p>";

echo "<p>15 Zufallszahlen mit mt_rand()zwischen 1 und 49:<br />";

for ($i=1; $i<=15; $i++)echo mt_rand() % 49 + 1 . " &nbsp;";

echo "</p>";

echo "<p>3 Zufallszahlen mit lcg_value():<br />";for ($i=1; $i<=3; $i++)

echo lcg_value() . " &nbsp; ";echo "</p>";

?></body></html>

Listing 11.7 Datei math_zufall.php

ModuloDie 15 »besseren« Zufallszahlen zwischen 1 und 49 werden mit Hilfe desOperators Modulo (%) ermittelt. Der Zufallszahlengenerator erzeugt jedesMal eine ganze Zahl zwischen 0 und 2.147.483.647. Teilt man jede belie-bige Zahl, die dabei ermittelt werden kann, durch 49, so bleibt ein Rest,der zwischen 0 und 48 liegt. Wird noch der konstante Wert 1 hinzuad-diert, so hat man das gewünschte Ergebnis (zwischen 1 und 49). Die Aus-gabe sieht, in Abhängigkeit der zufälligen Zahlen, aus wie in Abbildung11.7.

Nach jedem neuen Laden (Aktualisieren) der Seite erscheinen neue Zah-len. Bei näherem Hinsehen, insbesondere bei den Zahlen zwischen 1 und49, fällt allerdings auf, dass manche Zahlen mehrfach gezogen werden.

385

Page 387: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Mathematische Funktionen11

Abbildung 11.7 Zufallszahlen

Bei jeder einzelnen Zufallszahl wird aus dem gesamten Bereich derZufallszahlen, also von 0 bis 2.147.483.647, gezogen. Es wird keine Zahlvon der Ziehung ausgeschlossen. Das Ergebnis der Modulo-Berechnungkann somit für mehrere gezogene Zahlen identisch sein.

11.8 Mischen

Für viele Problemstellungen ist es erforderlich, die bereits gezogenenZufallszahlen von der Ziehung auszuschließen. Man denke an die Zie-hung der Lottozahlen, bei der eine Kugel mit einem bestimmten Zahlen-wert nicht zweimal gezogen werden darf.

Skatblatt mischen Es muss also gemischt werden. Nachfolgend führen wir dies mit zweiMethoden für ein Kartenspiel mit 32 Karten (Skatblatt) durch:

mit einem eigenen, erweiterungsfähigen Algorithmus, der einenZufallszahlengenerator benutzt

mit der Feldfunktion shuffle(), die sich intern eines Zufallszahlen-generators bedient

386

Page 388: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Mischen 11.8

11.8.1 Mischen mit eigenem Algorithmus

Das Ziel ist die Ermittlung einer zufälligen Abfolge von Zahlen aus einembestimmten Bereich, wobei jede Zahl nur einmal vorkommen darf. Esmuss demzufolge festgehalten werden, welche Zahlen bereits gezogenwurden. Sollte eine dieser Zahlen noch einmal gezogen werden, so mussdie aktuelle Ziehung wiederholt werden.

<html><body><?php

mt_srand((double)microtime()*1000000);for ($i=1; $i<=32; $i++)

$cnt[$i]=0; // Zähler auf 0

for($i=1; $i<=32; $i++) // 32-mal ziehen

do // mehrmals ziehen, falls Zähler > 0 */$z = mt_rand() % 32 + 1;

while($cnt[$z]>0);

$cnt[$z] = $cnt[$z]+1; // Zähler erhöhen$karte[$i] = $z; // Karte speichern

/* Karten ausgeben */echo "Spieler A: ";for ($i=1; $i<=10; $i++) echo $karte[$i] . " ";echo "<br />";

echo "Spieler B: ";for ($i=11; $i<=20; $i++) echo $karte[$i] . " ";echo "<br />";echo "Spieler C: ";for ($i=21; $i<=30; $i++) echo $karte[$i] . " ";echo "<br />";

echo "Im Stock: ";for ($i=31; $i<=32; $i++)

echo $karte[$i] . " ";?></body></html>

Listing 11.8 Datei math_mischen.php

387

Page 389: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Mathematische Funktionen11

Im Feld $karte werden die 32 verschiedenen zufälligen Zahlen gespei-chert. Im Feld $cnt wird gespeichert, wie oft eine Zahl (= Karte) schongezogen wurde. Zu Beginn wird dieser Wert für alle Karten auf 0 gestellt.Während der Ziehung wird dieser Wert überprüft. Nach erfolgreicherZiehung einer Zahl, die vorher noch nicht gezogen wurde, wird dieserWert auf 1 gestellt. Die Ausgabe kann aussehen wie in Abbildung 11.8.

Abbildung 11.8 Skat, Mischvorgang

11.8.2 Mischen mit shuffle()

Das Programm:

<html><body><?php

srand((double)microtime()*1000000);

/* 32 Karten geordnet im Feld speichern */for ($i=0; $i<=31; $i++) $karte[$i]=$i+1;

/* Mischen */shuffle($karte);

/* Karten ausgeben */echo "Spieler A: ";for ($i=0; $i<=9; $i++) echo $karte[$i] . " ";echo "<br />";

echo "Spieler B: ";for ($i=10; $i<=19; $i++) echo $karte[$i] . " ";echo "<br />";

echo "Spieler C: ";for ($i=20; $i<=29; $i++) echo $karte[$i] . " ";echo "<br />";

388

Page 390: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Stellenwertsysteme 11.9

echo "Im Stock: ";for ($i=30; $i<=31; $i++)

echo $karte[$i] . " ";?></body></html>

Listing 11.9 Datei math_shuffle.php

shuffle()Der Zufallszahlengenerator für die Funktion shuffle() muss mitsrand() initialisiert werden. Im Programm werden die Feldelemente 0bis 31 der Reihe nach mit den Werten 1 bis 32 belegt. Anschließend wirdmit shuffle() gemischt. Die Ausgabe entspricht der Ausgabe in deranderen Methode.

11.9 Stellenwertsysteme

Ein Stellenwertsystem ist ein System zur Darstellung von Zahlen durchZiffern und Zeichen, bei denen der Wert einer Ziffer von der Stelleabhängt, an der sie sich innerhalb der Zahl befindet.

Dezimal, dual, oktal, hexadezimal

Das gebräuchlichste Stellenwertsystem ist das Dezimalsystem (Zahlen zurBasis 10). In der Informatik werden außerdem das Dualsystem (Basis 2)und das Hexadezimalsystem (Basis 16) eingesetzt, seltener das Oktalsys-tem (Basis 8).

Die benutzten Ziffern und Zeichen in den verschiedenen Systemen sind: imDualsystem 0 und 1, im Oktalsystem 0 bis 7, im Dezimalsystem 0 bis 9, imHexadezimalsystem 0 bis 9 und A bis F. Die Buchstaben A bis F entsprechendabei den Dezimalwerten von 10 bis 15.

Beispiele

Dezimalzahl 456: 4 * 10 hoch 2 + 5 * 10 hoch 1 + 6 * 10 hoch 0 = 400 +50 + 6 = 456

Dualzahl 11001: 1 * 2 hoch 4 + 1 * 2 hoch 3 + 0 * 2 hoch 2 + 0 * 2 hoch1 + 1 * 2 hoch 0 = 16 + 8 + 0 + 0 + 1 = 25 (dezimal)

Hexadezimalzahl 2A5F: 2 * 16 hoch 3 + 10 * 16 hoch 2 + 5 * 16 hoch 1+ 15 * 16 hoch 0 = 2 * 4096 + 10 * 256 + 5 * 16 + 15 = 10847 (dezimal)

PHP stellt die Funktionen decbin(), dechex(), decoct(), bindec(), hex-dec() und octdec() zur Umrechnung zwischen den oben angegebenen

389

Page 391: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Mathematische Funktionen11

Stellenwertsystemen zur Verfügung. Außerdem bietet die Funktionbase_convert() die Möglichkeit der Umrechnung zwischen zwei belie-bigen Stellenwertsystemen im Bereich von 2 bis 36. Die Begrenzung auf36 existiert deshalb, weil zur Darstellung der Ziffern und Zeichen nur dieZiffern 0 bis 9 sowie die 26 Buchstaben (A bis Z) des Alphabets verwen-det werden.

<html><body><?php

echo "<p><b>Zahlensysteme:</b></p>";$x = 57;echo "Variable x: $x (als Dezimalzahl)<br />";echo "als Binärzahl (Zahl zur Basis 2): "

. decbin($x) . "<br />";echo "als Oktalzahl (Zahl zur Basis 8): "

. decoct($x) . "<br />";echo "als Hexadezimalzahl (Zahl zur Basis 16): "

. dechex($x) . "<br />";echo "als Zahl zur Basis 4: "

. base_convert($x,10,4) . "<br />";echo "als Zahl zur Basis 32: "

. base_convert($x,10,32);?></body></html>

Listing 11.10 Datei math_basis.php

Die Ausgabe zeigt Abbildung 11.9.

Abbildung 11.9 Zahlensysteme

390

Page 392: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Stellenwertsysteme 11.9

Übung »u_math«

Erstellen Sie eine HTML-Tabelle. Darin soll das Ergebnis der nachfolgendbeschriebenen Berechnungen stehen. Für jeden Wert x von 0 bis 90 in Schrit-ten von 15 (also die Werte x=0, x=15, x=30, x=45, x=60, x=75, x=90) sollendie folgenden Funktionen berechnet werden (Datei u_math.php):

Umrechnung des Werts x in Bogenmaß (Radiant)

Sinus und Cosinus des Bogenmaßwerts

Wurzel (x), Quadrat von x

natürlicher Logarithmus von x, 10er-Logarithmus von x

e hoch (1/x)

x als Binärzahl und als Hexadezimalzahl

Die Ergebnisse sollen jeweils mit zwei Nachkommastellen in deutscherSchreibweise formatiert ausgegeben werden, jedoch mit Ausnahme vonWert x, Quadrat von x, Binärzahl und Hexadezimalzahl. Diese sollen unfor-matiert ausgegeben werden.

Ein Tipp zur Durchführung: Schreiben Sie dieses umfangreiche Programm inmehreren Schritten. Lassen Sie zunächst die HTML-Tabelle mit einer einzi-gen Spalte (Wert x) anzeigen. Nachdem Sie diese Aufgabe erfolgreich bewäl-tigt haben, erweitern Sie die Tabelle nach und nach um die weiteren Spalten.So lassen sich eventuell auftretende Fehler leichter finden.

Das Ergebnis sollte aussehen wie in Abbildung 11.10.

Abbildung 11.10 Ergebnis der Übung »u_math«

391

Page 393: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet
Page 394: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

12 Sessions und Cookies

Jeder Aufruf einer Internetseite über HTTP wird einzeln bearbeitet undist unabhängig von vorherigen Aufrufen. Falls ein Benutzer bei mehrerenAufrufen direkt nacheinander oder an verschiedenen Tagen auf den glei-chen Webserver zugreift, kann es nützlich sein, bestimmte individuelleDaten für ihn aufzubewahren beziehungsweise zu transportieren. Dazustehen in PHP Cookies und das Sessionmanagement zur Verfügung.Einige Beispiele:

Sie melden sich per Login auf einer geschützten Website an und»bewegen« sich anschließend innerhalb dieser Website. In diesemFall können die Anmeldedaten transportiert werden, damit Sie sichnicht auf jeder Seite neu anmelden müssen.

Sie tätigen Einkäufe auf verschiedenen Seiten eines Webshops. DieEinkäufe werden einzeln in einem Warenkorb abgelegt und dort auf-bewahrt, bis Sie zur Kasse gehen.

Sie besuchen häufiger eine Website, auf der Sie Ihre individuelleUmgebung schaffen können oder häufig genutzte Daten schnell zurVerfügung gestellt bekommen möchten.

CookiesDiese Daten können in Cookies (das sind kleine Dateien) längere Zeit aufdem Rechner des Benutzers gespeichert werden. Je nach Einstellung desBrowsers wird dies allerdings eingeschränkt oder ganz verhindert. Daherkann diese Möglichkeit nicht immer eingesetzt werden.

$_SESSIONBeim Sessionmanagement können diese Daten im superglobalen Array$_SESSION abgelegt werden. Dessen Inhalt wird nur für die Dauer einerabgeschlossenen Internetsitzung auf dem Server gespeichert. Das Ses-sionmanagement von PHP kann trotz all seiner Möglichkeiten keinen100 %igen Schutz der Benutzerdaten vor unerlaubtem Zugriff garantie-ren. Überlegen Sie also, welche Daten Ihrer Programme innerhalb einerSession transportiert werden sollen und welche nicht. Empfehlen Sieden Benutzern Ihrer Programme, nach einem Logoff den Browser zuschließen.

393

Page 395: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Sessions und Cookies12

12.1 Sessionmanagement

Eine Session muss explizit begonnen werden. Sie endet später entwedermit dem Schließen des Browserfensters durch den Benutzer oder indemsie durch das Programm explizit geschlossen wird. Das Beenden einerSession führt zum Löschen des Session-Arrays.

session_start(),session_destroy()

Die Funktion session_start() muss auf jeder Seite, die zu einer Sessiongehört, aufgerufen werden. Diese Funktion beginnt entweder eine neueSession oder nimmt eine vorhandene Session wieder auf. Um eine Sessionexplizit zu beenden, wird die Funktion session_destroy() benötigt.

12.2 Beispiel für Sessions: Zugriffszähler

Zunächst ein einfaches Beispiel mit einem Zugriffszähler, dessen Wert imbereits erwähnten Session-Array gespeichert wird. Der erste Besuch aufder Seite liefert eine Ausgabe wie in Abbildung 12.1.

Abbildung 12.1 Erster Besuch der Seite

Nach einigen Aktualisierungen der Seite sieht sie aus wie in Abbildung 12.2.

Abbildung 12.2 Nach einigen Aktualisierungen

Sie erkennen, dass der Zähler hochzählt. Es wird also festgestellt, dassdieser Benutzer diese Seite mehrmals nacheinander besucht hat. WennSie den Browser schließen und wieder öffnen, erscheint eine Ausgabewie in Abbildung 12.3.

Session-ID Eine Session ist also unabhängig von der vorherigen Session. Es handeltsich wiederum um einen ersten Besuch. Die Eindeutigkeit der Session ist

394

Page 396: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiel für Sessions: Zugriffszähler 12.2

auch an der individuellen Session-ID erkennbar, die hier nur zu Kontroll-zwecken ausgegeben wurde.

Abbildung 12.3 Eine andere Session

Der Programmcode sieht wie folgt aus:

<?php/* Session-Start oder Session-Wiederaufnahme */session_start();

?><html><body><?php

/* Zugriffszähler existiert? */if (isset($_SESSION["zz"]))

$_SESSION["zz"] = $_SESSION["zz"] + 1;else

$_SESSION["zz"] = 1;

/* Ausgabe Zugriffszähler */echo "Ihr Besuch Nr.: " . $_SESSION["zz"] . "<br />";

/* Ausgabe Session-ID */echo "Ihre Session-ID: " . session_id();

?></body></html>

Listing 12.1 Datei sc_zaehler.php

Erläuterung:

Zum Start einer neuen Session beziehungsweise zur Wiederauf-nahme einer vorhandenen Session wird ein Aufruf der Funktionsession_start() benötigt. Dieser Aufruf muss vor dem Beginn deseigentlichen HTML-Dokuments erfolgen.

isset() Mit Hilfe der Funktion isset() wird festgestellt, ob das Element zzdes superglobalen Session-Arrays existiert.

395

Page 397: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Sessions und Cookies12

Falls es existiert, handelt es sich um eine wieder aufgenommene Ses-sion. Der Wert des Elements zz wird um 1 erhöht.

Falls es nicht existiert, handelt es sich um eine neue Session. Der Wertdes Elements zz wird auf 1 gesetzt.

Der Wert des Zugriffszählers wird ausgegeben.

session_id() Der Wert der eindeutigen Session-ID, die zur Verwaltung der Sessionauf dem Server benötigt wird, wird mit Hilfe der Funktionsession_id() ermittelt und anschließend (hier nur zur Kontrolle)ausgegeben.

12.3 Beispiel für Sessions: Geschützte Website

Das Folgende ist eine Anwendung für Sessions bei einer geschütztenWebsite, die aus drei Seiten besteht:

einer Login-Seite zur Website, auf der der Benutzer den Namen unddas Passwort eingibt

einer Intro-Seite, in der die Session gestartet wird

einer beliebigen weiteren Seite innerhalb der Website

12.3.1 Ablauf

Zwischen der Intro-Seite und der beliebigen Seite kann der Benutzer sichnach erfolgreicher Anmeldung hin- und herbewegen. Von jeder dieserSeiten aus kann er sich zudem abmelden und gelangt wieder zur Login-Seite. Keine der Seiten kann direkt im Browser angewählt werden, da diezugehörigen Sessiondaten fehlen. Beide Seiten sind also erst nach einemLogin erreichbar. Beim Aufruf der Login-Seite erscheint eine Ausgabewie in Abbildung 12.4.

Abbildung 12.4 Hier kann sich der Benutzer anmelden.

396

Page 398: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiel für Sessions: Geschützte Website 12.3

Nach Eingabe eines falschen Namens und/oder Passworts sieht es auswie in Abbildung 12.5.

Abbildung 12.5 Die Anmeldung ist gescheitert.

Nach Betätigung des Hyperlinks gelangt der Benutzer wieder zur Login-Seite. Falls er dort den richtigen Namen (zum Beispiel Hans) und das rich-tige Passwort (in diesem Fall bingo) angibt, erscheint die Intro-Seite(siehe Abbildung 12.6).

Abbildung 12.6 Die Anmeldung war erfolgreich.

Der Benutzer wird mit Namen begrüßt und kann von hier aus weiter zueiner beliebigen Seite gehen oder sich wieder abmelden (zur Login-Seite). Nach Betätigen des ersten Hyperlinks erscheint die beliebige Seite,wie in Abbildung 12.7.

Abbildung 12.7 Beliebige weitere Seite der Website

397

Page 399: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Sessions und Cookies12

Ein direkter Aufruf der Intro-Seite oder der beliebigen Seite durch Ein-gabe der jeweiligen URL führt hingegen nicht zum Erfolg.

Anmeldung 12.3.2 Login-Seite

Zunächst der Code der Login-Seite:

<?php/* Vor Beenden der Session wieder aufnehmen */session_start();

/* Beenden der Session */session_destroy();$_SESSION = array();

?><html><body><h3>Login-Seite</h3><form action="sc_schutz_b.php" method="post"><p><input name="n" /> Name</p><p><input type="password" name="p" /> Passwort</p><p><input type="submit" value="Login" /></p>

</form></body></html>

Listing 12.2 Datei sc_schutz_a.php

Erläuterung:

Zunächst fragen Sie sich sicher, warum auf der Login-Seite bereits einAufruf der Funktion session_start() steht.Zur Erinnerung: Der Benutzer gelangt zur Login-Seite auch durch einLogoff von der Website. In diesem Fall soll die Session explizit beendetwerden, also ist ein Aufruf von session_destroy() notwendig. Bevoraber eine Session beendet werden kann, muss sie wieder aufgenom-men werden – daher zunächst der Aufruf von session_start().

Zur Erhöhung der Sicherheit wird das superglobale Array $_SESSIONmit einem leeren Array neu initialisiert. Damit werden alle Sessionda-ten explizit gelöscht.

Es folgt ein Anmeldeformular. Von hier aus wird die Intro-Seite derWebsite aufgerufen (sc_schutz_b.php). Die Formularelemente habendie Namen n für den Benutzernamen und p für das Passwort.

398

Page 400: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiel für Sessions: Geschützte Website 12.3

12.3.3 Intro-Seite

Es folgt der Code für die Intro-Seite:

<?php/* Session starten oder wieder aufnehmen */session_start();

/* Falls Aufruf von Login-Seite */if(isset($_POST["n"]))

/* Falls Name und Passwort korrekt */if($_POST["n"] == "Hans" && $_POST["p"] == "bingo"|| $_POST["n"] == "Gerd" && $_POST["p"] == "tango")

$_SESSION["n"] = $_POST["n"];

/* Kontrolle, ob innerhalb der Session */include "sc_schutz.inc.php";

?>

<html><body><h3>Intro-Seite</h3><?php

/* Begrüßung des Benutzers */echo "<p>Hallo " . $_SESSION["n"] . "</p>";

?><p><a href="sc_schutz_c.php">Zur beliebigen Seite</a></p><p><a href="sc_schutz_a.php">Logoff</a></p></body></html>

Listing 12.3 Datei sc_schutz_b.php

Erläuterung:Als Erstes wird eine Session gestartet beziehungsweise wieder aufge-nommen. Anschließend wird festgestellt, woher der Aufruf dieser Seitestammt:

$_POST Per Formular von der Login-Seite. In diesem Fall existiert die Variable$_POST["n"]. Falls Name und Passwort stimmen (hier entweder Hansund bingo oder Gerd und tango), wird der aus dem Formular über-mittelte Name in das Session-Array übernommen und steht währendder Session zur Verfügung.

399

Page 401: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Sessions und Cookies12

Von einer beliebigen anderen Seite innerhalb oder außerhalb derWebsite beziehungsweise durch direkte Eingabe der URL. In diesemFall gibt es die Variable $_POST["n"] nicht; Name und Passwort wer-den daher nicht überprüft.

Im nächsten Schritt wird der Quellcode der Datei sc_schutz.inc.php ein-gebunden. Dieser wird von allen Seiten innerhalb der Website verwen-det. Der Code prüft, ob überhaupt ein Benutzer angemeldet ist.

<?php/* Kontrolle, ob innerhalb der Session */if (!isset($_SESSION["n"]))

echo "<p>Kein Zugang</p>";echo "<p><a href='sc_schutz_a.php'>Zum Login</a></p>";echo "</body></html>",exit;

?>

Listing 12.4 Datei sc_schutz.inc.php

Erläuterung:

$_SESSION Falls der Benutzer sich soeben angemeldet hat oder von einer anderenSeite innerhalb der Website kommt, existiert die Variable$_SESSION["n"]. Falls nicht, erscheinen nur der Text Kein Zugangund ein Hyperlink zur Login-Seite.

Falls also der Benutzer von einer beliebigen Seite außerhalb der Web-site beziehungsweise durch direkte Eingabe der URL hierherkommt,wird ihm der Zugang verwehrt.

Nunmehr weiter im Code der Intro-Seite:

Es wird der Titel ausgegeben. Der Benutzer wird mit Namen begrüßt.Der Name steht während der Session in der Variablen $_SESSION["n"]zur Verfügung. Zwei Hyperlinks führen nun zur beliebigen Seite bezie-hungsweise zum Ausloggen.

Hinweis

Name und Passwort sind hier zur Vereinfachung fest codiert. Natürlich wer-den diese in der Realität verschlüsselt in einer Datenbank abgelegt, und eserfolgt an dieser Stelle eine entsprechende Datenbankabfrage.

400

Page 402: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiel für Sessions: Webshop 12.4

Beliebige SeiteZu guter Letzt der Code der beliebigen Seite innerhalb der Website:

<?php/* Session wieder aufnehmen */session_start();

/* Kontrolle, ob innerhalb der Session */include "sc_schutz.inc.php";

?>

<html><body><h3>Beliebige Seite</h3><?php

/* Begrüßung des Benutzers */echo "<p>Hallo " . $_SESSION["n"] . "</p>";

?><p><a href="sc_schutz_b.php">Zur Intro-Seite</a></p><p><a href="sc_schutz_a.php">Logoff</a></p></body></html>

Listing 12.5 Datei sc_schutz_c.php

Erläuterung:

Im Code fehlt nur der Block zur Prüfung der übermittelten Formular-daten. Das ist auf dieser Seite (innerhalb der Website) unnötig, da dienotwendigen Daten für den angemeldeten Benutzer bereits mit demSession-Array transportiert werden.

TestenSie können diese Anwendung testen, indem Sie mehrere Browserfensteröffnen, verschiedene Anmeldungen ausprobieren (mit Hans, mit Gerd,mit anderen Namen) und sich wieder abmelden. Sie werden entwederabgewiesen oder auf den Seiten innerhalb der Website mit dem richtigenNamen begrüßt. Bei einem direkten Aufruf der Intro-Seite beziehungs-weise der beliebigen Seite werden Sie abgewiesen.

12.4 Beispiel für Sessions: Webshop

Als drittes Beispiel soll ein Webshop dienen. Der Benutzer wählt diejeweils gewünschte Anzahl verschiedener Artikel aus insgesamt dreiAbteilungen aus und legt sie in den Warenkorb. Dabei werden dieseDaten in das Session-Array eingetragen. Zu einem beliebigen Zeitpunkt

401

Page 403: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Sessions und Cookies12

kann der Benutzer sich den Inhalt des Warenkorbs ansehen und zurKasse gehen. Der Warenkorb wird erst gelöscht, wenn der Browser wie-der geschlossen wurde.

12.4.1 Ablauf

Webshop Beim Aufruf der Startseite des Webshops hat der Benutzer die Möglich-keit, eine Abteilung zu wählen oder sich direkt den Warenkorb anzeigenzu lassen. Dies sehen Sie in Abbildung 12.8.

Abbildung 12.8 Startseite des Webshops

Abteilung Nach Auswahl einer Abteilung erscheint eine Tabelle mit den Artikelndieser Abteilung, wie in Abbildung 12.9.

Abbildung 12.9 Abteilung DVD/Video

402

Page 404: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiel für Sessions: Webshop 12.4

Der Benutzer kann die jeweils gewünschte Anzahl verschiedener Artikeleintragen und in den Warenkorb legen. Es erscheint der Warenkorb mitder bisher getroffenen Auswahl, siehe Abbildung 12.10.

Abbildung 12.10 Warenkorb

WarenkorbFalls der Benutzer weitere Artikel aus anderen Abteilungen auswählenmöchte, kann er diese mit einem »Umweg« über die Startseite erreichen.Falls er zu einer Abteilung wechselt, in der er bereits Artikel ausgewählthat, erscheint die betreffende Anzahl im Eingabefeld. Der Warenkorbfüllt sich, siehe Abbildung 12.11.

Abbildung 12.11 Warenkorb nach weiteren Einkäufen

403

Page 405: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Sessions und Cookies12

Kasse Abschließend geht der Benutzer zur Kasse (die in Abbildung 12.12 nurangedeutet wird).

Abbildung 12.12 Abschluss des Einkaufs

Sicherlich ist dieses Beispiel noch unkomfortabel und einfach gehalten.Es zeigt aber das Wesentliche: die Übernahme und Aufbewahrung ausge-wählter Daten im Session-Array.

12.4.2 Startseite

Zunächst der Code der Startseite:

<html><body><h3>Willkommen im Webshop</h3><p>Zur Abteilung:<br /><?php/* Arrays einbinden */include "sc_shop.inc.php";

/* Abteilungsnamen mit Hyperlinks ausgeben */for($i=0; $i<count($abtname); $i++)

echo "<a href='sc_shop_b.php?abtnr=$i'>$abtname[$i]</a><br />";

?></p><p><a href="sc_shop_c.php">Zum Warenkorb</a></p></body></html>

Listing 12.6 Datei sc_shop_a.php

404

Page 406: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiel für Sessions: Webshop 12.4

Erläuterung:

Es wird (wie auch auf den anderen Seiten des Webshops) die Dateisc_shop.inc.php mit mehreren Arrays eingebunden. Diese Arraysbeinhalten den Gesamtkatalog des Webshops mit:

den Namen der Abteilungen (eindimensionales Array $abtname)

den Namen der Artikel (zweidimensionales Array $aname)

den Nummern der Artikel (zweidimensionales Array $artnr)

den Preisen der Artikel (zweidimensionales Array $preis)

sizeof() Auf der Startseite werden nun die Namen der Abteilungen ausgege-ben. Falls später weitere Abteilungen oder Artikel hinzukommen,führt dies nicht zu einer Änderung des Codes, da mit der Funktionsizeof() automatisch die aktuelle Größe jedes Arrays ermittelt wird.

GET-Parameter Jeder Name einer Abteilung ist gleichzeitig ein Hyperlink zur Tabelleder Artikel dieser Abteilung. Die ausgewählte Abteilungsnummerwird per GET-Parameter (sc_shop_b.php?abtnr=$i) übergeben.

12.4.3 Include-Datei

Die Include-Datei mit den verschiedenen Arrays:

<?php/* Namen der Abteilungen */$abtname[0] = "Unterhaltungselektronik";$abtname[1] = "DVD/Video";$abtname[2] = "Mobilfunk";

/* Namen der Artikel */$aname[0][0] = "Kopfhörerset";$aname[0][1] = "Funklautsprecher";$aname[0][2] = "Uhrenradio";$aname[0][3] = "Weltempfänger";

$aname[1][0] = "DVD-Recorder";$aname[1][1] = "DVD-Player";

Hinweis

Die Arrays sind hier zur Vereinfachung fest codiert. Natürlich werden diesein der Praxis in einer Datenbank abgelegt, und es erfolgen die entsprechen-den Datenbankabfragen. Der Inhalt der Include-Datei wird weiter untenangegeben.

405

Page 407: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Sessions und Cookies12

$aname[1][2] = "Fernbedienung";$aname[1][3] = "Portable DVD-Kombi";$aname[1][4] = "DVD-Videokombi";

$aname[2][0] = "PMR-Funkgerätepaar";$aname[2][1] = "Handscanner";$aname[2][2] = "Doppelstandlader";

/* Nummern der Artikel */$artnr[0][0] = "7609";$artnr[0][1] = "7612";$artnr[0][2] = "7632";$artnr[0][3] = "7678";

$artnr[1][0] = "4418";$artnr[1][1] = "4422";$artnr[1][2] = "4471";$artnr[1][3] = "4475";$artnr[1][4] = "4482";$artnr[2][0] = "6213";$artnr[2][1] = "6265";$artnr[2][2] = "6267";

/* Preise der Artikel */$preis[0][0] = 6.95;$preis[0][1] = 79.95;$preis[0][2] = 17.95;$preis[0][3] = 29.95;

$preis[1][0] = 249.00;$preis[1][1] = 49.95;$preis[1][2] = 19.95;$preis[1][3] = 279.00;$preis[1][4] = 189.00;

$preis[2][0] = 29.95;$preis[2][1] = 89.95;$preis[2][2] = 14.95;

?>

Listing 12.7 Datei sc_shop.inc.php

406

Page 408: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiel für Sessions: Webshop 12.4

12.4.4 Tabelle der Artikel

Nachfolgend der Code für die Tabelle der Artikel:

<?php/* Session starten oder wieder aufnehmen */session_start();

?><html><body><?php/* Falls diese Seite direkt angewählt wurde */if(!isset($_GET["abtnr"]))

echo "Keine Abteilung angegeben!";echo "<p><a href='sc_shop_a.php'>Zur Startseite</a></p>";echo "</body></html>";exit;

/* Abteilungsnummer übernehmen */$abtnr = $_GET["abtnr"];/* Arrays einbinden */include "sc_shop.inc.php";

/* Abteilungsname ausgeben */echo "<h3>$abtname[$abtnr]</h3>";

echo "<p>Wählen Sie aus:</p>";echo "<form action='sc_shop_c.php?abtnr=$abtnr'

method='post'>";?><table border="1"><tr>

<td><b>Artikel</b></td><td><b>Nr.</b></td><td><b>Preis</b></td><td><b>Anzahl</b></td>

</tr><?php/* Alle Artikel dieser Abteilung ausgeben */for($i=0; $i<sizeof($aname[$abtnr]); $i++)

echo "<tr>";echo "<td>" . $aname[$abtnr][$i] . "</td>";

407

Page 409: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Sessions und Cookies12

echo "<td>" . $artnr[$abtnr][$i] . "</td>";echo "<td align='right'>"

. number_format($preis[$abtnr][$i],2,",",".")

. " &euro;</td>";

/* Eingabefeld für Anzahl */echo "<td><input name='anzahl[$i]' size='5'";if(isset($_SESSION["anzahl"][$abtnr][$i]))

echo " value='". $_SESSION["anzahl"][$abtnr][$i] . "'";

echo " /></td>";echo "</tr>";

?></table><p><input type="submit" value="In den Warenkorb" /></p></form>

<p><a href="sc_shop_a.php">Zur Startseite</a></p></body></html>

Listing 12.8 Datei sc_shop_b.php

Erläuterung:

Zunächst wird mit session_start() eine Session gestartet (beim ers-ten Aufruf der Seite) oder wieder aufgenommen. Bei Wiederauf-nahme stehen alle Elemente des Session-Arrays (also die bisherigenEinkäufe) zur Verfügung.

Falls der Benutzer diese Seite direkt anwählt, also über die Eingabeder Adresse, steht keine Abteilungsnummer zur Verfügung. Es wirdeine Fehlermeldung ausgegeben. Ein Hyperlink führt zur Startseite,und das Dokument wird beendet.

$_GET Im »Normalfall« wird die Abteilungsnummer per GET-Parameterübergeben, und zwar mit Hilfe des superglobalen Arrays $_GET. Siewird hier zur Vereinfachung in der Variablen $abtnr abgespeichert.Die Arrays werden eingebunden, und der Abteilungsname wird aus-gegeben.

Es folgt ein Formular, dessen Inhalt an den Warenkorb (Dateisc_shop_c.php) gesendet wird. Die Abteilungsnummer wird wie-derum per GET-Parameter übergeben (sc_shop_c.php?abtnr=$abtnr).

408

Page 410: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiel für Sessions: Webshop 12.4

number_format() In der Tabelle werden für jeden Artikel dieser Abteilung der Artikel-name, die Artikelnummer und der Preis ausgegeben. Der Preis wirdmit Hilfe der Funktion number_format() formatiert (Darstellung mitTausenderpunkt, zwei Nachkommastellen, Komma als Dezimaltrenn-zeichen).

Außerdem steht jeweils ein Eingabefeld für die gewünschte Anzahlzur Verfügung. Alle Eingabefelder haben den gleichen Namen undwerden durch eine laufende Nummer voneinander unterschieden.Ein Eingabefeld wird mit einem Wert gefüllt, falls der Benutzer in die-ser Abteilung bereits vorher eine Auswahl getroffen haben sollte. Indiesem Fall existiert das betreffende Element in $_SESSION

["anzahl"].

Der Submit-Button führt zur Übermittlung der Daten in den Waren-korb.

12.4.5 Warenkorb

Der Programmcode für den Warenkorb:

<?php/* Session starten oder wieder aufnehmen */session_start();

?><html><body><h3>Warenkorb</h3><p>Sie haben bisher gewählt:</p>

<table border="1"><tr>

<td><b>Artikel</b></td><td><b>Nr.</b></td><td><b>Einzelpreis</b></td><td><b>Anzahl</b></td><td><b>Gesamtpreis</b></td>

</tr>

<?php/* Arrays einbinden */include "sc_shop.inc.php";

/* Falls neue Artikel in den Warenkorb kommen,werden sie in das Session-Array übernommen */

409

Page 411: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Sessions und Cookies12

if(isset($_GET["abtnr"]))

/* Abteilungsnummer übernehmen */$abtnr = $_GET["abtnr"];

for($i=0; $i<sizeof($aname[$abtnr]); $i++)

/* Falls dieser Artikel ausgewählt wurde */if(intval($_POST["anzahl"][$i]) > 0)

$_SESSION["anzahl"][$abtnr][$i]= intval($_POST["anzahl"][$i]);

/* Ausgabe der Inhalte des Session-Arrays: *//* Gesamteinkaufspreis */$summe = 0;

/* Alle Abteilungen */for($a=0; $a<sizeof($abtname); $a++)

/* Alle Artikel einer Abteilung */for($i=0; $i<sizeof($aname[$a]); $i++)

/* Falls dieser Artikel im Session-Array vorhanden */if(isset($_SESSION["anzahl"][$a][$i]))

echo "<tr>";echo "<td>" . $aname[$a][$i] . "</td>";echo "<td>" . $artnr[$a][$i] . "</td>";echo "<td align='right'>"

. number_format($preis[$a][$i],2,",",".")

. " &euro;</td>";echo "<td align='right'>"

. $_SESSION["anzahl"][$a][$i] . "</td>";

/* Gesamtpreis für diesen Artikel berechnen */$gp = $preis[$a][$i] * $_SESSION["anzahl"][$a][$i];

/* Gesamtpreis aktualisieren und ausgeben */$summe += $gp;echo "<td align='right'>"

. number_format($gp,2,",",".")

. " &euro;</td>";echo "</tr>";

410

Page 412: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiel für Sessions: Webshop 12.4

/* Gesamteinkaufspreis in Session-Array speichern */$_SESSION["summe"] = $summe;

/* Gesamteinkaufspreis ausgeben */echo "<tr>";echo "<td colspan='4'>Gesamteinkaufspreis</td>";echo "<td align='right'>"

. number_format($summe,2,",",".") . " &euro;</td>";echo "</tr>";?></table><p><a href="sc_shop_d.php">Zur Kasse</a></p><p><a href="sc_shop_a.php">Zur Startseite</a></p></body></html>

Listing 12.9 Datei sc_shop_c.php

Erläuterung:

Zunächst wird mit session_start() eine Session gestartet (beim ers-ten Aufruf der Seite) oder wieder aufgenommen. Bei Wiederauf-nahme stehen alle Elemente des Session-Arrays (also die bisherigenEinkäufe) zur Verfügung.

Die Überschrift und der Beginn der Tabelle mit den Spaltenüber-schriften werden ausgegeben.

Die Arrays werden eingebunden.

Für den Fall, dass diese Seite über den Button In den Warenkorb auf-gerufen wurde, steht die Abteilungsnummer in einem GET-Parameterzur Verfügung. Sie wird hier zur Vereinfachung in der Variablen$abtnr abgespeichert.

Es wird dann für alle Artikel der Abteilung, von der aus der Waren-korb aufgerufen wurde, überprüft, ob im zugehörigen Eingabefeldeine gültige ganze Zahl gestanden hat, die größer als 0 ist, mit anderenWorten, ob der betreffende Artikel ausgewählt wurde. Diese Zahlsteht im Array $_POST zur Verfügung. Da jedes Element im Formularden gleichen Namen (anzahl) und eine laufende Nummer hat, heißtdas betreffende Element $_POST["anzahl"][$i].

411

Page 413: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Sessions und Cookies12

Wurde der betreffende Artikel ausgewählt, wird die Zahl in das Array$_SESSION übernommen. Dieses Array hat im vorliegenden Beispieldrei Dimensionen:

Die erste Dimension bezeichnet das Element anzahl. Alle Men-genangaben sind hier gespeichert.

Die zweite Dimension bezeichnet die Abteilung.

Die dritte Dimension entspricht der laufenden Nummer innerhalbder Abteilung.

Sie sehen, dass im Array $_SESSION nicht nur einzelne Variablen, son-dern ganze Felder gespeichert werden können. Die Regeln für mehr-dimensionale Felder finden, wie gewohnt, Anwendung.

Für den Fall, dass diese Seite direkt über den Hyperlink Zum Waren-korb von der Startseite aufgerufen wurde, wird dem Array $_SESSIONkein Element hinzugefügt. Es erfolgt lediglich die Anzeige des Waren-korbinhalts.

Dazu wird das gesamte Array $_SESSION für alle Abteilungen und alleArtikel durchlaufen. Es wird geprüft, ob das zugehörige Element exis-tiert (also der Artikel in den Warenkorb gelegt wurde). Ist dies derFall, so werden die Daten des Artikels ausgegeben. Gleichzeitig wirdaus dem Einzelpreis und der Anzahl der Gesamtpreis pro Artikelsowie der Gesamteinkaufspreis berechnet. Alle Preise werden (wieweiter oben bereits erläutert) formatiert ausgegeben.

Der Gesamteinkaufspreis wird am Ende der Tabelle ausgegeben undzusätzlich im Array $_SESSION gespeichert.

Der Kunde kann nun weitere Artikel auswählen oder zur Kasse gehen.

12.4.6 Kasse

Der Gang zur Kasse wird hier nur angedeutet, daher nur minimaler Pro-grammcode:

<?php/* Session starten oder wieder aufnehmen */session_start();

?><html><body><h3>Kasse</h3><?phpecho "<p>Bitte bezahlen Sie den Gesamteinkaufspreis von ";

412

Page 414: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Cookies 12.5

echo number_format($_SESSION["summe"],2,",","."). " &euro;.</p>";

?><p>........</p><p><a href="sc_shop_a.php">Zur Startseite</a></p></body></html>

Listing 12.10 Datei sc_shop_d.php

Erläuterung:

Zunächst wird mit session_start() die Session wieder aufgenommen.Anschließend wird der Benutzer aufgefordert, den Gesamteinkaufspreiszu bezahlen, der über das Session-Array hierher »transportiert« wurde.

12.5 Cookies

Falls Daten über einen längeren Zeitraum aufbewahrt werden sollen,zum Beispiel über mehrere Tage oder ein Jahr, können Sie Cookies ver-wenden. Dabei handelt es sich um kleine Dateien auf dem Rechner desBenutzers. Je nach Einstellung des Browsers werden Cookies allerdingsteilweise oder vollständig verhindert. Daher können Sie diese Möglich-keit nicht immer einsetzen.

setcookie()Zum Erzeugen von Cookies benötigen Sie die Funktion setcookie().Diese hat sechs Parameter:

Name

Wert

Ablaufdatum

Domain

Pfad

Sicherheitsstatus

Nur die ersten drei Parameter müssen Sie im Regelfall explizit setzen.Nach dem Ablaufdatum wird das Cookie automatisch gelöscht. JedeDomain soll natürlich nur ihre eigenen Cookies auf dem Rechner desBenutzers lesen können. Außerdem kann ein Server gleiche Cookiesbezüglich unterschiedlicher Anwendungen (die in unterschiedlichen Pfa-

413

Page 415: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Sessions und Cookies12

den installiert sein müssen) setzen. Domain und Pfad werden automa-tisch vom Server gesetzt, falls Sie sie beim Setzen weglassen.

Falls auf dem Rechner eines Benutzers Cookies gefunden werden, diezum Server und zum Pfad passen, stehen sie im superglobalen Array$_COOKIE zur Verfügung.

Abbildung 12.13 Cookie-Einstellung in Mozilla Firefox 7

Je nach Einstellung des Browsers des Benutzers werden Cookies automa-tisch gelöscht, unabhängig von den gewählten Werten. Falls Sie nichtmöchten, dass sie gelöscht werden, gehen Sie in Mozilla Firefox 7 imMenü Einstellungen zur Registerkarte Datenschutz. Dort wählen Sieaus Firefox wird eine Chronik nach benutzerdefinierten Einstellun-

gen anlegen. Anschließend entfernen Sie das Häkchen bei Immer den

privaten Modus verwenden. Im Bereich Cookies von Drittanbietern

akzeptieren wählen Sie Behalten, bis sie nicht mehr gültig sind aus,siehe Abbildung 12.13. Unter Ubuntu sind die Einstellmöglichkeiten füreinen normalen Benutzer eingeschränkt. In der Standardeinstellung wer-den Cookies gespeichert.

414

Page 416: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiel für Cookies: Besuch 12.6

12.6 Beispiel für Cookies: Besuch

Zunächst ein einfaches Beispiel, in dem die Existenz eines Cookiesgeprüft wird. Beim ersten Besuch auf der Seite sehen Sie Abbildung12.14.

Abbildung 12.14 Erster Besuch

Bei weiteren Besuchen auf der Seite erscheint eine Ausgabe wie in Abbil-dung 12.15 (vorausgesetzt, der Browser akzeptiert Cookies und speichertdiese lange genug).

Abbildung 12.15 Weiterer Besuch

Dies gilt unabhängig davon, ob

die Seite lediglich aktualisiert wurde,

der Benutzer innerhalb der gleichen Session auf die gleiche Seitezurückkehrt,

der Browser in der Zwischenzeit geschlossen wurde oder

der Rechner des Benutzers in der Zwischenzeit ausgeschaltet war.

Die Information, ob der Benutzer diese Seite bereits besucht hat, bleibterhalten.

Cookies anzeigenAls Beispiel soll das Cookie im Browser Mozilla Firefox 7 gezeigt werden.Neben der in Abbildung 12.13 gewählten Einstellung Behalten, bis sie

415

Page 417: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Sessions und Cookies12

nicht mehr gültig sind gelangen Sie über den Button Cookies anzeigen

zur Liste der Cookies.

Abbildung 12.16 Anzeige der gespeicherten Cookies

Sie erkennen in Abbildung 12.16 den Namen Besuch, den Wert 1, dieDomain localhost, gegebenenfalls den Pfad unterhalb des Basisver-zeichnisses und das Ablaufdatum.

Zum Code dieser Seite:

<?php/* Falls Cookie vorhanden */if (isset($_COOKIE["Besuch"])) $neu = 0;else $neu = 1;setcookie("Besuch", "1", time() + 86400);

?>

Hinweis

Falls Sie die gleiche Seite mit einem anderen Browser besuchen, handelt essich wieder um einen ersten Besuch. Dies liegt daran, dass jeder Browserseine eigenen Cookies an anderer Stelle auf dem Rechner des Benutzersspeichert. Im Regelfall kann man aber davon ausgehen, dass durchgehendder gleiche Browser benutzt wird.

416

Page 418: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiel für Cookies: Adressspeicherung 12.7

<html><body><h3>Cookies</h3><?php

/* Falls erster Besuch */if ($neu==1)

echo "<p>Sie waren noch nicht hier<br />oder Sie akzeptieren beziehungsweisespeichern keine Cookies.</p>";

elseecho "<p>Sie waren schon einmal hier.</p>";

?></body></html>

Listing 12.11 Datei sc_besuch.php

Erläuterung:

Zunächst wird geprüft, ob im superglobalen Array $_COOKIE das Ele-ment Besuch existiert. Ist dies nicht der Fall, so handelt es sich um denersten Besuch. Der Benutzer ist also neu auf der Seite. Die Variable$neu erhält den Wert 1 oder 0, je nachdem, ob das Element Besuchexistiert.

setcookie() Die Funktion setcookie() wird aufgerufen. Das Cookie erhält denNamen Besuch, den Wert 1 (hier nicht wichtig) und läuft in 24 Stun-den ab.

time() Zur Zeitbestimmung wird hier die Funktion time() aufgerufen. Dieseliefert einen aktuellen Timestamp (in Sekunden). Zu diesem Wertwerden 24 Stunden (= 86.400 Sekunden) hinzugerechnet.

Wie auch bei der Funktion session_start() muss der Aufruf vonsetcookie() vor dem Aufruf der eigentlichen Seite erfolgen.

Im eigentlichen Dokument wird – abhängig vom Wert der Variablen$neu – ein Informationstext ausgegeben.

12.7 Beispiel für Cookies: Adressspeicherung

In diesem Beispiel soll eine Adresse, zum Beispiel die Lieferadresse oderdie Rechnungsadresse eines Benutzers bei einem Webshop, gespeichertwerden. Bei der nächsten Bestellung kann dem Benutzer somit Arbeiterspart werden.

417

Page 419: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Sessions und Cookies12

Beim ersten Besuch erscheint die Adressseite (in Abbildung 12.17 nurNachname und Vorname) mit einem leeren Formular, da der Benutzerdem Webshop noch unbekannt ist.

Abbildung 12.17 Neuer Kunde, Daten noch nicht gespeichert

Der Benutzer gibt seine Adressdaten ein, betätigt den Button Bestellen

und bekommt eine Bestätigung, siehe Abbildung 12.18. Gleichzeitigwerden seine Adressdaten in Cookies gespeichert.

Abbildung 12.18 Bestätigung der Adresse

Beim nächsten Besuch des Webshops erscheint die Adressseite miteinem bereits gefüllten Formular, siehe Abbildung 12.19.

Abbildung 12.19 Bekannter Kunde, Daten bereits gespeichert

418

Page 420: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiel für Cookies: Adressspeicherung 12.7

Die Daten werden aus den gespeicherten Cookies ermittelt. Der Benutzerkann diese Daten direkt verwenden oder geänderte Daten eintragen.

Der Programmcode des Formulars sieht wie folgt aus:

<html><body><h3>Ihr Name</h3><form action="sc_adresse_b.php" method="post"><?php

echo "<p><input name='nname' size='20' value='";if(isset($_COOKIE["nname"]))

echo $_COOKIE["nname"];echo "' /> Nachname</p>";

echo "<p><input name='vname' size='20' value='";if(isset($_COOKIE["vname"]))

echo $_COOKIE["vname"];echo "' /> Vorname</p>";

?><p><input type="submit" value="Bestellen" /></p></form></body></html>

Listing 12.12 Datei sc_adresse_a.php

Erläuterung:

Es wird ein Formular abgebildet, das die Bestätigung (Dateisc_adresse_b.php) anfordert.

Es beinhaltet die beiden Eingabefelder nname und vname.

Falls es bereits zugehörige Cookies gibt, werden die entsprechendenWerte eingetragen, ansonsten bleiben die Eingabefelder leer.

Der Programmcode der Bestätigung sieht wie folgt aus:

<?php$t = time() + 60 * 60 * 24 * 365;setcookie("nname", $_POST["nname"], $t);setcookie("vname", $_POST["vname"], $t);

?><html><body><h3>Bestätigung</h3><p>Ihre Ware wird versandt,

419

Page 421: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Sessions und Cookies12

<?phpecho $_POST["vname"] . " " . $_POST["nname"];

?></p></body></html>

Listing 12.13 Datei sc_adresse_b.php

Erläuterung:

Es werden zwei Cookies gesetzt. Diese erhalten die Werte aus demgesendeten Formular.

Bei jedem Absenden überschreibt also der aktuelle Formularinhalt dieCookies, falls diese bereits vorhanden sind.

Als Ablaufdatum wird »heute in einem Jahr« (heutiges Datum+60×60×24×365 Sekunden) gesetzt.

In der Bestätigung werden die gesendeten Formulardaten zur Kon-trolle noch einmal ausgegeben.

In Abbildung 12.20 wird die zugehörige Liste der Cookies angezeigt,davon das erste Cookie mit Werten.

Abbildung 12.20 Liste der Cookies, Cookie »vname«

420

Page 422: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

13 Datenbanken mit SQLite3

SQLite3 kann als Ersatz für ein komplexes Datenbankmanagementsys-tem dienen. Die SQLite3-Bibliothek ist bei einer XAMPP- beziehungs-weise EasyPHP-Installation unter Windows bereits eingebunden. UnterUbuntu muss PHP mit SQLite3 neu kompiliert und installiert werden. Siekönnen mit dem nachfolgenden Programm leicht feststellen, ob dieBibliothek installiert ist:

<html><body><?php

if (extension_loaded("sqlite3"))echo "sqlite3-Bibliothek vorhanden<br />";

elseecho "sqlite3-Bibliothek nicht vorhanden<br />";

?></body></html>

Listing 13.1 Datei sq3_pruefen.php

Die Funktion extension_loaded() prüft, ob die betreffende Extensiongeladen ist.

13.1 SQLite3

SQLite3 arbeitet auf der Basis von Textdateien und nutzt die aus Kapi-tel 4, »Datenbanken mit MySQL«, bekannten SQL-Befehle. Einige Ei-genschaften von SQLite3:

Textdatei Sie müssen sich keine Gedanken um einen Datenbankserver machen,der zusätzlich zum Webserver installiert sein muss. Sie sollten aller-dings die Textdateien von SQLite3 in eigenen, geschützten Verzeich-nissen unterbringen, damit sie nicht einfach vom Webserver herun-tergeladen werden können.

421

Page 423: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit SQLite313

Leicht zupublizieren

Jede Datenbank wird bei SQLite3 in einer separaten Datei abgespei-chert. Dadurch wird es sehr einfach, die Datenbank zu publizieren.Die Datenbankdatei kann einfach mit einem FTP-Programm (zum Bei-spiel FileZilla, siehe Abschnitt 3.6, »PHP-Programme publizieren«) aufden Server geladen werden. Mehrere Schreibvorgänge sind allerdingsnicht gleichzeitig möglich, da für die Dauer des ersten Schreibvor-gangs die gesamte Datei gesperrt wird.

Geschwindigkeit Bei kleineren Datenbanken ist SQLite3 mindestens genauso schnellwie zum Beispiel ein MySQL-Datenbankserver. Bei größeren Daten-banken ergeben sich Vorteile auf Seiten »echter« Datenbankserver,weil bessere Techniken eingesetzt werden. Im Unterschied zu MySQLdarf eine SQLite3-Datenbank auch im kommerziellen Rahmen einge-setzt werden.

Datentyplos SQLite3 hat eine weitere Besonderheit: Es ist ein datentyploses System(mit einer Ausnahme, siehe unten). Sie haben dadurch den Vorteil, keineDatentypen angeben zu müssen, allerdings entfallen im Gegenzug einigeautomatische Kontrollmöglichkeiten. Falls es also wichtig sein sollte,Daten des richtigen Typs zu verwenden, müssen Sie dies durch zusätzli-chen Code kontrollieren.

integerprimary key

Eine Ausnahme bildet der Datentyp integer primary key. Ein Feld die-ses Typs kann für den Primärschlüssel verwendet werden und hat auto-matisch die Eigenschaft auto_increment. Falls Sie also keinen Wert vor-geben, wird der höchste vorhandene Wert um 1 erhöht.

13.2 Datenbankdatei, Tabelle und Datensätze erzeugen

Bei der Bibliothek für SQLite3 handelt es sich um eine Klassenbibliothek.Die verschiedenen Funktionen werden als Objektmethoden ausgeführt.Dabei kommen Objekte zum Einsatz, die die Verbindung zur SQLite3-Datenbank beziehungsweise das Abfrageergebnis repräsentieren.

Zunächst sollen eine Datenbankdatei und eine Tabelle erzeugt werden.Aus Gründen der Vergleichbarkeit verwenden wir das Beispiel aus Kapi-tel 4, »Datenbanken mit MySQL« (Datenbank firma, Tabelle personen,drei Datensätze). Der Programmcode hierfür:

<html><body>

422

Page 424: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbankdatei, Tabelle und Datensätze erzeugen 13.2

<?php/* Datenbankdatei öffnen bzw. erzeugen */$db = new SQLite3("sq3.db");

/* Tabelle mit Primärschlüssel erzeugen */$db->exec("create table personen (name, vorname,

personalnummer integer primary key,gehalt, geburtstag);");

/* Drei Datensätze eintragen */$sqlstr = "insert into personen (name, vorname,

personalnummer, gehalt, geburtstag) values ";$db->query($sqlstr . "('Maier', 'Hans',

6714, 3500, '1962-03-15')");$db->query($sqlstr . "('Schmitz', 'Peter',

81343, 3750, '1958-04-12')");$db->query($sqlstr . "('Mertens', 'Julia',

2297, 3621.5, '1959-12-30')");

/* Verbindung zur Datenbankdatei wieder lösen */$db->close();

?></body></html>

Listing 13.2 Datei sq3_neu.php

Erläuterung:

new SQLite3 Zunächst wird mit Hilfe von new ein neues Objekt der Klasse SQLite3erzeugt. Der Name der Datenbankdatei ist hier sq3.db. Die Endung istbeliebig wählbar. Falls die Datenbankdatei nicht existiert, wird sieerzeugt. Rückgabewert ist ein Verweis auf das neu erzeugte Objekt.

exec() Über diesen Verweis wird die Methode exec() aufgerufen. Sie wirdbei SQL-Befehlen genutzt, die kein Rückgabeergebnis liefern. In die-sem Fall wird sie zur Erzeugung der Tabelle mit create table einge-setzt. Die Tabelle wird mit insgesamt fünf Feldern erzeugt. Es fällt auf,dass keine Datentypen angegeben werden, außer für das Feld perso-nalnummer. Auf diesem Feld sollte der Primärschlüssel liegen.

query() Die Methode query() wird für SQL-Abfragen mit Rückgabeergebniseingesetzt. Damit werden hier die drei Datensätze mit insert into... erzeugt. Der Anfang des Befehls ist für alle drei Datensätze gleich,daher wurde er in der Variablen $sqlstr gespeichert. Zeichenkettenund Datumsangaben werden, wie gewohnt, in Anführungszeichen

423

Page 425: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit SQLite313

gesetzt. Als Dezimaltrennzeichen wird der Punkt verwendet (einKomma würde den Übergang zum nächsten Feldinhalt kennzeich-nen).

close() Zuletzt wird die Verbindung zur Datenbank mit Hilfe der Methodeclose() wieder geschlossen.

13.3 Abfrage der Datensätze

Die Datensätze aus der soeben erzeugten Tabelle sollen abgefragt undausgegeben werden. Das Ergebnis sehen Sie in Abbildung 13.1.

Abbildung 13.1 Datensätze aus der SQLite3-Datenbankdatei

Wie Ihnen sicher aufgefallen ist, sind die Datensätze unabhängig von derEinfügereihenfolge automatisch nach dem Feld personalnummer sortiert.Dies ist das Feld, auf dem der Primärschlüssel liegt. Der Programmcode:

<html><body><?php

/* Datenbankdatei öffnen bzw. erzeugen */$db = new SQLite3("sq3.db");

/* Abfrage ausführen */$res = $db->query("select * from personen");

/* Abfrageergebnis ausgeben */while($dsatz = $res->fetchArray(SQLITE3_ASSOC))

Hinweis

Auch wenn es nicht notwendig ist, werden beim Einfügen eines Datensatzesdennoch alle Feldnamen angegeben. Dies ist wegen der Datentyplosigkeitvon SQLite3 noch wichtiger als bei anderen Datenbanksystemen. Ein mögli-cher Fehler kann in SQLite3 nicht so leicht bemerkt werden, da beim Einfü-gen alle Typen akzeptiert werden.

424

Page 426: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Benutzeroberfläche mit JavaScript und CSS 13.4

echo $dsatz["name"] . ", "

. $dsatz["vorname"] . ", "

. $dsatz["personalnummer"] . ", "

. $dsatz["gehalt"] . ", "

. $dsatz["geburtstag"] . "<br />";

/* Verbindung zur Datenbankdatei wieder lösen */$db->close();

?></body></html>

Listing 13.3 Datei sq3_abfragen.php

Erläuterung:

SQLite3Result Nach dem Öffnen der Datenbankdatei wird mit Hilfe der Methodequery() die Abfrage ausgeführt. Sie liefert einen Verweis auf dasObjekt der Klasse SQLite3Result, das das Abfrageergebnis beinhaltet.

fetchArray() Die Methode fetchArray() dient der Speicherung eines Datensatzesaus dem Abfrageergebnis in einem eindimensionalen Array. Gleich-zeitig wird der Rückgabewert benutzt, um die while-Schleife zu steu-ern. Die Inhalte des Arrays können Sie in der gewohnten Form ausge-ben, unter Verwendung des assoziativen Indexes.

SQLITE3_ASSOC Der zweite Parameter der Methode fetch_array() ist optional. DieAngabe SQLITE3_ASSOC bewirkt, dass jeder Datensatz nur einmalzurückgeliefert wird, mit dem Feldnamen als assoziativem Index.Falls Sie den zweiten Parameter weglassen, wird jeder Datensatz zwei-mal zurückgeliefert, einmal mit numerischem Index, einmal mit asso-ziativem Index. Dies sollten Sie aus Performancegründen vermeiden.

13.4 Benutzeroberfläche mit JavaScript und CSS

Das Beispielprogramm db_linkcss.php aus Abschnitt 4.2.9, »Benutzer-oberfläche mit JavaScript und CSS«, stelle ich nun in einer SQLite3-Vari-ante vor. Damit soll noch einmal die Ähnlichkeit zwischen SQLite3 undklassischen Datenbanken verdeutlicht werden.

JavaScriptund CSS

In diesem Programm werden SQL-Abfragen zum Anzeigen, Erzeugen,Ändern und Löschen von Datensätzen zu einer komfortabel zu bedienen-

425

Page 427: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit SQLite313

den Benutzeroberfläche einer Tabelle vereinigt. Es werden Hyperlinksmit JavaScript-Code zur Erzeugung dynamischer Abfragen sowie CSS-Formatierungen zur optischen Gestaltung eingesetzt.

Sortierung Hinzugefügt wird lediglich die Möglichkeit, die Datensätze nach einembeliebigen Feld aufsteigend zu sortieren. Bei Betätigung eines der Hyper-links in den Feldnamen wird nach dem betreffenden Feldnamen sortiert.Abbildung 13.2 zeigt die dazugehörige Bildschirmausgabe.

Abbildung 13.2 Hyperlinks zum Sortieren, Ändern und Löschen

Es folgt der Programmcode:

<html><head><link rel="stylesheet" type="text/css"

href="sq3_linkcss.css">

<script type="text/javascript">function send(ak,id)

if(ak==0)document.f.ak.value = "in";

else if(ak==1)document.f.ak.value = "up";

else if(ak==2)

if (confirm("Datensatz mit id " + id + " löschen?"))document.f.ak.value = "de";

elsereturn;

document.f.id.value = id;

426

Page 428: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Benutzeroberfläche mit JavaScript und CSS 13.4

document.f.submit();</script></head><body><?php

/* Datenbank-Datei öffnen bzw. erzeugen */$db = new SQLite3("sq3.db");

/* Sortierung, wird ggf. überschrieben */$od = "";

/* Aktion ausführen */if(isset($_POST["ak"]))

/* neu eintragen */if($_POST["ak"] == 'in')

$sqlab = "insert into personen". "(name, vorname, personalnummer,". " gehalt, geburtstag) values ". "('" . $_POST["na"][0] . "', ". "'" . $_POST["vo"][0] . "', ". "'" . $_POST["pn"][0] . "', ". "'" . $_POST["gh"][0] . "', ". "'" . $_POST["gb"][0] . "')";

$db->query($sqlab);

/* ändern */else if($_POST["ak"] == "up")

$id = $_POST["id"];$sqlab = "update personen set name = '"

. $_POST["na"][$id] . "', ". " vorname = '" . $_POST["vo"][$id] . "',". " personalnummer = '" . $_POST["pn"][$id]. "',". " gehalt = '" . $_POST["gh"][$id] . "',". " geburtstag = '" . $_POST["gb"][$id] . "'". " where personalnummer = $id";

$db->query($sqlab);

427

Page 429: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit SQLite313

/* löschen */else if($_POST["ak"] == "de")

$sqlab ="delete from personen where personalnummer = ". $_POST["id"];

$db->query($sqlab);

/* sortieren */else if(isset($_GET["ak"]))

if($_GET["ak"] == "sna")$od = " order by name";

else if($_GET["ak"] == "svo")$od = " order by vorname";

else if($_GET["ak"] == "spe")$od = " order by personalnummer";

else if($_GET["ak"] == "sgh")$od = " order by gehalt";

else if($_GET["ak"] == "sgb")$od = " order by geburtstag";

/* Formularbeginn */echo "<form name='f' action='sq3_linkcss.php'

method='post'>";echo "<input name='ak' type='hidden' />";echo "<input name='id' type='hidden' />";

/* Tabellenbeginn */echo "<table><tr>";echo "<td>

<a href='sq3_linkcss.php?ak=sna'>Name</a></td>";echo "<td>

<a href='sq3_linkcss.php?ak=svo'>Vorname</a></td>";echo "<td><a href='sq3_linkcss.php?ak=spe'>Pnr</a></td>";echo "<td>

<a href='sq3_linkcss.php?ak=sgh'>Gehalt</a></td>";echo "<td>

<a href='sq3_linkcss.php?ak=sgb'>Geburtstag</a></td>";echo "<td>Aktion</td></tr>";

428

Page 430: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Benutzeroberfläche mit JavaScript und CSS 13.4

/* Neuer Eintrag */echo "<tr>";echo "<td><input name='na[0]' size='6' /></td>";echo "<td><input name='vo[0]' size='6' /></td>";echo "<td><input name='pn[0]' size='6' /></td>";echo "<td><input name='gh[0]' size='6' /></td>";echo "<td><input name='gb[0]' size='10' /></td>";echo "<td><a href='javascript:send(0,0);'>

neu eintragen</a></td>";echo "</tr>";

/* Anzeigen */$res = $db->query("select * from personen $od");

/* Alle vorhandenen Datensätze */while($dsatz = $res->fetchArray())

$id = $dsatz["personalnummer"];echo "<tr>";echo "<td><input name='na[$id]' value='"

. $dsatz["name"] . "' size='6' /></td>";echo "<td><input name='vo[$id]' value='"

. $dsatz["vorname"] . "' size='6' /></td>";echo "<td><input name='pn[$id]' value='" . $id

. "' size='6' /></td>";echo "<td><input name='gh[$id]' value='"

. $dsatz["gehalt"] . "' size='6' /></td>";echo "<td><input name='gb[$id]' value='"

. $dsatz["geburtstag"] . "' size='10' /></td>";echo "<td>

<a href='javascript:send(1,$id);'>ändern</a>";echo " <a href='javascript:send(2,$id);'>löschen</a>

</td>";echo "</tr>";

echo "</table></form>";$db->close();

?></body></html>

Listing 13.4 Datei sq3_linkcss.php

429

Page 431: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit SQLite313

Ähnlichkeiten beziehungsweise Unterschiede zur Datei db_linkcss.php:

Die Bildschirmausgabe bleibt gleich.

Im Dokumentkopf wird nun die CSS-Datei sq3_linkcss.css eingebun-den. Der Inhalt der Datei wurde gegenüber der Datei db_linkcss.cssnicht verändert.

Die JavaScript-Funktion send() im Dokumentkopf wurde nicht ver-ändert, da sich die Namen des Formulars und seiner Elemente nichtverändert haben.

Die Datenbankdatei wird mit new SQLite3() geöffnet. Der zurückge-gebene Verweis wird im restlichen Programm verwendet, um dieDatenbankdatei zu erreichen.

Die SQL-Abfragen für die Funktionen neu eintragen, ändern undlöschen bleiben unverändert. Sie werden mit der Methode query()gesendet.

order by Falls eine Sortierung gewünscht wurde, wird die Zeichenkette $od mit... order by <Feldname> zusammengesetzt. Diese wird später für dieAnzeige benötigt.

Der Formularbeginn und die Zeile mit den Formularfeldern für denneuen Eintrag bleiben gleich.

In der Tabellenüberschrift wurden Hyperlinks zum Sortieren einge-fügt. Bei einer Betätigung eines Hyperlinks wird unmittelbar die glei-che PHP-Datei mit dem Parameter ak=<Sortierfeld> aufgerufen.

Die SQL-Abfrage zum Anzeigen der Daten wird um die Zeichenkette$od (mit ... order by <Feldname>) verlängert. Sie wird mit derMethode fetch_array() gesendet; das Ergebnis steht für jedenDatensatz im Array $dsatz zur Verfügung.

Leicht zu ändern Sie sehen also, dass ein vorhandenes Programm zur Bearbeitung einerMySQL-Tabelle mit relativ wenigen Schritten und ohne tiefe Eingriffe inden Ablauf in ein entsprechendes Programm für SQLite3 umgewandeltwerden kann.

13.5 Beispiel Kopfrechnen

Das Ihnen bereits bekannte Beispiel Kopfrechnen (siehe Abschnitt 10.9,»Kopfrechnen mit Zeitmessung«) führe ich nachfolgend in einer leichtabgeänderten Version vor. Die ermittelte Zeit des Spielers wird in einerSQLite3-Datenbank statt in einer MySQL-Datenbank gespeichert.

430

Page 432: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispiel Kopfrechnen 13.5

Die Dateien des Beispiels haben das einheitliche Präfix kopfsq3. Es gehtalso los mit kopfsq3.htm. Es muss lediglich die Klasse Highscore geän-dert werden:

<?php/* Klasse "Highscore" */class Highscore

function __construct($spieler, $dauer)

/* Falls keine DB vorhanden:DB mit Tabelle erstellen */

if(!file_exists("kopfsq3.db"))

$db = new SQLite3("kopfsq3.db");$db->exec("create table highscore"

. "(name, zeit)");

/* Falls DB vorhanden: DB öffnen */else

$db = new SQLite3("kopfsq3.db");

/* Datensatz einfügen */$db->query("insert into highscore (name, zeit)"

. " values ('$spieler', $dauer)");$db->close();

/* Datensätze anzeigen */$this->anzeigen();

function anzeigen()

/* Datensätze anzeigen */echo "<p><b>Highscore:</b></p>";echo "<p><table>";echo "<tr><td><b>Name</b></td>"

. "<td><b>Zeit</b></td></tr>";$db = new SQLite3("kopfsq3.db");$res = $db->query("select * from highscore"

. " order by zeit limit 10");while($dsatz = $res->fetchArray())

echo "<tr><td>" . $dsatz["name"]. "</td><td align='right'>"

431

Page 433: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Datenbanken mit SQLite313

. $dsatz["zeit"] . " Sek.</td></tr>";$db->close();echo "</table></p>";

?>

Listing 13.5 Datei kopfsq3_highscore.inc.php

Erläuterung:

Im Konstruktor wird geprüft, ob die SQLite-Datenbankdateikopfsq3.db existiert. Ist dies nicht der Fall, dann wird die Datenbank-datei neu erzeugt und mit einer neuen Tabelle bestückt. Ansonstenwird nur die Verbindung zur Datenbankdatei aufgenommen.

Nach dem Einfügen eines neuen Datensatzes in die Tabelle, die jetztauf jeden Fall existiert, wird die Methode anzeigen() aufgerufen.Anschließend wird die Verbindung zur Datenbankdatei wiedergeschlossen.

In der Methode anzeigen() werden die maximal zehn besten Ergeb-nisse aus der Datenbanktabelle abgerufen und in einer kleinen Tabelleauf dem Bildschirm ausgegeben.

432

Page 434: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

14 XML

Universelles Datenformat

XML ist ein weitverbreitetes, plattformunabhängiges Datenformat, dassich zum universellen Datenaustausch eignet. XML-Dateien sind miteinem einfachen Texteditor editierbar. Einige Regeln zur Erstellung vonXML-Dateien erläutere ich kurz anhand der Beispiele.

SimpleXMLEs soll eine mögliche Methode zum Einlesen, Bearbeiten und Ausgebenvon XML-Dateien (von PHP aus) vorgestellt werden: die PHP-Erweite-rung SimpleXML.

14.1 Einlesen eines einzelnen Objekts

Hierarchische Struktur

SimpleXML liest den gesamten Inhalt einer XML-Datei ein und konver-tiert ihn in ein PHP-Objekt, das die gleiche hierarchische Struktur hat wiedie XML-Daten. An einem einfachen Beispiel soll dies verdeutlicht wer-den. Zunächst eine XML-Datei, in der die Daten eines Objekts (hier einesFahrzeugs) gespeichert sind:

<?xml version="1.0"?><fahrzeug>

<marke>Opel</marke><typ>Astra</typ><motordaten>

<leistung>70 KW</leistung><hubraum>1600 ccm</hubraum>

</motordaten><gewicht>1200 Kg</gewicht>

</fahrzeug>

Listing 14.1 Datei xml_einzel.xml

Der Aufbau einer XML-Datei:

Zu Beginn steht eine Zeile, die die XML-Version angibt.

Auf der obersten Ebene darf es nur ein Objekt geben. Hier ist dies dasObjekt fahrzeug.

433

Page 435: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

XML14

XML-Markierungen

XML-Daten werden ähnlich wie HTML-Markierungen notiert, alsomit einer Anfangsmarkierung (hier <fahrzeug>) und einer Endmar-kierung (hier </fahrzeug>), allerdings können Sie die Markierungenfrei wählen.

Schachtelung XML-Daten können wie HTML-Markierungen geschachtelt werden,hier zum Beispiel <marke> ... </marke> innerhalb von <fahrzeug>und </fahrzeug>. Dadurch entstehen Objekteigenschaften, hiermarke, typ, motordaten und gewicht.

Die Eigenschaft motordaten ist wiederum ein Objekt mit den Eigen-schaften leistung und hubraum.

Wenn Sie die Datei in einem Browser aufrufen, wird lediglich die hierar-chische Struktur der XML-Daten wiedergegeben, siehe Abbildung 14.1.

Abbildung 14.1 XML-Datei im Browser

Die Daten werden mit dem folgenden PHP-Programm eingelesen undauf dem Bildschirm ausgegeben:

<html><body><?php/* Einlesen der Datei in ein Objekt */$fahrzeug = simplexml_load_file("xml_einzel.xml");

/* Ausgabe der Objektdaten */echo "Marke: $fahrzeug->marke<br />";echo "Typ: $fahrzeug->typ<br />";

434

Page 436: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Einlesen eines einzelnen Objekts 14.1

echo "Motordaten:<br />";echo "--- Leistung: "

. $fahrzeug->motordaten->leistung . "<br />";echo "--- Hubraum: "

. $fahrzeug->motordaten->hubraum . "<br />";echo "Gewicht: $fahrzeug->gewicht";?></body></html>

Listing 14.2 Datei xml_einzel.php

Erläuterung:

simplexml_load_file()

Die Funktion simplexml_load_file() dient dem Einlesen der gesam-ten XML-Datei in ein Objekt, hier $fahrzeug.

Auf die Eigenschaften wird in der Objektnotation zugegriffen.

Zugriff über -> Die Eigenschaft motordaten ist wiederum ein Objekt, daher wird aufdessen Eigenschaften wie folgt zugegriffen:$fahrzeug->motordaten->leistung.

Die Ausgabe sehen Sie in Abbildung 14.2.

Abbildung 14.2 Verarbeitung der XML-Datei mit PHP

Hinweis

Einfache Variablen, Elemente von eindimensionalen numerischen Feldernund Objekteigenschaften können Sie auch innerhalb von Zeichenkettennotieren, um zum Beispiel eine Ausgabeanweisung übersichtlicher zu gestal-ten. Dagegen müssen Sie Elemente von assoziativen Feldern oder von Fel-dern mit mehr als zwei Dimensionen und auch Eigenschaften von Objekten,die wiederum Eigenschaften übergeordneter Objekte sind, außerhalb vonZeichenketten notieren, wie hier zum Beispiel $fahrzeug->motordaten->leistung.

435

Page 437: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

XML14

14.2 Einlesen mehrerer Objekte

Array vonObjekten

Falls Sie mehrere gleiche Objekte in einer XML-Datei speichern möchten,müssen Sie sie innerhalb eines Hauptobjekts anordnen. Mehrere gleicheObjekte werden als Bestandteile eines Feldes betrachtet, das man miteiner Schleife durchlaufen kann. Auf jeder Ebene können gleiche Objektebeziehungsweise gleiche Eigenschaften vorkommen. Diese werden wie-derum als Elemente eines Feldes betrachtet. Zunächst die XML-Datei, inder die Daten mehrerer Objekte des Typs fahrzeug gespeichert sind:

<?xml version="1.0"?><sammlung><fahrzeug>

<marke>Opel</marke><typ>Astra</typ><motordaten>

<leistung>70 KW</leistung><hubraum>1600 ccm</hubraum>

</motordaten><gewicht>1200 Kg</gewicht><reifen>155 R 14</reifen><reifen>165 H 14</reifen>

</fahrzeug><fahrzeug>

<marke>Ford</marke><typ>Focus</typ><motordaten>

<leistung>80 KW</leistung><hubraum>1700 ccm</hubraum>

</motordaten><gewicht>1100 Kg</gewicht><reifen>185-60 R 13</reifen><reifen>205-70 R 13</reifen>

</fahrzeug></sammlung>

Listing 14.3 Datei xml_mehrere.xml

Der Aufbau der XML-Datei sieht wie folgt aus:

Jedes einzelne Fahrzeug wird innerhalb der Markierungen <fahr-zeug> und </fahrzeug> notiert.

Alle Fahrzeuge werden innerhalb des Hauptobjekts <sammlung> ...</sammlung> angeordnet.

436

Page 438: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Einlesen mehrerer Objekte 14.2

Jedem Fahrzeug sind zwei Reifensätze zugeordnet. Die Eigenschaftreifen ist also pro Fahrzeug zweimal vorhanden.

Das PHP-Programm, in dem die Daten der Fahrzeugsammlung eingele-sen werden, beinhaltet zwei Varianten zur Bildschirmausgabe:

<html><body><?php/* Einlesen der Datei in ein Objekt */$sammlung = simplexml_load_file("xml_mehrere.xml");

/* Ausgabe der Objektdaten, Variante 1 */foreach ($sammlung->fahrzeug as $fz)

echo "Marke: $fz->marke<br />";echo "Typ: $fz->typ<br />";echo "Motordaten:<br />";echo "--- Leistung: "

. $fz->motordaten->leistung . "<br />";echo "--- Hubraum: "

. $fz->motordaten->hubraum . "<br />";echo "Gewicht: $fz->gewicht<br />";echo "Reifen: " . $fz->reifen[0] . "<br />";echo "Reifen: " . $fz->reifen[1] . "<br /><br />";

/* Ausgabe der Objektdaten, Variante 2 */for($i=0; $i<2; $i++)

echo "Marke: ". $sammlung->fahrzeug[$i]->marke . "<br />";

echo "Typ: ". $sammlung->fahrzeug[$i]->typ . "<br />";

echo "Motordaten:<br />";echo "--- Leistung: "

. $sammlung->fahrzeug[$i]->motordaten->leistung

. "<br />";echo "--- Hubraum: "

. $sammlung->fahrzeug[$i]->motordaten->hubraum

. "<br />";echo "Gewicht: "

. $sammlung->fahrzeug[$i]->gewicht . "<br />";echo "Reifen: "

. $sammlung->fahrzeug[$i]->reifen[0]

437

Page 439: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

XML14

. "<br />";echo "Reifen: "

. $sammlung->fahrzeug[$i]->reifen[1]

. "<br /><br />";?></body></html>

Listing 14.4 Datei xml_mehrere.php

Erläuterung:

Mit simplexml_load_file() wird das Hauptobjekt eingelesen.

foreach Variante 1: Bei jedem Durchlauf der foreach-Schleife wird auf eineinzelnes Fahrzeugobjekt als Objekt $fz zugegriffen.

for-Schleife, Index Variante 2: Bei jedem Durchlauf der for-Schleife wird auf ein einzel-nes Fahrzeugobjekt als Feldelement zugegriffen.

Die beiden Objekte des Typs reifen werden im Programm als Feld-elemente betrachtet und mit einem numerischen Index angesprochen.

Die Ausgabe (hier nur eine Variante) sehen Sie in Abbildung 14.3.

Abbildung 14.3 Mehrere gleiche Objekte

438

Page 440: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Zugriff auf Attribute 14.3

14.3 Zugriff auf Attribute

Assoziatives ArrayXML-Daten können wie HTML-Markierungen auch Attribute haben. EinBeispiel bei HTML: <font color="#ff0000" size="4"> ... </font>.Diese Attribute werden bei der Umwandlung in ein PHP-Objekt mit Sim-pleXML als Elemente eines assoziativen Arrays betrachtet. Zunächst dieXML-Datei, in der XML-Daten mit Attributen notiert sind:

<?xml version="1.0"?><fahrzeug>

<marke land="Deutschland">Opel</marke><typ>Astra</typ><motordaten zylinder="4" katalysator="Euro 5">

<leistung>70 KW</leistung><hubraum ventilzahl="3">1600 ccm</hubraum>

</motordaten><gewicht>1200 Kg</gewicht>

</fahrzeug>

Listing 14.5 Datei xml_attribut.xml

Der Aufbau der XML-Datei:

Die Markierung marke hat das Attribut land.

Die Markierung motordaten hat die Attribute zylinder und kataly-sator.

Die Markierung hubraum hat das Attribut ventilzahl.

Das PHP-Programm zum Einlesen und zur Bildschirmausgabe sieht wiefolgt aus:

<html><body><?php/* Einlesen der Datei in ein Objekt */$fahrzeug = simplexml_load_file("xml_attribut.xml");

/* Ausgabe der Objektdaten */echo "Marke: $fahrzeug->marke<br />";echo "--- Land: "

. $fahrzeug->marke["land"] . "<br />";echo "Typ: $fahrzeug->typ<br />";echo "Motordaten:<br />";echo "--- Zylinder: "

. $fahrzeug->motordaten["zylinder"] . "<br />";

439

Page 441: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

XML14

echo "--- Katalysator: ". $fahrzeug->motordaten["katalysator"] . "<br />";

echo "--- Leistung: ". $fahrzeug->motordaten->leistung . "<br />";

echo "--- Hubraum: ". $fahrzeug->motordaten->hubraum . "<br />";

echo "--- --- Ventilzahl: ". $fahrzeug->motordaten->hubraum["ventilzahl"]. "<br />";

echo "Gewicht: $fahrzeug->gewicht";?></body></html>

Listing 14.6 Datei xml_attribut.php

Erläuterung:

Zugriff über [""] Über $fahrzeug->marke["land"] können Sie auf das Attribut landzugreifen.

Über $fahrzeug->motordaten->hubraum["ventilzahl"] können Sieauf das Attribut ventilzahl zugreifen.

Die Ausgabe zeigt Abbildung 14.4.

Abbildung 14.4 Objekte mit Attributen

440

Page 442: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Interne XML-Daten 14.4

14.4 Interne XML-Daten

XML-Daten können, anstatt aus einer externen XML-Datei eingelesen zuwerden, auch Bestandteil des Programms sein. Allerdings liegt in solcheinem Fall keine saubere Trennung zwischen Programm und Daten vor.

simplexml_load_string()

Falls interne XML-Daten vorliegen, werden sie durch SimpleXML mitHilfe der Funktion simplexml_load_string() aus einer XML-Zeichen-kette in ein Objekt eingelesen. Die weitere Verarbeitung bleibt erhalten.Der Programmcode sieht wie folgt aus:

<html><body><?php

/* Erzeugen der Zeichenkette */$xml_zk = <<< XML<?xml version="1.0"?><fahrzeug>

<marke>Opel</marke><typ>Astra</typ><motordaten>

<leistung>70 KW</leistung><hubraum>1600 ccm</hubraum>

</motordaten><gewicht>1200 Kg</gewicht>

</fahrzeug>XML;

/* Einlesen der Zeichenkette in ein Objekt */$fahrzeug = simplexml_load_string($xml_zk);

/* Ausgabe der Objektdaten */echo "Marke: $fahrzeug->marke<br />";echo "Typ: $fahrzeug->typ<br />";echo "Motordaten:<br />";echo "--- Leistung: "

. $fahrzeug->motordaten->leistung . "<br />";echo "--- Hubraum: "

. $fahrzeug->motordaten->hubraum . "<br />";echo "Gewicht: $fahrzeug->gewicht<br />";?></body></html>

Listing 14.7 Datei xml_intern.php

441

Page 443: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

XML14

Erläuterung:

<<< XML … XML Die XML-Zeichenkette beginnt mit <<< XML und endet mit XML. Dazwi-schen muss das Objekt wie bisher im XML-Format notiert sein. Fürden späteren Zugriff müssen Sie die XML-Zeichenkette einer PHP-Variablen (hier $xml_zk) zuweisen.

Die Funktion simplexml_load_string() liest die Zeichenkette in einObjekt ein. Anschließend wird auf die Eigenschaften dieses Objekts,wie gewohnt, zugegriffen.

14.5 Speicherung von Objekten

Ausgabe Die Daten eines Objekts können selbstverständlich geändert werden.Falls Sie diese Änderungen in einer XML-Datei speichern möchten, kön-nen Sie die Funktion file_put_contents() und die ObjektmethodeasXML() verwenden. Im folgenden Beispiel soll eine Objekteigenschaftgeändert und gespeichert werden. Zunächst die XML-Datei mit den Ori-ginalwerten:

<?xml version="1.0"?><fahrzeug>

<marke>Opel</marke><typ>Astra</typ><gewicht>1200 Kg</gewicht>

</fahrzeug>

Listing 14.8 Datei xml_speichern.xml

Das Programm sieht wie folgt aus:

<html><body><?php/* Einlesen der Datei in ein Objekt, Teilausgabe */$fahrzeug = simplexml_load_file("xml_speichern.xml");echo "<p>Gewicht: " . $fahrzeug->gewicht . "</p>";

/* Ändern von Teildaten, Dateiausgabe des Objekts */$fahrzeug->gewicht ="2200 Kg";file_put_contents("xml_speichern.xml", $fahrzeug->asXML());

/* Einlesen der Datei in ein Objekt, Teilausgabe */$fahrzeug = simplexml_load_file("xml_speichern.xml");

442

Page 444: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Speicherung von Objekten 14.5

echo "<p>Gewicht: " . $fahrzeug->gewicht . "</p>";?></body></html>

Listing 14.9 Datei xml_speichern.php

Erläuterung:

Die Objekteigenschaft gewicht wird zunächst mit ihrem Originalwertausgegeben.

Die Eigenschaft wird verändert: von 1200 kg auf 2200 kg.

file_put_contents()

Die Methode file_put_contents() wird aufgerufen.

Als erster Parameter wird die Datei angegeben, in die geschriebenwerden soll. In diesem Fall ist das wiederum die Dateixml_speichern.xml.

asXML() Als zweiter Parameter wird die Methode asXML() für das Objekt$fahrzeug aufgerufen. Dies führt dazu, dass die Objektdaten über-schrieben werden. Ansonsten bleibt der Aufbau der Datei unver-ändert.

Das Objekt wird einmal vor und einmal nach der Veränderung eingele-sen. Es werden nur die in Abbildung 14.5 dargestellten Teildaten ausge-geben.

Abbildung 14.5 Vorher/nachher

443

Page 445: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet
Page 446: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

15 Ajax

AsynchronAjax steht für Asynchronous JavaScript and XML. Diese Technik ermög-licht es Ihnen, Teile einer Webseite zu ändern, ohne die gesamte Seiteneu aufbauen zu müssen. Dies reduziert den Entwicklungsaufwand, ver-ringert den Netzverkehr und macht die Webseiten schneller und flexi-bler. Die Technik wird seit Jahren erfolgreich im Web eingesetzt und istein selbstverständlicher Bestandteil vieler Webseiten geworden.

Zum Ablauf: Aus der Webseite heraus wird eine Anforderung an denWebserver gesendet. Dieser sendet, hier mit Hilfe von PHP, eine Ant-wort zurück. Die Antwort wird in der dauerhaft angezeigten Webseiteausgewertet und führt zur Änderung eines Teils der Seite.

XMLHttpRequestZentraler Bestandteil des gesamten Ablaufs ist ein Objekt des Typs XML-HttpRequest. Ein solches Objekt wird von allen modernen Browsernerkannt. Falls Sie auch auf die Version 6 oder eine frühere Version desMS Internet Explorer Rücksicht nehmen wollen, müssen Sie ein Objekteines anderen Typs nutzen. Darauf wird hier nicht weiter eingegangen.

15.1 Hallo Ajax

Anhand eines ersten Beispiels (»Hallo Ajax«) erläutere ich Ihnen dengrundsätzlichen Ablauf, wie er im gesamten Kapitel gilt.

Leeres ElementEs wird eine HTML-Seite mit einem Hyperlink dargestellt. Die Seite(siehe Abbildung 15.1) beinhaltet einen leeren und daher unsichtbarendiv-Container.

Abbildung 15.1 Dauerhaft angezeigte Seite

445

Page 447: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Ajax15

Nach Betätigung des Hyperlinks wird eine Anforderung an den Webser-ver gesendet. Dieser sendet einen Text als Antwort. Der gesendete Textwird in den div-Container eingesetzt und erscheint auf der Seite, wie Siein Abbildung 15.2 sehen.

Abbildung 15.2 Seite ergänzt um Code aus PHP-Datei

Zunächst die HTML-Seite mit dem JavaScript-Code:

<html><head><script type="text/javascript">var rq;function anfordern() rq = new XMLHttpRequest(); rq.open("post", "ajax_hallo.php", true); rq.send(null); rq.onreadystatechange = auswerten;function auswerten() if(rq.readyState == 4 && rq.status == 200) document.getElementById("meindiv").innerHTML = rq.responseText;</script></head><body><a href="javascript:anfordern()">Bitte klicken</a><div id="meindiv"></div></body></html>

Listing 15.1 Datei ajax_hallo.htm

446

Page 448: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Hallo Ajax 15.1

Dazu das antwortende PHP-Programm:

<?phpheader("Content-Type: text/html; charset=utf-8");echo "<b>Hallo Ajax</b>";

?>

Listing 15.2 Datei ajax_hallo.php

Zunächst zur Datei ajax_hallo.htm:

anfordern()Im body des Dokuments stehen der Hyperlink und der leere div-Contai-ner. Bei Betätigung des Hyperlinks wird die JavaScript-Funktion anfor-dern() aufgerufen. Die eindeutige ID des div-Containers (meindiv) wirdspäter genutzt, um diesen mit Text zu füllen.

Globale VariableIm head des Dokuments werden die globale Variable rq und die beidenFunktionen anfordern() und auswerten() definiert. Die Variable rqermöglicht im gesamten JavaScript-Teil den Zugriff auf das XMLHttpRe-quest-Objekt.

open()In der Funktion anfordern() wird zunächst ein neues XMLHttpRequest-Objekt erzeugt. Die Methode open() dieses Objekts eröffnet die Kom-munikation mit der antwortenden Seite, hier ajax_hallo.php, über dieIhnen bereits bekannte POST-Methode. Falls der dritte Parameter auftrue steht, so wird die Kommunikation asynchron abgewickelt. Es wirdalso nicht auf das Ende anderer Abläufe gewartet, dies ist der Standard.

send()Die Methode send() des XMLHttpRequest-Objekts sendet die Anforde-rung. In diesem Beispiel werden keine Daten zum Webserver gesendet.Stattdessen wird null gesendet, das heißt ein Verweis auf »Nichts«.

onreadystate-change

Nach dem Senden ändert das XMLHttpRequest-Objekt mehrmals seinenStatus. Auf dieses Änderungs-Ereignis reagiert der Event-Handler onready-statechange. Diesem wurde ein Verweis auf die Methode auswerten()zugeordnet. Also: bei jeder Status-Änderung wird die Methode auswer-ten() aufgerufen.

readystate, statusIn der Methode auswerten() werden zunächst die Eigenschaften ready-state und status des XMLHttpRequest-Objekts betrachtet. Die Auswer-tung ist erst dann interessant, wenn readystate den Wert 4 (= complete)und status den Wert 200 hat. status repräsentiert den Wert des Status-codes des Hypertext Transfer Protocols (HTTP). 200 steht für Ok, 404 fürPage not found, 500 für Internal Server Error und so weiter.

447

Page 449: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Ajax15

Die JavaScript-Methode getElementById() liefert einen Verweis auf einElement, dem eine eindeutige ID innerhalb eines HTML-Dokumentsgegeben wurde. Hier ist dies der div-Container mit der ID meindiv. DieEigenschaft innerHTML bezeichnet den Inhalt des Elements. Dieser kannsowohl aus Text als auch aus HTML-Markierungen bestehen.

responseText Die Eigenschaft responseText des XMLHttpRequest-Objekts enthält dieAntwort des Webservers, in diesem Fall HTML-Code: den Text »HalloAjax« in Fettschrift.

Damit kommen wir zur Datei ajax_hallo.php:

PHP Mit Hilfe der Funktion header() wird festgelegt, dass das PHP-Programmseine Antwort als HTML-Code im angegebenen Zeichensatz sendet.

15.2 Parameter senden

Im ersten Beispiel wurde der Wert null, das heißt ein Verweis auf»Nichts«, an den Webserver gesendet. Dies ändert sich in diesemAbschnitt. Es werden nunmehr Daten an den Webserver gesendet. Diesewerden mit Hilfe von PHP verarbeitet.

Daten senden Es wird eine HTML-Seite mit drei Hyperlinks dargestellt, siehe Abbil-dung 15.3.

Abbildung 15.3 Aufruf von JavaScript mit Parametern

Je nachdem, welchen Hyperlink der Benutzer betätigt, werden unter-schiedliche Daten an den Webserver gesendet. Entsprechend wird derdiv-Container unterhalb der Hyperlinks unterschiedlich gefüllt, sieheAbbildung 15.4.

448

Page 450: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Parameter senden 15.2

Abbildung 15.4 Webserver sendet parameterabhängiges Ergebnis

Zunächst die HTML-Seite mit dem JavaScript-Code:

<html><head><script type="text/javascript">var rq;function anfordern(nachname, personalnummer) rq = new XMLHttpRequest(); rq.open("post", "ajax_parameter.php", true); rq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); rq.send("nn=" + nachname + "&pnr=" + personalnummer); rq.onreadystatechange = auswerten;function auswerten() if(rq.readyState == 4 && rq.status == 200) document.getElementById("meindiv").innerHTML = rq.responseText;</script></head><body> <a href="javascript:anfordern('Maier', 6714)"> Hans Maier</a><br /> <a href="javascript:anfordern('Schmitz', 81343)"> Peter Schmitz</a><br /> <a href="javascript:anfordern('Mertens', 2297)"> Julia Mertens</a><br /><br /> <div id="meindiv"></div></body></html>

Listing 15.3 Datei ajax_parameter.htm

449

Page 451: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Ajax15

Dazu das antwortende PHP-Programm:

<?phpheader("Content-Type: text/html; charset=utf-8");echo $_POST["nn"] . ", " . $_POST["pnr"];

?>

Listing 15.4 Datei ajax_parameter.php

Zunächst zur Datei ajax_parameter.htm. Es werden nur die Unterschiedezum vorherigen Beispiel erläutert.

Parameter Bei Betätigung eines der drei Hyperlinks im body des Dokuments wirddie JavaScript-Funktion anfordern() aufgerufen. Dabei werden über-mittelt: eine Zeichenkette für den Parameter nachname und eine Zahl fürden Parameter personalnummer.

setRequest-Header()

Mit Hilfe der Methode setRequestHeader() des XMLHttpRequest-Objekts wird festgelegt, in welcher Form diese Daten übermittelt wer-den. Der Parameter der Methode send() des XMLHttpRequest-Objektswird zusammengesetzt, ein Beispiel: nn=Mertens&pnr=2297.

PHP Es folgt die Datei ajax_parameter.php: Nach dem Senden stehen hier diebeiden Elemente $_POST["nn"] und $_POST["pnr"] zur Verfügung.Diese werden zu einem Text zusammengesetzt. Dieser Text wird zurück-gesendet.

15.3 Bild tauschen

Mit Hilfe von Ajax können Sie natürlich auch Bilder in vorhandeneWebseiten einblenden. Im nachfolgenden Beispiel in Abbildung 15.5sehen Sie eine HTML-Seite mit drei Hyperlinks. Je nachdem, welchenHyperlink der Benutzer betätigt, wird im div-Container unterhalb derHyperlinks ein anderes Bild dargestellt, siehe Abbildung 15.6.

Abbildung 15.5 Hyperlinks mit Anforderung einer Bilddatei

450

Page 452: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Bild tauschen 15.3

Abbildung 15.6 Webserver sendet Bilddatei.

Zunächst die HTML-Seite mit dem JavaScript-Code:

<html><head><script type="text/javascript">var rq;function anfordern(bilddateiname) rq = new XMLHttpRequest(); rq.open("post", "ajax_bild.php", true); rq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); rq.send("bild=" + bilddateiname); rq.onreadystatechange = auswerten;function auswerten() if(rq.readyState == 4 && rq.status == 200) document.getElementById("meindiv").innerHTML = "<img src='" + rq.responseText + "' />";</script></head><body> <a href="javascript:anfordern('im_arrow.gif')"> Pfeil</a></br /> <a href="javascript:anfordern('im_work.gif')"> Arbeit</a><br /> <a href="javascript:anfordern('im_upload.gif')"> Computer</a><br /><br /> <div id="meindiv"></div></body></html>

Listing 15.5 Datei ajax_bild.htm

451

Page 453: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Ajax15

Dazu das antwortende PHP-Programm:

<?phpheader("Content-Type: text/html; charset=utf-8");echo $_POST["bild"];

?>

Listing 15.6 Datei ajax_bild.php

Bei Betätigung eines der drei Hyperlinks wird die Funktion anfordern()mit einer Zeichenkette für den Parameter bilddateiname aufgerufen.Der Parameter der Methode send() des XMLHttpRequest-Objekts siehtdann zum Beispiel aus wie folgt: bild=im_arrow.gif.

<img src=… /> Aus der PHP-Datei wird der Wert des Elements $_POST["bild"] zurück-gesendet. Für die Eigenschaft innerHTML in der Funktion auswerten()wird daraus für das angegebene Beispiel der nachfolgende Code zusam-mengesetzt: <img src='im_arrow.gif' />.

15.4 Mehrere Ergebnisse aus XML-Knoten

Rückgabe mit XML In den bisherigen Beispielen wurde HTML-Code vom Webserver zumAktualisieren einer einzelnen Stelle im vorhandenen Dokument gesendet.Falls Sie mehrere Stellen im Dokument aktualisieren möchten, muss derWebserver XML-Code senden. Aus diesem XML-Code können dannunterschiedliche Informationen extrahiert werden.

Im nachfolgenden Beispiel sehen Sie eine HTML-Seite mit drei Paarenvon Zahlen in Hyperlinks, siehe Abbildung 15.7.

Abbildung 15.7 Anforderung mehrerer Ergebnisse

Auf dem Webserver werden die Addition, die Subtraktion und die Mul-tiplikation des angeklickten Paares von Zahlen durchgeführt. Die dreiErgebnisse werden zurückgesendet und in drei verschiedenen div-Con-tainern dargestellt, wie Sie in Abbildung 15.8 sehen.

452

Page 454: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Mehrere Ergebnisse aus XML-Knoten 15.4

Abbildung 15.8 Webserver sendet XML mit mehreren Ergebnissen

Zunächst die HTML-Seite mit dem JavaScript-Code:

<html><head><script type="text/javascript">var rq;function anfordern(zahl1, zahl2) rq = new XMLHttpRequest(); rq.open("post", "ajax_knoten.php", true); rq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); rq.send("z1=" + zahl1 + "&z2=" + zahl2); rq.onreadystatechange = auswerten;function auswerten() if(rq.readyState == 4 && rq.status == 200) var antwort = rq.responseXML; document.getElementById("add").innerHTML = antwort.getElementsByTagName("plus")[0]. firstChild.nodeValue; document.getElementById("sub").innerHTML = antwort.getElementsByTagName("minus")[0]. firstChild.nodeValue; document.getElementById("mul").innerHTML = antwort.getElementsByTagName("mal")[0]. firstChild.nodeValue; </script>

453

Page 455: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Ajax15

</head><body> <a href="javascript:anfordern(6,4)"> 6 und 4</a><br /> <a href="javascript:anfordern(12,14)"> 12 und 14</a><br /> <a href="javascript:anfordern(23,52)"> 23 und 52</a><br /><br /> <div id="add"></div> <div id="sub"></div> <div id="mul"></div></body></html>

Listing 15.7 Datei ajax_knoten.htm

Dazu das antwortende PHP-Programm:

<?phpheader("Content-Type: text/xml; charset=utf-8");$ps = doubleval($_POST["z1"]) + doubleval($_POST["z2"]);$mi = doubleval($_POST["z1"]) – doubleval($_POST["z2"]);$ma = doubleval($_POST["z1"]) * doubleval($_POST["z2"]);

echo "<?xml version='1.0' encoding='utf-8'?>\n";echo "<berechnung>\n";echo " <plus>$ps</plus>\n";echo " <minus>$mi</minus>\n";echo " <mal>$ma</mal>\n";echo "</berechnung>\n";

?>

Listing 15.8 Datei ajax_knoten.php

Bei Betätigung eines der drei Hyperlinks wird die Funktion anfordern()mit zwei Zahlen für die Parameter zahl1 und zahl2 aufgerufen. Der Para-meter der Methode send() des XMLHttpRequest-Objekts sieht dann zumBeispiel aus wie folgt: z1=12&z2=14.

responseXML Mit Hilfe der Funktion header() wird festgelegt, dass das PHP-Pro-gramm ein XML-Dokument sendet. Das XML-Element berechnung ent-hält drei Knoten mit den Namen plus, minus und mal. Als Wert dieserKnoten werden die drei Rechenergebnisse notiert. In der Funktion aus-werten() wird statt der Eigenschaft responseText die EigenschaftresponseXML betrachtet.

454

Page 456: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Mehrere Ergebnisse aus XML-Attributen 15.5

getElementsBy-TagName()

Die darin befindlichen XML-Knoten können mit Hilfe der Methode get-ElementsByTagName() ausgewertet werden. Die Eigenschaft nodeValuebeinhaltet den Wert des jeweiligen Knotens.

15.5 Mehrere Ergebnisse aus XML-Attributen

Es folgt wiederum das Beispiel mit den drei Rechenergebnissen. DieseErgebnisse werden diesmal allerdings als Attribute der XML-Knotengesendet und ausgewertet. Es sind die beiden Dateien ajax_attribut.htmund ajax_attribut.php beteiligt. Zunächst die Änderungen in der Funk-tion auswerten() gegenüber dem vorherigen Beispiel:

... document.getElementById("add").innerHTML = antwort.getElementsByTagName("erg")[0]. getAttribute("plus"); document.getElementById("sub").innerHTML = antwort.getElementsByTagName("erg")[0]. getAttribute("minus"); document.getElementById("mul").innerHTML = antwort.getElementsByTagName("erg")[0]. getAttribute("mal");...

Listing 15.9 Datei ajax_attribut.htm (Ausschnitt)

Das XML-Dokument wird anders aufgebaut:

...echo "<?xml version='1.0' encoding='utf-8'?>\n";echo "<berechnung>\n";echo " <erg plus='$ps' minus='$mi' mal='$ma' />\n";echo "</berechnung>\n";...

Listing 15.10 Datei ajax_attribut.php (Ausschnitt)

getAttribute()Im XML-Dokument gibt es jetzt den Knoten erg mit den drei Attributenplus, minus und mal. Deren Werte werden in der Funktion auswerten()mit Hilfe der Methode getAttribute() ermittelt.

455

Page 457: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Ajax15

15.6 Zugriff auf MySQL-Datenbank

Ergänzung ausDatenbank

Im nachfolgenden Beispiel zeige ich Ihnen Ajax im Zusammenspiel miteinem Datenbankzugriff. Es werden alle Datensätze der bereits bekann-ten Tabelle personen aus der MySQL-Datenbank firma angezeigt. JederDatensatz wird als Hyperlink dargestellt, mit den Inhalten der Feldername und vorname, wie Sie in Abbildung 15.9 sehen.

Abbildung 15.9 Aufbau der Seite aus Datenbank

Sobald der Benutzer einen Hyperlink betätigt, werden die Daten zu denFeldern gehalt und geburtstag des betreffenden Datensatzes angezeigt,siehe Abbildung 15.10.

Abbildung 15.10 Webserver ergänzt Seite aus Datenbank.

Zunächst das PHP-Programm, das die dauerhaft angezeigte Seite erzeugt:

<html><head><script type="text/javascript">var rq;function anfordern(personalnummer) rq = new XMLHttpRequest(); rq.open("post", "ajax_db_b.php", true);

456

Page 458: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Zugriff auf MySQL-Datenbank 15.6

rq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); rq.send("pnr=" + personalnummer); rq.onreadystatechange = auswerten;function auswerten() if(rq.readyState == 4 && rq.status == 200) var xmlDoc = rq.responseXML; document.getElementById("gehalt").innerHTML = xmlDoc.getElementsByTagName("gh")[0]. firstChild.nodeValue; document.getElementById("geburtstag").innerHTML = xmlDoc.getElementsByTagName("gb")[0]. firstChild.nodeValue; </script></head><body><?php mysql_connect("","root"); mysql_select_db("firma"); $res = mysql_query ("select * from personen order by name, vorname"); while ($dsatz = mysql_fetch_assoc($res)) echo "<a href='javascript:anfordern(" . $dsatz["personalnummer"] . ")'>" . $dsatz["name"] . ", " . $dsatz["vorname"] . "</a><br />";?><br /> <div id="gehalt"></div><div id="geburtstag"></div></body></html>

Listing 15.11 Datei ajax_db_a.php

Dazu das antwortende PHP-Programm:

<?phpheader("Content-Type: text/xml; charset=utf-8");mysql_connect("","root");

457

Page 459: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Ajax15

mysql_select_db("firma");$res = mysql_query

("select * from personen where personalnummer = ". $_POST["pnr"]);

$dsatz = mysql_fetch_assoc($res);

echo "<?xml version='1.0' encoding='utf-8'?>\n";echo "<daten>\n";echo " <gh>" . $dsatz["gehalt"] . "</gh>\n";echo " <gb>" . $dsatz["geburtstag"] . "</gb>\n";echo "</daten>\n";

?>

Listing 15.12 Datei ajax_db_b.php

Bei Betätigung des Hyperlinks auf einem der Datensätze wird die Funk-tion anfordern() mit einer Zahl für den Parameter personalnummer auf-gerufen. Der Parameter der Methode send() des XMLHttpRequest-Objekts sieht dann zum Beispiel aus wie folgt: pnr=6714.

Im antwortenden PHP-Programm wird der Datensatz mit dem betreffen-den Wert im Feld personalnummer ermittelt. Aus diesem Datensatz wer-den die Werte für die Felder gehalt und geburtstag als Knoten inner-halb eines XML-Dokuments zurückgesendet.

15.7 Weitere Ereignisse

Bisher wurde nur das Ereignis »Betätigen eines Hyperlinks« zum Aufrufeiner JavaScript-Funktion genutzt. Der Benutzer kann aber noch weitereEreignisse auslösen, die wiederum für Ajax genutzt werden können. Imnachfolgenden Beispiel werden einige Möglichkeiten gezeigt, sieheAbbildung 15.11.

Abbildung 15.11 Tabelle und Formular

458

Page 460: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Weitere Ereignisse 15.7

Der HTML- und JavaScript-Code:

<html><head><script type="text/javascript">function ev(p) switch(p) case 1: alert("Maus in 1. Zelle hinein bewegt"); break; case 2: alert("Maus aus 2. Zelle heraus bewegt"); break; case 3: alert("Maustaste in 3. Zelle gedrückt"); break; case 4: alert("Maustaste in 4. Zelle losgelassen"); break; case 5: alert("Formular gesendet"); break; case 6: alert("Formular zurückgesetzt"); break; case 7: alert("Auswahl: " + document.f.s.selectedIndex); break; </script></head><body><table border="1"> <tr> <td onmouseover="ev(1)">Erste Zelle</td> <td onmouseout="ev(2)">Zweite Zelle</td> <td onmousedown="ev(3)">Dritte Zelle</td> <td onmouseup="ev(4)">Vierte Zelle</td> </tr></table><br /><form name="f" onsubmit="ev(5)" onreset="ev(6)"> <select name="s" onchange="ev(7)"> <option value="0" selected="selected">0</option> <option value="1">1</option> <option value="2">2</option> </select> <input type="submit" /><input type="reset" /></form>

459

Page 461: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Ajax15

</body></html>

Listing 15.13 Datei ajax_ereignis.htm

Mausereignisse Das Dokument beinhaltet eine Tabelle und ein Formular. In jeder dervier Zellen kann der Benutzer ein anderes Mausereignis auslösen: Maushinein, Maus heraus, Maustaste gedrückt oder Maustaste losgelassen.

Formular-ereignisse

Das Formular beinhaltet ein Auswahlelement. Das Absenden undZurücksetzen des Formulars sowie der Wechsel der Auswahl innerhalbdes Auswahlelements sind ebenfalls Ereignisse.

460

Page 462: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

16 jQuery

KlassenbibliothekBei jQuery handelt es sich um eine JavaScript-Klassenbibliothek. Code inder Skriptsprache JavaScript haben Sie schon in einigen Beispielen in die-sem Buch gesehen, unter anderem in Abschnitt 3.3.1, »Absenden undZurücksetzen«. JavaScript wird zur clientseitigen Programmierung einge-setzt. Diese stellt in der Praxis eine wichtige Ergänzung zur serverseitigenProgrammierung mit PHP dar.

JavaScriptBei JavaScript befinden sich die Programme bereits beim Benutzer, zu-sammen mit dem HTML-Code. Die Programme können dort bestimmte,häufig vorkommende Abläufe steuern, ohne unnötigen Netzverkehr zuverursachen. Im Unterschied zu PHP gibt es allerdings keine direkte Mög-lichkeit, auf Dateien oder Datenbanken des Webservers zuzugreifen.

Die Bibliothek jQuery hat zurzeit (Ende 2011) die größte Verbreitungunter den JavaScript-Bibliotheken. Sie bietet komfortable, browserunab-hängige Möglichkeiten zur Veränderung der Seiten beim Benutzer, unteranderem durch Einsatz von CSS und durch Animationen.

jQueryAktuell gibt es jQuery in der Version 1.7. Die Datei jquery.js mit der Klas-senbibliothek ist nur ca. 90 KB groß. Sie befindet sich auf dem Datenträgerzum Buch. Die aktuelle Version können Sie über http://www.jquery.comherunterladen. In den nachfolgenden Beispielen gehe ich davon aus, dasssie sich im gleichen Verzeichnis befindet.

Hier kann nur ein kleiner Ausschnitt von jQuery gezeigt werden. MehrInformationen finden Sie in: F. Bongers/M. Vollendorf: jQuery. Das Pra-xisbuch, Galileo Press, 2. aktualisierte und erweiterte Auflage 2011,http://www.galileocomputing.de/2930.

16.1 Erstes Beispiel

In einem ersten Beispiel erläutere ich Ihnen den grundsätzlichen Aufbau,wie er im gesamten Kapitel gilt.

In Abbildung 16.1 wird eine Datei mit einem div-Element und einemHyperlink dargestellt. Nach Betätigen des Hyperlinks ändert sich der

461

Page 463: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

jQuery16

Inhalt des div-Elements durch den Einsatz von jQuery, wie Sie in Abbil-dung 16.2 sehen.

Abbildung 16.1 Dokument nach dem Laden

Abbildung 16.2 Dokument nach dem Ereignis

Es folgt der Code:

<html><head><script src="jquery.js" type="text/javascript"></script><script type="text/javascript">$(document).ready(function()$("div").html("<i>Änderung nach Laden</i>");$("a").click(function()

$("div").html("<b>Änderung nach Klick</b>"); ););</script>

<style type="text/css">div width:200px; height:50px; background:#bbbbbb;

</style></head><body><div><u>Das ist jQuery</u></div><a href="#">Bitte klicken</a><br />

462

Page 464: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Erstes Beispiel 16.1

</body></html>

Listing 16.1 Datei jq_geladen.htm

Im body des Dokuments steht ein div-Element mit dem unterstrichenenBeispieltext »Das ist jQuery« und ein Hyperlink mit der Zielangabe »#«.Diese Zielangabe führt dazu, dass die Betätigung des Hyperlinks zum sel-ben Dokument führt.

CSS-FormatDirekt darüber (am Ende des head des Dokuments) sehen Sie das CSS-Format für die hier gewählte Darstellung von div-Elementen: Breite 200Pixel, Höhe 50 Pixel, graue Hintergrundfarbe.

jquery.jsZu Beginn des Dokuments stehen zwei JavaScript-Container. Im erstenContainer wird die Datei jquery.js eingebunden, sodass hier die Klassender Bibliothek zur Verfügung stehen.

ready()Im zweiten Container wird die Methode ready() für das document aufge-rufen. Der gesamte jQuery-Code soll erst dann starten können, wenn diegesamte Datei mit allen Elementen im Browser des Benutzers geladenwurde. Dafür sorgt die Methode ready(). Ansonsten könnte es vorkom-men, dass mit dem jQuery-Code auf ein Element zugegriffen wird, dassnoch nicht existiert.

html()Innerhalb der Methode ready() finden Sie zwei verschiedene Abläufe.Im ersten Teil wird die Methode html() für alle div-Elemente aufgeru-fen. Diese Methode ändert den HTML-Inhalt des betroffenen Elements.Es erscheint sofort nach dem Laden des Dokuments der kursive Text»Änderung nach Laden« im div-Element.

click()Im zweiten Teil wird die Methode click() für alle a-Elemente (also alleHyperlinks) aufgerufen. Dies sorgt dafür, dass ein Klick auf einen Hyper-link zur Ausführung der angegebenen Aktion führt. Es erscheint erst nachdem Klick der fett gedruckte Text »Änderung nach Klick« im div-Element.

SelektorSie konnten an drei Beispielen bereits den allgemeinen Aufbau einerjQuery-Anweisung erkennen: $(Selektor).Methode();. Die Methodewird für das im Selektor genannte Objekt durchgeführt. Falls es sich beidem Selektor um ein HTML-Element oder einen CSS-Selektor handelt, sosteht er in Anführungszeichen.

( ) " "Aufgrund der vielen Klammerebenen in jQuery-Anweisungen empfehleich die hier verwendete kompakte Schreibweise. Beachten Sie bei Ihreneigenen Programmen auch die häufig notwendigen Anführungszeichen.

463

Page 465: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

jQuery16

16.2 Selektoren, Methoden css(), html() und text()

Selektoren dienen der Auswahl des HTML- beziehungsweise CSS-Ele-ments, auf das sich der jQuery-Code bezieht. In diesem Abschnitt stelleich Ihnen einige Möglichkeiten für jQuery-Selektoren vor. Außerdemlernen Sie verschiedene Methoden kennen:

css() zur Änderung der CSS-Eigenschaften

html() zur Änderung des Textes, mit HTML-Code

text() zur Änderung des Textes, ohne HTML-Code

In Abbildung 16.3 sehen Sie vier verschiedene div-Elemente. Die Betäti-gung eines der angegebenen Hyperlinks führt zu Änderungen bei einemoder mehreren div-Elementen.

Abbildung 16.3 Selektoren und Methoden

Es folgt der Code:

<html><head><script src="jquery.js" type="text/javascript"></script><script type="text/javascript">$(document).ready(function()

464

Page 466: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Selektoren, Methoden css(), html() und text() 16.2

$("#f01").click(function()$("div").css("width", "300px"); );

[... weitere jQuery-Funktionen, siehe Erläuterung ...]

);</script>

<style type="text/css">div width:250px; height:50px; background:#bbbbbb;#hell width:250px; height:50px; background:#dddddd;.dunkel width:250px; height:50px; background:#999999;

</style></head>

<body><div>div-Element, ohne id, ohne class</div><div id="hell">Element mit id 'hell'</div><div class="dunkel">1. div-Element mit class 'dunkel'</div>

<div class="dunkel">2. div-Element mit class 'dunkel'</div><br />

<a id="f01" href="#">1: CSS-Änderung aller div-Elemente</a><br />

[... weitere Hyperlinks, siehe Abbildung ...]

</body></html>

Listing 16.2 Datei jq_selektieren.htm

Im body des Dokuments stehen vier div-Elemente:

Das erste Element hat weder eine eindeutige ID noch wurde ihm eineCSS-Klasse zugeordnet.

ID Das zweite Element hat die eindeutige ID hell.

CSS-Klasse Dem dritten und dem vierten Element wurde die CSS-Klasse dunkelzugeordnet.

Direkt darüber (am Ende des head des Dokuments) sehen Sie die CSS-Vorgabe für die Darstellung von Elementen:

div-Elemente haben eine Größe von 250 × 50 Pixeln und sind mittel-grau.

465

Page 467: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

jQuery16

Beim Element mit der eindeutigen ID hell wird die Eigenschaft Hin-tergrundfarbe überschrieben mit hellgrau. Vor einer ID steht das Zei-chen #.

Bei allen Elementen der CSS-Klasse dunkel wird die Eigenschaft Hin-tergrundfarbe überschrieben mit dunkelgrau. Vor einer CSS-Klassesteht ein Punkt.

Kommen wir zu den Auswirkungen der Hyperlinks. Der erste Hyperlinkhat die eindeutige ID f01:

<a id="f01" href="#"> 1: CSS-Änderung ...</a>

Ein Klick auf diesen Hyperlink bewirkt die Ausführung der jQuery-Methode mit dem passenden Selektor, also der ersten Methode inner-halb der Methode ready():

$("#f01").click(function()$("div").css(width:"300px"); );

css() Darin wird die Methode css() für alle div-Elemente ausgeführt. DieseMethode ändert CSS-Eigenschaften. Hier wird der Eigenschaft width derWert 300 Pixel zugewiesen.

Es gibt verschiedene Schreibweisen für die Angabe der CSS-Eigenschaftund des zugehörigen Werts. Hier wird einheitlich die folgende verwen-det: Eigenschaft und Wert in geschweiften Klammern, durch Doppel-punkt getrennt, der Wert in Anführungszeichen.

Im vorliegenden Programm sind die Hyperlinks und die zugehörigenKlick-Methoden alle gleichartig aufgebaut. Nachfolgend wird nur nochdie Auswirkung des jeweiligen Klicks beschrieben:

ID Hyperlink 2 ändert das Element mit der eindeutigen ID hell:

$("#hell").css(width:"350px");

CSS-Klasse Hyperlink 3 ändert alle Elemente mit der CSS-Klasse dunkel:

$(".dunkel").css(width:"400px");

Collection Sie können mehrere Selektoren in einer Collection zusammenfassen.Hyperlink 4 ändert alle Elemente mit der eindeutigen ID hell oder derCSS-Klasse dunkel:

$("#hell, .dunkel").css(width:"450px");

466

Page 468: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Ereignisse 16.3

Mehrere Eigenschaften

Falls Sie mehrere Eigenschaften ändern möchten, so werden die Eigen-schaft-Wert-Paare jeweils durch Kommata getrennt. Hyperlink 5 ändertdie Eigenschaften Hintergrundfarbe und Breite für das Element mit dereindeutigen ID hell:

$("#hell").css("background-color":"f0f0f0","width":"500px");

html()Die Methode html() dient dem Ändern des Textes inklusive des HTML-Codes. Hyperlink 6 sorgt für einen neuen Text in Fettdruck für das Ele-ment mit der eindeutigen ID hell:

$("#hell").html("<b>HTML neu</b>");

text()Die Methode text() dient dem Ändern des Textes, ohne Berücksichti-gung des HTML-Codes. Hyperlink 7 dient dazu, einen neuen Text in dasElement mit der eindeutigen ID hell zu schreiben. Eventuell enthalteneHTML-Elemente werden ebenfalls als Text ausgegeben:

$("#hell").text("<b>Text neu</b>");

Verkettung, +=Sie können durch Verkettung mehrere Methoden für einen Selektor aus-führen. Außerdem können Sie einen CSS-Wert auch relativ verändernmit Hilfe der beiden Operatoren += und -=. Hyperlink 8 führt die Metho-den css() und html() für das Element mit der eindeutigen ID hell aus.In der Methode css() wird die Breite bei jedem Klick um 20 Pixelerhöht:

$("#hell").css(width:"+=20px").html("CSS und HTML neu");

16.3 Ereignisse

Bisher wurde nur das Klick-Ereignis zum Starten von jQuery-Codegenutzt. In diesem Abschnitt lernen Sie weitere Ereignisse kennen.

In Abbildung 16.4 sehen Sie ein div-Element, darunter eine Tabelle mitzehn Zellen. Das Auslösen eines der Ereignisse in der jeweiligen Zelleführt jedes Mal zu einer animierten Verbreiterung des Elements. Dabeikommt die Methode animate() zum Einsatz. Sie erzeugt durch eineAbfolge von Einzelbildern den Eindruck eines gleichmäßigen Ablaufs,wie in einem Film. Mehr zu animate() im nächsten Abschnitt.

467

Page 469: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

jQuery16

Abbildung 16.4 Verschiedene Ereignisse

Es folgt der Code:

<html><head><script src="jquery.js" type="text/javascript"></script><script type="text/javascript">$(document).ready(function()$("#f01").click(function()

$("#re").animate(width:"+=20px"); );

[... weitere jQuery-Funktionen, siehe Erläuterung ...]

);</script>

<style type="text/css">#re width:200px; height:100px; background:#aaaaaa;

</style></head>

468

Page 470: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Ereignisse 16.3

<body><div id="re">Rechteck</div><br /><table border="1"><tr><td id="f01" href="#"> 1: click</td></tr/>

[... weitere Tabellenzellen, siehe Abbildung ...]

</table></body></html>

Listing 16.3 Datei jq_ereignis.htm

Das div-Element hat die eindeutige ID re, eine Größe von 200×100Pixeln und eine graue Farbe. Die Auswirkungen der Ereignisse:

click()Die Ihnen bereits bekannte Methode click() wird einmalig durch eineneinfachen Klick auf die Zelle ausgelöst:

$("#f01").click(function()$("#re").animate(width:"+=20px"); );

Die nachfolgenden Methoden führen alle zur gleichen Animation, daherwird nur noch der Methodenkopf dargestellt.

dblclick()Die Methode dblclick() wird einmalig durch einen doppelten Klick aufdie Zelle ausgelöst:

$("#f02").dblclick(function() ... );

mouseenter()Die Methoden mouseenter() beziehungsweise mouseover() werden ein-malig durch das »Betreten« der Zelle mit der Maus ausgelöst:

$("#f03").mouseenter(function() ... );

mouseleave()Die Methoden mouseleave() beziehungsweise mouseout() werden ein-malig durch das »Verlassen« der Zelle mit der Maus ausgelöst:

$("#f04").mouseleave(function() ... );

mousemove()Die Methode mousemove() wird permanent durch das Bewegen derMaus innerhalb der Zelle ausgelöst. Das Ereignis tritt häufig auf, wirdgespeichert und später abgearbeitet. Daher kann es schon bei einer klei-nen Bewegung zu vielen Animationen kommen:

$("#f05").mousemove(function() ... );

mousedown()Die Methode mousedown() wird einmalig durch das Herunterdrückeneiner Maustaste innerhalb der Zelle ausgelöst. Die rechte Maustaste ist in

469

Page 471: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

jQuery16

den Browsern häufig belegt, sodass zum Beispiel noch ein Kontextmenüaufklappt:

$("#f06").mousedown(function() ... );

mouseup() Die Methode mouseup() wird einmalig durch das Loslassen einer herun-tergedrückten Maustaste innerhalb der Zelle ausgelöst:

$("#f07").mouseup(function() ... );

hover() Die Methode hover() vereinigt die beiden Ereignisse mouseenter undmouseleave. Sie wird also sowohl durch das »Betreten« als auch durchdas »Verlassen« der Zelle mit der Maus ausgelöst:

$("#f08").hover(function() ... );

bind() Die Methode bind() dient allgemein dazu, Ereignisse an Methoden zubinden. Die anderen Methoden in diesem Abschnitt sind eigentlich Spe-zialisierungen der Methode bind() zur Schreibabkürzung.

Hier wird die Bindung für die Ereignisse mousedown und mouseup durch-geführt. Die Animation wird also sowohl durch das Herunterdrücken alsauch durch das Loslassen einer Maustaste innerhalb der Zelle ausgelöst:

$("#f09").bind("mousedown mouseup", function() ... );

Event-Objekt Bei jedem der genannten Ereignisse stellt jQuery Ereignis-Informationenin einem Event-Objekt bereit. Dieses Event-Objekt erreichen Sie übereinen Verweis (hier e), den Sie als optionalen Parameter der Methodeangeben können.

Beim Klick auf die Zelle 10 wird ein Teil der Informationen ausgegeben.Dies sind Art, Ort und Zeitpunkt des Ereignisses, mit Hilfe der Eigen-schaften type, pageX, pageY und timeStamp:

$("#f10").click(function(e)$("#re").html("Ereignis: " + e.type

+ "<br />Ort X: " + e.pageX + " , Y: " + e.pageY+ "<br />Zeit: " + Date(e.timeStamp)); );

Der timeStamp wird in Millisekunden geliefert. Diese Angabe können Siezum Beispiel mit Hilfe der JavaScript-Methode Date() in ein lesbaresFormat verwandeln.

470

Page 472: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Animationen 16.4

16.4 Animationen

animate()In diesem Abschnitt stelle ich Ihnen verschiedene Möglichkeiten derAnimation von Elementen vor. Dabei kommt die Methode animate()zum Einsatz. Sie erzeugt durch eine Abfolge von Einzelbildern den Ein-druck eines gleichmäßigen Ablaufs, wie in einem Film.

In Abbildung 16.5 sehen Sie ein div-Element, das mit Hilfe von absolutenKoordinaten mitten auf der Seite platziert wurde. Über die Hyperlinkskönnen unterschiedliche Animationen gestartet werden. Der letzte Hy-perlink stellt den Ausgangszustand nach dem Laden der Seite wieder her.

Abbildung 16.5 Animationen

Es folgt der Code:

<html><head><script src="jquery.js" type="text/javascript"></script><script type="text/javascript">$(document).ready(function()

$("#f01").click(function()$("#re").animate(width:"200px"); );

[... weitere jQuery-Funktionen, siehe Erläuterung ...]

);</script>

471

Page 473: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

jQuery16

<style type="text/css">#quad position:absolute; width:100px; height:100px;

left:300px; top:100px; background:#aaaaaa;</style></head><body><div id="re">Rechteck</div><a id="f01" href="#">

1: Eine Eigenschaft (width) </a><br />

[... weitere Hyperlinks, siehe Abbildung ...]

</body></html>

Listing 16.4 Datei jq_animieren.htm

Das div-Element hat die eindeutige ID re, eine Größe von 100×100Pixeln, die absolute Position 300px/100px und eine graue Farbe. Dieabsolute Positionierung ist nur notwendig bei einer Animation des Orts.

Animierte Eigenschaft und Zielwert können in geschweiften Klammernnotiert werden, durch Doppelpunkt getrennt, der Wert in Anführungs-zeichen. Hyperlink 1 animiert die Breite bis zum Zielwert 200px:

$("#re").animate(width:"200px"); );

MehrereEigenschaften

Sie können mehrere Eigenschaften gleichzeitig ändern. Die Eigenschaft-Wert-Paare werden jeweils durch Kommata voneinander getrennt.Hyperlink 2 animiert hier die Breite bis zum Zielwert 200px und dieHöhe bis zum Zielwert 50px:

$("#re").animate(width:"200px", height:"50px");

Bewegung Eine animierte Bewegung erreichen Sie über die Änderung der Eigen-schaftswerte für left und top. Hyperlink 3 bewegt das Rechteck zumZielpunkt 400px/200px:

$("#re").animate(left:"400px", top:"200px");

Transparenz Die Transparenz (Durchsichtigkeit) ändern Sie über die Eigenschaft opa-city. Der Wert 1.0 ist der Standard, dann ist das Element nicht transpa-rent, also ganz undurchsichtig. Der Wert 0.0 steht für vollkommentransparent, also ganz durchsichtig. Hyperlink 4 ändert die Transparenzauf 0.5:

$("#re").animate(opacity:0.5);

472

Page 474: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Animationen 16.4

DauerEine Animation dauert ohne weitere Angabe 0,4 Sekunden, also 400 Mil-lisekunden. Sie können die Dauer der Animation über die Eigenschaftduration in Millisekunden einstellen, der Wert darf dabei nicht inAnführungszeichen gesetzt werden. Hyperlink 5 ändert die Breite aufden Zielwert 200px innerhalb von 2 Sekunden:

$("#re").animate(width:"200px", duration: 2000);

EasingEine Animation hat als weitere Eigenschaft die Easing-Funktion swing.Das bedeutet, dass die Animation zu Beginn beschleunigt, dann mitgleichmäßiger Geschwindigkeit weiterläuft und am Ende abbremst.Dadurch entsteht, wie bei der Ortsveränderung im vorherigen Beispiel,der Eindruck eines natürlichen Ablaufs.

Sie können die Easing-Funktion über die Eigenschaft easing einstellen.Als Alternative steht Ihnen in jQuery der Wert linear zur Verfügung.Das bedeutet, dass die Animation die ganze Zeit mit gleichmäßigerGeschwindigkeit abläuft. Easing-Plugins, die Sie im Internet finden, bein-halten Easing-Funktionen für andere Abläufe. Hyperlink 6 verschiebt dasElement innerhalb von 2 Sekunden linear bis zum Zielwert:

$("#re").animate(left:"400px",duration:2000, easing:"linear");

CallbackAls weiteren Parameter können Sie eine Callback-Funktion angeben.Diese wird ausgeführt, nachdem die Animation beendet ist. Hyperlink 7führt zu einer Verschiebung des Elements zum Zielwert 400px. Anschlie-ßend wird das Element zum Zielwert 300px verschoben:

$("#re").animate(left:"400px",function()$("#re").animate(left:"300px") );

Relative ÄnderungBisher wurde für die animierte Eigenschaft ein absoluter Zielwert ange-geben. Sie können aber auch relative Veränderungen durchführen mitHilfe der Operatoren += und -=. Hyperlink 8 verschiebt das Element beijeder Betätigung um 100px nach rechts und ändert die Transparenz um0.3, ausgehend von den jeweils aktuellen Werten:

$("#re").animate(left:"+=100px", opacity:"-=0.3");

Ein Wert über 1.0 oder unter 0.0 macht für die Eigenschaft opacityeigentlich keinen Sinn, führt aber nicht zu einem Fehler.

VerkettungWie bereits an anderer Stelle erläutert, können Methoden verkettet wer-den. Hyperlink 9 verschiebt das Element um 100px nach rechts, anschlie-ßend wieder um 100px nach links:

473

Page 475: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

jQuery16

$("#re").animate(left:"+=100px").animate(left:"-=100px");

Verzögerung Innerhalb einer Animation können Sie eine Verzögerung mit Hilfe derMethode delay() einbauen. Hyperlink 10 führt zur gleichen Bewegungwie Hyperlink 9. Zwischen den beiden Teilanimationen wird allerdings1 Sekunde gewartet:

$("#re").animate(left:"+=100px").delay(1000).animate(left:"-=100px");

Gleichzeitig Bei einer Verkettung laufen die einzelnen Teile einer Animation norma-lerweise nacheinander ab. Sie können mit Hilfe des Parameters queuedafür sorgen, dass sie gleichzeitig stattfinden.

Hyperlink 11 animiert die Breite zum Zielwert 200px innerhalb von 1Sekunde. Gleichzeitig wird die Höhe zum Zielwert 50px animiert, aller-dings innerhalb von 2 Sekunden. Der zweite Teil läuft also 1 Sekundelänger. Dies wird mit dem Booleschen Wert false für die Eigenschaftqueue erreicht, der Standardwert ist true. Der Wert darf nicht in Anfüh-rungszeichen stehen:

$("#re").animate(width:"200px", 1000).animate(height:"50px",

duration:2000, queue:false);

Hyperlink 12 dient dazu, den Ausgangszustand wiederherzustellen. Eswerden gleichzeitig fünf Eigenschaften verändert:

$("#re").animate(width:"100px", height:"100px",left:"300px", top:"100px", opacity:"1.0");

WeitereFunktionen

Puffer

Die Ereignisse werden gepuffert. Falls Sie also einen Hyperlink betätigen,bevor eine Animation geendet hat, wird die Aktion anschließend ausgeführt.

Schreibabkürzung

Als Schreibabkürzung für bestimmte Animationen gibt es die Methoden:

slideDown(), slideUp() und slideToggle() für die Veränderung derEigenschaft height

474

Page 476: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

JavaScript 16.5

16.5 JavaScript

In den einzelnen Funktionen wurden bisher nur jQuery-Methoden auf-gerufen. Wir sollten aber nicht vergessen, dass uns in den JavaScript-Containern der gesamte Sprachumfang zur Verfügung steht.

Sinus-AnimationIm nachfolgenden Beispiel bewegt sich ein kleines graues Quadrat ent-lang einer Sinuskurve von 0 Grad bis 360 Grad, sobald der Benutzer dar-auf klickt. Zusätzlich sind einige Hilfslinien eingezeichnet, siehe Abbil-dung 16.6.

Die Kurve besteht aus einzelnen Linienstücken. Jedes Linienstück wirddurch eine jQuery-Animation erzeugt. Eine JavaScript-Schleife sorgt fürdie Aneinanderreihung der Animationen. Je feiner die Kurve zerlegtwird, desto gleichmäßiger ist der Kurvenverlauf. Sie sehen aber bereitsbei einer Zerlegung in Stücke à 10 Grad einen recht homogenen Verlauf.

Abbildung 16.6 Animation einer Sinuskurve, Startpunkt

Der Code:

<html><head><script src="jquery.js" type="text/javascript"></script>

fadeIn(), fadeOut(), fadeToggle() und fadeTo() für die Veränderungder Eigenschaft opacity

show(), hide() und toggle() für die gleichzeitige Veränderung derEigenschaften width, height und opacity

475

Page 477: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

jQuery16

<script type="text/javascript">$(document).ready(function()$("#quad").click(function()

var w;for(w=10; w<=360; w+=10)

var links = (10 + w) + "px";var oben = (120 – Math.sin(w/180*Math.PI)*100) + "px";$("#quad").animate(left:links, top:oben,

duration:100, easing:"linear");

););</script></head><body><div id="quad" style="position:absolute; width:20px;height:20px; left:10px; top:120px;background:#aaaaaa"></div>

<script type="text/javascript">var t;for(t=30; t<=230; t+=50)

document.write("<div style='position:absolute;width:360px; height:1px; left:20px; top:"+ t + "px; background:#000000;'></div>");

</script></body></html>

Listing 16.5 Datei jq_sinus.htm

Die Hilfslinien werden mit Hilfe einer kleinen Schleife erzeugt. Darinnimmt die Eigenschaft top Werte von 30px bis 230px an. Das kleinegraue Quadrat ist absolut positioniert, ansonsten könnten die Eigen-schaften left und top nicht animiert werden.

Math.sin() Innerhalb der Methode click() gibt es die Variable w für den Winkel.Sie durchläuft die Werte von 10 bis 360 in 10er-Schritten. Das Rechteckbewegt sich in x-Richtung gleichmäßig nach rechts. Für die Bewegung iny-Richtung wird die Methode sin() des Math-Objekts aus JavaScriptgenutzt. Sie erwartet den Winkel im Bogenmaß, daher muss er vorherumgerechnet werden.

476

Page 478: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

jQuery und Ajax 16.6

Die auf diese Weise errechneten Werte für den Zielpunkt werden in denVariablen links und oben gespeichert. Diese Variablen können als Ziel-werte für die Eigenschaften left und top als Parameter der Methodeanimate() eingesetzt werden.

16.6 jQuery und Ajax

Ajax steht für Asynchronous JavaScript and XML. Diese Technik ermög-licht Ihnen das Nachladen von Dokumentteilen. Eine ausführlicheBeschreibung finden Sie in Kap. 15, »Ajax«. In jQuery gibt es eine Reihevon Funktionen, die intern die Ajax-Technik nutzen, wie bei jQuerygewohnt, browser- und versionsunabhängig.

load(), post()Im vorliegenden Beispiel werden die Funktionen load() und post()genutzt, um auf einfache Weise Inhalte aus Textdateien, HTML-Dateien,PHP-Programmen und XML-Dateien in das aktuelle Dokument zu impor-tieren, ohne den Rest der Seite neu aufbauen zu müssen.

Es gilt eine Einschränkung: Die externen Dateien müssen sich in der glei-chen Domain befinden. Im nachfolgenden Beispiel sehen Sie einige Ein-satzmöglichkeiten, siehe Abbildung 16.7.

Abbildung 16.7 jQuery, Ajax-Nutzung

477

Page 479: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

jQuery16

Der Code:

<html><head><script src="jquery.js" type="text/javascript"></script><script type="text/javascript">$(document).ready(function()$("#f01").click(function()

$("#aus").load("jq_ajax_test.txt"); );

[... weitere jQuery-Funktionen, siehe Erläuterung ...]

);</script></head><body><p><b>Funktion load() für Text und HTML:</b></p><a id="f01" href="#">Gesamte Text-Datei laden</a></br >

[... weitere Hyperlinks, siehe Abbildung ...]

<table border="1"><tr><td id="aus">Start-Text</td></tr></table>

</body></html>

Listing 16.6 Datei jq_ajax.htm

Die Tabellenzelle hat die eindeutige ID aus.

Hyperlink 1 lädt mit Hilfe der Methode load() den gesamten Text auseiner Textdatei in die Tabellenzelle:

$("#aus").load("jq_ajax_test.txt");

Hyperlink 2 lädt den gesamten Inhalt aus einer HTML-Datei inklusive derMarkierungen:

$("#aus").load("jq_ajax_test.htm");

Hyperlink 3 lädt den Inhalt des Elements mit der eindeutigen ID t1 ausder HTML-Datei inklusive der Markierungen. Achten Sie auf das tren-nende Leerzeichen im Parameter:

$("#aus").load("jq_ajax_test.htm #t1");

Hyperlink 4 ruft mit Hilfe der Methode post()ein PHP-Programm auf.Im Parameter (hier erg) der Callback-Funktion steht anschließend die

478

Page 480: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

jQuery und Ajax 16.6

Rückgabe des Webservers. Diese wird mit Hilfe der Methode html()zum Inhalt der Tabellenzelle:

$.post("jq_ajax_test.php",function(erg) $("#aus").html(erg); );

Das zugehörige PHP-Programm:

<?phpheader("Content-Type: text/html; charset=utf-8");echo "<b>Daten</b> aus PHP-Datei";

?>

Listing 16.7 Datei jq_ajax_test.php

Hyperlink 5 ruft ein PHP-Programm auf, dabei werden Daten an dasPHP-Programm gesendet. Es handelt sich um Eigenschaft-Wert-Paare,durch Doppelpunkte getrennt, Werte in Anführungszeichen. Die Rück-gabe des Webservers wird zum Inhalt der Tabellenzelle:

$.post("jq_ajax_test_daten.php",zahl1:'12.2', zahl2:'25.5',function(erg) $("#aus").html(erg); );

Das zugehörige PHP-Programm:

<?phpheader("Content-Type: text/html; charset=utf-8");echo "<b>Summe</b> der gesendeten Daten aus PHP-Datei: " .(doubleval($_POST["zahl1"]) + doubleval($_POST["zahl2"]));

?>

Listing 16.8 Datei jq_ajax_test_daten.php

Hyperlink 6 ruft eine XML-Datei auf. Es werden der Wert des Knotens kaund das Attribut aa des Knotens kb ermittelt und zum Inhalt der Tabel-lenzelle:

$.post("jq_ajax_test.xml",function(erg) $("#aus").html(erg.getElementsByTagName("ka")[0].firstChild.nodeValue+ " / " +erg.getElementsByTagName("kb")[0].getAttribute("aa")););

479

Page 481: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

jQuery16

Die zugehörige XML-Datei:

<?xml version="1.0" encoding="UTF-8"?><wurzel><ka>Wert des 1. Knotens</ka><kb aa="1. Attribut des 2. Knotens"

ab="2. Attribut des 2. Knotens">Wert des 2. Knotens</kb>

</wurzel>

Listing 16.9 Datei jq_ajax_test.xml

Hyperlink 7 ruft ein PHP-Programm auf. Dieses PHP-Programm liefertein XML-Dokument. Es wird der Wert des Knotens ka ermittelt und zumInhalt der Tabellenzelle:

$.post("jq_ajax_test_xml.php",function(erg) $("#aus").html(erg.getElementsByTagName("ka")[0].firstChild.nodeValue););

Das zugehörige PHP-Programm:

<?phpheader("Content-Type: text/xml; charset=utf-8");echo "<?xml version='1.0' encoding='utf-8'?>\n";echo "<wurzel>\n";echo " <ka>Wert des 1. Knotens</ka>\n";echo " <kb>Wert des 2. Knotens</kb>\n";echo "</wurzel>\n";

?>

Listing 16.10 Datei jq_ajax_test_xml.php

Mit den Beispielen dieses Programms wird es Ihnen ermöglicht,

Daten an ein PHP-Programm zu senden,

mit diesen Daten im PHP-Programm eine Datenbankabfrage zu starten,

aus dem Ergebnis der Datenbankanfrage mit Hilfe von PHP ein XML-Dokument zu erzeugen,

dieses XML-Dokument zurückzusenden und

die Inhalte des XML-Dokuments an den gewünschten Stellen des auf-rufenden Dokuments unterzubringen,

siehe auch Abschnitt 15.6, »Zugriff auf MySQL-Datenbank«.

480

Page 482: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

17 Grafiken programmieren

GD-BibliothekPHP gibt Ihnen mit der GD-Bibliothek eine Möglichkeit, eigene Grafikenzu erstellen. Diese Grafiken lassen sich unmittelbar anzeigen oder alsGrafikdatei speichern. Außerdem können Sie vorhandene Grafiken ladenund verändern. In diesem Buch wird unter Windows die Version 2.0.34verwendet, unter Ubuntu die Version 2.0. Die Bibliothek wurdeursprünglich von Thomas Boutell entwickelt.

Als umfangreiches Beispiel zum Abschluss dieses Abschnitts soll die Dar-stellung eines Aktienkurses dienen. Das Beispiel liefert eine anschaulicheDarstellung für dynamische Daten aus einer Datenbank, die mit den rea-len Börsenkursen gefüllt wird. Ein weiteres, umfangreiches Beispiel fürdie Anwendung der GD-Bibliothek finden Sie in Abschnitt 20.2, »Projekt›Blog‹«.

17.1 Installation testen

ExtensionBei den in diesem Buch empfohlenen Installationen für Windows undUbuntu ist die GD-Bibliothek als Erweiterung (Extension) bereits akti-viert. Dies können Sie wie folgt testen:

<html><body><?php

if (extension_loaded("gd"))echo "GD-Bibliothek aktiviert<br />";$gd = gd_info();echo "Version: " . $gd["GD Version"] . "<br />";echo "Grafikformate: ";if ($gd["JPEG Support"]) echo "JPEG ";if ($gd["PNG Support"]) echo "PNG ";

elseecho "GD-Bibliothek nicht aktiviert";

?>

481

Page 483: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Grafiken programmieren17

</body></html>

Listing 17.1 Datei im_pruefen.php

Falls GD aktiviert ist, erfolgt die Ausgabe, die Sie in Abbildung 17.1sehen.

Abbildung 17.1 Prüfung der GD-Aktivierung

Erläuterung:

extension_loaded()

Die Funktion extension_loaded() stellt fest, ob die GD-Bibliothekgeladen wurde. Falls ja, erfolgt die entsprechende Ausgabe.

gd_info() Die Funktion gd_info() liefert ein assoziatives Feld mit Informatio-nen über die GD-Bibliothek.

Das Element "GD Version" beinhaltet die Versionsnummer.

Die Elemente "JPEG Support" bzw. "PNG Support" haben den Wert 1,falls das entsprechende Format unterstützt wird. Dies sind zwei inte-ressante Formate für Internetseiten.

Sollten Sie eine Windows-Installation haben, bei der die GD-Bibliotheknicht aktiviert ist, so können Sie diese wie folgt aktivieren:

ini_get() Prüfen Sie zunächst, ob sich die Datei php_gd2.dll im Verzeichnis fürdie Extensions befindet. Dieses Verzeichnis lässt sich über den fol-genden Aufruf der Funktion ini_get() ermitteln: echo ini_get("extension_dir");

php_gd2.dll Suchen Sie in der PHP-Konfigurationsdatei php.ini die Zeile ;exten-sion=php_gd2.dll. Sie finden die Datei unter XAMPP im VerzeichnisC:\xampp\php, unter EasyPHP im Verzeichnis C:\EasyPHP\conf_files.und unter Ubuntu im Verzeichnis /etc/php5/apache2.

Entfernen Sie das Semikolon am Anfang der Zeile, und speichern Siedie Datei.

Starten Sie den Apache Webserver neu.

482

Page 484: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Grafik speichern 17.2

17.2 Grafik speichern

In einem ersten Beispiel soll eine einfache Grafik ohne Inhalt erzeugt undin einer Datei gespeichert werden:

<html><body><?php

$im = imagecreate(150,100);$grau = imagecolorallocate($im, 192, 192, 192);imagefill ($im, 0, 0, $grau);imagejpeg($im, "im_test.jpg");imagedestroy($im);

?></body></html>

Listing 17.2 Datei im_speichern.php

Im Browser wird nichts angezeigt. Die Grafik ist in der Datei im_test.jpgim gleichen Verzeichnis wie das Programm im_speichern.php gespei-chert. Die Datei im_test.jpg sehen Sie in Abbildung 17.2.

Abbildung 17.2 Eine erste Grafik

Erläuterung:

imagecreate() Die Funktion imagecreate() erzeugt ein Grafikobjekt in der angege-benen Breite (150 Pixel) und Höhe (100 Pixel). Sie liefert einen Zeigerauf das Grafikobjekt. Dieser Zeiger wird anschließend benötigt, umdas Grafikobjekt zu bearbeiten.

imagecolor-allocate()

Die Funktion imagecolorallocate() dient der Erstellung einer Farbefür die Farbpalette dieser Grafik. Sie benötigt vier Parameter: den Zei-ger auf die Grafik und drei Werte zwischen 0 und 255 für die Rot-,

483

Page 485: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Grafiken programmieren17

Grün- und Blauanteile der Grafik. Sie liefert eine Farb-ID für dieerstellte Farbe zurück.

imagefill() Die Funktion imagefill() füllt eine Grafik mit Farbe. Sie benötigtvier Parameter: den Zeiger auf die Grafik, zwei Werte für die x- undy-Koordinaten des Startpunkts für den Füllvorgang sowie die Farb-ID.

imagejpeg() Die Funktion imagejpeg() erzeugt die Grafik und speichert sie. Siebenötigt zwei Parameter: den Zeiger auf die Grafik und den Datei-namen.

imagedestroy() Die Funktion imagedestroy() gibt den Speicher, der zur Erzeugungder Grafik benötigt wurde, wieder frei.

imagepng()

17.3 Grafik unmittelbar anzeigen

Eine Grafik lässt sich auch unmittelbar nach ihrer Erzeugung anzeigen.Falls die Grafik später nicht mehr benötigt wird, entfällt dadurch das zeit-aufwendige Speichern:

<?php$im = imagecreate(150,100);$grau = imagecolorallocate($im, 192, 192, 192);imagefill ($im, 0, 0, $grau);

header("Content-Type: image/jpeg");imagejpeg($im);

imagedestroy($im);?>

Listing 17.3 Datei im_anzeigen.php

Die Grafik wird nun unmittelbar im Browser angezeigt, wie Sie in Abbil-dung 17.3 sehen.

Hinweis

Eine Grafik im PNG-Format können Sie wie folgt erzeugen:

imagepng($im, "im_test.png");

484

Page 486: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Grafik unmittelbar anzeigen 17.3

Abbildung 17.3 Grafik unmittelbar im Browser anzeigen

Erläuterung:

header() Die Funktion header() wird zum Senden des Headers benutzt. Eshandelt sich um Startinformationen für das HTTP-Protokoll. Hier wirdder Typ der nachfolgenden Informationen (image/jpg) übermittelt.

Die Funktion imagejpeg() benötigt jetzt keinen Dateinamen mehr.

In einer PHP-Datei, die direkt ein Bild oder eine andere Anwendungund keine HTML-Datei erzeugt, sollten Sie keine HTML-Container,wie zum Beispiel <html> ... </html> oder <body> ... </body>, set-zen.

Sie können ein solches programmiertes Bild auch direkt in eine HTML-Datei einbinden:

<html><body>Es folgt ein Bild: <img src="im_anzeigen.php" /></body></html>

Listing 17.4 Datei im_anzeigen.htm

Das Ergebnis sieht dann aus wie in Abbildung 17.4.

Hinweis

Eine Grafik im PNG-Format können Sie wie folgt erzeugen:

header("Content-Type: image/png");imagepng($im);

485

Page 487: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Grafiken programmieren17

Abbildung 17.4 Einbindung in HTML-Datei

17.4 Text mit internen Fonts

Zur Anzeige von Text sind interne Fonts und TrueType-Fonts vorhanden.Zunächst ein Beispiel mit internen Fonts, das Sie in Abbildung 17.5sehen.

Abbildung 17.5 Text mit internem Font

Der Programmcode:

<?php$im = imagecreate(150,100);$grau = imagecolorallocate($im, 192, 192, 192);imagefill ($im, 0, 0, $grau);

$schwarz = imagecolorallocate($im, 0, 0, 0);

Hinweis

In den folgenden Abschnitten wird die Grafik jeweils unmittelbar nach ihrerErzeugung angezeigt. Jede Grafik lässt sich auch in einer Grafikdatei spei-chern, wie im vorherigen Abschnitt erläutert.

486

Page 488: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Text mit TrueType-Fonts 17.5

imagestring($im, 5, 0, 0, "hallo", $schwarz);

header("Content-Type: image/jpeg");imagejpeg($im);imagedestroy($im);

?>

Listing 17.5 Datei im_intern.php

Erläuterung:

Es wird eine weitere Farbe (Schwarz) zur Farbpalette der Grafik hin-zugefügt.

imagestring() Die Funktion imagestring() erzeugt einen Text in einem internenFont. Sie benötigt sechs Parameter: den Zeiger auf die Grafik, dieGröße des Fonts, die x- und y-Koordinaten, den Text selbst und dieFarb-ID. Die x- und y-Koordinaten werden ab der linken oberen Eckeder Seite gemessen und kennzeichnen den oberen linken Startpunktdes Textes.

Ergänzung:

Der Wert für die Größe des Fonts kann zwischen 1 (klein) und 5 (groß)liegen. Interne Fonts bieten nicht sehr viele Variationsmöglichkeiten.

17.5 Text mit TrueType-Fonts

Weitaus mehr Möglichkeiten bieten TrueType-Fonts. Bei manchenGrafiken besteht auch die Notwendigkeit, den Text zu drehen, zumBeispiel für eine Achsenbeschriftung. Ein Beispiel dafür sehen Sie inAbbildung 17.6.

Der Programmcode:

<?php$im = imagecreate(150,100);$grau = imagecolorallocate($im, 192, 192, 192);imagefill ($im, 0, 0, $grau);$schwarz = imagecolorallocate($im, 0, 0, 0);

$schriftart = "arial.ttf";imagettftext($im, 20, 0, 0, 20,

$schwarz, $schriftart, "normal");imagettftext($im, 20, 90, 144, 100,

487

Page 489: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Grafiken programmieren17

$schwarz, $schriftart, "gedreht");

header("Content-Type: image/jpeg");imagejpeg($im);imagedestroy($im);

?>

Listing 17.6 Datei im_ttf.php

Abbildung 17.6 Text mit dem TrueType-Font Arial

Erläuterung:

Der Name einer TTF-Datei, die sich im gleichen Verzeichnis befindet,wird in einer Variablen gespeichert. Dies ist von Vorteil, falls mehrereTexte ausgegeben werden und eventuell später die Schriftart für alleTexte geändert werden soll.

Unter Windows finden sich die systemweit verfügbaren TTF-Dateienzum Herüberkopieren meist im Verzeichnis C:\Windows\Fonts, zumBeispiel die Datei arial.ttf. Unter Ubuntu liegen sie meist im Ver-zeichnis /usr/share/fonts/truetype und darunter, zum Beispiel dieDatei ubuntu-font-family/Ubuntu-R.ttf.

imagettftext() Die Funktion imagettftext() erzeugt einen Text. Sie benötigt achtParameter: den Zeiger auf die Grafik, die Größe des Fonts, einenDrehwinkel, zwei Werte für die x- und y-Koordinaten, die Farb-ID,die Schriftart und den Text selbst.

Die x- und y-Koordinaten kennzeichnen den Startpunkt des Textes;dies ist das linke Ende der Basislinie des Textes. Die Basislinie ist dieLinie, die direkt unter den Buchstaben verläuft, die keine Unterlänge,also kein »Anhängsel« nach unten haben. Buchstaben ohne Unter-länge sind in der hier verwendeten Schriftart zum Beispiel »e« oder»d«, Buchstaben mit einer Unterlänge sind zum Beispiel »g« oder »p«.

488

Page 490: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Bild aus einer Datei laden 17.6

Im ersten Beispiel wurde die Schriftgröße 20 gewählt und für den ers-ten Text die Startkoordinaten 0, 20. Daher beginnt der Text am linkenRand der Grafik; der obere Rand des Textes schließt mit dem oberenRand der Grafik ab.

Text drehen Der Drehwinkel wird in Grad angegeben. Er wird wie in der Mathe-matik verwendet, das heißt, 0 Grad liegt bei 3 Uhr, und es wird gegenden Uhrzeigersinn gerechnet (90 Grad = 12 Uhr, 180 Grad = 9 Uhr,270 Grad = 6 Uhr). Drehpunkt ist wiederum das linke Ende der Basis-linie des Textes.

Im zweiten Beispiel wurde ein Drehwinkel von 90 Grad gewählt. Diey-Koordinate liegt bei 100, also beginnt der Text am unteren Rand derGrafik. Die x-Koordinate wurde etwas kleiner als 150 gewählt. Damitliegt der Startpunkt etwas links von der rechten unteren Ecke der Gra-fik. Da der Buchstabe »g« eine Unterlänge hat, wäre er andernfallsnicht vollständig angezeigt worden.

17.6 Bild aus einer Datei laden

Neben eigenen Bildern können Sie auch vorhandene Bilder aus Dateien la-den, verändern, anzeigen und speichern. Ein Beispiel zeigt Abbildung 17.7.

Abbildung 17.7 Bild aus Datei, mit Text

489

Page 491: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Grafiken programmieren17

Der Programmcode:

<?php$im = imagecreatefromjpeg("im_blume.jpg");$breite = imagesx($im);$hoehe = imagesy($im);

$schwarz = imagecolorallocate($im, 0, 0, 0);$weiss = imagecolorallocate($im, 255, 255, 255);$schriftart = "arial.ttf";imagettftext($im, 20, 90, $breite, $hoehe,

$weiss, $schriftart, "Sonnen");imagettftext($im, 20, 180, $breite, 0,

$schwarz, $schriftart, "blume");header("Content-Type: image/jpeg");imagejpeg($im);imagedestroy($im);

?>

Listing 17.7 Datei im_laden.php

Erläuterung:

imagecreate-fromjpeg()

Die Funktion imagecreatefromjpeg() dient dem Laden eines Bildesaus einer Datei. Als Parameter wird der Name einer Bilddatei angege-ben, hier im gleichen Verzeichnis. Der Rückgabewert ist wie bei ima-gecreate() ein Zeiger auf das Bild, der anschließend verwendet wird.

imagesx(),imagesy()

Die Funktionen imagesx() und imagesy() werden eingesetzt, um dieBreite bzw. Höhe des geladenen Bildes zu ermitteln. Im dargestelltenBeispiel wird es dadurch möglich, zwei Texte am rechten unterenbzw. am rechten oberen Rand zu platzieren.

imagecreate-frompng()

17.7 Bilder aus Dateien ineinander einbetten

Es ist auch möglich, Bilder vollständig oder teilweise in andere Bildereinzubetten, wie Sie in Abbildung 17.8 sehen.

Hinweis

Eine Grafik im PNG-Format können Sie wie folgt laden:

imagecreatefrompng($im, "im_test.png");

490

Page 492: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Bilder aus Dateien ineinander einbetten 17.7

Abbildung 17.8 Bild einbetten

Der Programmcode:

<?php$im = imagecreate(250,150);$grau = imagecolorallocate($im, 192, 192, 192);imagefill ($im, 0, 0, $grau);

$ve = imagecreatefromjpeg("im_vogel.jpg");imagecopy($im, $ve, 0, 0, 0, 0,

imagesx($ve), imagesy($ve));imagecopy($im, $ve, 150, 50, 20, 10, 50, 50);

header("Content-Type: image/jpeg");imagejpeg($im);imagedestroy($im);imagedestroy($ve);

?>

Listing 17.8 Datei im_einbetten.php

Erläuterung:

Mit der Funktion imagecreate() wird eine eigene Grafik mit grauemHintergrund in der Größe 250×150 Pixel erzeugt.

Mit der Funktion imagecreatefromjpeg() wird ein vorhandenes Bildaus einer Datei geladen.

imagecopy() Die Funktion imagecopy() dient dem Einbetten eines zweiten Bildesin ein Basisbild. Sie benötigt acht Parameter: den Zeiger auf das Basis-bild, den Zeiger auf das zweite Bild, die x- und y-Koordinaten im

491

Page 493: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Grafiken programmieren17

Basisbild, die x- und y-Koordinaten im zweiten Bild sowie Breite undHöhe des Ausschnitts des zweiten Bildes.

Bildausschnitt Die x- und y-Koordinaten dienen jeweils als oberer linker Bezugs-punkt. Das zweite Bild wird ab den x- und y-Koordinaten im Basisbildeingebettet. Es wird der Ausschnitt des zweiten Bildes eingebettet,der ab den x- und y-Koordinaten im zweiten Bild beginnt und dieangegebene Breite und Höhe hat.

Im ersten Beispiel werden die Parameter ($im, $ve, 0, 0, 0, 0,imagesx($ve), imagesy($ve)) verwendet. Es wird ein Ausschnitt desBildes $ve im Bild $im eingebettet. Der Ausschnitt beginnt bei 0, 0 undhat die Maße des zweiten Bildes, demnach wird das vollständige Bildverwendet. Eingebettet wird im Bild $im ab 0, 0, also links oben.

Im zweiten Beispiel werden die Parameter ($im, $ve, 150, 50, 20, 10,50, 50) verwendet. Es wird wiederum ein Ausschnitt des Bildes $veim Bild $im eingebettet. Der Ausschnitt beginnt bei 20, 10 und hat dieMaße 50, 50, somit wird ein kleiner Ausschnitt aus dem linken oberenTeil von $ve verwendet. Eingebettet wird im Bild $im ab 150, 50, alsoetwas rechts vom Zentrum.

17.8 Ellipsen und Bögen

Es gibt eine Reihe von Zeichenelementen. Beginnen wir mit Ellipsen undBögen. Diese sehen Sie in Abbildung 17.9.

Abbildung 17.9 Ellipsen und Bögen

Der Programmcode:

<?php$im = imagecreate(500,100);$grau = imagecolorallocate($im, 192, 192, 192);

492

Page 494: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Ellipsen und Bögen 17.8

imagefill ($im, 0, 0, $grau);$s = imagecolorallocate($im, 0, 0, 0);

imageellipse($im, 50, 50, 50, 50, $s);imagefilledellipse($im, 120, 50, 50, 50, $s);

imagearc($im, 190, 50, 50, 50, 0, 90, $s);imagefilledarc($im, 260, 50, 50, 50, 0, 90,

$s, IMG_ARC_PIE);imagefilledarc($im, 330, 50, 50, 50, 0, 90,

$s, IMG_ARC_EDGED | IMG_ARC_NOFILL);imagefilledarc($im, 400, 50, 50, 50, 0, 90,

$s, IMG_ARC_CHORD);

header("Content-Type: image/jpeg");imagejpeg($im);imagedestroy($im);

?>

Listing 17.9 Datei im_bogen.php

Erläuterung:

imageellipse() Die Funktion imageellipse() zeichnet eine Ellipse. Sie benötigtsechs Parameter: den Zeiger auf die Grafik, die x- und y-Koordinatendes Mittelpunkts der Ellipse, die Breite und Höhe der Ellipse sowiedie Farbe des Randes. Falls Breite und Höhe gleich groß sind, wird einKreis gezeichnet.

imagefilled-ellipse()

Die Funktion imagefilledellipse() zeichnet eine gefüllte Ellipse.Sie hat die gleichen Parameter wie die Funktion imageellipse(). Dieangegebene Farbe dient dem Füllen des Objekts.

imagearc() Die Funktion imagearc() zeichnet einen Bogen. Sie hat fast die glei-chen Parameter wie die Funktion imageellipse(). Zusätzlich werdennach den Koordinaten- und Größenangaben der Startwinkel und derEndwinkel des Bogens in Grad notiert. 0 Grad liegt bei 3 Uhr, und eswird mit dem Uhrzeigersinn gerechnet (90 Grad = 6 Uhr, 180 Grad =9 Uhr, 270 Grad = 12 Uhr), also nicht wie in der Mathematik üblich,sondern umgekehrt. Im vorliegenden Beispiel wurde jeweils dieAngabe 0, 90 verwendet: Es handelt sich also um den unteren rechtenAusschnitt.

imagefilledarc() Die Funktion imagefilledarc() bietet Füllmöglichkeiten für Bögen.Nach den Parametern der Funktion imagearc() wird zusätzlich mit

493

Page 495: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Grafiken programmieren17

Hilfe von Konstanten die Art der Füllung notiert. Diese Konstantenkönnen einzeln stehen oder durch den Operator | (Bit-weises Und)miteinander verknüpft werden:

IMG_ARC_PIE: gefüllter Bogen (Kuchenstück)

IMG_ARC_EDGED: Verbindung des Startwinkels und des Endwinkelsmit dem Zentrum

IMG_ARC_NOFILL: Randbegrenzung statt Füllung

IMG_ARC_CHORD: direkte Verbindung zwischen Startwinkel undEndwinkel

17.9 Rechtecke und Polygone

Es geht weiter mit Rechtecken und Polygonen. Abbildung 17.10 zeigteinige Beispiele.

Abbildung 17.10 Rechtecke und Polygone

Der Programmcode:

<?php$im = imagecreate(350,100);$grau = imagecolorallocate($im, 192, 192, 192);imagefill ($im, 0, 0, $grau);$s = imagecolorallocate($im, 0, 0, 0);

imagerectangle($im, 25, 25, 75, 75, $s);imagefilledrectangle($im, 95, 25, 145, 75, $s);

$poly1 = array(165, 25, 190, 75, 215, 25);imagepolygon($im, $poly1, 3, $s);

$poly2 = array(240, 25, 265, 75, 290, 25);

494

Page 496: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Linien und Pixel 17.10

imagefilledpolygon($im, $poly2, 3, $s);

header("Content-Type: image/jpeg");imagejpeg($im);imagedestroy($im);

?>

Listing 17.10 Datei im_ecke.php

Erläuterung:

imagerectangle() Die Funktion imagerectangle() zeichnet ein Rechteck. Sie benötigtsechs Parameter: den Zeiger auf die Grafik, die x- und y-Koordinatender linken oberen Ecke und der rechten unteren Ecke des Rechteckssowie die Farbe des Randes.

imagefilledrect-angle()

Die Funktion imagefilledrectangle() zeichnet ein gefülltes Recht-eck. Sie hat die gleichen Parameter wie die Funktion imagerect-angle(). Die angegebene Farbe dient dem Füllen des Objekts.

imagepolygon() Die Funktion imagepolygon() zeichnet ein geschlossenes Vieleck(Polygon). Sie benötigt vier Parameter: den Zeiger auf die Grafik, einKoordinaten-Array, die Anzahl der Eckpunkte und die Farbe des Ran-des. Das Array wird nacheinander mit den x- und y-Koordinaten dereinzelnen Eckpunkte gefüllt.

imagefilled-polygon()

Die Funktion imagefilledpolygon() zeichnet ein gefülltes Vieleck(Polygon). Sie benötigt die gleichen Parameter wie die Funktion image-polygon(). Die angegebene Farbe dient dem Füllen des Objekts.

17.10 Linien und Pixel

Es folgen Linien und Pixel, wie Sie sie in Abbildung 17.11 sehen.

Der Programmcode:

<?php$im = imagecreate(150,150);$grau = imagecolorallocate($im, 192, 192, 192);imagefill ($im, 0, 0, $grau);$s = imagecolorallocate($im, 0, 0, 0);

for($i=25; $i<=125; $i+=5)imagesetpixel($im, 25, $i, $s);

495

Page 497: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Grafiken programmieren17

imageline($im, 50, 25, 50, 125, $s);

imagesetthickness($im, 10);imageline($im, 75, 25, 75, 125, $s);imagesetthickness($im, 1);

$w = imagecolorallocate($im, 255, 255, 255);$style = array($s, $s, $s, $s, $s, $s, $s,

$w, $w, $w, $w, $w, $w, $w);imagesetstyle($im, $style);imageline($im, 100, 25, 100, 125,

IMG_COLOR_STYLED);

imagedashedline($im, 125, 25, 125, 125, $s);

header("Content-Type: image/jpeg");imagejpeg($im);imagedestroy($im);

?>

Listing 17.11 Datei im_linie.php

Abbildung 17.11 Linien und Pixel

Erläuterung:

imagesetpixel() Die Funktion imagesetpixel() setzt ein einzelnes Pixel. Sie benötigtvier Parameter: den Zeiger auf die Grafik, die x- und y-Koordinatendes einzelnen Pixels und die Farbe des Pixels. Im vorliegenden Bei-spiel wurde zur Verdeutlichung mit Hilfe einer Schleife eine Pixel-reihe gesetzt.

496

Page 498: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Füllen mit Farbe 17.11

imageline() Die Funktion imageline() zieht eine Linie. Sie benötigt sechs Para-meter: den Zeiger auf die Grafik, die x- und y-Koordinaten des Start-punktes und des Endpunktes der Linie und die Farbe der Linie.

imageset-thickness()

Die Funktion imagesetthickness() bestimmt die Dicke von Linien,mit denen nachfolgende Objekte gezeichnet werden. Sie benötigtzwei Parameter: den Zeiger auf die Grafik und die Dicke der Linie inPixeln. Im vorliegenden Beispiel wurde die Dicke zunächst auf 10 undnach dem Ziehen einer Linie wieder auf 1 gesetzt. Ohne Zurücksetzenwären alle weiteren Objekte mit Linien der Dicke 10 gezeichnet wor-den.

imagesetstyle() Die Funktion imagesetstyle() bestimmt die Art von Linien, mitdenen nachfolgende Objekte gezeichnet werden. Sie benötigt zweiParameter: den Zeiger auf die Grafik und ein Farben-Array für dasStyle-Element. Im vorliegenden Beispiel wurde festgelegt, dass dasStyle-Element aus sieben schwarzen und sieben weißen Pixelnbesteht. Falls als letzter Parameter der Funktion imageline() die Kon-stante IMG_ COLOR_STYLED statt einer Farbangabe eingesetzt wird,wird die Linie mit den gewählten Style-Elementen gezogen.

imagedashedline() Die Funktion imagedashedline() zeichnet eine gepunktete Linie. Siebenötigt die gleichen Parameter wie die Funktion imageline().

17.11 Füllen mit Farbe

Objekte bzw. Kombinationen von Objekten innerhalb einer Grafik kön-nen mit Farben gefüllt werden. Ein Beispiel sehen Sie in Abbildung 17.12.

Der Programmcode:

<?php$im = imagecreate(250,200);$grau = imagecolorallocate($im, 192, 192, 192);imagefill ($im, 0, 0, $grau);$s = imagecolorallocate($im, 0, 0, 0);$w = imagecolorallocate($im, 255, 255, 255);$r = imagecolorallocate($im, 255, 0, 0);

imagerectangle($im, 0, 0, 249, 199, $s);imageellipse($im, 100, 100, 100, 100, $s);imageellipse($im, 150, 100, 100, 100, $s);imagerectangle($im, 120, 90, 130, 110, $r);

497

Page 499: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Grafiken programmieren17

imagefilltoborder($im, 125, 100, $s, $w);imagefilltoborder($im, 1, 1, $s, $w);

header("Content-Type: image/jpeg");imagejpeg($im);imagedestroy($im);

?>

Listing 17.12 Datei im_fuellen.php

Abbildung 17.12 Füllen mit Farbe

Erläuterung:

Zunächst werden zwei Kreise gezeichnet, die sich überlappen, und einRechteck am Rand der Grafik. Zur Verdeutlichung wird ein weitereskleines rotes Rechteck innerhalb des Überlappungsbereichs gezeich-net. Dieses Rechteck ist in der endgültigen Grafik nicht mehr zusehen, da es durch die Füllung gelöscht wird.

imagefillto-border()

Die Funktion imagefilltoborder() füllt Teile einer Grafik mit Farbe.Sie benötigt fünf Parameter: den Zeiger auf die Grafik, die x- und y-Koordinaten des Startpunktes, die Grenzfarbe sowie die Füllfarbe.Jedes Pixel der Grafik wird, beginnend mit dem Startpunkt, in derFüllfarbe gefüllt. Sobald beim Füllen die Grenzfarbe oder der Randder Grafik erreicht wird, wird in dieser Richtung nicht weiter gefüllt.

Falls sich also der Startpunkt innerhalb eines mit der Grenzfarbegeschlossenen Bereichs befindet, wird nur dieser Bereich gefüllt. Imvorliegenden Beispiel sind zwei Bereiche geschlossen: der Überlap-

498

Page 500: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Darstellung eines Aktienkurses 17.12

pungsbereich der beiden Kreise und der Bereich außerhalb der beidenKreise.

Beim Füllen wird das rote Rechteck innerhalb des Überlappungsbe-reichs ignoriert (das heißt übermalt), da es nicht die Grenzfarbe hat.

Ergänzung:Das große umgebende Rechteck wäre nicht nötig gewesen; es dient hiernur der Verdeutlichung.

17.12 Darstellung eines Aktienkurses

Den Abschluss dieses Abschnitts bildet die Darstellung eines Aktienkur-ses. Dieses einfache Programm arbeitet mit zufälligen Daten. Normaler-weise stammen die Daten aus einer Datenbank, die vorher mit realenBörsenkursen gefüllt wurde. Ein weiteres, umfangreiches Beispiel für dieAnwendung der GD-Bibliothek finden Sie in Abschnitt 20.2, »Projekt›Blog‹«. Abbildung 17.13 zeigt die Darstellung des Aktienkurses.

Abbildung 17.13 Aktienkurs

499

Page 501: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Grafiken programmieren17

Es werden die Tageskurse der letzten fünf Wochen, ausgehend vom28.02.2012, dargestellt. Auf der x-Achse wird für jede Woche ein Datumangegeben, auf der y-Achse wird der Kurswert in Stufen von 10 € darge-stellt. Der Programmcode:

<?php// Grafik erzeugen$im = imagecreate(400,400);

// Farben, Schriftart$grau = imagecolorallocate($im, 192, 192, 192);imagefill ($im, 0, 0, $grau);$s = imagecolorallocate($im, 0, 0, 0);$r = imagecolorallocate($im, 255, 0, 0);$schriftart = "arial.ttf";

// Startdatum$ds = "28.02.2012";$datum = mktime(0, 0, 0, substr($ds,3,2),

substr($ds,0,2), substr($ds,6,4));$datum = strtotime("-35 day", $datum);

// Kursesrand((double)microtime()*1000000);$kurs[0] = 25;for($i=1; $i<36; $i++)

$kurs[$i] = $kurs[$i-1] + rand(-3,3);if($kurs[$i]<1)

$kurs[$i] = 1;

// Gitternetz, Beschriftungfor($i=0; $i<6; $i++)

imageline($im, 30, 30 + $i * 340/5,370, 30 + $i * 340/5, $s);

imagettftext($im, 11, 0, 375,30 + $i * 340/5, $s, $schriftart, 50-$i*10);

imageline($im, 30 + $i * 340/5, 30,30 + $i * 340/5, 370, $s);

imagettftext($im, 11, 0, 12 + $i * 340/5,385, $s, $schriftart, date("d.m.",$datum));

$datum = strtotime("+7 day", $datum);

500

Page 502: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Darstellung eines Aktienkurses 17.12

// Kurs darstellenfor($i=0; $i<35; $i++)imageline($im, 30 + $i * 340/35,

370 – $kurs[$i] * 340/50,30 + ($i+1) * 340/35,370 – $kurs[$i+1] * 340/50, $r);

// Grafik darstellenheader("Content-Type: image/jpeg");imagejpeg($im);

// Speicher freigebenimagedestroy($im);

?>

Listing 17.13 Datei im_aktie.php

Erläuterung:

Es wird eine Grafik der Größe 400×400 Pixel erzeugt.

Die Farben Grau (Hintergrund), Schwarz (Gitternetz und Beschrif-tung) und Rot (Kursverlauf) werden der Farbpalette der Grafik hinzu-gefügt. Die TrueType-Schriftart Arial wird eingeführt.

In der Variablen $ds wird das Enddatum für den Kursverlauf festge-legt. Dieses würde im Normalfall aus dem Systemdatum (Kursverlaufbis heute) oder aus einer Benutzereingabe (Kursverlauf bis ausgewähl-ter Tag) generiert. Das Datum wird mit der Funktion mktime() in dasDatumsformat konvertiert, mit dem PHP arbeiten und rechnen kann.Aus dem Enddatum wird mit der Funktion strtotime() das Startda-tum (35 Tage = 5 Wochen vorher) erzeugt.

Die Werte für den Kursverlauf werden in ein Array geschrieben. DerStartwert ist 25. Die per Zufallszahlengenerator erzeugten Änderungs-werte liegen zwischen +3 und –3 pro Tag, wobei der Kurs nicht unterden Wert 1 fallen kann. Die Kurswerte würden im Normalfall auseiner Datenbank in das Array geschrieben.

Es werden mit Hilfe einer Schleife nacheinander:

sechs senkrechte Gitternetzlinien zur Datumsorientierung gezeich-net

sechs Beschriftungen für die y-Achse (Kurswerte 0 bis 50) gesetzt

sechs waagerechte Gitternetzlinien zur Kurswertorientierunggezeichnet

501

Page 503: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Grafiken programmieren17

sechs Beschriftungen für die x-Achse (Datum alle 7 Tage) gesetzt

das Datum um sieben Tage erhöht

Mit Hilfe einer weiteren Schleife werden 35 Linien für den Kursver-lauf gezogen, jeweils vom Kurswert eines Tags zum Kurswert desnächsten Tags.

Zum Schluss wird die Grafik gezeichnet und der Speicher wieder frei-gegeben.

502

Page 504: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

18 PDF-Dateien erstellen

fpdfDie frei verfügbare und frei nutzbare Bibliothek fpdf ermöglicht esIhnen, eigene PDF-Objekte zu erstellen. Diese Objekte können unmittel-bar als PDF-Objekt im Browser angezeigt oder als PDF-Datei gespeichertwerden. Es handelt sich bei der Bibliothek fpdf nicht um eine Sammlungvon Funktionen, sondern von Klassen. Zum Erstellen von PDF-Dateienmit PHP sind daher Kenntnisse der objektorientierten Programmierungerforderlich.

PDF-Dateien sind weitverbreitet und dienen der Darstellung von Doku-menten, die Texte und Grafiken beinhalten. Zum Betrachten der PDF-Dateien wird lediglich ein (zumeist frei verfügbarer) PDF-Reader wie derAdobe Reader oder der PDF-XChange Viewer unter Windows oder derDokumentenbetrachter unter Ubuntu benötigt.

18.1 Installation

Unterverzeichnis »fpdf«

Bei der in diesem Buch empfohlenen XAMPP-Installation für Windowswird die Bibliothek fpdf bereits mitgeliefert. Sie befindet sich im Ver-zeichnis C:\xampp\php\PEAR\fpdf. In EasyPHP unter Windows und un-ter Ubuntu ist sie nicht beinhaltet. Sie finden Sie aber auf dem Datenträ-ger zum Buch.

Sie können sie auch von der Website http://www.fpdf.org bzw. http://www.fpdf.de herunterladen. In den Beispielen in diesem Abschnitt wirddavon ausgegangen, dass die notwendigen Dateien (als wichtigstefpdf.php) jeweils im Unterverzeichnis fpdf des aktuellen PHP-Pro-gramms bereitstehen. Dies erleichtert die Portierung Ihrer Programmeauf einen Webserver. Achten Sie besonders bei der Nutzung unterUbuntu darauf, dass die Zugriffsrechte für das Unterverzeichnis passen.

503

Page 505: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PDF-Dateien erstellen18

18.2 PDF-Dokument erzeugen

In einem ersten Beispiel soll ein einfaches PDF-Objekt mit einer leerenSeite erzeugt werden:

<html><body><?phprequire("fpdf/fpdf.php");

$pdf = new FPDF();$pdf->AddPage();$pdf->Output("pdf_test.pdf");?></body></html>

Listing 18.1 Datei pdf_einfach.php

Im Browser wird nichts angezeigt. Die PDF-Datei pdf_test.pdf ist im glei-chen Verzeichnis gespeichert und kann mit einem PDF-Reader betrachtetwerden, siehe Abbildung 18.1.

Hinweis: Seit Juni 2011 gibt es fpdf in der Version 1.7. Diese Versionwurde auch für die PHP-Programme in diesem Kapitel eingesetzt. BeiAufruf der PHP-Programme wird eine Warnung im Browser angezeigt,die darauf hinweist, dass in der Datei fpdf.php die veraltete PHP-Funk-tion get_magic_quotes_runtime() eingesetzt wird. Dies hat aber keinennegativen Einfluss auf die Funktionalität.

Abbildung 18.1 PDF-Datei im PDF-Reader

Erläuterung:

require() Die Datei fpdf.php im Unterverzeichnis fpdf wird mit der Funktionrequire() eingebunden (siehe Abschnitt 2.8.3, »Externe Dateien«).Sie beinhaltet die Klasse FPDF.

504

Page 506: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PDF-Dokument erzeugen 18.2

new FPDF() Die Anweisung $pdf = new FPDF() erzeugt ein neues Objekt der KlasseFPDF. Der dabei verwendete Konstruktor hat drei optionale Parame-ter: die Seitenausrichtung ("P" = Hochformat, "L" = Querformat), dieMaßeinheit für Größenangaben ("pt" = Point, "mm", "cm", "in" =Inch) und das Seitenformat ("A3", "A4", "A5", "Letter", "Legal").Die Default-Werte sind "P", "mm" und "A4". Das gleiche Objekt wärealso mit der Anweisung $pdf = new FPDF("P", "mm", "A4") erzeugtworden. Mit $pdf können Sie auf das Objekt zugreifen.

AddPage() Die Methode AddPage() erzeugt eine Seite. Sie hat einen optionalenParameter für die Seitenausrichtung ("P", "L"). Falls dieser nicht ange-geben wird, wird die Ausrichtung genommen, die mit dem Konstruk-tor gewählt wurde.

Output() Die Methode Output() dient der Ausgabe des PDF-Objekts. Sie hatzwei optionale Zeichenkettenparameter: eine Zeichenkette mit demDateinamen (mit der Dateiendung pdf) und ein Ziel ("I" = Darstellungim Browser, "D" = Herunterladen im Browser mit dem Dateinamen,"F" = Speichern mit dem Dateinamen, "S" = Rückgabe als String). Fallskeiner der beiden Parameter angegeben ist, gilt "I", also die direkteAusgabe im Browser. Falls nur ein Name angegeben wird, gilt "F".

In Abbildung 18.2. sehen Sie die Ansicht, falls die nachfolgende Zeilehinzugefügt wurde, damit die PDF-Datei direkt im Browser angezeigtwird (sofern dieser dazu in der Lage ist).

header("Location: pdf_test.pdf");

Abbildung 18.2 PDF-Datei im Browser

Hinweis

Falls Sie versuchen, eine Datei zu erzeugen, während sie noch in einem PDF-Reader geöffnet ist, schlägt die Erzeugung fehl.

505

Page 507: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PDF-Dateien erstellen18

18.3 Text in Zelle

Zur Anzeige von Text gibt es Standardfonts und zusätzliche, geladeneFonts. Ein Beispiel mit Standardfont sieht aus wie in Abbildung 18.3.

Abbildung 18.3 PDF-Datei mit Standardfont

Der Programmcode:

<html><body><?phprequire("fpdf/fpdf.php");

$pdf = new FPDF();$pdf->SetFont("Helvetica", "B", 24);$pdf->AddPage();$pdf->Cell(50, 20, "Hallo");$pdf->Output("pdf_test.pdf");?></body></html>

Listing 18.2 Datei pdf_zelle.php

Erläuterung:

SetFont() Die Methode SetFont() legt die Schriftart fest. Sie kann bereits vorder ersten Seite aufgerufen werden und gilt dann für das ganze Doku-ment, bis sie wieder geändert wird. Sie hat drei Parameter, wobei diebeiden letzten optional sind:

506

Page 508: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Text in Zelle 18.3

Der erste Parameter bezeichnet den Font. Unter Windows sindintern bereits vorhanden unter anderem "Helvetica", "Courier"und "Times". Eine Hilfestellung zur Erzeugung von Fonts fürUbuntu finden Sie über: http://www.fpdf.de/tutorials/7.

Der zweite Parameter legt den Schriftschnitt fest ("B" = fett, "I" =kursiv, "U" = unterstrichen). Die Buchstaben können beliebig kom-biniert werden.

Mit dem dritten Parameter wird die Größe der Schrift in Punktengewählt; der Default-Wert beträgt 12.

Im vorliegenden Beispiel wird Helvetica, fett und 24 pt, verwen-det. Die zugehörige PHP-Fontdatei (helveticab.php) muss im Unter-verzeichnis fpdf/font vorhanden sein.

Cell() Die Methode Cell() erzeugt eine rechteckige Zelle, gegebenenfallsmit Text. Sie hat acht Parameter, davon sind alle außer dem erstenoptional. Die erste Zelle einer Seite wird links oben mit jeweils 1 cmAbstand zum Seitenrand erzeugt.

Die Parameter 1 bis 3 legen die Breite, die Höhe und den Text fest.Falls die Breite 0 beträgt, erstreckt sich die Zelle bis zum rechtenRand. Wenn der Text nicht vollständig in die Zelle passt, wird überden Rand der Zelle und gegebenenfalls der Seite hinausgeschrie-ben! Eine Alternative bietet die Methode Write(); dazu spätermehr.

Der vierte Parameter dient der Festlegung des Randes (0 = keinRand, 1 = alle Ränder, "L" = Rand links, "T" = Rand oben, "R" =Rand rechts, "B" = Rand unten). Die Buchstaben können Sie belie-big kombinieren, der Default-Wert beträgt 0.

Der fünfte Parameter legt die nächste Schreibposition nach derZelle fest (0 = rechts von der Zelle, 1 = nach Zeilenumbruch in dernächsten Zeile, 2 = unter der Zelle). Der Default-Wert ist 0.

Der sechste Parameter bestimmt die Ausrichtung des Textes ("L" =links, "C" = zentriert, "R" = rechts). Der Default-Wert ist "L".

Mit dem siebten Parameter wird festgehalten, ob die Zelle gefülltwird (0 = keine Füllung, 1 = Füllung). Der Default-Wert ist 0.

Der letzte Parameter dient der Wahl eines Hyperlinks (mehr dazuin Abschnitt 18.8, »Hyperlinks«.)

507

Page 509: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PDF-Dateien erstellen18

18.4 Fließtext, Schriftparameter

Write() Die Methode Cell() bietet einige Möglichkeiten zur Textgestaltung undTextumrandung, allerdings wird der Text gegebenenfalls über den Randder Zelle hinausgeschrieben. Die Methode Write() dagegen schreibtFließtext und fügt automatisch einen Zeilenumbruch ein, falls der Textzu lang wird. Ein Beispiel zeigt Abbildung 18.4.

Abbildung 18.4 Fließtext

Der Programmcode:

<html><body><?phprequire("fpdf/fpdf.php");

$pdf = new FPDF();$pdf->SetFont("Helvetica", "B", 24);$pdf->SetTextColor(255, 0, 0);

$pdf->AddPage();$text = "Das ist ein längerer Text,

der sich über mehrere Zeilen erstreckt.";$pdf->Write(20, $text);

$pdf->SetFontSize(12);$pdf->Ln();$pdf->Write(20, "Neue Zeile");

508

Page 510: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Fließtext, Schriftparameter 18.4

$pdf->SetFont("","I");$pdf->Ln(10);$pdf->Write(20, "Ende");

$pdf->Output("pdf_test.pdf");?></body></html>

Listing 18.3 Datei pdf_schrift.php

Erläuterung:

SetTextColor() Mit der Methode SetTextColor() wird die Schriftfarbe festgelegt. Siekann bereits vor der ersten Seite aufgerufen werden und gilt dann fürdas ganze Dokument, bis sie wieder geändert wird. Sie hat drei Para-meter: die Rot-, Grün- und Blauanteile, jeweils mit Werten zwischen0 und 255.

Die Methode Write() gibt Text an der aktuellen Position aus. BeimErreichen des rechten Seitenrandes wird ein Zeilenumbruch erzeugt.Nach der Ausgabe ist die aktuelle Position unmittelbar hinter demText. Die Methode hat drei Parameter, davon ist der letzte optional:

Die Parameter 1 und 2 legen die Zeilenhöhe und den Text fest.

Der letzte Parameter dient der Wahl eines Hyperlinks.

SetFontSize() Falls nur die Schriftgröße geändert werden soll, muss nicht dieMethode SetFont() aufgerufen werden. Die Methode SetFont-Size() reicht hier aus; die restlichen Einstellungen werden übernom-men. Der einzige Parameter gibt die Größe der Schrift in Punkt an.

Ln() Die Methode Ln() erzeugt einen Zeilenumbruch. Sie ist zum Beispielin Verbindung mit der Methode Write() sinnvoll, da diese keinenZeilenumbruch am Ende des Textes erzeugt. Ln() hat einen einzigen,optionalen Parameter: die Zeilenhöhe. Falls kein Parameter angege-ben wird, wird die Zeilenhöhe der letzten Ausgabe übernommen.

Falls nur der Schriftschnitt geändert werden soll, können Sie als ers-ten Parameter der Methode SetFont() eine leere Zeichenkette ange-ben. Die restlichen Einstellungen werden übernommen. Hier wurdenur von »fett« auf »kursiv« gewechselt. Die zugehörige PHP-Fontdatei(helveticai.php) muss im Unterverzeichnis fpdf/font vorhanden sein.

509

Page 511: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PDF-Dateien erstellen18

18.5 Tabelle

Tabellen lassen sich mit der Methode Cell() zusammensetzen. Mit einerindividuellen Einstellung von Schriftfarbe, Schriftschnitt, Linienfarbe,Liniendicke und Füllung der Zellen lassen sich größere Datenmengen über-sichtlich darstellen. Eine Tabelle könnte aussehen wie in Abbildung 18.5.

Abbildung 18.5 Beispieltabelle (Ausschnitt)

Der Programmcode:

<html><body><?phprequire("fpdf/fpdf.php");

$pdf = new FPDF();$pdf->AddPage();

/* Einstellung für Überschrift */$pdf->SetFont("Helvetica", "B", 11);$pdf->SetLineWidth(0.4);$pdf->SetDrawColor(255, 0, 255);$pdf->SetFillColor(192, 192, 192);

510

Page 512: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Tabelle 18.5

$pdf->SetTextColor(255, 0, 0);

/* Überschrift */$pdf->Cell(30, 10, "Winkel", "LTR", 0, "C", 1);$pdf->Cell(40, 10, "im Bogenmaß", "LTR", 0, "C", 1);$pdf->Cell(60, 10, "Sinus(Winkel)", "LTR", 0, "C", 1);$pdf->Ln();

/* Einstellung für Tabelle */$pdf->SetFont("", "");$pdf->SetLineWidth(0.2);$pdf->SetDrawColor(0, 0, 0);

/* Tabelle */for($w=10; $w<=90; $w=$w+10)

/* Zeilen abwechselnd gestalten */if($w%20==0)$pdf->SetFillColor(0, 0, 255);$pdf->SetTextColor(255, 255, 255);

else$pdf->SetFillColor(255, 255, 255);$pdf->SetTextColor(0, 0, 0);

/* Werte */$wb = $w / 180 * M_PI;$pdf->Cell(30, 10, $w, "LR", 0, "C", 1);$pdf->Cell(40, 10, number_format($wb,3),

"LR", 0, "R", 1);$pdf->Cell(60, 10, number_format(sin($wb),3),

"LR", 0, "R", 1);$pdf->Ln();

$pdf->Output("pdf_test.pdf");?></body></html>

Listing 18.4 Datei pdf_tabelle.php

511

Page 513: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PDF-Dateien erstellen18

Erläuterung:

SetLineWidth() Die Methode SetLineWidth() dient der Einstellung der Liniendickebei Zellen oder geometrischen Objekten. Der einzige Parameter istder Wert für die Dicke. Ohne Einstellung beträgt die Liniendicke0,2 mm.

SetDrawColor() Die Methode SetDrawColor() wird zur Einstellung der Linienfarbebei Zellen oder geometrischen Objekten verwendet. Sie hat drei Para-meter: die Rot-, Grün- und Blauanteile, jeweils mit Werten zwischen0 und 255.

SetFillColor() Mit der Methode SetFillColor() wird die Füllfarbe bei Zellen odergefüllten geometrischen Objekten eingestellt. Sie hat drei Parameter:die Rot-, Grün- und Blauanteile, jeweils mit Werten zwischen 0 und255.

Es wird eine Tabelle mit drei Spalten dargestellt. Jede Zelle wirdrechts neben die Vorgängerzelle gesetzt. Nach jeweils drei Zellen wirdmit Hilfe der Methode Ln() die Zeile gewechselt.

Die Zellen der Überschrift haben einen grauen Hintergrund und einemagentafarbene Rahmenlinie der Dicke 0,4 mm als linke, rechte undobere Begrenzung. Der Text ist in Fettschrift und zentriert gesetzt.

Die Zeilen der restlichen Tabelle haben abwechselnd schwarze Schriftauf weißem Hintergrund und weiße Schrift auf blauem Hintergrund.Sie verfügen über eine schwarze Rahmenlinie der Dicke 0,2 mm alslinke und rechte Begrenzung der Zellen. Der Text ist in normalerDicke gesetzt. Die erste Spalte ist zentriert ausgerichtet, die restlichenSpalten sind rechtsbündig.

Es kann sich, wie hier, um eine mathematische Tabelle oder um dieDarstellung eines größeren Datenbestands handeln – zum Beispiel auseiner Datenbank.

18.6 Kopf- und Fußzeile

Zum Füllen der Kopf- und Fußzeilen müssen die bereits vorhandenenMethoden der Klasse FPDF überschrieben werden. Daher müssen Siezunächst eine abgeleitete Klasse erzeugen. In Abbildung 18.6 sehen Siezunächst die Kopfzeile.

512

Page 514: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Kopf- und Fußzeile 18.6

Abbildung 18.6 Kopfzeile und Text (Ausschnitt)

Es folgt die Fußzeile in Abbildung 18.7.

Abbildung 18.7 Fußzeile

Der Programmcode:

<html><body><?phprequire("fpdf/fpdf.php");

class MyPDF extends FPDF

function Header()

$this->SetFont("Helvetica", "B", 16);$this->Cell(0, 20, "Kopfzeile", "B", 1, "C");

function Footer()

513

Page 515: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PDF-Dateien erstellen18

$this->SetY(-20);$this->SetFont("Helvetica", "B", 8);$this->Cell(0, 10, "Seite "

. $this->PageNo() . "/nb", "T", 0, "R");

$pdf = new MyPDF();$pdf->AliasNbPages();$pdf->AddPage();$pdf->SetFont("Helvetica", "B", 12);for($i=1;$i<=60;$i++)

$pdf->Cell(0, 10, "Zeile: " . $i, 0, 1);$pdf->Output("pdf_test.pdf");?></body></html>

Listing 18.5 Datei pdf_kopf.php

Erläuterung:

Die Klasse MyPDF wird von der Klasse FPDF abgeleitet. Die MethodenHeader() und Footer() der Klasse FPDF werden überschrieben.

Header() In der Methode Header() für die Kopfzeile wird gewählt:

Schrift Helvetica, fett, Größe 16. Sie bleibt für die Kopfzeilen allerSeiten erhalten, unabhängig von der Schrift für die Fußzeile oderfür den eigentlichen Text.

Zelle mit der Breite 0, unterer Rahmenlinie und zentrierter Aus-richtung. Daher erstreckt sich die Zelle über die gesamte Breite, dieKopfzeile wird vollständig nach unten mit einer Linie begrenzt,der Text steht mittig.

Footer() In der Methode Footer() für die Fußzeile wird gewählt:

Schrift Helvetica, fett, Größe 8. Sie bleibt für die Fußzeilen allerSeiten erhalten, unabhängig von der Schrift für die Kopfzeile oderfür den eigentlichen Text.

SetY() Die Methode SetY() setzt die Schreibposition auf einen absolutenWert. Ist dieser negativ, wird vom unteren Rand aus gemessen.Wird die Methode nicht aufgerufen, so wird die letzte Fußzeile ansEnde des Textes und nicht ans Ende der letzten Seite gesetzt!

514

Page 516: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Bild aus Datei laden 18.7

nb, PageNo() Zelle mit der Breite 0, obere Rahmenlinie und rechtsbündige Aus-richtung. Daher erstreckt sich die Zelle über die gesamte Breite, dieFußzeile wird vollständig nach oben mit einer Linie begrenzt, derText steht rechts. Der Text beinhaltet unter anderem die laufendeSeitennummer (Methode PageNo()) sowie die Gesamtanzahl derSeiten im Dokument. Dazu dient der Platzhalter nb in Verbin-dung mit der Methode AliasNbPages.

Die Anweisung $pdf = new MyPDF() erzeugt ein neues Objekt derabgeleiteten Klasse MyPDF.

AliasNbPages() Die Methode AliasNbPages()() sorgt dafür, dass die Gesamtanzahlder Seiten im Dokument zur Verfügung steht.

Die Schrift Helvetica, fett, Größe 12 wird gewählt. Sie bleibt für deneigentlichen Text aller Seiten erhalten, unabhängig von der Schrift fürdie Kopfzeile oder die Fußzeile.

Es werden insgesamt 60 Zeilen ausgegeben. Sobald eine Zelle denunteren Seitenrand erreicht, wird automatisch ein Seitenumbruchvorgenommen.

18.7 Bild aus Datei laden

Das Einfügen eines Bildes aus einer Datei ist recht einfach. Ein Beispielzeigt die Abbildung 18.8.

Abbildung 18.8 Bilder in PDF-Datei

515

Page 517: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PDF-Dateien erstellen18

Das Programm dazu:

<html><body><?phprequire("fpdf/fpdf.php");

$pdf = new FPDF();$pdf->AddPage();$pdf->Image("im_blume.jpg", 50, 10, 30);$pdf->Image("im_work.gif", 20, 10);$pdf->Output("pdf_test.pdf");?></body></html>

Listing 18.6 Datei pdf_bild.php

Erläuterung:

Image() Die Methode Image() dient dem Einbinden eines Bildes. Sie hat sie-ben Parameter, davon sind die ersten drei zwingend:

Diese drei Parameter legen den Dateinamen sowie die x- undy-Position fest.

Der vierte Parameter dient der Angabe der Breite, falls das Bildvergrößert oder verkleinert dargestellt wird. Falls der Wert nichtangegeben wird oder 0 ist, wird die Originalbreite genommen.

Der fünfte Parameter legt die Höhe fest. Falls der Wert nicht ange-geben wird oder 0 ist, wird die Höhe passend zur Breite genom-men.

Mit dem sechsten Parameter kann der Bildtyp (JPG, JPEG, PNG,GIF) bestimmt werden. Falls kein Typ angegeben wird, wird derTyp aus der Dateiendung bestimmt.

Der letzte Parameter dient der Wahl eines Hyperlinks.

18.8 Hyperlinks

Hyperlinks können auf interne Ziele innerhalb des PDF-Dokuments oderauf externe Ziele, also andere URLs, verweisen. Ausgangspunkt einesHyperlinks kann Text, eine Zelle, ein Bild oder ein Rechteck ähnlich wiebei einer Imagemap sein. Zunächst sehen Sie in Abbildung 18.9 ein Bei-

516

Page 518: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Hyperlinks 18.8

spiel mit einem internen Textlink auf Seite 1 des Dokuments, der zurSeite 2 führt.

Abbildung 18.9 Texthyperlink

Der Programmcode:

<html><body><?phprequire("fpdf/fpdf.php");

$pdf = new FPDF();$pdf->SetFont("Helvetica", "", 11);

$pdf->AddPage();$pdf->Write(10, "Inhalt:");$pdf->Ln();

/* Start des Hyperlinks */$pdf->SetFont("", "U");$seite2 = $pdf->AddLink();$pdf->Write(10, "zu Seite 2", $seite2);$pdf->SetFont("", "");$pdf->Ln();

$pdf->Write(10, "Ende Inhalt");

/* Ziel des Hyperlinks */$pdf->AddPage();$pdf->SetLink($seite2);$pdf->Write(10, "Seite 2");

517

Page 519: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PDF-Dateien erstellen18

$pdf->Output("pdf_test.pdf");?></body></html>

Listing 18.7 Datei pdf_link1.php

Erläuterung:

Vor der ersten Seite wird eine der üblichen Schriften eingestellt.Unmittelbar vor dem Link wird auf Unterstrichen gewechselt, damitder Text als anklickbar erkannt wird. Dazu benötigen Sie übrigenskeine separate PHP-Fontdatei. Es genügt die Datei für Normaltext

(= nicht unterstrichen).

AddLink() Die Methode AddLink() erzeugt einen Link und liefert dessen IDzurück.

Mit der Methode Write() wird ein Text auf die erste Seite geschrie-ben. Als dritter Parameter nach Zeilenhöhe und Textinhalt wird diesoeben ermittelte Link-ID notiert. Damit erreichen Sie, dass der Text-inhalt anklickbar ist und als Startpunkt des Links dient. Sobald sichder Mauszeiger im PDF-Dokument über dem Link befindet, ändertsich sein Aussehen.

Unmittelbar nach dem Link wird auf Nicht Unterstrichen zurückge-wechselt.

SetLink() Auf der zweiten Seite wird mit der Methode SetLink() der Zielpunktdes Links eingerichtet. Einziger Parameter ist die Link-ID. Damit errei-chen Sie, dass dieser Punkt auf der zweiten Seite direkt per Klick vondem unterstrichenen Text der ersten Seite aus erreicht werden kann.

In Abbildung 18.10 sehen Sie ein Beispiel mit einem externen Ziel sowieeiner Zelle, einem Bild und einem Bildbereich als Startpunkte.

Der Programmcode:

<html><body><?phprequire("fpdf/fpdf.php");

$pdf = new FPDF();$pdf->SetFont("Helvetica", "", 11);

$pdf->AddPage();$pdf->Write(10, "Seite 1");

518

Page 520: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Hyperlinks 18.8

$pdf->Ln();

/* Externer Hyperlink */$pdf->SetFont("", "U");$pdf->Write(10, "extern", "http://localhost");$pdf->Ln();

/* Hyperlink in einer Zelle */$seite2 = $pdf->AddLink();$pdf->Cell(40, 10, "zu Seite 2",

1, 1, "C", 0, $seite2);$pdf->SetFont("", "");

/* Bild als Hyperlink */$pdf->Image("im_blume.jpg", 65,

10, 20, 0, "", $seite2);

/* Hyperlink innerhalb eines Bildes */$pdf->Image("im_blume.jpg", 100, 10, 20);$pdf->Link(100, 10, 20, 15, $seite2);

/* Ziel des Hyperlinks */$pdf->AddPage();$pdf->SetLink($seite2);

$pdf->Write(10, "Seite 2");$pdf->Output("pdf_test.pdf");?></body></html>

Listing 18.8 Datei pdf_link2.php

Abbildung 18.10 Verschiedene Hyperlink-Möglichkeiten

519

Page 521: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PDF-Dateien erstellen18

Erläuterung:

Als Erstes ist ein Textlink eingerichtet, hier zur Startseite des Webser-vers (http://localhost). Eine Link-ID wird bei einem externen Linknicht benötigt.

Es folgt ein interner Hyperlink in einer Zelle. Der letzte Parameter derMethode Cell() ist die Link-ID.

Das erste Bild stellt einen Hyperlink zum gleichen Ziel dar. Der letzteParameter der Methode Image() ist wiederum die Link-ID. Sobaldsich der Mauszeiger im PDF-Dokument über dem Bild befindet,ändert sich sein Aussehen.

Link() Mit Hilfe der Methode Link() ist der obere Bereich des zweiten Bil-des als Hyperlink eingerichtet. Die Methode hat fünf Parameter, diealle angegeben werden müssen: die x- und y-Koordinaten der oberenlinken Ecke des Bereichs, die Breite und Höhe des Bereichs sowie dieLink-ID. Die Koordinaten stimmen mit den Koordinaten des Bildesüberein. Als Breite wurde die Breite des Bildes gewählt. Sobald sichder Mauszeiger im PDF-Dokument über dem betreffenden Bildbe-reich befindet, ändert sich wieder sein Aussehen.

Bei der Positionierung eines solchen Hyperlinks sollten Sie darauf ach-ten, dass er in einem Bildteil liegt, der intuitiv als Link zu erkennenist. Eine Landkarte, auf der Sie einzelne Städte oder Regionen ankli-cken können, ist ein gutes Beispiel hierfür.

18.9 Linie, Rechteck, Position

Sie können auch in PDF-Dateien einfache geometrische Objekte wie eineLinie oder ein Rechteck zeichnen. Im Zusammenhang mit Text kann esdabei nützlich sein, die aktuelle Position zu bestimmen bzw. zu setzen.Abbildung 18.11 zeigt ein Beispiel mit einer Linie, einem Rechteck undeinem gefüllten Rechteck.

Der Programmcode:

<html><body><?phprequire("fpdf/fpdf.php");

$pdf = new FPDF();$pdf->SetFont("Helvetica", "", 11);

520

Page 522: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Linie, Rechteck, Position 18.9

$pdf->SetLineWidth(1);

/* Linie */$pdf->AddPage();$pdf->Write(10, "Linie:");$pdf->Ln();$x = $pdf->GetX();$y = $pdf->GetY();$pdf->Line($x, $y, $x+15, $y+10);

/* Rechteck */$pdf->SetY($y+15);$pdf->Write(10, "Rechteck:");$pdf->Ln();$x = $pdf->GetX();$y = $pdf->GetY();$pdf->Rect($x, $y, 15, 10);

/* gefülltes Rechteck */$pdf->SetY($y+15);$pdf->Write(10, "gefülltes Rechteck:");$pdf->Ln();$x = $pdf->GetX();$y = $pdf->GetY();$pdf->SetFillColor(0, 0, 255);$pdf->Rect($x, $y, 15, 10, "DF");

$pdf->Output("pdf_test.pdf");?></body></html>

Listing 18.9 Datei pdf_zeichnen.php

Erläuterung:

SetLineWidth() Mit Hilfe der Methode SetLineWidth() wird zunächst die Linien-stärke auf 1 mm gesetzt.

GetX(), GetY() Nach der Ausgabe des Textes und eines Zeilenumbruchs wird jeweilsdie aktuelle Position bestimmt, damit an dieser Position gezeichnetwerden kann. Dazu werden die beiden Methoden GetX() und GetY()eingesetzt, die die aktuellen x- und y-Koordinaten als Rückgabewertliefern.

521

Page 523: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

PDF-Dateien erstellen18

Line() Die Methode Line() zeichnet eine Linie von einem Startpunkt zueinem Zielpunkt. Die vier Parameter geben die x- und y-Koordinatendes Startpunkts und des Zielpunkts an.

Rect() Die Methode Rect() zeichnet ein Rechteck. Die vier Parameter gebendie x- und y-Koordinaten des Startpunkts sowie Breite und Höhe desRechtecks an.

SetFillColor() Ein gefülltes Rechteck wird gezeichnet, indem im fünften Parameter»F« angegeben wird. Der Buchstabe »D« steht für das Ziehen der Rah-menlinie, »F« für Füllung. Mit SetFillColor() wird vorher eine Füll-farbe angegeben.

SetX(), SetY(),SetXY()

Neben der in diesem Beispiel verwendeten Methode SetY() gibt esnoch die verwandten Methoden SetX() und SetXY() zum Setzen derSchreibposition.

Abbildung 18.11 Linie und Rechtecke

522

Page 524: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

19 Automatisierter E-Mail-Versand

Automatisierte E-Mail

Bei vielen Websites besteht die Notwendigkeit, automatisierte E-Mails zuversenden. Diese dienen zum Beispiel als Bestellbestätigungen, Statusin-formationen oder zur Registrierung von Benutzern. In PHP wird zu die-sem Zweck die Funktion mail() angeboten. Damit können Sie bereitseinfache E-Mails versenden.

Falls Sie allerdings eine E-Mail im HTML-Format, eventuell auch mitAnhängen, versenden wollen, reicht die Funktion mail() nicht mehraus. Daher wird in diesem Kapitel mit der frei verfügbaren KlassePHPMailer gearbeitet. Die Version 5.2.0 dieser weit verbreiteten Klasseist auf dem Datenträger zum Buch bereits enthalten. Im nachfolgendenBeispiel wird davon ausgegangen, dass die Dateien des PHPMailer-Pro-jekts im untergeordneten Verzeichnis phpmailer stehen.

Am Ort der Ausführung des PHP-Skripts (zum Beispiel auf der eigenenWebsite im Internet) muss ein laufender E-Mail-Server zur Weiterleitungder E-Mail zur Verfügung stehen.

Zunächst das Beispiel:

<html><body><?phpinclude("phpmailer/class.phpmailer.php");

$mail = new PHPMailer();$mail->From = "[email protected]";$mail->FromName = "Arnold Absender";$mail->Subject = "Betreff der Mail";$mail->Body = "<table border='1'><tr><td>

Das ist <b>fett</b></td></tr></table>";$mail->AltBody = "Nur Text";

$mail->AddAddress("[email protected]");// $mail->AddCC("[email protected]");// $mail->AddBCC("[email protected]");$mail->AddReplyTo("[email protected]");

523

Page 525: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Automatisierter E-Mail-Versand19

$mail->AddAttachment("im_work.gif");$mail->AddAttachment("im_blume.jpg");$mail->AddAttachment("mail_word.doc");$mail->AddAttachment("mail_excel.xls");$mail->AddAttachment("pdf_test.pdf");

if($mail->Send())echo "oK";

?></body></html>

Listing 19.1 HTML-Mail mit Anhängen

Es handelt sich um eine HTML-Mail. Im HTML-Code steht eine Tabellemit einer Zelle, darin ein Text, teilweise in Fettschrift. Es werden fünfDateien unterschiedlichen Typs als Anhang gesendet: ein GIF-Bild, einJPG-Bild, eine MS Word-Datei, eine MS Excel-Datei und ein PDF-Doku-ment.

Zunächst wird die Datei class.phpmailer.php aus dem untergeordnetenVerzeichnis phpmailer eingebunden. Damit steht die Klasse PHPMailerzur Verfügung. Mit new wird ein neues Objekt dieser Klasse erzeugt undein Verweis auf dieses Objekt zurückgeliefert.

In den Eigenschaften From und FromName werden die E-Mail-Adresse undder Name des Absenders notiert. In der Eigenschaft Subject steht derBetreff. Die Eigenschaft Body speichert den eigentlichen E-Mail-Text, hierin HTML-Form. Falls der E-Mail-Client des Empfängers keine HTML-Mails verarbeiten kann, so sieht er nur den Wert der Eigenschaft Alt-Body.

Die Methoden AddAddress(), AddCC() und AddBCC() dienen der Auf-nahme der Empfängeradressen für Original und Kopie der E-Mail.AddReplyTo() sorgt dafür, dass eine Antwort auf diese E-Mail nicht anden Absender, sondern an die hier angegebene Adresse gesendet wird.Die Methode AddAttachment() wird genutzt, um eine oder mehrereDateien als Anhang der E-Mail hinzuzufügen. Im Beispiel wird davonausgegangen, dass sich die Dateien im gleichen Verzeichnis wie diesesPHP-Programm befinden.

524

Page 526: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Automatisierter E-Mail-Versand 19

Zu guter Letzt wird die E-Mail mit Hilfe der Methode Send() gesendet.Im Erfolgsfall wird eine Bestätigung ausgegeben. Das Ergebnis sehen Siein Abbildung 19.1 in MS Outlook 2010. Abbildung 19.2 zeigt die Dar-stellung, falls der Empfänger den Antworten-Button betätigt hat.

Abbildung 19.1 Ergebnis des Programms in MS Outlook 2010

Abbildung 19.2 Antwort an ReplyTo-Adresse

525

Page 527: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet
Page 528: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

20 Beispielprojekte

In diesem Kapitel beschreibe ich einige typische Anwendungsprojekte:einen Chat, ein Blog und ein Forum. Besonderen Wert lege ich dabei aufdas Zusammenspiel von PHP, JavaScript und CSS. Alle Projekte (außerdem Chat) wurden beziehungsweise werden real genutzt. Dadurch konn-ten einige Erkenntnisse in die Verbesserung der Anwendung einfließen.

20.1 Projekt »Chat«

Es soll eine Anwendung geschrieben werden, mit deren Hilfe ein ein-facher Chat in eine Website integriert werden kann. Dazu gibt es imInternet bereits vorgefertigte Lösungen. Hier kommt es aber auf die Ent-wicklung mit den erlernten Mitteln und auf das Verständnis des Zusam-menspiels der einzelnen Komponenten an. Die Chat-Anwendung wird inzwei Versionen angeboten:

Textdatei einer Version »Textdatei«, die auf Websites ohne Datenbankanbin-dung eingesetzt werden kann (chat_text.php)

Datenbank einer Version »Datenbank«, die Websites mit MySQL-Datenbank-anbindung nutzen (chat_db.php)

Beide Versionen beschreibe ich im Folgenden parallel. Damit sind dieGemeinsamkeiten beziehungsweise Unterschiede deutlicher erkennbar.Außerdem spreche ich mögliche, individuelle Erweiterungen an, die eineStandardanwendung nicht bieten kann.

20.1.1 Frame-Aufbau

Beide Versionen haben den gleichen Frame-Aufbau. Sie unterscheidensich nur in der Form der Datenabspeicherung. In der Version »Textdatei«werden die bisherigen Chat-Beiträge bei der Darstellung aufsteigend sor-tiert. In der Version »Datenbank« wird die Darstellung in absteigenderForm ermöglicht, sodass der neueste Beitrag oben steht. In Abbildung 20.1sehen Sie zunächst eine Gesamtdarstellung in der Version »Textdatei«.

527

Page 529: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispielprojekte20

Abbildung 20.1 Ausgabe gesamt

Frame-Steuerdatei Es wird eine Aufteilung in Frames vorgenommen. Dazu dient eineFrame-Steuerdatei:

<html><frameset rows="4*,*">

<frame src="chat_text_aus.php" name="ausgabe" /><frame src="chat_text_ein.php" name="eingabe" />

</frameset></html>

Listing 20.1 Datei chat_text.php (analog zu chat_db.php)

Erläuterung:

Die Aufteilung der beiden Frame-Zeilen wurde im Verhältnis 4:1 vor-genommen. Die Grenze zwischen den beiden Frames wurde nur fürdie obige Darstellung verschoben.

Im oberen Frame werden die bisherigen Beiträge ausgegeben, dasProgramm steht in den Dateien chat_text_aus.php beziehungsweisechat_db_aus.php. Der Frame hat den Namen ausgabe.

Im unteren Frame können neue Beiträge eingegeben werden, das Pro-gramm steht in chat_text_ein.php beziehungsweise chat_db_ein.php.Der Frame hat den Namen eingabe.

528

Page 530: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Projekt »Chat« 20.1

20.1.2 CSS-Formatierung

Beide Dateien binden in beiden Versionen jeweils die folgende CSS-Dateizur einheitlichen Formatierung ein:

body,td font-family: Verdana; font-size: 9pt;background-color:#d0dce0; color:#00008b

a:link font-family: Verdana; font-size: 9pt;color: #0000ff

a:visited font-family: Verdana; font-size: 9pt;color: #0000ff

a:hover font-family: Verdana; font-size: 9pt;color: #ff0000

Listing 20.2 Datei chat.css

ZentraleFormatierung

Erläuterung:

Es wird für das gesamte Dokument und für die Tabellenzellen dieSchriftart Verdana in der Größe 9 Punkt und in der Farbe Mittelblaugewählt. Der Hintergrund ist hellblau.

Ein Hyperlink wird in der gleichen Formatierung dargestellt, aller-dings mit Unterstreichung. Wenn der Benutzer mit dem Mauszeigerüber den Link fährt, wird dieser rot eingefärbt.

20.1.3 Ausgabe, Version »Textdatei«

Inhalte lesenund ausgeben

Die bisherigen Beiträge werden im oberen Frame durch das folgendeProgramm aus der Textdatei gelesen und auf dem Bildschirm ausge-geben:

<html><head><link rel="stylesheet" type="text/css" href="chat.css"></head><body><h3>Chat</h3><?php/* Datei mit Chat-Daten auslesen */$fp = @fopen("chat_text.txt","r");if($fp)

echo "<table>". "<tr><td><b>Zeit</b></td>"

529

Page 531: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispielprojekte20

. "<td><b>Name</b></td>"

. "<td><b>Beitrag</b></td></tr>";

/* alle Zeilen lesen und ausgeben */while(!feof($fp))

$tabzeile = fgets($fp,200);echo "$tabzeile";

echo "</table>";fclose($fp);

?></body></html>

Listing 20.3 Datei »chat_text_aus.php«

Erläuterung:

Zunächst wird die CSS-Formatierungsdatei eingebunden.

Im PHP-Teil wird die Datei mit den Beiträgen (chat_text.txt) zumLesen geöffnet. Das Zeichen @ (der sogenannte silence operator) vorder Funktion fopen() dient dazu, eine eventuelle Ausgabe der Funk-tion zu unterdrücken.

Falls dieser Vorgang erfolgreich war, wird eine dreispaltige Tabellemit den Überschriften Zeit, Name und Beitrag begonnen.

Alle Zeilen der Textdatei werden mit Hilfe der while-Schleife gelesen.Jede Zeile beinhaltet die Formatierungen für die HTML-Tabelle undwird vollständig ausgegeben.

20.1.4 Darstellung der Textdatei

Die Textdatei hat den in Abbildung 20.2 gezeigten Aufbau. Jede Zeile istbereits eine vollständige HTML-Tabellenzeile.

Abbildung 20.2 Textdatei chat_text.txt

530

Page 532: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Projekt »Chat« 20.1

20.1.5 Ausgabe, Version »Datenbank«

Den Aufbau der Datenbank inklusive der Tabelle beschreibe ich imnächsten Abschnitt. Die bisherigen Beiträge werden im oberen Framedurch das folgende Programm aus der Datenbank gelesen und auf demBildschirm ausgegeben:

<html><head><link rel="stylesheet" type="text/css" href="chat.css"></head>

<body><h3>Chat</h3><?php/* Datei mit Chat-Daten auslesen */mysql_connect("","root");mysql_select_db("chat");$res = mysql_query("select * from daten order by zeit desc");

if(mysql_num_rows($res)>0)

echo "<table>". "<tr><td><b>Zeit</b></td>". "<td><b>Name</b></td>". "<td><b>Beitrag</b></td></tr>";

while($dsatz = mysql_fetch_assoc($res))

$z = $dsatz["zeit"];$zs = substr($z,8,2) . "." . substr($z,5,2) . "."

. substr($z,0,4) . " " . substr($z,11);echo "<tr>"

. "<td>$zs</td>"

. "<td>" . $dsatz["nick"] . "</td>"

. "<td>" . $dsatz["beitrag"] . "</td>"

. "</tr>";

echo "</table>";?></body></html>

Listing 20.4 Datei chat_db_aus.php

531

Page 533: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispielprojekte20

Datenbank lesenund ausgeben

Erläuterung:

Zunächst wird die CSS-Formatierungsdatei eingebunden.

Im PHP-Teil werden aus der Datenbank chat alle Datensätze aus derTabelle daten geholt. Diese sind nach dem Feld zeit absteigend sor-tiert, sodass der neueste Beitrag der erste Beitrag ist.

Falls Datensätze vorhanden sind, wird eine dreispaltige Tabelle mitden Überschriften Zeit, Name und Beitrag begonnen.

Alle Datensätze werden mit Hilfe der while-Schleife und der Funktionmysql_fetch_assoc() im assoziativen Feld $dsatz gespeichert.

Der automatisch erstellte MySQL-Timestamp im Datenfeld zeit wirdzerlegt, damit er formatiert ausgegeben werden kann.

Die drei Angaben jedes Datensatzes werden als HTML-Tabellenzeileausgegeben.

20.1.6 Darstellung der Datenbanktabellen

Die Struktur der Tabelle chat sehen Sie in Abbildung 20.3.

Abbildung 20.3 Tabellenstruktur »Chat«

Einige Beispieldaten sehen Sie in Abbildung 20.4 dargestellt.

Abbildung 20.4 Daten »Chat«

Hinweis

Zur Erzeugung der Datenbank inklusive der Tabelle können Sie statt phpMy-Admin auch das PHP-Programm chat_db_neu.php benutzen.

532

Page 534: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Projekt »Chat« 20.1

20.1.7 Eingabe, Head

Die Datei chat_text_ein.php beziehungsweise chat_db_ein.php mit demProgramm zur Eingabe eines neuen Beitrags ist etwas umfangreicher,daher stelle ich sie nachfolgend in drei Teilen dar:

Teil 1: Head mit CSS und JavaScript-Funktionen. Dieser ist für beideVersionen fast gleich.

Teil 2: PHP-Abschnitt zum Speichern eines neuen Beitrags. Dieserunterscheidet sich und wird daher in zwei Versionen erläutert.

Teil 3: Formular zum Eingeben eines neuen Beitrags. Dieses ist fürbeide Versionen gleich.

Es folgt Teil 1, also der Head mit CSS und JavaScript-Funktionen. Er istfür beide Versionen fast gleich. Nachfolgend für die Version »Textdatei«:

<html><head><link rel="stylesheet" type="text/css" href="chat.css">

<script type="text/javascript">/* Beitrag senden, falls Name und Beitrag vorhanden */function send()

if(document.f.nick.value != "" &&document.f.beitrag.value != "")document.f.submit();

/* Chat-Anzeige aktualisieren */function reload()

parent.ausgabe.location.href = "chat_text_aus.php";</script></head>

Listing 20.5 Datei chat_text_ein.php bzw. chat_db_ein.php, Teil 1

Erläuterung:

Zunächst wird die CSS-Formatierungsdatei eingebunden.

JavaScript-Prüfung

Im JavaScript-Teil wird mit Hilfe der Funktion send() überprüft, obder Benutzer seinen (Nick-)Namen und einen Beitrag in die beiden For-mularfelder eingetragen hat. Falls ja, wird das Formular abgesendet.

533

Page 535: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispielprojekte20

Die Funktion reload() dient dem neuen Laden des oberen Frames,also der Ausgabeseite. Dies geschieht sowohl »automatisch« nach demEintragen des neuen Beitrags als auch bei Betätigung des Links Chat

laden ohne Eingabe eines neuen Beitrags. Die geladene Datei istchat_text_aus.php beziehungsweise chat_db_aus.php.

20.1.8 Eingabe, PHP zum Speichern, Version »Textdatei«

Dateispeicherung Es folgt Teil 2, der PHP-Abschnitt zum Speichern eines neuen Beitrags ineiner Textdatei:

<body><?php/* Anhängen des neuen Textes, falls vorhanden */if(isset($_POST["beitrag"]))

$fp = @fopen("chat_text.txt","a");if($fp)

$jetzt = date("d.m.y H:i:s");$tabzeile = "<tr><td>$jetzt</td><td>"

. $_POST["nick"] . "</td><td>"

. $_POST["beitrag"] . "</td></tr>"

. chr(13) . chr(10);fputs($fp,$tabzeile);

fclose($fp);

/* Chat-Anzeige aktualisieren */echo "<script type='text/javascript'>

reload();</script>";?>

Listing 20.6 Datei chat_text_ein.php, Teil 2

Hinweis

Der JavaScript-Verweis auf ein Dokument wird über das Objekt location,Eigenschaft href realisiert. Dieser Eigenschaft wird ein Wert zugewiesen. Indiesem Fall handelt es sich um das gleiche Dokument, das bereits angezeigtwird; es wird also nur neu geladen.

Da das Dokument in einem anderen Frame geladen werden soll, muss derFrame über das festgelegte Wort parent, gefolgt vom Namen des Frames(ausgabe), angesprochen werden. Dieser Name wurde in der Frame-Steuer-datei festgelegt.

534

Page 536: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Projekt »Chat« 20.1

Erläuterung:

Falls es keinen Beitrag gibt, wird in diesem Teil nichts ausgeführt.Dies ist beim ersten Aufruf der Seite der Fall.

Die Datei mit den Beiträgen (chat_text.txt) wird zum Anhängen geöff-net. Das aktuelle Datum und die aktuelle Uhrzeit werden ermitteltund zusammen mit dem (Nick-)Namen des Benutzers und seinem Bei-trag in die Datei geschrieben.

Diese drei Angaben werden in eine HTML-Tabellenzeile eingebettet,sodass die betreffende Zeile beim späteren Lesevorgang unmittelbarausgegeben werden kann (siehe oben). Damit der Entwickler dieInhalte der Textdatei besser kontrollieren kann, wird am Ende einZeilenumbruch (chr(13) und chr(10)) eingefügt.

Nach dem Schreibvorgang wird der Ausgabe-Frame durch die eigeneJavaScript-Funktion reload() neu geladen, damit der neu eingege-bene Beitrag unmittelbar zu sehen ist.

20.1.9 Eingabe, PHP zum Speichern, Version »Datenbank«

Datenbank-speicherung

Es folgt Teil 2, der PHP-Abschnitt zum Speichern eines neuen Beitrags ineiner Datenbank:

<body><?php/* Anhängen des neuen Textes, falls vorhanden */if(isset($_POST["beitrag"]))

mysql_connect("","root");mysql_select_db("chat");mysql_query("insert daten (nick, beitrag)

values ('" . $_POST["nick"] . "', '". $_POST["beitrag"] . "')");

/* Chat-Anzeige aktualisieren */echo "<script type='text/javascript'>

reload();</script>";?>

Listing 20.7 Datei chat_db_ein.php, Teil 2

535

Page 537: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispielprojekte20

Erläuterung:

Falls es keinen Beitrag gibt, der neu abzuspeichern ist, wird in diesemTeil nichts ausgeführt. Dies ist beim ersten Aufruf der Seite der Fall.

insert into …values

Mit Hilfe der SQL-Anweisung insert werden der (Nick-)Name desBenutzers und sein Beitrag in die Tabelle daten der Datenbank chatgeschrieben. Diese Tabelle beinhaltet ein drittes Feld vom Typ Time-stamp. In diesem Feld werden bei der Erzeugung des Datensatzes vonMySQL automatisch das aktuelle Datum und die aktuelle Uhrzeit ein-getragen.

Nach dem Schreibvorgang wird der Ausgabe-Frame durch die eigeneJavaScript-Funktion reload() neu geladen, damit der eingegebeneBeitrag unmittelbar zu sehen ist.

20.1.10 Eingabe, Formular

Es folgt Teil 3, das Eingabeformular. Es ist für beide Versionen fastgleich. Nachfolgend in der Version »Textdatei«:

<form name="f" action="chat_text_ein.php" method="post"><table>

<tr><td>Ihr Name:</td><td><input name="nick"

<?phpif(isset($_POST["nick"]))

echo "value='" . $_POST["nick"] . "'";?>size="20" /></td>

<td align="center"><a href="javascript:reload();">Chat laden</a>

</td><td align="right">

<a href="javascript:send();">Senden</a></td>

</tr>

<tr><td valign="top">Ihr Beitrag:</td><td colspan="3">

<textarea cols="50" rows="2" name="beitrag"></textarea></td>

</tr></table>

536

Page 538: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Projekt »Chat« 20.1

</form>

</body></html>

Listing 20.8 Datei chat_text_ein.php bzw. chat_db_ein.php, Teil 3

Erläuterung:

Das Eingabeformular hat einen Namen (f), dieser wird für JavaScriptbenötigt. Es ruft die gleiche Datei wieder auf, also chat_text_ein.phpbeziehungsweise chat_db_ein.php. Nach dem Absenden steht das Ein-gabefenster also wieder zur Verfügung.

Die Formularelemente sind in eine kleine Tabelle eingebettet.

In der oberen Tabellenzeile steht das Eingabefeld für den(Nick-)Namen. Der Benutzer muss seinen Namen nur einmal eintra-gen. Nach dem Absenden sorgt PHP dafür, dass der gleiche Name wie-der übernommen wird (value='$nick').

Es folgt der Hyperlink für Chat laden (ohne Beitrag), der die eigeneJavaScript-Funktion reload() aufruft.

Beitrag senden Anschließend folgt der Hyperlink für das Senden eines Beitrags, derdie eigene JavaScript-Funktion send() aufruft.

In der unteren Tabellenzeile nimmt eine Textarea der Größe 50×2 dieneuen Beiträge auf. Diese Werte wurden nur für Abbildung 20.1gewählt. Sinnvoller wäre zum Beispiel 90×3.

20.1.11 Mögliche Erweiterungen

Das Programm könnte mit folgenden Features erweitert werden:

Der Benutzer, der an einem Chat teilnehmen möchte, gelangt zunächstzu einer Login-Seite. Dort meldet er sich mit seinem (Nick-)Namen undseinem Passwort an und bestimmt, an welcher Chat-Gruppe er teilneh-men möchte.

IdeenAlle anwesenden Teilnehmer jeder Chat-Gruppe werden angezeigt,sodass man sich einen Überblick darüber verschaffen kann, wie gut diejeweilige Chat-Gruppe besucht ist und ob Bekannte dabei sind. Ein neuhinzukommender Benutzer, der noch kein Passwort hat, wird auf eineSeite zur Neuanmeldung verwiesen. Hier trägt er seine persönlichenDaten ein, soweit diese für die Chat-Anmeldung relevant sind.

537

Page 539: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispielprojekte20

Es ist eine Administrationsseite für einen Moderator vorhanden. Dieserkann Folgendes:

alle Chat-Beiträge sehen

eigene Beiträge und Hinweise senden

Beiträge, die die gesetzten Regeln verletzen, gegebenenfalls löschen

Benutzer temporär oder permanent ausschließen

Neuanmeldungen bearbeiten und die neuen Benutzer benachrichti-gen

Ausgehend von der Version »Datenbank« wird eine zusätzliche Tabellefür die Benutzer benötigt. Hier werden folgende Angaben gespeichert:persönliche Daten, Nickname, Passwort, Anwesenheitsvermerk (anwe-send, wenn ja, in welchem Chat), Benutzerstatus (neu, normal, gesperrt).

Die Tabelle daten wird um ein Feld gruppe erweitert. Bei der Ausgabewerden mit der SQL-Anweisung nur die Beiträge aus der betreffendenGruppe ausgewählt.

20.2 Projekt »Blog«

Reisetagebuch Es soll eine Anwendung erstellt werden, mit deren Hilfe ein einfachesBlog, zum Beispiel für ein Reisetagebuch, in eine Website integriert wer-den kann.

Bilder verkleinern Der Blog-Betreiber kann Texte und Bilder hochladen. Die Bilder werdennach dem Hochladen auf eine einheitliche Breite (bzw. Höhe) von 320Pixeln verkleinert. Dies ermöglicht eine weiterhin informative Darstel-lung, gleichzeitig verringert es die Ladezeit für die Blog-Betrachter. DieEinträge sind absteigend nach Zeit sortiert, sodass der Blog-Betrachterdie Bilder und Texte zu den neuesten Reiseerlebnissen immer als Erstessieht. Zunächst die Darstellung des Blogs, wie ihn die Betrachter sehen,in Abbildung 20.5.

Zwei Zeitzonen Sie erkennen, dass jeder Eintrag mit zwei Zeitinformationen versehenist. Dabei handelt es sich um die Zeit, zu der der jeweilige Eintrag vorge-nommen wurde und nach der die Einträge absteigend sortiert werden.Einerseits wird die Ortszeit des Betrachters in MEZ (MitteleuropäischeZeit) dargestellt. Andererseits können Sie die Ortszeit des Betreibersablesen, in AWST (Australian Western Standard Time). In unserem Bei-spiel befindet sich der Betreiber Max in West-Australien.

538

Page 540: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Projekt »Blog« 20.2

Abbildung 20.5 Blog, für die Betrachter

Abbildung 20.6 Blog, für den Betreiber

Text oder BildDer Blog-Betreiber hat eine Eingabeseite für seine Beiträge, siehe Abbil-dung 20.6. Der Betreiber hat zwei verschiedene Möglichkeiten. Im obe-

539

Page 541: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispielprojekte20

ren Teil kann er einen längeren Text von maximal 1.000 Zeichen Längeeingeben und senden. Im unteren Teil kann er ein Bild auswählen und eshochladen. Das Bild wird anschließend auf dem Webserver auf eineBreite (bzw. Höhe) von 320 Pixeln verkleinert.

20.2.1 Aufbau der Datenbank

Die Texte und die Namen der Bilder werden in einer Datenbank gespei-chert. In Abbildung 20.7 sehen Sie die Struktur der Datenbanktabelle.

Abbildung 20.7 Blog, Tabellenstruktur

Erläuterung:

id Auf dem Feld id liegt ein Primärschlüssel, außerdem verfügt es überdie Eigenschaft auto_increment. Die Einträge bekommen im Feld idalso eine eindeutige Nummer, die automatisch immer um 1 höherliegt als die bisherige größte Nummer.

zeit Das Feld zeit ist vom Typ timestamp. Bei jeder Erzeugung einesDatensatzes wird hier die aktuelle Systemzeit eingetragen.

art Im Feld art steht entweder eine 0 für einen Texteintrag oder eine 1für einen Bildeintrag.

text Im Feld text steht entweder der eingetragene Text oder der Name derBilddatei.

Einige Beispieleinträge sehen Sie in Abbildung 20.8.

Abbildung 20.8 Blog, einige Beispieldaten

540

Page 542: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Projekt »Blog« 20.2

Eindeutiger NameSie können erkennen, dass der Name der Bilddatei geändert wurde. Siebeinhaltet das Datum und die Zeit, zu der der Eintrag vorgenommenwurde. Damit hat jede Bilddatei einen eindeutigen Namen, unabhängigvon dem Namen, der von der digitalen Kamera vergeben wird.

20.2.2 Blog für den Betrachter, Programmcode

Es folgt der Code der Datei, die die Seite für den Betrachter erzeugt:

<html><head><title>Max in Australien</title><style type="text/css">

body,td font-family:Verdana; font-size:10pt;background-color:#ff9900; color:#00008b

.li font-size:8pt</style></head>

<body><p align="center"><b>Max in Australien</b></p><table border="0" width="100 %"><?php

/* DB-Abfrage */mysql_connect("", "root");mysql_select_db("blog");$res = mysql_query("select * from blogdaten". " order by zeit desc");

while($dsatz = mysql_fetch_assoc($res))/* Zeiten */$z = $dsatz["zeit"];$zeit = mktime(substr($z,11,2), substr($z,14,2),

substr($z,17,2), substr($z,5,2), substr($z,8,2),substr($z,0,4));

$awst = strtotime("+7 hour", $zeit);

/* Ausgabe */echo "<tr>";

Hinweis

Zur Erzeugung der Datenbank inklusive der Tabelle können Sie statt phpMy-Admin auch das PHP-Programm blog_db_neu.php benutzen.

541

Page 543: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispielprojekte20

echo "<td valign='top' class='li'>". date("d.m.y H:i", $zeit) . " MEZ<br />". date("d.m.y H:i", $awst) . " AWST</td>";

if($dsatz["art"] == 1)echo "<td valign='top' width='20 %'>"

. "<img src='" . $dsatz["text"] . "' /></td>";else

echo "<td valign='top' width='80 %'>". $dsatz["text"] . "</td>";

echo "</tr>";echo "</table>";

?><p class="li">MEZ = Mitteleurop. Zeit,AWST = Australian Western Standard Time</p></body></html>

Listing 20.9 Datei blog.php

Erläuterung:

CSS Der Head beginnt zunächst mit dem Titel und den CSS-Einstellungen.Die »australische« Hintergrundfarbe ist #ff9900. Die CSS-Klasse liwird mit einer etwas kleineren Schrift eingestellt. Sie wird in der lin-ken Spalte für die Zeitangaben benutzt.

Die Ergebnisse der Datenbankabfrage sind absteigend nach Zeit sor-tiert.

Zeitverschiebung Der Eintrag im Feld zeit wird gelesen und in eine Zeitvariable umge-wandelt. Damit lässt sich der Wert für die um sieben Stunden ver-schobene westaustralische Ortszeit ermitteln. Anschließend werdenbeide Zeitangaben in die linke Spalte geschrieben.

Inhalt In der rechten Spalte wird der eigentliche Inhalt des Blogs ausgege-ben, entweder der Text oder das Bild, abhängig vom Eintrag im Feldart.

Unterhalb der Tabelle folgt noch eine Erklärung zu den Zeitzonen,ebenfalls in kleinerer Schrift dank der CSS-Klasse li.

20.2.3 Blog für den Betreiber, Programmcode

Es folgt der Code der Datei, die die Seite für den Betreiber erzeugt.Zunächst der Dokument-Head:

542

Page 544: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Projekt »Blog« 20.2

<html><head><title>Max in Australien, Eingabe</title><style type="text/css">

body,td font-family:Verdana; font-size:10pt;background-color:#ff9900; color:#00008b

.li font-size:8pt</style><?php

if (isset($_POST["gesendet"]))mysql_connect("", "root");mysql_select_db("blog");

/* Einfügen Text */if($_POST["art"] == 0)

mysql_query("insert into blogdaten (art, text)". " values (0, '" . $_POST["text"] . "')");

/* Einfügen Bild */else

/* Neuer Name */$fn = $_FILES["upfile"]["name"];$fn_teile = explode(".", $fn);$fn_endung = $fn_teile[count($fn_teile) – 1];if(strtolower($fn_endung) == "jpg")

$fn = "blog_" . date("YmdHis") . "." . $fn_endung;

/* In DB einfügen, Bild kopieren */copy($_FILES["upfile"]["tmp_name"], $fn);mysql_query("insert into blogdaten (art, text)"

. " values (1, '$fn')");

/* Original-Bildgröße ermitteln */$info = getimagesize($fn);$width_alt = $info[0];$height_alt = $info[1];

/* Neue Bildgröße festlegen */if($width_alt > $height_alt)

$width_neu = 320;$height_neu = ceil($height_alt *

$width_neu / $width_alt);

543

Page 545: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispielprojekte20

else

$height_neu = 240;$width_neu = ceil($width_alt *

$height_neu / $height_alt);

/* Altes und neues Bildobjekt erzeugen */$im_alt = imagecreatefromjpeg($fn);$im_neu = imagecreatetruecolor(

$width_neu, $height_neu);

/* Bild in neue Größe kopieren, speichern */imagecopyresampled($im_neu, $im_alt,

0, 0, 0, 0, $width_neu, $height_neu,$width_alt, $height_alt);

imagejpeg($im_neu, $fn);

/* Bildobjekte löschen */imagedestroy($im_alt);imagedestroy($im_neu);

else

echo "<p><font color='#ff0000'>Bild wurde nicht hochgeladen, muss vomTyp JPG sein!</font></p>";

?></head>

Listing 20.10 Datei blog_eingabe.php, oberer Teil

Erläuterung:

Gesendete Daten Nach Überschrift und CSS folgt die Abfrage, ob die Datei mit oderohne eingegebene und gesendete Daten aufgerufen wurde.

Text speichern Falls es sich um einen gesendeten Text handelt, wird dieser mit Hilfeder SQL-Anweisung insert in die Datenbank eingefügt.

Bild hochladen Falls es sich dagegen um ein hochgeladenes Bild handelt, wirdzunächst ein neuer Name für dieses Bild (nur vom Typ JPG) ermittelt.Dieser beinhaltet die aktuelle Zeit inklusive Angabe der Sekunde.Unter diesem eindeutigen Namen wird das hochgeladene Bild aus

544

Page 546: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Projekt »Blog« 20.2

dem temporären Serververzeichnis in das Anwendungsverzeichnisauf dem Server kopiert. Der neue Name wird außerdem in der Daten-bank abgelegt, damit das Bild später für den Betrachter auf der Seiteblog.php dargestellt werden kann.

Wenn Sie das Bild in Originalgröße darstellen wollten, müssten keineweiteren Aktionen erfolgen. Allerdings soll es ja auf eine Breite (bzw.Höhe) von 320 Pixeln verkleinert werden.

getimagesize() Dazu wird zunächst die aktuelle Größe des Bildes mit Hilfe der Funk-tion getimagesize() festgestellt. Diese Funktion liefert ein Array mitBildinformationen.

Bildformat Abhängig davon, ob das Bild im Querformat oder im Hochformat auf-genommen wurde, wird die Größe des neuen Bildes festgelegt. Fallses sich zum Beispiel um ein Bild im Querformat handelt, ist die Breitegrößer als die Höhe. Die neue Breite wird auf 320 Pixel festgelegt. Dieneue Höhe wird passend dazu aus den alten Daten ermittelt.

imagecreate-truecolor()

Nun werden zwei Bildobjekte erschaffen. Das Objekt des alten Bildesbasiert auf der alten Bilddatei und wird »klassisch« mit Hilfe der Funk-tion imagecreatefromjpeg() erzeugt. Das Objekt für das neue Bild istzunächst schwarz und wird mit Hilfe der Funktion imagecreatetrue-color() in der gewünschten neuen Größe erzeugt.

imagecopy-resampled()

Der entscheidende Schritt wird mit Hilfe der Funktion imagecopy-resampled() durchgeführt. Damit wird das alte Bildobjekt bei gleich-zeitiger Größenänderung in das neue Bildobjekt überführt. Dabeiwerden die Bildpixel gleichmäßig interpoliert. Die Funktion benötigtinsgesamt zehn Parameter. Dies sind die Objekte, die Breite, die Höheund die Koordinaten, jeweils des alten und des neuen Bildes.

Speichern Schließlich wird die neue Bilddatei mit Hilfe der Funktion image-jpeg() gespeichert, und die beiden nicht mehr benötigten Bildob-jekte werden zerstört.

Als Letztes folgt der Dokumentbody der Datei, die die Seite für denBetreiber erzeugt:

<body><p align="center"><b>Max in Australien, Eingabe</b></p><form action="blog_eingabe.php" method="post">

<input type="hidden" name="art" value="0" /><p>Text eingeben und absenden (max. 1000 Zeichen):</p><p><textarea name="text" rows="5"

cols="80"></textarea></p><p><input type="submit" name="gesendet"

545

Page 547: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispielprojekte20

value="Senden"/><input type="reset" value="Leeren"/></p>

</form>

<p><b>oder</b></p><form enctype="multipart/form-data"

action="blog_eingabe.php" method="post"><input type="hidden" name="art" value="1" /><p>Bild auswählen und absenden:</p><p><input name="upfile" type="file" /></p><p><input type="submit" name="gesendet"

value="Senden"/><input type="reset" value="Leeren"/></p>

</form></body></html>

Listing 20.11 Datei blog_eingabe.php, unterer Teil

Erläuterung:

Der Body umfasst zwei Formulare. Beide rufen wiederum die gleicheDatei auf.

Textarea Das erste Formular beinhaltet eine Textarea zur Eingabe eines länge-ren Textes mit dem Namen text.

Upload-Element Das zweite Formular beinhaltet ein Element für den Datei-Upload mitdem Namen upfile.

Bei beiden Formularen hat der Submit-Button den Namen gesendet.Daher wird beim Laden der Seite bemerkt, ob sie mit oder ohnegesendete Daten aufgerufen wurde.

20.3 Projekt »Forum«

Es soll ein individuelles Forum für eine geschlossene Benutzergruppegeschaffen werden. Zunächst eine kurze Erläuterung zu der Benutzer-gruppe:

Fachinformatiker Die Umschulung zum Fachinformatiker, Fachrichtung Anwendungs-entwicklung, umfasst vierzehn Monate Unterricht, sechs MonatePraktikum, zwei Monate Prüfungsvorbereitung und eine Prüfung vorder Industrie- und Handelskammer. Während des Praktikums soll den50 Umschulungsteilnehmern aus insgesamt zwei Kursen die Möglich-

546

Page 548: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Projekt »Forum« 20.3

keit geboten werden, über das Internet Erfahrungen auszutauschenund sich gegenseitig Tipps und Hilfestellungen zu geben.

Die Teilnehmer haben Praktikantenstellen bei unterschiedlichen Fir-men aus dem IT-Bereich beziehungsweise in IT-Abteilungen bran-chenfremder Firmen sowie in öffentlichen Einrichtungen (zum Bei-spiel Universität, Stadtverwaltung). Diese befinden sich größtenteilsim Kammergebiet, einige sind auch über das gesamte Bundesgebietverteilt.

PasswortDer Zugang zum Forum ist über eine Internetseite möglich, auf der nurdas individuelle Passwort eingegeben werden muss. Die Eingabe einesBenutzernamens oder die Möglichkeit zur Neuanmeldung ist nicht erfor-derlich bzw. möglich, da alle Teilnehmer bereits namentlich bekanntsind und das Forum nur für einen begrenzten Zeitraum genutzt wird. DieTeilnehmer erfahren die Adresse und ihr individuelles Passwort als Ant-wort auf eine E-Mail, die sie von ihrem Praktikumsplatz aus an denAdministrator der Website gesendet haben.

DatenbankDie Namen, Passwörter und Beiträge der Teilnehmer werden in zweiTabellen einer Datenbank gespeichert. Es handelt sich um die Datenbankforum und die Tabellen eintrag und teilnehmer. Den Aufbau der Tabel-len erläutere ich im Zusammenhang mit dem Aufbau des zugehörigenProgrammelements. Das gesamte Programm einschließlich der Anmeld-eseite ist in einer Datei codiert. Dies vereinfacht viele Vorgänge.

20.3.1 Darstellung, Anmeldung

Nach Aufruf des Forums erscheint zunächst der Anmeldebildschirm,siehe Abbildung 20.9. Beispielpasswörter finden Sie weiter unten inAbbildung 20.13.

Abbildung 20.9 Forum, Anmeldebildschirm

547

Page 549: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispielprojekte20

20.3.2 Darstellung, Hauptbildschirm

Nach Eingabe eines falschen Passworts oder keines Passworts gelangt derBenutzer ohne Kommentar wieder auf den Anmeldebildschirm. NachEingabe seines korrekten, persönlichen Passworts gelangt der Teilneh-mer schließlich zum Forum, wie es in Abbildung 20.10 dargestellt wird.

Abbildung 20.10 Forum, nach der Anmeldung (obere Hälfte)

Erläuterung:

Forum, Inhalt In der Titelzeile und als Überschrift erscheint der Name des Forums.In der Überschrift wird zusätzlich der Name des angemeldeten Teil-nehmers angezeigt, der nach der Eingabe des Passworts eindeutigzugeordnet werden kann.

In den nächsten beiden Zeilen können verschiedene Hyperlinks ange-klickt werden:

Der Hyperlink Neuen Beitrag eingeben führt zum unteren Endeder Seite. Dies ist besonders dann sinnvoll, wenn bereits zahlrei-che Einträge existieren. Hier können das Thema und der Beitrageingegeben und abgesendet werden (siehe den nächstenAbschnitt).

Der Link Abmelden führt wieder zum Anmeldebildschirm (sieheoben).

Die Beiträge des Forums lassen sich gefiltert anzeigen. Die Benutzerkönnen selbst das Thema ihres Beitrags wählen.

548

Page 550: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Projekt »Forum« 20.3

Themenfilter Falls ein Benutzer nur die Beiträge zu einem bestimmten Themasehen möchte, kann er das gewünschte Thema aus dem Menü Filtern

nach Thema auswählen. Diese Liste beinhaltet automatisch alle The-men des Forums in alphabetischer Reihenfolge. Das Forum kannsomit auf einfache Weise in einzelne Foren »zerlegt« werden. DieseFunktionalität setzt natürlich eine gewisse Benutzerdisziplin bei derEingabe der Themen voraus, die man in einer geschlossenen, nament-lich bekannten Benutzergruppe erwarten kann. Zusätzlich kann einModerator regelmäßig die Liste der Themen »vereinheitlichen«, umdie Filterung zu erleichtern.

Namensfilter Falls ein Benutzer nur die Beiträge eines bestimmten Kollegen sehenmöchte, kann er den gewünschten Name aus dem Menü Filtern

nach Name auswählen. Diese Liste beinhaltet automatisch alle Benut-zer des Forums, die bereits mindestens einen Beitrag gesendet haben,in alphabetischer Reihenfolge.

Wortfilter Das Textfeld Filtern nach Wort bietet eine Volltextsuchfunktion an.Nach Eingabe eines Begriffs werden nur noch die Beiträge angezeigt,die dieses Wort beinhalten. Dies kann als Ergänzung zum Filtern

nach Thema angesehen werden. Ein Beitrag lässt sich nicht immernur einem Thema eindeutig zuordnen.

Sortierung Der Hyperlink Datum sortiert die Beiträge nach ihrem Datum; derneueste Beitrag steht oben. Dies ist die Standardsortierung nach derAnmeldung. Sie wird nur benötigt, wenn vorher eine der beidenanderen Sortierungen genutzt wurde.

Die beiden Hyperlinks Name und Thema bieten eine alphabetischeSortierung der Beiträge nach Benutzernamen beziehungsweise nachdem Thema des Beitrags.

Es folgen die einzelnen Beiträge gemäß der aktuellen Sortierung.Dabei werden Datum, Uhrzeit und Name des beitragenden Teilneh-mers automatisch ermittelt. Er muss nur das Thema und den Beitraghinzufügen.

Eine Einschränkung: Die Filter-, Such- und Sortierfunktionen könnennur einzeln genutzt werden. Sie sind nicht additiv, das heißt, es ist nichtmöglich, nur die Beiträge eines Teilnehmers anzuzeigen und diese gleich-zeitig nach einem Thema zu sortieren. Hier wurde einer schnellenLösung der Vorzug vor der komplexen Lösung gegeben. Die erweiterteFunktionalität könnte allerdings problemlos hinzugefügt werden, fallssich die Notwendigkeit ergibt.

549

Page 551: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispielprojekte20

20.3.3 Darstellung, neuer Beitrag

Der Hyperlink Neuen Beitrag eingeben führt zum unteren Ende derSeite, siehe Abbildung 20.11. Hier lassen sich Thema und Beitrag einge-ben und absenden.

Abbildung 20.11 Eingabe eines neuen Beitrags

Binary LargeObject

Die Bezeichnung des Themas sollte nicht länger als 20 Zeichen sein. DieLänge eines Beitrags ist auf 1.000 Zeichen begrenzt.

Unter der Textarea für den Beitrag befindet sich ein Hyperlink Beitrag

senden und einer zum Zurücksetzen des Formulars beziehungsweisezum Rücksprung (Nach oben) zum Kopf der Seite.

Neuer Beitrag Nachdem ein neuer Beitrag gesendet wurde, wird die Seite neu geladen.Es ist kein Filter aktiv, die Beiträge sind absteigend nach dem Datum sor-tiert, der soeben abgesendete Beitrag erscheint oben. Die Liste desMenüs Filtern nach Thema wurde bereits ergänzt, falls es sich um einenBeitrag zu einem neuen Thema handelte. Die Liste des Menüs Filtern

nach Name wurde ebenfalls unmittelbar ergänzt, wenn der Beitrag zumForum der erste des angemeldeten Teilnehmers war.

20.3.4 Datenbank, Tabelle der Teilnehmer

Teilnehmer-struktur

In Abbildung 20.12 sehen Sie die Struktur der Datenbanktabelle für dieTeilnehmer. Zu jedem Teilnehmer werden ID, Vorname, Nachname undPasswort gespeichert. Auf dem Feld id liegt ein Primärschlüssel. DiePflege der Teilnehmertabelle geschieht außerhalb dieses Forums, direktmit phpMyAdmin, und ist nicht Thema dieser Beschreibung.

550

Page 552: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Projekt »Forum« 20.3

Abbildung 20.12 Tabelle »teilnehmer«, Struktur

Einige Beispieleinträge in der Tabelle teilnehmer sehen Sie in Abbildung20.13.

Abbildung 20.13 Tabelle »teilnehmer«, Daten

20.3.5 Datenbank, Tabelle der Beiträge

BeitragsstrukturDie Beiträge werden in der Tabelle eintrag gespeichert. Abbildung20.14 zeigt ihren Aufbau.

Abbildung 20.14 Tabelle »eintrag«, Struktur

Neben der ID (mit eindeutigem Index) werden Datum/Uhrzeit, Namedes Teilnehmers, Thema und Text des Beitrags gespeichert. Die Einträge

Hinweis

Zur Erzeugung der Datenbank inklusive beider Tabellen können Sie anstellevon phpMyAdmin auch das PHP-Programm forum_db_neu.php benutzen.

551

Page 553: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispielprojekte20

im Feld id werden automatisch hochgezählt (auto_increment). Der Ein-trag im Feld zeit erfolgt ebenfalls automatisch (Datentyp timestamp).Einige Beispieleinträge zeigt Abbildung 20.15.

Abbildung 20.15 Tabelle »eintrag«, Daten

20.3.6 Passwortvergabe

Wie bereits erwähnt, ist der Zugang nur über ein individuelles Passwortmöglich. Die Teilnehmer erfahren die Adresse und ihr individuelles Pass-wort als Antwort auf eine E-Mail, die sie von ihrem Praktikumsplatz ausgesendet haben.

Passwort-ermittlung

Dazu ist es vorher notwendig, für jeden Teilnehmer ein eigenes, eindeu-tiges Passwort zu erzeugen. Das Passwort besteht stets aus drei Klein-buchstaben und drei Ziffern. Dadurch ergeben sich circa 17,5 Millionenverschiedene Kombinationen. Das Passwort ist fest, es kann nicht vomTeilnehmer geändert werden. Dies erscheint zunächst als Nachteil, aber:

Durch die zufällige Auswahl werden Passwörter festgelegt, die nurschwer erraten werden können.

Es wird vermieden, dass die Teilnehmer eigene, eventuell zu einfachePasswörter auswählen.

Der Aufwand bei der Anmeldung ist geringer.

Das Programm zur Erzeugung der verschiedenen Passwörter setzt auf derbereits dargestellten Tabelle teilnehmer auf. In dieser Tabelle sind bereitsvier Datensätze vorhanden, in denen ID, Vorname und Nachname einge-tragen sind. Das Programm lässt sich durch Änderung der Schleifenvari-ablen leicht auf mehr Teilnehmer erweitern. Das Programm:

<html><body><?php/* Zufallszahlengenerator initialisieren */mt_srand((double)microtime()*1000000);

/* Jeweils eine zufällige Kombination erzeugen */

552

Page 554: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Projekt »Forum« 20.3

for($i=1; $i<=4; $i++)

/* Keine Kombination doppelt erzeugen */do

$vorhanden = 0;$pw[$i] = "";

/* Kombination aus drei kleinen Buchstaben ... */for ($k=1; $k<=3; $k++)

$pw[$i] .= chr(mt_rand()%26+97);/* ... und drei Ziffern */for ($k=1; $k<=3; $k++)

$pw[$i] .= chr(mt_rand()%10+48);

/* Mit allen bisherigen Kombinationen vergleichen */for($m=1; $m<$i; $m++)

if($pw[$m] == $pw[$i])

$vorhanden=1;break;

while($vorhanden==1);

/* Kombinationen in die Datenbank schreiben */mysql_connect("", "root");mysql_select_db("forum");

$num = 0;for($i=1; $i<=4; $i++)

$sqlab = "update teilnehmer set passwort = '". $pw[$i] . "' where id = " . $i;

echo $sqlab . "<br />";mysql_query($sqlab);$num += mysql_affected_rows();

echo "$num Datensätze geändert";?></body></html>

Listing 20.12 Datei forum_pw.php

553

Page 555: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispielprojekte20

Erläuterung:

Zunächst wird der Zufallszahlengenerator initialisiert.

Es wird für jeden Datensatz einmal eine for-Schleife durchlaufen.

Für ein Passwort wird eine Kombination aus drei Kleinbuchstabenund drei Ziffern ermittelt und in einem numerisch indizierten Feldgespeichert.

Dazu wird für die Buchstaben eine ganze Zahl zwischen 0 und 25erzeugt. Das Ergebnis wird um 97 verschoben, sodass eine ganze Zahlzwischen 97 und 122 zur Verfügung steht. Das Zeichen mit dembetreffenden Code wird dem Passwort hinzugefügt.

Die Erzeugung der drei Ziffern verläuft analog. Die Ziffern liegen imCodebereich zwischen 48 und 57.

Anschließend wird das neue Passwort mit den bisher ermittelten Pass-wörtern in dem Feld verglichen. Falls es bereits vorhanden ist, wirddie do-while-Schleife, in der die gesamte Ermittlung eines Passwortseingebettet ist, noch einmal durchlaufen. Dies wird so oft wiederholt,bis ein neues Passwort gefunden wird.

Zur Kontrolle wird das Passwort auf dem Bildschirm ausgegeben.

In einer weiteren for-Schleife werden die Datensätze der Tabelle inder Datenbank mit den Elementen des Feldes aktualisiert.

Zur Kontrolle wird die Anzahl der vorgenommenen Änderungen mitHilfe der Funktion mysql_affected_rows() in der Tabelle festgehal-ten und am Ende ausgegeben.

20.3.7 Forum, CSS

CSS-Formatierung

Aufgrund der Größe stelle ich das Forum-Programm in einzelnen Teilendar. Ich bilde die Dateiinhalte der Reihe nach ab und erläutere sie. Hierzunächst die Beschreibung der CSS-Formatierung:

<html><head><title>Fachinformatiker Praktikumsforum</title>

Hinweis

Sie sollten das Programm nach einem Lauf auskommentieren oder umbe-nennen, damit die vergebenen Passwörter nicht versehentlich durch neueZufallswerte überschrieben werden.

554

Page 556: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Projekt »Forum« 20.3

<style type="text/css">body font-family:Verdana; font-size:10pt;

background-color:#d0dce0; color:#00008btd font-family:Verdana; font-size:10pt;

background-color:#d0d0d0; color:#00008b;vertical-align:top

td.ub background-color:#d0d0d0td.kl font-size:8pta:link color:#0000ffa:visited color:#0000ffa:hover color:#ff0000

</style>

Listing 20.13 Datei forum.php, CSS

Erläuterung:

Für das Dokument wird die Schriftart Verdana in der Größe 10 Punkteingestellt. Der Hintergrund ist hellblau.

Für Tabellenzellen wird die gleiche Schriftformatierung gewählt. Siehaben allerdings einen hellgrauen Hintergrund. Dadurch wird dieAufteilung der Seite vor dem Dokumenthintergrund stärker hervorge-hoben. Auf diese Weise hat die CSS-Formatierung nicht nur einenoptischen, sondern auch einen funktionellen Charakter.

Beiträge erstrecken sich meist über mehrere Zeilen innerhalb einerZelle. Die Informationen zu Datum, Uhrzeit, Name und Thema dienendurch ihre vertikale Ausrichtung (oberer Rand) als optische »Ordner«der gesamten Tabellenzeile.

Tabellenzellen der Klasse kl werden für die Angaben Datum, Uhrzeitund Name eingesetzt. Diese Zellen haben eine etwas kleinere Schrift.Der Eigenschaftswert 10pt wird durch den Wert 8pt überlagert. Dierestlichen Eigenschaften einer Tabellenzelle bleiben erhalten.

Hyperlinks ändern die Schriftfarbe auf Rot, wenn man mit dem Maus-zeiger darüberfährt.

20.3.8 Forum, JavaScript-Funktion

Es folgt die JavaScript-Funktion send(), mit deren Hilfe die gewünschteAktion beziehungsweise der Darstellungsstatus eingestellt wird:

<script type="text/javascript">function send(p)

555

Page 557: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispielprojekte20

if (p==1)

if (document.tb.thema.value == ""|| document.tb.beitrag.value == "")alert("Bitte Thema und Beitrag eintragen!");

else

document.tb.aufruf.value = "beitrag";document.tb.submit();

else if (p==2)

document.tb.aufruf.value = "sdatum";document.tb.submit();

else if (p==3)

document.tb.aufruf.value = "sname";document.tb.submit();

else if (p==4)

document.tb.aufruf.value = "sthema";document.tb.submit();

else if (p==5)

document.tb.aufruf.value = "filter_t";document.tb.submit();

else if (p==6)

document.tb.aufruf.value = "filter_n";document.tb.submit();

else if (p==7)

document.tb.aufruf.value = "filter_w";document.tb.submit();

</script></head>

Listing 20.14 Datei forum.php, JavaScript-Funktion

556

Page 558: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Projekt »Forum« 20.3

Erläuterung:

Unterschiedlicher Seitenaufruf

Die Funktion send() wird von vielen verschiedenen Hyperlinks aufgeru-fen. Der dabei übermittelte Parameter p legt die Art der Aktion fest:

1. p=1: Es handelt sich um das Absenden eines neuen Beitrags. Fallseines der beiden Elemente für das Thema beziehungsweise den Bei-trag leer ist, wird darauf aufmerksam gemacht und nicht gesendet.Andernfalls wird dem versteckten Element aufruf zur Auswertungim empfangenden Programmteil der Wert beitrag zugewiesen.Anschließend wird gesendet.

2. p=2: Die Tabelle soll nach dem Datum absteigend sortiert werden. Dasversteckte Element aufruf bekommt den Wert sdatum.

3. p=3: Die Tabelle soll nach dem Namen sortiert werden. Das versteckteElement bekommt den Wert sname.

4. p=4: Die Tabelle soll nach dem Thema sortiert werden. Das versteckteElement bekommt den Wert sthema.

5. p=5: Die Tabelle soll nach dem ausgewählten Thema gefiltert angezeigtwerden. Das versteckte Element bekommt den Wert filter_t.

6. p=6: Die Tabelle soll nach dem ausgewählten Namen gefiltert ange-zeigt werden. Das versteckte Element bekommt den Wert filter_n.

7. p=7: Die Tabelle soll nach dem eingetragenen Wort gefiltert angezeigtwerden. Das versteckte Element bekommt den Wert filter_w.

Nach Durchführung einer der Aktionen 2 bis 7 wird das Formular eben-falls abgesendet.

20.3.9 Forum, Anmeldung

Der erste Teil des Hauptdokuments dient der Aufnahme der Datenbank-verbindung und der Darstellung des Anmeldebildschirms:

<body><?php/* Datenbankverbindung */mysql_connect("","root");mysql_select_db("forum");

/* Keine Parameter gesendet: Zur Anmeldung */if(!isset($_POST["aufruf"]) || !isset($_POST["pw"]))

echo "<form name='anm' action='forum.php' method='post'>". "Passwort:<br /><input type='password' name='pw' />"

557

Page 559: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispielprojekte20

. "<input type='hidden' name='aufruf'value='login' /><br />"

. "<a href='javascript:document.anm.submit();'>Anmelden</a>"

. "</form></body></html>";exit;

Listing 20.15 Datei forum.php, Anmeldung

Anmeldung Erläuterung:

Es wird die Datenbank forum ausgewählt.

Falls kein Passwort übermittelt oder keine Aktion aufgerufen wird, sowird unmittelbar die Anmeldeseite generiert.

Diese besteht aus dem Formular mit dem Namen anm. Das Formularbeinhaltet das versteckte Element aufruf, dem der Wert login zuge-wiesen wird, sowie ein Passwortelement.

Der Hyperlink dient dem Absenden des Formulars.

Weitere Elemente beinhaltet die Anmeldeseite nicht, daher kann dasDokument mit exit beendet werden.

20.3.10 Forum, Zugangsprüfung und Überschrift

Dieser Teil des Hauptdokuments dient als Zugangsprüfung und leitet dieÜberschrift ein:

/* Prüfung auf gültiges Passwort */$sqlab = "select * from teilnehmer";$sqlab .= " where passwort like '" . $_POST["pw"] . "'";$res = mysql_query($sqlab);$num = mysql_num_rows($res);if($num==0)

echo "<script type='text/javascript'>location.href='forum.php'</script></body></html>";

exit;

/* Formular beginnt nach erfolgreicher Anmeldung */echo "<form name='tb' action='forum.php' method='post'>". "<input type='hidden' name='pw' value='"

. $_POST["pw"] . "' />". "<input type='hidden' name='aufruf' />";

558

Page 560: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Projekt »Forum« 20.3

/* Kopfzeile mit Teilnehmername */$vn = mysql_result($res,0,"vorname");$nn = mysql_result($res,0,"nachname");$name = "$vn $nn";

echo "<table width='100%'>". "<tr><td colspan='4' class='ub'>". "<a name='oben'><b>Fachinformatiker

Praktikumsforum, $name</b></a>". "</td></tr>". "<tr><td width='25%' class='ub'><a href='#neu'>

Neuen Beitrag eingeben</a>". "<br />&nbsp;<br /><a href='forum.php'>

Abmelden</a></td>";

Listing 20.16 Datei forum.php, Zugangsprüfung und Überschrift

ZugangsprüfungErläuterung:

Mit Hilfe einer select-Anweisung wird ermittelt, ob das Passwort inder Tabelle existiert. Falls kein passender Datensatz gefunden wird,ruft das Dokument sich selbst auf. Da dabei keine Parameter übermit-telt werden, gelangt man so zur Anmeldeseite zurück.

Falls dagegen die Anmeldung erfolgreich war, wird das Hauptformu-lar mit dem Namen tb begonnen. Das erste versteckte Element (pw)übermittelt das Passwort zum nächsten Aufruf weiter. Das zweite ver-steckte Element (aufruf) dient der Übermittlung der gewünschtenAktion (Sortieren, Filtern, Eintragen usw.) mit der JavaScript-Funk-tion (siehe oben).

Der Name des Teilnehmers wird aus dem Datensatz ermittelt, in demdas Passwort gefunden wurde.

Es folgt die Überschrift, in der auch der Name des Teilnehmerserscheint.

Anschließend folgt der Hyperlink zum Ankerpunkt #neu im unterenTeil des Dokuments (Neuen Beitrag eingeben).

20.3.11 Forum, neuen Beitrag speichern

Ein neuer Beitrag wird als Erstes gespeichert, sodass das restliche Doku-ment ihn mit einbeziehen kann:

/* Neuen Beitrag in Datenbank schreiben */if($_POST["aufruf"] == "beitrag")

559

Page 561: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispielprojekte20

$sqlab = "insert eintrag (name, thema, beitrag)

values ('$name', '". $_POST["thema"] . "', '". $_POST["beitrag"] . "')";

mysql_query($sqlab);

Listing 20.17 Datei forum.php, neuen Beitrag speichern

Erläuterung:

Neuen Beitragspeichern

Falls ein Beitrag gesendet wurde, hat $aufruf den Wert beitrag.

Es wird die Systemzeit formatiert ermittelt.

Der neue Beitrag wird eingetragen: mit der Systemzeit, dem vollenNamen des Teilnehmers, dem Thema und dem Beitrag selbst.

20.3.12 Forum, Filterung auswählen

Hier folgt die Erläuterung, wie die Elemente zur Filterauswahl dargestelltwerden:

/* Thema als Auswahlfilter */$sqlab = "select thema from eintrag group by thema";$res = mysql_query($sqlab);$num = mysql_num_rows($res);

echo "<td width='25%' class='ub'>Filtern nach Thema:<br />". "<select name='filter_t'><option>- alle -</option>";

for($i=0; $i<$num; $i++)

$optt = mysql_result($res, $i, "thema");echo "<option>$optt</option>";

echo "</select><br />". "<a href='javascript:send(5);'>anzeigen</a></td></td>";

/* Name als Auswahlfilter */$sqlab = "select name from eintrag group by name";$res = mysql_query($sqlab);$num = mysql_num_rows($res);

echo "<td width='25%' class='ub'>Filtern nach Name:<br />"

560

Page 562: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Projekt »Forum« 20.3

. "<select name='filter_n'><option>- alle -</option>";for($i=0; $i<$num; $i++)

$optn = mysql_result($res, $i, "name");echo "<option>$optn</option>";

echo "</select><br />"

. "<a href='javascript:send(6);'>anzeigen</a></td></td>";

/* Wort im Beitrag als Auswahlfilter */echo "<td width='25%' class='ub'>Filtern nach Wort:<br />"

. "<input name='filter_w' /><br />"

. "<a href='javascript:send(7);'>anzeigen</a></td>"

. "</tr></table>";

Listing 20.18 Datei forum.php, Filterung auswählen

Erläuterung:

group by Mit select werden alle Themen, die bereits eingegeben wurden,gesammelt. Die group-Klausel sorgt dabei für eine Gruppierung.Dadurch wird jedes Thema im Abfrageergebnis nur einmal aufge-führt.

Mit den Daten des Abfrageergebnisses wird das HTML-Select-Menüfilter_t gefüllt. Als erste Option der Optionsliste wird -alle- ein-getragen. Falls kein anderes Listenelement ausgewählt wird, werdenalle Beiträge angezeigt. Die Filterung wird dadurch aufgehoben.

Unterhalb des HTML-Select-Menüs wird der zugehörige Hyperlinkanzeigen dargestellt. Bei seiner Betätigung wird die JavaScript-Funk-tion send() mit dem Parameter 5 aufgerufen. Dadurch wird dem ver-steckten Element aufruf der Wert filter_t zugewiesen, sodass beimanschließenden Neuanzeigen der Tabelle dieser Filter genutzt wird.

Auf die gleiche Weise wird das zweite HTML-Select-Menü filter_nmit den verschiedenen Namen der Teilnehmer gefüllt, die bereitsetwas eingegeben haben. Die Funktion send() wird mit dem Parame-ter 6 aufgerufen; aufruf bekommt dadurch den Wert filter_n.

Für das gesuchte Wort steht das Eingabeelement filter_w bereit.Darunter wird wiederum der zugehörige Hyperlink anzeigen darge-stellt. Die Funktion send() wird mit dem Parameter 7 aufgerufen;aufruf bekommt dadurch den Wert filter_w.

561

Page 563: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispielprojekte20

20.3.13 Forum, Sortierung durchführen

Sortieren Die Beiträge werden nach dem gewünschten Kriterium sortiert:

/* Alle Beiträge darstellen, sortiert *//* nach Zeit (absteigend) */if($_POST["aufruf"] == "sdatum"

|| $_POST["aufruf"] == "beitrag"|| $_POST["aufruf"] == "login")

$sqlab = "select * from eintrag order by zeit desc";$res = mysql_query($sqlab);$num = mysql_num_rows($res);

/* Alle Beiträge darstellen, sortiert *//* nach Name (aufsteigend) und Zeit (absteigend) */else if($_POST["aufruf"] == "sname")

$sqlab = "select * from eintragorder by name asc, zeit desc";

$res = mysql_query($sqlab);$num = mysql_num_rows($res);

/* Alle Beiträge darstellen, sortiert *//* nach Thema (aufsteigend) und Zeit (absteigend) */else if($_POST["aufruf"] == "sthema")

$sqlab = "select * from eintragorder by thema asc, zeit desc";

$res = mysql_query($sqlab);$num = mysql_num_rows($res);

Listing 20.19 Datei forum.php, Sortierung durchführen

Es folgen drei verschiedene Sortierungen:

Falls eine Sortierung nach Datum gewünscht oder ein neuer Beitrageingegeben wird oder ein Teilnehmer sich angemeldet hat, wird dieStandardsortierung durchgeführt: Der neueste Beitrag steht oben.

Falls nach dem Namen sortiert werden soll, gilt als zweiter Sortier-schlüssel das Datum (absteigend).

Das Gleiche gilt für die Sortierung nach dem Thema: Zweiter Sortier-schlüssel ist das Datum (absteigend).

562

Page 564: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Projekt »Forum« 20.3

20.3.14 Forum, Filterung durchführen

FilternDie Beiträge werden nach dem gewünschten Kriterium gefiltert:

/* Nur Beiträge zum ausgewählten Thema *//* darstellen, sortiert nach Zeit (absteigend) */else if($_POST["aufruf"] == "filter_t")

if ($_POST["filter_t"] == "- alle -")

$sqlab = "select * from eintrag order by zeit desc";$res = mysql_query($sqlab);

else

$sqlab = "select * from eintrag where";$sqlab .= " thema like '" . $_POST["filter_t"] . "'";$sqlab .= " order by zeit desc";$res = mysql_query($sqlab);

$num = mysql_num_rows($res);

/* Nur Beiträge zum ausgewählten Namen *//* darstellen, sortiert nach Zeit (absteigend) */else if($_POST["aufruf"] == "filter_n")

if ($_POST["filter_n"] == "- alle -")

$sqlab = "select * from eintrag order by zeit desc";$res = mysql_query($sqlab);

else

$sqlab = "select * from eintragwhere name like '" . $_POST["filter_n"]. "' order by zeit desc";

$res = mysql_query($sqlab);$num = mysql_num_rows($res);

/* Nur Beiträge mit ausgewähltem Wort aus *//* Beitrag, sortiert nach Zeit (absteigend) */else if($_POST["aufruf"] == "filter_w")

563

Page 565: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispielprojekte20

if ($_POST["filter_w"] == "")

$sqlab = "select * from eintrag order by zeit desc";$res = mysql_query($sqlab);

else

$sqlab = "select * from eintragwhere beitrag like '%" . $_POST["filter_w"]. "%' order by zeit desc";

$res = mysql_query($sqlab);$num = mysql_num_rows($res);

?>

Listing 20.20 Datei forum.php, Filterung durchführen

Es folgen drei verschiedene Filterungen:

Falls nach dem Thema gefiltert werden soll, wird zunächst untersucht,ob die erste Option (alle) ausgewählt wurde. In diesem Fall wird dieFilterung aufgehoben, und es werden alle Beiträge angezeigt. Andern-falls gilt der Wert des HTML-Select-Menüs filter_t als Wert für diewhere-Klausel.

Das Gleiche gilt für die Filterung nach dem Namen, mit dem Wert desHTML-Select-Menüs filter_n als Wert für die where-Klausel.

Falls nach einem eingegebenen Wort gefiltert werden soll, wirdzunächst untersucht, ob eventuell kein Zeichen eingegeben wurde. Indiesem Fall wird die Filterung aufgehoben, und es werden alle Bei-träge angezeigt. Ansonsten gilt der Wert des Eingabeelementsfilter_w, umrahmt von zwei Prozentzeichen, als Wert für die where-Klausel. Die Prozentzeichen sind die Platzhalter für »beliebige Zei-chen«. Es ist also nicht wichtig, an welcher Stelle das gesuchte Wortim Beitrag steht.

20.3.15 Forum, Sortierung auswählen

Die Darstellung der Hyperlinks, die der Benutzer zur gewünschten Sor-tierung auswählen kann:

<table width="100%"><tr>

<td width="15%" class="ub">

564

Page 566: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Projekt »Forum« 20.3

<a href="javascript:send(2);"><b>Datum</a> /<a href="javascript:send(3);">Name</b></a>

</td><td width="15%" class="ub">

<a href="javascript:send(4);"><b>Thema</b></a></td><td width="70%" class="ub">

<b>Beitrag</b></td>

</tr>

Listing 20.21 Datei forum.php, Sortierung auswählen

Erläuterung:

Die drei Hyperlinks zur Auswahl der Sortierung rufen die Funktionsend() auf, mit den Parametern 2 (= Sortierung nach Datum, auf-ruf=sdatum), 3 (= Sortierung nach Name, aufruf=sname) beziehungs-weise 4 (= Sortierung nach Thema, aufruf=sthema).

20.3.16 Forum, Beiträge darstellen

DarstellungDie eigentliche Tabelle der Beiträge – gegebenenfalls sortiert beziehungs-weise gefiltert:

<?phpfor($i=0; $i<$num; $i++)

$tabz = mysql_result($res, $i, "zeit");$ausz = substr($tabz,8,2) . "." . substr($tabz,5,2)

. "." . substr($tabz,2,2) . " " . substr($tabz,11,5);$tabn = mysql_result($res, $i, "name");$tabt = mysql_result($res, $i, "thema");$tabb = mysql_result($res, $i, "beitrag");echo "<tr><td class='kl'>$ausz<br />$tabn</td>"

. "<td>$tabt</td><td>$tabb</td></tr>";echo "</table>";?>

Listing 20.22 Datei forum.php, Beiträge darstellen

Erläuterung:

Unabhängig davon, welcher Vorgang (Sortierung, Filterung, Anmeldungusw.) stattgefunden hat, steht ein Abfrageergebnis bereit. Die verschie-

565

Page 567: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Beispielprojekte20

denen Inhalte der Felder werden aus den Datensätzen extrahiert. DerMySQL-Timestamp wird formatiert. Es werden alle Daten ausgegeben.

20.3.17 Forum, neuen Beitrag eingeben

Das Eingabeformular für einen neuen Beitrag:

<table width="100%"><tr><td width="100%" class="ub"><a name="neu">

<b>Neuen Beitrag eingeben:</b></a><br />&nbsp;<br />

Thema (max. 20 Zeichen):<br /><input name="thema" size="30" maxlength="20" /><br />&nbsp;<br />Beitrag:<br /><textarea name="beitrag" rows="10"

cols="70"></textarea><br />&nbsp;<br /><a href="javascript:send(1);">

Beitrag senden</a> &nbsp; &nbsp;<a href="javascript:document.tb.reset();">

Zurücksetzen</a> &nbsp; &nbsp;<a href="#oben">Nach oben</a><br />&nbsp;<br /></td></tr></table>

</form></body></html>

Listing 20.23 Datei forum.php, neuen Beitrag eingeben

Erläuterung:

Es wird ein einzeiliges Textfeld für das Thema und eine Textarea fürden Beitrag dargestellt. Weitere Daten werden nicht benötigt. DerTimestamp wird in der Datenbank erzeugt. Der Name des Teilneh-mers ist nach der Anmeldung bekannt.

Der Hyperlink Beitrag senden ruft die Funktion send() mit demParameter 1 auf (aufruf=beitrag).

566

Page 568: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

A HTML für PHP

Die Sprache HTML bildet die Grundlage zur Programmierung mit PHP.Bei Bedarf finden Sie eine ausführliche HTML-Anleitung in Form einerPDF-Datei auf dem Datenträger zum Buch. Dieses Kapitel bietet Ihneneine Kurzeinführung in die Bestandteile von HTML, die zum Bearbeitenvon PHP-Programmen notwendig sind. Dies sind: Dokumentaufbau, For-mulare und Tabellen.

HypertextMit Hilfe von HTML (Hypertext Markup Language) werden Dokumenteim Internet dargestellt. Innerhalb der Dokumente sind Zeichen, Wörterund ganze Bereiche durch HTML-Befehle markiert. Ein Webbrowser for-matiert den Text gemäß den Markierungen und stellt ihn auf dem Bild-schirm dar. Einzelne Bereiche des Dokuments können als Hypertext mar-kiert werden. Dadurch wird es möglich, diese Bereiche mit anderenBereichen oder anderen Dokumenten zu verknüpfen. Diese Verknüpfun-gen werden Hyperlinks oder einfach Links genannt.

Zum Erlernen der Programmiersprache PHP, zum Ausprobieren der Bei-spiele und zum Lösen der Übungsaufgaben müssen Sie nur wenigeGrundlagen von HTML beherrschen, die in diesem Abschnitt vermitteltwerden. Sie benötigen zum Testen einen Texteditor und einen Web-browser. Zum Erzeugen ansprechender Websites, also mehrerer mitein-ander verknüpfter Seiten mit Bildern, formatierten Tabellen und Frames,sind allerdings weitergehende Kenntnisse notwendig.

Umlautedarstellen

Hinweis

Normalerweise haben moderne Browser keine Probleme mit der Darstellungdeutscher Umlaute. Die Anzeige der Umlaute kann aber (je nach Einstellungdes Browsers) davon abhängen, welche Webseite Sie unmittelbar zuvorangesteuert haben.

Zur einheitlichen Darstellung empfehle ich Ihnen daher speziell für MozillaFirefox 7, Folgendes durchzuführen: Wählen Sie im Menü Web-Entwickler

die Funktion Zeichenkodierung und danach Automatisch bestimmen aus, undaktivieren Sie dort den Befehl Universell. Dadurch kommt eine universelleZeichenkodierung zum Einsatz, die auch Umlaute richtig darstellt.

567

Page 569: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

HTML für PHPA

A.1 Die erste Seite

Betrachten wir in Abbildung A.1 ein erstes Beispiel.

Abbildung A.1 Erste Internetseite

Nachfolgend der HTML-Programmcode hierfür:

<html><head><title>Meine erste Internetseite</title></head><body>Das ist der Text meiner ersten Internetseite</body></html>

Listing A.1 Datei erstes.htm

Container Innerhalb einer HTML-Seite befinden sich Texte und Markierungen, diein spitzen Klammern eingebunden sind (< und >). Viele dieser Markie-rungen sind sogenannte Container, das heißt, es gibt jeweils eineAnfangs- und eine Endmarkierung. Bei der Endmarkierung wird einzusätzlicher Forward-Slash (Schrägstrich /) eingefügt.

html, head, body Innerhalb des Containers <html> befindet sich das gesamte Dokument.Es besteht aus den Containern <head> und <body>. Im Container <head>können sich Angaben zum Dokument befinden, wie zum Beispiel derTitel innerhalb des Containers <title>. Im Container <body> befindetsich der eigentliche Inhalt des Dokuments.

Kleinbuchstaben Zur besseren Kompatibilität mit den Standards sollten Sie alle Markie-rungen in Kleinbuchstaben schreiben. Es gibt auch einige leere Elemente.Beispiele hierfür sind ein Zeilenumbruch <br />, eine horizontale Linie<hr /> oder ein Eingabefeld in einem Formular <input ... />.

568

Page 570: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Formulare A.2

EditorAdresse in Screenshots

localhostDie Adresse des Webservers ist http://localhost. Die Funktionsweise allerDateien, sowohl der HTML-Dateien als auch der PHP-Dateien, wurdeüber den Webserver kontrolliert, obwohl dies bei reinen HTML-Dateiennicht notwendig wäre. Daher lautet die Adresse im Screenshot für daserste Beispielprogramm http://localhost/erstes.htm.

A.2 Formulare

Daten sendenEine besondere Stärke von PHP ist die einfache Auswertung von Formu-larinhalten. Durch eine solche Auswertung wird die Informationsüber-mittlung vom Betrachter der Website zum Webserver ermöglicht. DemBetrachter wird zunächst ein Formular vorgelegt, in dem er eigene Ein-träge vornehmen beziehungsweise unter vorgefertigten Einträgen aus-wählen kann. Er füllt das Formular aus, sendet es ab und erhält eine Ant-wort vom Webserver. Ein Beispiel für eine HTML-Datei mit einemEingabeformular sehen Sie in Abbildung A.2.

Abbildung A.2 Formular

Übung »erstes«

Geben Sie das angegebene Beispiel mit Hilfe eines Texteditors ein. AchtenSie dabei besonders auf das korrekte Setzen der spitzen Klammern undSchrägstriche. Speichern Sie es unter dem Dateinamen erstes.htm in einemVerzeichnis Ihrer Wahl ab. Starten Sie einen Webbrowser, laden Sie dieDatei, und überprüfen Sie die korrekte Darstellung der Titelzeile und desDokumentinhalts.

569

Page 571: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

HTML für PHPA

Der HTML-Programmcode:

<html><body><p>Bitte tragen Sie Ihren Namen ein und senden Sie dasFormular ab.</p><form>

<input size="30" /> Vorname <p><input size="30" /> Nachname <p><input type="submit" /><input type="reset" />

</form></body></html>

Listing A.2 Datei form.htm

In diesem Formular kann der Betrachter zwei Einträge vornehmen unddas Formular mit Hilfe des Buttons Daten absenden zum Webserverschicken. Der Webserver wird allerdings noch nicht antworten, da esdort kein passendes Serverprogramm gibt. Zumindest können Sie aberschon den Aufbau eines Formulars erkennen. Falls der Betrachter denAnfangszustand des Formulars wiederherstellen möchte, zum Beispielweil er Fehleingaben gemacht hat, kann er die Schaltfläche Zurückset-

zen betätigen.

submit, reset Innerhalb des <body>-Containers befindet sich ein <form>-Container mitden Formularelementen. Dabei handelt es sich um zwei Eingabefelderfür Text in der Größe 30 (<input size="30" />), eine Schaltfläche zumAbsenden (<input type="submit" />) und eine Schaltfläche zum Zurück-setzen (<input type="reset" />) des Formulars.

Bei der Markierung <input> werden erstmalig Attribute und Werte ver-wendet. Eine Markierung kann mehrere Attribute (also Eigenschaften)haben. Hier sind dies type beziehungsweise size. Die Eigenschaftenhaben Werte. Hier sind dies der Wert 30 für die Größe (size) des Einga-befeldes und der Wert submit beziehungsweise reset für den Typ (type)des Eingabefeldes. Ein Wert wird dem zugehörigen Attribut immer perGleichheitszeichen zugewiesen.

Die Markierung <p> erzeugt einen Absatz, der eine eigene Absatzforma-tierung haben kann. Mit <br /> können Sie einen einfachen Zeilenum-bruch erzeugen. Dabei entsteht kein Abstand zur Vorgängerzeile, wiedies bei einem Absatz der Fall ist.

570

Page 572: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Tabellen A.3

A.3 Tabellen

table, tr, tdTabellen dienen der übersichtlichen Darstellung größerer Datenmengenund der mehrspaltigen Ausgabe in Dokumenten. Sie eignen sich beson-ders zur Ausgabe von Datenbankinhalten. Eine Tabelle besteht aus meh-reren Containern. Die gesamte Tabelle steht im Container <table>, eineZeile einer Tabelle steht im Container <tr>, und eine Zelle innerhalbeiner Zeile steht im Container <td>.

Übung »form«

Geben Sie das angegebene Beispiel mit Hilfe eines Texteditors ein, undspeichern Sie es unter dem Dateinamen form.htm ab. Betrachten Sie dasDokument anschließend mit Hilfe eines beliebigen Webbrowsers.

Übung »u_form«

Erweitern Sie das Beispiel dahingehend, dass eine ganze Adresse eingegebenwerden kann (Datei u_form.htm). Es soll zusätzlich vier weitere, gleich großeEingabefelder für die Angaben zu Straße, Hausnummer, Postleitzahl und Ortinnerhalb des Formulars geben. Die Seite soll aussehen wie in AbbildungA.3.

Abbildung A.3 Ergebnis der Übung »u_form«

571

Page 573: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

HTML für PHPA

Ein Beispiel:

<html><body><table border>

<tr><td>Berlin</td><td>Paris</td><td>Brüssel</td>

</tr><tr>

<td>Deutschland</td><td>Frankreich</td><td>Belgien</td>

</tr></table></body></html>

Listing A.3 Datei tabelle.htm

Diese Tabelle besitzt einen Rahmen (Attribut border innerhalb des Con-tainers <table>), zwei Zeilen (Container <tr>), drei Zellen pro Zeile(Container <td>). Insgesamt sieht die Tabelle aus wie in Abbildung A.4.

Abbildung A.4 Tabelle

Übung »tabelle«

Geben Sie das angegebene Beispiel mit Hilfe eines Texteditors ein, und spei-chern Sie es unter dem Dateinamen tabelle.htm ab. Betrachten Sie das Doku-ment anschließend mit Hilfe eines beliebigen Webbrowsers.

Übung »u_tabelle«

Verändern Sie das Beispiel. Fügen Sie noch eine weitere Stadt-/Land-Kom-bination hinzu, und drehen Sie die Tabelle (Datei u_tabelle.htm). Die Tabellesoll aussehen wie in Abbildung A.5.

572

Page 574: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Hyperlinks A.4

A.4 Hyperlinks

Hyperlinks verbinden HTML-Dokumente. Der Betrachter muss einenHyperlink nur mit der Maus anklicken, und schon gelangt er zu eineranderen Seite.

<a href = … > … </a>

Ein Hyperlink befindet sich innerhalb des Containers <a> … </a>. DerWert des Attributs href gibt das Ziel des Hyperlinks an, auch Verweiszielgenannt. Nehmen wir zunächst einmal vereinfachend an, dass sich allebeteiligten Dateien innerhalb des gleichen Verzeichnisses befinden.Durch Anklicken des Hyperlinks im folgenden Beispiel (siehe auch Abbil-dung A.6) gelangt der Betrachter zur ersten Beispielseite diesesAbschnitts.

<html><body><p>Zur <a href="erstes.htm">ersten</a> Datei</p><p>Klicken Sie mit der Maus auf das unterstrichene Wort</p></body></html>

Listing A.4 Datei link.htm

Abbildung A.6 Hyperlink

Abbildung A.5 Ergebnis der Übung »u_tabelle«

573

Page 575: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

HTML für PHPA

Bilder können auch als Hyperlinks dienen (siehe Bonuskapitel »HTMLausführlich« auf dem Datenträger zum Buch). Ziele von Hyperlinks kön-nen auch PHP-Programme sein (siehe Abschnitt 3.4.6, »Daten an Hyper-linkziel anhängen«).

Übung »u_link«

Erweitern Sie das oben angegebene Beispiel. Fügen Sie vier weitere Hyper-links hinzu, die zu den restlichen Dateien dieses Abschnitts führen sollen(form.htm, u_form.htm, tabelle.htm und u_tabelle.htm). Die Seite soll aussehenwie in Abbildung A.7.

Abbildung A.7 Ergebnis der Übung »u_link«

574

Page 576: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

B Installationen

Dieses Kapitel beschreibt die Installationen, die für die Nutzung von PHPund MySQL unter Windows und unter Ubuntu Linux notwendig sind.

B.1 Installationen unter Windows

In diesem Abschnitt beschreibe ich die Installation von zwei unterschied-lichen Paketen für PHP und die zugehörige Software unter Windows:XAMPP und EasyPHP. Beide beinhalten den Apache Webserver, PHP mitseinen Bibliotheken, den MySQL-Datenbankserver und die Benutzer-oberfläche phpMyAdmin.

Die Pakete sind fertig vorkonfiguriert und frei verfügbar. Das EasyPHP-Paket ist meist schneller auf dem aktuellen Stand. Etwaige Unterschiedein der Benutzung werden im jeweiligen Buchabschnitt erläutert.

Der FTP-Client FileZilla bietet die Möglichkeit, eigene PHP-Programmeins Internet zu transferieren. Die Installation des Programms wird ineinem eigenen Abschnitt beschrieben. Ebenfalls auf dem Datenträgerzum Buch enthalten ist der frei verfügbare Editor Notepad++. Er zeichnetsich unter anderem durch die Syntaxhervorhebung für die verschiede-nen Sprachen (wie zum Beispiel HTML, PHP oder JavaScript) aus.

B.1.1 Installation des Pakets XAMPP

Auf dem Datenträger zum Buch finden Sie das Paket XAMPP. Etwaigeaktuellere Versionen können Sie auch von der Internetseite http://www.apachefriends.de herunterladen.

Durch den Aufruf der Installationsdatei leiten Sie die Installation ein. Dasvorgeschlagene Zielverzeichnis C:\xampp sollten Sie beibehalten. Auchdie XAMPP-Optionen sollten Sie unverändert lassen (siehe AbbildungB.1), insbesondere sollten Sie keine Dienste installieren. Nach der Betäti-gung des Buttons Installieren startet die eigentliche Installation.

575

Page 577: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

InstallationenB

Abbildung B.1 XAMPP, Optionen

Den Apache Webserver und den MySQL-Datenbankserver starten Siedann vor der Benutzung über das XAMPP Control Panel (siehe Abbil-dung B.2) über die beiden Buttons Start. Sie können die beiden Servernach der Benutzung über die gleichen Buttons wieder anhalten. Dies hatden Vorteil, dass die beiden Server nur dann laufen, wenn Sie sich mitPHP und MySQL beschäftigen. Das XAMPP Control Panel finden Sie nachder Installation auf dem Desktop.

Abbildung B.2 XAMPP, Control Panel

Die Adresse der XAMPP-Hauptseite lautet nach der Installationhttp://localhost. Ihre eigenen PHP-Programme müssen Sie im Unterver-zeichnis C:\xampp\htdocs der XAMPP-Installation oder in Verzeichnissendarunter speichern.

576

Page 578: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Installationen unter Windows B.1

B.1.2 Installation des Pakets EasyPHP

Auch das Paket EasyPHP finden Sie auf dem Datenträger zum Buch.Etwaige aktuellere Versionen können Sie von der Internetseitehttp://www.easyphp.org herunterladen.

Bei der Installation sollten Sie das Zielverzeichnis C:\EasyPHP wählen.Nach der Installation können Sie EasyPHP mit Webserver und Daten-bankserver vom Desktop aus starten. In der Taskleiste finden Sie ein Ver-waltungsmenü, das Abbildung B.3 zeigt. Hier steht Ihnen unter anderemeine Möglichkeit zum Neustart der Server (Restart) und zum Beendender EasyPHP-Anwendung inklusive Server (Exit) zur Verfügung.

Abbildung B.3 EasyPHP, Verwaltungsmenü

Die Adresse der EasyPHP-Hauptseite lautet nach der Installationhttp://localhost. Ihre eigenen PHP-Programme müssen Sie im Unterver-zeichnis C:\EasyPHP\www der EasyPHP-Installation oder in Verzeichnis-sen darunter speichern.

B.1.3 phpinfo

Zum Testen einer erfolgreichen Installation können Sie den nachfolgen-den Code verwenden. Er wird in der Datei C:\xampp\htdocs\phpinfo.phpbeziehungsweise in der Datei C:\EasyPHP\www\phpinfo.php gespei-chert:

Hinweis

Unter Microsoft Vista können vereinzelt Probleme auftreten. Aktuelle Infor-mationen finden Sie unter http://www.apachefriends.org/de/xampp-win-dows.html, dort über FAQ – Vista-Probleme.

577

Page 579: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

InstallationenB

<html><body><?phpphpinfo();

?></body></html>

Listing B.1 Datei phpinfo.php

Nach Eingabe der zugehörigen Adresse auf dem lokalen Webserver(http://localhost/phpinfo.php) in einem Webbrowser erscheint eine aus-führliche Übersicht über die installierte PHP-Version.

B.1.4 FTP-Client FileZilla

Nachfolgend erläutere ich Installation und Bedienung des FTP-ClientsFileZilla. Nach dem Aufruf der Installationsdatei vom Datenträger zumBuch können Sie einfach den Installationsschritten folgen. Dabei könnenSie alle Komponenten, inklusive des Desktop-Icons, einschließen. Nachdem Start des Programms können Sie den Bildschirm etwas übersichtli-cher gestalten, indem Sie über das Menü Ansicht die folgenden Fensterausschalten:

Statusleisten für Verzeichnisanzeige

Quickconnect-Leiste

Lokaler Verzeichnisbaum

Server-Verzeichnisbaum

Transfer-Warteschlange

Anschließend rufen Sie den Menüpunkt Datei Servermanager auf, umdie Daten der Verbindung zum FTP-Server der eigenen Website einzutra-gen.

Im Dialogfeld Servermanager betätigen Sie zunächst den Button Neuer

Server. Tragen Sie auf der linken Seite einen selbst gewählten Namen fürdie neue Verbindung ein. Auf der rechten Seite wählen Sie die Verbin-dungsart Normal aus und tragen den Namen des FTP-Servers, Ihre User-ID und Ihr Passwort ein, siehe Abbildung B.4.

578

Page 580: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Installationen unter Ubuntu Linux B.2

Abbildung B.4 Neue Verbindung eintragen

Anschließend können Sie über den Button Verbinden unmittelbar eineVerbindung mit dem FTP-Server aufnehmen. Die Verbindungsdaten sindgespeichert und über den Servermanager weiterhin erreichbar.

Im linken Fenster werden die Dateien und Verzeichnisse des lokalen PCsangezeigt, im rechten Fenster die Dateien und Verzeichnisse auf demFTP-Server für die Website im Internet. Wenn Sie die gewünschtenDateien markiert haben, können Sie über das Kontextmenü (rechteMaustaste) die Dateien und Verzeichnisse zwischen den beiden Ortentransferieren. Außerdem können Sie Verzeichnisse an beiden Ortenerzeugen und löschen sowie Dateien löschen.

B.2 Installationen unter Ubuntu Linux

In diesem Abschnitt beschreibe ich die Installation und die Nutzung vonPHP, MySQL und phpMyAdmin unter Ubuntu Linux. Es wird dieUbuntu Version 11.10 genutzt und als normaler User gearbeitet, ohnebesondere Rechte. Diese werden nur bei Bedarf mit Hilfe von sudogenutzt. Sie sollten die Installationen in der hier genannten Reihenfolgevornehmen.

B.2.1 Editor

Sie können PHP-Dateien bereits mit dem einfachen Text-Editor geditbearbeiten. Er hebt die Syntax in PHP hervor. Es ist empfehlenswert,wenn Sie sich die Zeilennummern anzeigen lassen, einzustellen über das

579

Page 581: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

InstallationenB

Menü Bearbeiten Einstellungen Ansicht. Wie unter Ubuntu üblich,müssen Sie auf die richtige Groß- und Kleinschreibung achten: im Termi-nal, im Browser und natürlich auch im PHP-Code.

B.2.2 Apache Web Server

Der Apache Web Server ist bei Ubuntu bereits installiert und läuft per-manent als Server. Ist dies auf Ihrem System nicht der Fall, so können Sieihn über den Button Jetzt installieren von der Seite http://wiki.ubuntu-users.de/Apache herunterladen und installieren.

Das Basisverzeichnis ist /var/www. Die Dateien, die in diesem Verzeich-nis liegen, werden im Browser über http://localhost angezeigt. Ein Bei-spiel für die Bearbeitung einer Datei test.php in diesem Verzeichnis mitdem Editor gedit: sudo gedit /var/www/test.php.

Der Apache Web Server läuft unter Ubuntu als der Benutzer www-data inder Gruppe www-data. Eine Datei, die mit Hilfe eines PHP-Programmsim Verzeichnis /var/www gespeichert wird, hat diesen Besitzer. ZumÄndern des Besitzers einer Datei können Sie chown verwenden. DenRechtevektor einer Datei oder eines Verzeichnisses können Sie mitchmod ändern.

B.2.3 PHP

Sie können PHP über den Button Jetzt installieren von der Seitehttp://wiki.ubuntuusers.de/PHP herunterladen und installieren. Die Vor-einstellungen zur Anzeige von Fehlern in der Datei php.ini (siehe Kapitel6, »Fehler behandeln, Sicherheit erhöhen«) unter Ubuntu 11.10 sind fol-gende:

error_reporting = E_ALL & ~E_DEPRECATEDdisplay_errors = Offlog_errors = Onerror_log (nicht eingestellt)

Falls Sie die Voreinstellungen ändern möchten, finden Sie die Dateiphp.ini im Verzeichnis /etc/php5/apache2. Anschließend müssen Sie denApache Web Server bzw. Ubuntu neu starten. Falls Sie error_log zumBeispiel auf php_errors.log stellen, so benötigen Sie Schreibrechte fürden Benutzer www-data für das Verzeichnis, in dem php_errors.log liegensoll.

580

Page 582: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Installationen unter Ubuntu Linux B.2

B.2.4 MySQL

Sie können MySQL über den Button Jetzt installieren von der Seitehttp://wiki.ubuntuusers.de/MySQL herunterladen und installieren. Bei derInstallation dürfen Sie ein leeres Passwort für den Benutzer root ange-ben. Allerdings ist dies nicht zu empfehlen. Zum einen aus Sicherheits-gründen, zum anderen aufgrund der Tatsache, dass phpMyAdmin (siehenächster Abschnitt) nicht ohne Passwort gestartet werden kann.

Im Weiteren gehe ich davon aus, dass Sie bei der Installation von MySQLdas Beispiel-Passwort "toor" für den Benutzer root vergeben haben.Sollten Sie dies nicht gemacht haben, dann können Sie es nachholen mit:

mysqladmin -u root -p password "toor"

Nach dem Absenden des Befehls folgt eine Rückfrage nach dem altenPasswort. Falls Sie vorher keines vergeben hatten, so genügt die TasteReturn. In den PHP-Programmen müssen Sie wie folgt auf den MySQL-Datenbankserver zugreifen:

mysql_connect("","root","toor");

MySQL läuft nach der Installation permanent als Server. Die Datenban-ken finden Sie im Verzeichnis /var/lib/mysql.

B.2.5 phpMyAdmin

Sie können phpMyAdmin über den entsprechenden Button Jetzt instal-

lieren von der Seite http://wiki.ubuntuusers.de/MySQL/Werkzeuge her-unterladen und installieren. Im Browser wird phpMyAdmin über dieSeite http://localhost/phpmyadmin angezeigt. Dabei wird nach demBenutzer (root) und dem Passwort (toor) gefragt. Falls Sie die Konfigura-tion ändern möchten, so finden Sie die Datei config.inc.php im Verzeich-nis /etc/phpmyadmin.

581

Page 583: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet
Page 584: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Index

-- (minus minus) 53- (minus) 25! (Ausrufezeichen) 45!= (ungleich, PHP) 38$ (Dollar) 73$(Selektor) 463$_COOKIE 414$_GET 33, 145, 288, 408$_POST 289, 399$_SESSION 393% (Modulo) 25, 385% (Platzhalter) 178& (Referenz) 82& (URL) 145, 288&& (logisches Und) 44' (Hochkomma) 27* (mal) 25+ (plus) 25++ (plus plus) 53. (Verkettung) 27.= (Anhängen an Zeichenketten) 27/ (durch) 25/* (mehrzeiliger Kommentar) 21// (einzeiliger Kommentar) 21:: (Operator) 248<> (ungleich, SQL) 177= (gleich) 177== (gleich) 38=> (Zuordnung) 68> (größer) 38, 177>= (größer gleich) 38, 177? (URL) 145, 288?> 19@ 288, 530[ ] 65\ 27\n 315__autoload() 265__clone() 244__construct() 234__destruct() 237__FILE__ 257__LINE__ 257__METHOD__ 257__toString() 262

nb 515|| 43127.0.0.1 367

A

Absatzumbruch 20absenden 31, 126abstract 255action 31Addition 25Ajax 445, 477Aktionsabfrage 193Aktionselement 126align 56and 177Angriff 287animate()

jQuery 471Animation 461, 471

Bewegung 472Dauer 473Geschwindigkeit 473gleichzeitige 474Größe 472relative Änderung 473Sinuskurve 475Transparenz 472Verzögerung 474

Anmeldung 396Anweisungsblock 39, 53Apache 20

Ubuntu 582append 309array() 65array_key_exists() 271array_pop() 339array_push() 339array_shift() 339array_unshift() 339arsort() 340as 69asc 178asort() 340asXML() 442

583

Page 585: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Index

Asynchronous JavaScript and XML 445, 477

aufhängen 53Ausnahmebehandlung 91Ausrichtung 56Auswahlelement 117Auswahlmenü 191

einfaches 120mehrfaches 124

auto_increment 365, 540autoload 266

B

base_convert() 390Basisklasse 229, 247Bedingung 37Benutzeroberfläche 204Bewegung 472bigint 365bind()

jQuery 470bindec() 389Blog 538body 570Bogenmaß 380border 574br 572break 49, 61

C

Cache 289Callback-Funktion 473call-by-reference 80call-by-value 80Cascading Style Sheets CSScase 49catch 91ceil() 378Chat 527chdir() 328Checkbox 122checkdate() 357checked 118, 122chr() 301class 231click()

jQuery 463, 469

Clientprogramm 17Clientprogrammierung 461closedir() 326, 328Collection

jQuery 466cols 112confirm() 207connect.inc.php 222Container 570continue 62Cookies 393, 413

anzeigen 415Lebensdauer 288

copy() 153count() 153crc32() 305crypt() 305CSS 134, 204, 461

Formatvorlagen 143css()

jQuery 464CSS-Datei

externe 143CSS-Format 463CSS-Klasse 465, 466CSV-Datei 294CSV-Format 317

D

date() 325, 354, 359, 470date.timezone 326Datei

Angabe der Position 321binärer Zugriff 307Ende ermitteln 311Existenz 309externe 73formatierte Ausgabe 321Größe feststellen 323Informationen ermitteln 324, 326Lese-/Schreibposition festlegen 321lesen 308öffnen 309schließen 310schreiben 314sequenzieller Zugriff 307Text anhängen 315vereinfachtes Lesen 313

584

Page 586: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Index

Datei (Forts.)wahlfreier Zugriff 307, 321Zeichenkette lesen 310Zeichenkette schreiben 314zurückspulen 321

Dateityp 307Datenbank 167

Abfrage 176, 179Ajax 456auswählen 176erzeugen 170hochladen 220SQL kontrollieren 179

DatenbankabfrageAnzahl der Datensätze 176Datensatz speichern 176HTML-Tabelle ausgeben 182

Datenbankbrowser 212Datenbankserver 168

Verbindung aufnehmen 175, 221Verbindung trennen 177

Datenfeld 167Datensatz 167

ändern 196, 197auswählen 176, 177erzeugen 191identifizieren 171löschen 202

Datentyp 23Datum und Zeit 353

Datenbankspeicherung 365Differenz 360, 362, 363erzeugen 358, 360formatieren 354Gültigkeit prüfen 357Systemzeit ermitteln 353

dblclick()jQuery 469

decbin() 389dechex() 389decoct() 389default 49deg2rad() 380delay()

jQuery 474delete 204, 209deprecated 282desc 178Deserialisierung 263

Destruktor 236Dezimalsystem 389Dezimaltrennzeichen 24display_errors 284div-Element 461Division 25

ganzzahlige 25do while 60document 129, 463Dokumentenbetrachter 503Dollarzeichen 23doubleval() 35, 337Dualsystem 389Dump 223duration

jQuery 473

E

e 25E_ALL 283Easing-Funktion 473EasyPHP 18, 21, 169, 176, 283, 326, 421,

579echo 20e-Funktion 375Eigenschaft 229

statische 253Eingabe 30Eingabefeld

Passwort 114Eingabemaske 140Einsatzbereich 17Element

verstecktes 114, 145, 201, 210else 40E-Mail

automatisieren 523HTML-Mail 523mit Anhang 523

enctype 151endif 51Endliche Zahl 381Ereignis 458

jQuery 467Ergebniskennung 176Erlernbarkeit 16error_log 284error_reporting 92, 283

585

Page 587: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Index

Event Handler 128Event-Objekt

jQuery 470Exceptionhandling 91exit 164, 309explode() 153, 294Exponentialzahl 25extends 248extension_dir 482extension_loaded() 482

F

fadeIn()jQuery 475

fadeOut()jQuery 475

fadeTo()jQuery 475

fadeToggle()jQuery 475

false 38, 130Fatal Error 93fclose() 310Fehler 281Feiertag 103

berechnen 367Feld 63

assoziatives 33, 66ein- oder mehrdimensionales 64Elemente entfernen 339Elemente hinzufügen 339Extrema ermitteln 333Größe ermitteln 332numerisch indiziertes 64Operationen 331, 340Schlüssel 66Sortierung 331statistische Auswertung 334Wert 68zweidimensionales assoziatives 348zweidimensionales gemischtes 346zweidimensionales numerisches 343

Feld von Formularelementen 125, 136feof() 311fgets() 310file 151file() 313file_exists() 309

file_get_contents() 265file_put_contents() 264, 442filesize() 323FileZilla 580Firefox

Datenschutz 414floor() 105, 378fopen() 309for 51foreach 69, 438form 31, 572Formatierung 95, 134Formular 289, 571

auswerten 30, 109prüfen 127und Programm in einer Datei 140

Forum 546Forward-Slash 570fpdf 503

AddLink() 518AddPage() 505AliasNbPages() 515Cell() 507, 510, 520Footer() 514GetX() 521GetY() 521Header() 514Image() 516, 520Line() 522Link() 520Ln() 509, 512Output() 505Rect() 522SetDrawColor() 512SetFillColor() 512, 522SetFont() 506SetFontSize() 509SetLineWidth() 512, 521SetLink() 518SetTextColor() 509SetX() 522SetXY() 522SetY() 514Version 1.7 504Write() 509, 518

fputs() 314Frame 134fseek() 321, 324ftell() 321

586

Page 588: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Index

FTP 166func_get_arg() 86func_num_arg() 86function 71, 231function_exists() 95Funktion 70

Aufruf 72benutzerdefinierte 88Definition 71Existenz prüfen 95mathematische 375Parameter 72, 73, 75rekursive 70, 329Rückgabewert 78Übergabe von Parametern 80variable Parameterliste 86verlassen 80

G

Gauß, Carl Friedrich 104gd_info() 482GD-Bibliothek 481gedit 581Geldanlage 97get 33get_class_methods() 260get_declared_classes() 260getAttribute() 455getcwd() 329getElementById() 448getElementsByTagName() 455getimagesize() 545GET-Parameter 405getrandmax() 384gleich 38, 177Gleichheitszeichen

doppeltes 38global 85Grafik 481

Bild aus Datei laden 489Bildausschnitt 492Breite 490Ellipse 492erzeugen und anzeigen 486erzeugen und speichern 484Farbpalette 483gepunktete Linie 497Größe ändern 545

Grafik (Forts.)Größe feststellen 545Höhe 490interner Font 486leer erzeugen 545Linie 495Linienart 497Liniendicke 497mit Farbe füllen 484, 497Objekt erzeugen 483Pixel 495Polygon 494Rechteck 494speichern 483Text drehen 489Text erzeugen 487Zeichenelement 492

Gregorianischer Kalender 357Groß- und Kleinschreibung 23größer 38, 177größer gleich 177group 561Grundrechenarten 154Gültigkeitsbereich 381

H

Handle 241Hash-Tabelle 63head 570header() 448, 485, 505Hexadezimalsystem 389hexdec() 389hidden 114, 288hide()

jQuery 475Hintergrundfarbe 143Hochkommata 27, 68Hochladen von Daten 150Hochladen von Programmen 166hover()

jQuery 470Hover-Effekt 143href 575HTML 569html()

jQuery 463, 464HTML-Entities 290HTML-Mail 523

587

Page 589: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Index

htmlspecialchars() 290HTML-Tabelle 55HTTP 447Hyperlink 142, 575

Daten anhängen 148Hypertext Markup Language HTML

I

ID 465, 466if 37, 38if/else 38, 39image/jpg 485imagearc() 493imagecolorallocate() 483imagecopy() 491imagecopyresampled() 545imagecreate() 483imagecreatefromjpeg() 490imagecreatetruecolor() 545imagedashedline() 497imagedestroy() 484imageellipse() 493imagefill() 484imagefilledarc() 493imagefilledellipse() 493imagefilledpolygon() 495imagefilledrectangle() 495imagefilltoborder() 498imagejpeg() 484imageline() 497imagepng() 484, 490imagepolygon() 495imagerectangle() 495imagesetpixel() 496imagesetstyle() 497imagesetthickness() 497imagestring() 487imagesx() 490imagesy() 490imagettftext() 488implode() 294inc.php 89include 73, 88include_once 73Index 65ini_get() 285, 482ini_set() 92, 286innerHTML 448

input 109, 572insert 193, 208, 366Installation 577instanceof 259Instanz 229integer primary key 422Internetseite

dynamische 16intval() 35, 357IP-Adresse 365is_dir() 328is_file() 328is_finite() 381is_infinite() 381is_nan() 381is_readable() 328is_writeable() 328isset() 94, 123, 141, 395

J

JavaScript 204, 461Ajax 445, 477Ereignis 458

jQuery 461animate() 471bind() 470click() 463, 469Collection 466css() 464dblclick() 469delay() 474duration 473Ereignis 467Event-Objekt 470fadeIn() 475fadeOut() 475fadeTo() 475fadeToggle() 475hide() 475hover() 470html() 463, 464load() 477mousedown() 469mouseenter() 469mouseleave() 469mousemove() 469mouseout() 469mouseover() 469

588

Page 590: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Index

jQuery (Forts.)mouseup() 470queue 474ready() 463Selektor 463, 464, 466show() 475slideDown() 474slideToggle() 474slideUp() 474text() 464toggle() 475Verkettung 467

jquery.js 461, 463

K

Kapselungsprinzip 232Key 66Klammer

eckige 65geschweifte 39, 53

Klasse 229abgeleitete 229, 247abstrakte 256

Klassendefinition 230, 231Klassenhierarchie 249Klassenkonstante 253Kleiner 38, 177Kleiner gleich 177Klonen 241Kommentar

einzeiliger 21mehrzeiliger 21

Konfigurationsparameter 92Konstante

mathematische 376Konstruktor 234

Vererbung 250Kontrollkästchen 122Konvertierung 34

explizite 35Kopfrechnen 160, 272, 371, 430krsort() 340ksort() 340

L

Ladezeitverringern 538

lcg_value() 384Lesbarkeit 21Libre Office 318like 178load()

jQuery 477log_errors 284Logarithmus 375Login 396Logisches Oder 43Logisches Und 44Log-Tabelle 365Lotto 386

M

mail() 523Markierung 570Math-Objekt

JavaScript 476max() 379Maximum 379maxlength 110md5() 290, 305method 31Methode 229, 231

abstrakte 257statische 253

Microsoft Excel 317Microsoft Vista 579microtime() 353, 384min() 379Minimum 379mktime() 282, 358, 364, 417Modularisierung 70, 84Modulo-Operator 25, 385mousedown()

jQuery 469mouseenter()

jQuery 469mouseleave()

jQuery 469mousemove()

jQuery 469mouseout()

jQuery 469mouseover()

jQuery 469

589

Page 591: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Index

mouseup()jQuery 470

mt_getrandmax() 384mt_rand() 384mt_srand() 384multiple 124Multiplikation 25MySQL 168

Passwort ändern 583Ubuntu 583

mysql_affected_rows() 193mysql_connect() 175, 221mysql_fetch_assoc() 176mysql_num_rows() 176mysql_query() 176mysql_real_escape_string() 290mysql_select_db() 176

N

Nachkommastelle 24name 110, 112, 120, 152Namensregel 23, 72, 170new 233new FPDF 505nodeValue 455not 177Notice 92number_format() 95Nummer automatisch erhöhen 540Nummerierung

automatische 366Nutzung von PHP

Anzahl 15Gründe 16

O

Objekt 229als Rückgabewert 251erzeugen 233Kopie 241laden 263Lebensdauer 234speichern 263

octdec() 389Oder

logisches 43Oktalsystem 389

onreadystatechange 447onSubmit 128opacity 472open() 447opendir() 326Open-Source-Datenbank 168Operator

arithmetischer 25logischer 43, 177Rangordnung 26, 46Rechen- 25Vergleichs- 38, 177, 178

option 121Optionsschaltfeld 117

Gruppe 118or 177ord() 301order by 178Ostersonntag 103, 369

P

p 572Parameter

optionaler 238parent 249parent::__construct() 250password 114Passwort 290, 397

Datenbankserver 176Speicherung 290verschlüsseln 290

PDFAusgabe 505Bild skalieren 516erzeugen 504externer Hyperlink 520Fließtext 508Font 507Füllfarbe 512Hyperlink 516Hyperlink erzeugen 518Hyperlink in einem Bild 520Hyperlink in einem Bildbereich 520Hyperlink in einer Zelle 520Hyperlink, Zielpunkt 518Imagemap 516Kopf- und Fußzeile 512Linie 520

590

Page 592: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Index

PDF (Forts.)Liniendicke 512, 521Linienfarbe 512Rechteck 520Schreibposition 514, 521Schreibposition nach der Zelle 507Schriftart 506Schriftfarbe 509Schriftgröße 507, 509Schriftschnitt 507, 509Seite erzeugen 505Seitenanzahl 515Seitenumbruch 515Standardfont 506Tabelle 510unterstreichen 518Zeilenhöhe 509Zeilenumbruch 508, 509, 512Zelle 507Zellenausrichtung 507Zellenfüllung 507Zellengröße 507Zellenrand 507

PDF-Reader 503PHP

Konfiguration 326Ubuntu 582

PHP Hypertext Preprocessor 16php.ini 283, 289, 326, 482php_gd2.dll 482phpinfo() 579PHPMailer 523phpMyAdmin 168

Internetnutzung 220Ubuntu 583

Pizzabestellung 156Platzhalter 178Plausibilität 289post 31Potenzrechnung 375Preis 17Primärschlüssel 171private 231Programm beenden 164Programmierstil 19Programmierung

objektorientierte 229Programmpaket 288protected 232

Provider 166Proxy 289public 232

Q

queuejQuery 474

R

rad2deg() 380radio 117Radiobutton 117, 188Rahmen 574rand() 58, 384read 309readdir() 326readfile() 313readonly 110, 112ready()

jQuery 463readystate 447Referenz 80, 82, 106register globals 289Rekursiv 70, 329REMOTE_ADDR 365require 73require_once 73reset 32, 572responseText 448responseXML 454return 79

JavaScript 130rewind() 321round() 378rows 112rsort() 332

S

Schleife 51Abbruch 61bedingungsgesteuerte 58, 60endlose 53geschachtelte 54

Schriftart 143Schriftgröße 143SEEK_CUR 324

591

Page 593: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Index

SEEK_END 324SEEK_SET 324Seitenquelltext 211select 121, 124, 176selected 121Selektor

jQuery 463, 464, 466self 255send() 447Separator 294serial 365Serialisierung 263, 272serialize() 264Serverprogramm 17Session 288

Gültigkeit beenden 289session_cache_limiter() 289session_destroy() 394session_id() 396session_regenerate_id() 289session_set_cookie_params() 288session_start() 394Session-ID 395

regenerieren 289Sessionmanagement 393setcookie() 413setRequestHeader() 450show columns 217show databases 216show tables 216show()

jQuery 475shuffle() 386Sicherheit 287Silence Operator 288silence operator 530similar_text() 299SimpleXML 433simplexml_load_file() 435simplexml_load_string() 441sin()

JavaScript 476Sinuskurve 475size 110, 152, 572sizeof() 332slideDown()

jQuery 474slideToggle()

jQuery 474

slideUp()jQuery 474

sort() 332SORT_NUMERIC 332SORT_REGULAR 332SORT_STRING 332Spiel 60sprintf() 321SQL 168SQL-Code

schädlicher 290SQLite3 421

close() 424exec() 423query() 423

SQLITE3_ASSOC 425SQLite3Result 425

fetchArray() 425srand() 58, 384, 389ß (scharfes S) 23Startwert 52stat() 324status 447Stellenwertsystem 389str_replace() 291str_rot13() 305strcasecmp() 299strcmp() 299strftime() 354Strict Standards 282String-Funktionen 291stristr() 296strlen() 291strpos() 298strrchr() 296strrev() 291strrpos() 298strstr() 296strtolower() 291strtotime() 360strtoupper() 291strtr() 291submit 31, 126, 572submit() 132substr() 296Subtraktion 25Suchformular 183switch/case 48Systemvoraussetzungen 18

592

Page 594: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Index

Systemzeitermitteln 353

T

Tabelle 167, 573erzeugen 170exportieren 223Filterung 563mehrspaltige 573Sortierung 562Struktur 167

Tabellenzeile 573Tabellenzelle 573table 573target 134Tausendertrennzeichen 96td 573text()

jQuery 464textarea 112Texteingabefeld

einzeiliges 30, 109mehrzeiliges 112

Textelement 109Textfarbe 143this 231throw 91time() 353, 364Timestamp 324, 354, 365timestamp 540title 570toggle()

jQuery 475tr 573Transparenz 472true 38, 130TrueType-Fonts 487try 91TTF-Datei 488type 153, 572

U

Überladen 239Ubuntu 18, 21, 169, 176, 283, 318, 326,

421, 481, 503, 581ucfirst() 291ucwords() 291

Umlaut 23darstellen 569

Undlogisches 44

Unendlich 381Ungleich 38, 177unserialize() 265unset() 289Unterstrich 23update 197, 209Upload 150URI

wechseln 505URL

Daten anhängen 145, 288

V

Value 68value 110, 120, 124, 127var 232Variable 23

Existenz 123, 141, 193Existenz prüfen 94globale 84Gültigkeit 289Gültigkeitsbereich 84initialisieren 289lokale 84superglobale 84unerlaubter Zugriff 289

Vererbung 246Vergleichsoperator 38Verkettung 27

jQuery 467Verknüpfung 43Verschlüsselung 303, 305Verzeichnis

aktuellen Namen ermitteln 329Informationen ermitteln 326lesen 328öffnen 328schließen 328wechseln 328

Verzeichnisschutz 220Verzweigung 38

mehrfache 46, 48mit HTML 50verschachtelte 46

593

Page 595: Einstieg in PHP 5.4 und MySQL 5.5: Für Programmieranfänger geeignet

Index

W

Warenkorb 401Warning 93Webcounter 319Webserver

Hauptverzeichnis 22Webshop 401while 58Wiederholung 51Wildcard 178Winkelfunktionen 380write 309Würfel 58Wurzel 375www-data 582

X

XAMPP 18, 20, 169, 175, 283, 326, 421, 577Control Panel 578

XML 433Ajax 445, 477senden 452

XML-Dateihierarchische Struktur 434

XMLHttpRequest 445, 447XML-Zeichenkette 441

Z

Zahl 24formatierte Ausgabe 95Ganzzahlkonvertierung 377Nachkommastellen 97Prüffunktionen 381

Zahlenbereich 381Zeichencodierung 301Zeichenkette 27

drehen 291Länge 291Teile ersetzen 291Teile extrahieren 296umwandeln 291Umwandlung 34vergleichen 299Zeichen suchen 298zusammenfügen 294

Zeichenkettenfunktionen 291Zeilenumbruch 211, 315

nicht erlaubter 29Zeitangabe

formatieren 325Zeitstempel 540Zeitzone

einstellen 325Zufallszahlengenerator 58, 383Zugriffszähler 319, 394Zurücksetzen 32, 127

594