Home

Praktischer Einstieg in mit - Bücher A-Z

image

Contents

1. ht_nr ht_name ht_stadt bad 2 Hotel Colonia 1 Bad 23 The New Maitland Hotel 20 Dusche 152 Kapitel 5 Datenbanken entwerfen und erstellen F r eine so triviale Information wie die Badezimmerausstattung auf die nicht mehr weiter Bezug genommen wird ist diese L sung berdimensioniert Gl cklicher weise bietet MySQL eine leichtgewichtige Alternative in Form der sogenannten Aufz hlungstypen ENUM und SET Mit der Typdefinition wird eine festgelegte Menge von Textwerten gespeichert die eigentlichen Eintr ge f r eine solche Spalte sind numerische Verweise auf die jeweilige Elementnummer dieser Menge Im Grunde geschieht hinter den Kulissen also dasselbe wie bei der gezeigten Tabellenverkn p fung F r einfache nicht mit weiteren Tabellen verkn pfte Spalten ist diese L sung allerdings benutzerfreundlicher und auch etwas schneller Das Schema zur Definition von ENUM Spalten sieht wie folgt aus Spaltenname ENUM Werti Wert2 Das Badezimmerbeispiel besitzt also folgende Typdefinition ht_bad ENUM ohne WC Dusche Bad Intern werden die m glichen Eintr ge ab 1 durchnummeriert statt Dusche k nnte also beispielsweise 3 eingef gt werden Angezeigt wird allerdings immer die Zeichenkette auf die der ges
2. Das Schl sselwort AS selbst kann sogar wegfallen Beispiel mysql gt SELECT ht_name Hotel ht_ezpreis Einzelzimmer gt FROM rb_hotels LIMIT 0 3 Hotel Einzelzimmer Bergerhof 70 Hotel Colonia 105 Hotel de la Gare 8 brigens k nnen Sie nicht nur Spalten oder berechneten Ergebnissen einen Aliasna men zuweisen sondern auch Tabellen Dies ist n tzlich wenn Sie zwei verschie dene Werte aus derselben Tabelle ben tigen was weiter unten besprochen wird Das folgende Beispiel weist der Tabelle rb_kunden jedenfalls den Ersatznamen kunden zu mysql gt SELECT kd_name kd_vorname kd_mail FROM rb_kunden kunden gt LIMIT 0 4 kd_name kd_vorname kd_ mail Schmitz Klaus schmitz kajs com Meier Heinrich meier aol lokal de Becker Ludwig becker berlinerland de Huber Michael mhuber d online de Auswahlabfragen 165 Die LIMIT Klausel beschr nkt die Anzahl der Abfrageergebnisse Die erste Zahl gibt das Startelement entsprechend der aktuellen Sortierung ab 0 an die zweite ist die maximale Anzahl gew nschter Datens tze brigens gibt eine Auswahlabfr
3. F nfte Normalform Die f nfte Normalform 5NF schlie lich ist erf llt wenn innerhalb einer Tabelle nur triviale Join Abh ngigkeiten existieren Join Abh ngigkeiten bestehen in jeder Tabelle solange sie sich in mehrere einzelne Tabellen mit demselben Schl ssel unterteilen l sst Trivial sind diese Abh ngigkeiten wenn eine Verkn pfung zweier solcher Einzeltabellen keine Redundanz durch einen verdoppelten Datensatz erg be In der Praxis ist diese Normalform also nur von Bedeutung wenn zwei bis her getrennte Tabellen zusammengef gt werden sollen Im Reiseb ro Beispiel k nnte die Tabelle mit den Basisdaten der Kunden problem los mit den Kundenkontaktdaten verkn pft werden da sich beide auf das Entity Kunde beziehen und pro Kunde je genau einen Datensatz enthalten u In der Praxis kommt es mitunter vor dass bewusst gegen einige der Normalisierungsregeln versto en wird Solange Sie genau wissen was Sie tun kann eine solche Denormalisierung manchmal die Verarbeitungsgeschwindigkeit Ihrer Datenbanken verbessern oder Ihnen die Arbeit erleichtern In diesem Buch werden Sie dergleichen allerdings nicht antreffen 136 Kapitel 5 Datenbanken entwerfen und erstellen Wenn relationale Datenbanken berfordert sind Manche komplexen Datenstrukturen lassen sich mithilfe des relationalen Modells nur schlecht darstellen Das neuere objektorientierte Datenbank modell erm glicht dagegen belie
4. FROM UNIXTIME UNIX Timestamp Formatstring erledigt die umgekehrte Aufgabe Die angegebene Sekundenzahl seit EPOCH wird in eine Datums und Uhrzeitan gabe umgewandelt Optional k nnen Sie ein DATE_FORMAT kompatibles Format angeben Beispiele mysql gt SELECT FROM_UNIXTIME 1000000000 FROM_UNIXTIME 1000000000 2001 09 09 03 46 40 FROM_UNIXTIME 1234567890 d m Y H i 14 02 2009 00 31 SQL Ausdr cke und Funktionen 191 Aggregatfunktionen In einigen F llen sollen keine einzelnen Datens tze ermittelt werden sondern Informationen ber eine Gruppe von Datens tzen Zu diesem Zweck stellt SQL eine Reihe sogenannter Aggregatfunktionen zur Verf gung der Name weist darauf hin dass sie mehrere Zeilen zusammenfassen Hier die wichtigsten im berblick e SUM Spaltenname Summe der Spalte MIN Spaltenname niedrigster Wert der Spalte e MAX Spaltenname h chster Wert der Spalte e AvG Spaltenname Mittelwert der Spalte e COUNT Spaltenname Anzahl der Datens tze Hier werden beispielsweise der h chste der niedrigste und der durchschnittliche Preis f r ein Einzelzimmer ermittelt mysql gt SELECT MAX ht_ezpreis MI
5. Antworten Frage Teilnahme Teilnehmer FrageNr y A FrageNr 4 Teilnehmerir L 1 TeilnehmerNr AntwortNr Fragetext FrageNr Name Antworttext I Korrekte Antwort f AntwortNr E Mail Wunschstadt Abbildung 3 1 Beziehungen zwischen den Tabellen der Gewinnspielanwendung Die Datenbank erstellen 65 Datenbank und Tabellen erstellen Damit Sie Ihre F higkeiten beim Erstellen von SQL Abfragen verbessern k nnen wird die Erstellung der Datenbank und ihrer Tabellen hier nicht f r den komfortab len grafischen Client phpMyAdmin sondern f r das Konsolenprogramm mysql dokumentiert Aber nat rlich lassen sich die einzelnen Schritte auch mit einem gra fischen Tool nachvollziehen Denken Sie auch hier wieder an die Zeichensatzanpassung geben Sie nach dem Start des Kommandozeilenclients zun chst SET NAMES utf8 Unix beziehungsweise SET NAMES cp850 Windows ein Zuerst wird speziell f r diese Anwendung ein eigener Datenbankbenutzer erstellt Er hei t winuser darf nur vom lokalen Rechner aus zugreifen und erh lt das Pass wort G3w1nn3n Geben Sie dazu Folgendes ein mysql gt CREATE USER winuser localhost IDENTIFIED BY G3winn3n mysql gt GRANT ALL PRIVILEGES ON gewinnspiel TO winuser localhost mysql gt FLUSH PRIVILEGES Falls Sie noch MySQL 4 x verwenden m ssen Sie die CREATE USER Zeile durch fol gende Anweisung ersetzen mysql gt GRANT USAGE ON TO winuser l
6. st_name st_land K ln 1 Bonn 1 Rom 2 Neapel 2 Schl ssel und Indizes 159 Daten einf gen Nachdem die Datenbanken und Tabellen fertiggestellt sind m ssen Daten einge f gt werden Dazu wird die SQL Anweisung INSERT verwendet Beispiele wurden bereits in fr heren Kapiteln gezeigt Da die Datenbank reisebuero bereits ab Werk alle vorgegebenen Daten enth lt kommt f r die Beispiele in diesem Abschnitt zur Abwechslung wieder einmal das gewinnspiel aus den vorangehenden Kapiteln zum Einsatz Zun chst m ssen Sie diese Datenbank als Standard einstellen mysql gt USE gewinnspiel Die klassische Syntax von INSERT sieht folgenderma en aus INSERT INTO Tabelle Feldi Feld2 VALUES Werti Wert2 Wert1 Wert2 Eine Liste von Feldnamen brauchen Sie nur anzugeben wenn nicht f r jede Spalte ein Wert eingegeben werden soll Das folgende Beispiel tr gt einen neuen Benutzer in die Tabelle gw_teilnehmer ein wobei alle Spalten au er dem per AUTO_INCREMENT ausgef llten Prim rschl ssel explizit benannt werden mysql gt INSERT INTO gw_teilnehmer tn_uname tn_email tn_interest gt VALUES Heinz heinz example net 1 Query OK 1 row affected 0 03 sec Die Meldung Query OK zeigt bereits dass das Einf gen erfolgreich war Eine einfa che SELECT Abfrage bringt Gewissheit mysql gt SELECT FROM
7. Die Berechtigung GRANT selbst auszuf hren ist verst ndlicherweise das wichtigste und privilegierteste Benutzerrecht Aus diesem Grund ist GRANT kein Bestandteil von ALL PRIVILEGES Wenn Sie einem Benutzer wirklich unumschr nkte Rechte an allen Datenbanken erteilen und ihn auf diese Weise root gleichstellen m chten m s sen Sie daher die Klausel WITH GRANT OPTION hinzuf gen und beispielsweise Folgen des schreiben GRANT ALL PRIVILEGES TO admin localhost WITH GRANT OPTION Um einem Benutzer ein Recht wieder zu entziehen wird die Anweisung REVOKE mit folgender Syntax eingesetzt REVOKE Berechtigung Berechtigung ON Objekt FROM Benutzername Hier ein Beispiel das dem Benutzer leser alle Rechte entzieht REVOKE ALL PRIVILEGES ON FROM leser localhost Beachten Sie dass die GRANT OPTION so nicht entzogen wird somit kann er sich beliebige Rechte selbst wieder erteilen Die absolut sichere Variante lautet daher REVOKE ALL PRIVILEGES GRANT OPTION ON FROM leser localhost 286 Kapitel 9 MySQL Administration Wenn Sie einem Benutzer alle Berechtigungen entziehen werden seine tats chli chen Rechte aufgehoben um einen Benutzer ganz loszuwerden brauchen Sie ihm also nicht jedes einzelne Recht abzuerkennen sondern k nnen ihn mittels REVOKE ALL PRIVILEGES mit einem Schlag rechtlos machen Um Passw rter zu setzen oder nachtr glich zu ndern k nnen Sie statt der IDENTI FIED BY Klausel
8. eintr cgi_param eintr kein Text SQL String f r die Einf geabfrage querytext INSERT INTO fo_eintraege f_ pid f datum f_nick f mail f titel f inhalt VALUES pid NOW nick mail titel eintr Abfrage senden conn gt query querytext Hat es geklappt if conn gt affected_ rows 1 echo lt br lt br gt Ihr Beitrag wurde erfolgreich hinzugef uuml gt lt br gt lt br gt Die Reiseb ro Anwendung 271 Beispiel 8 7 forum php ein Diskussionsforum Fortsetzung else echo lt br lt br gt Aufgrund eines Fehlers konnte Ihr Beitrag leider nicht hinzugef uuml gt werden lt br lt br gt echo lt a href forum php mode 1 amp 0 1 gt Zur amp Uuml bersicht lt a gt else gt lt h2 gt Fehler lt h2 gt Ung amp uuml ltiger Zugriff auf das Forum lt br gt lt a href forum php mode 1 amp 0 1 gt Zur amp uuml ck lt a gt lt php gt lt td gt lt tr gt lt table gt lt body gt lt html gt Reiseanfrage und angebote Die hier vorgestellten Skripten sind eine wichtige und interessante Teilanwendung der Reiseb ro Website Nach der Auswahl von Abflug und Zielort sowie den Rei sedaten werden passende Fl ge und auf Wunsch auch Hotelangebote herausge sucht Die hier gezeigte Teilanwendung besteht aus zwei Skripten auskunft php dient ausschlie lich
9. 2 F llen Sie wtage mit den Zuordnungen das Format w verlangt dass die Werte 0 f r Sonntag bis 6 f r Samstag verwendet werden m ssen 190 Kapitel6 SQL Abfragen INSERT INTO wtage VALUES 0 Sonntag 1 Montag 2 Dienstag 3 Mittwoch 4 Donnerstag 5 Freitag 6 Samstag 3 Nun k nnen Sie die Wochentage einsetzen beispielsweise in einer komplexen Abfrage wie dieser mysql gt SELECT CONCAT tag_name DATE_FORMAT NOW gt d m Y H i AS Heute FROM wtage gt WHERE tag_nr DATE_FORMAT NOW w r Heute Montag 02 04 2007 17 21 Interessant sind schlie lich noch die sogenannten Unix Timestamps weil PHP und andere Programmiersprachen Zeitpunkte in diesem Format speichern Es handelt sich um die Anzahl der Sekunden seit EPOCH dem gegl tteten Unix Erfindungs datum 01 01 1970 00 00 Uhr GMT MySQL bietet zwei Funktionen zur Umrech nung in dieses Format beziehungsweise wieder zur ck UNIX_TIMESTAMP Datum wandelt den angegebenen Zeitpunkt in einen Unix Time stamp um Wenn Sie kein Datum angeben wird die aktuelle Systemzeit verwendet mysql gt SELECT UNIX_TIMESTAMP 2007 04 07 12 31 17 UNIX_TIMESTAMP 2007 04 07 12 31 17 4 17710000000 1112869877
10. Hier ein Beispiel f r die Reiseb ro Datenbank Connection conn DriverManager getConnection jdbe mysql localhost reisebuero rbuser R3153n F r Abfragen wird ein Statement Objekt ben tigt Statement st conn createStatement Abfragen k nnen Sie anschlie end ber die Methoden executeQuery beziehungs weise execute erstellen executeQuery liefert ein ResultSet zur ck und ist damit f r Auswahlabfragen mit Ergebnisdatens tzen geeignet execute wird dagegen f r alle anderen Abfragen verwendet Beispiele Alle Daten aller Hotels auslesen ResultSet rs st executeQuery SELECT FROM rb_hotels Doppelzimmer in K lner Hotels um 10 Euro billiger machen st execute UPDATE rb hotels SET ht_dzpreis ht_dzpreis 10 WHERE ht_stadt 1 Das ResultSet enth lt die Ergebnisdatens tze der SELECT Abfrage und kann mithilfe der Methode next in einer while Schleife durchgebl ttert werden Fine Reihe von get Methoden liefert die einzelnen Felder eines Datensatzes Da Java eine typi sierte Sprache ist werden die verschiedenen SQL Datentypen auf unterschiedliche Java Typen abgebildet zum Beispiel getInt f r Ganzzahlen oder getString f r Zeichenketten Hier ein vollst ndiges Beispiel das die Namen K rzel und L nder aller Fluggesell schaften auf der Konsole ausgibt import java sql public class AirlineTest public static void main String args MySQL Connector laden try
11. Only database to show Verbose name ofthis server phpMyAdmin control user phpMyAdmin controluser password phpMyAdmin database for advanced features Session name for signon auth Fertig Abbildung 2 4 Das Konfigurationsformular von phpMyAdmin Unter Server hostname kann in der Regel localhost stehen bleiben es sei denn Ihr MySQL Server befindet sich auf einem anderen Rechner als phpMyAdmin Server port oder Server socket brauchen Sie auch nur dann auszuf llen wenn diese Werte vom Standard abweichen siehe Kapitel 9 Connection type muss unter Windows sowie bei einem entfernten Rechner stets tcp sein bei einem lokalen MySQL Server auf einem Unix Rechner k nnen Sie auch socket w hlen um per Unix Domain Socket mit dem Server zu kommunizieren verbessert die Performance und bei spe ziellen Einstellungen auch die Sicherheit ein wenig Die Option Compress connec tion bertr gt die Daten zwischen Web und Datenbankserver komprimiert Dies beschleunigt die Daten bertragung verlangsamt aber die Verarbeitung und ist damit nur bei einem entfernten Datenbankserver und relativ langsamer Netzwerk anbindung zu empfehlen phpMyAdmin einrichten 59 Der Authentication type bestimmt wie die Benutzeranmeldung am MySQL Server durchgef hrt wird Die verf gbaren Optionen sind config User und Passwort werden fest in die Konfigurationsdatei eingetragen verwen den Sie dazu die beiden Felder Use
12. DROP INDEX Index entfernen ADD PRIMARY KEY Prim rschl ssel hinzuf gen D R ROP PRIMARY KEY Prim rschl ssel entfernen ENAME Tabelle umbenennen Tabellen l schen DROP TABLE Tabelle Einf geabfragen INSERT INTO Tabelle Feld Feld2 VALUES Werti Wert2 Wert1 Wert2 Auswahlabfragen SELECT DISTINCT ROW Spaltei Spalte2 Ausdruck Ausdruck FROM Datenbank Tabelle Tabelle JOIN Konstrukt WHERE Kriterium ORDER BY Spalte ASC DESCIL Spalte ASCIDESC LIMIT Start Anzahl JOIN Konstrukt Tabelle INNER LEFT RICHT JOIN Tabelle2 ON JOIN Kriterium MySQL Abfragen 305 Wichtige Kriterien f r WHERE oder ON e Vergleich Spalte Ausdruck Spalte Ausdruck M gliche Operatoren lt gt lt gt und lt gt Mustervergleich Spalte Ausdruck LIKE Muster Platzhalter im Muster _ genau ein beliebiges Zeichen beliebig viele belie bige Zeichen e Regul rer Ausdruck Spalte Ausdruck REGEXP Regul rerAusdruck die RegEx Syntax ist zu komplex f r den Anhang siehe Kapitel 6 e Verkn pfung von Kriterien AND alle m ssen zutreffen OR mindestens eins muss zutreffen XOR genau eins muss zutreffen NOT Kriterium darf nicht zutreffen Elemente f r SQL Ausdr cke e Arithmetische Operationen e Mathematische Funktionen zum Beispiel SIN EXP ROUND RAND e String
13. Abfrage f r den Beitrag querytext SELECT DATE _FORMAT f datum d m Y H i f pid f nick f mail f titel f_ inhalt FROM fo_eintraege WHERE f_id id query conn gt query querytext Beitrag vorhanden anzahl query gt num_rows if anzahl 0 Die Reiseb ro Anwendung 269 Beispiel 8 7 forum php ein Diskussionsforum Fortsetzung Nicht vorhanden echo Dieser Beitrag ist leider nicht vorhanden lt br gt else Den Beitrag anzeigen list datum pid nick mail titel text query gt fetch_row Nickname leer gt Anonymous if nick nick Anonymous Titel leer gt Ohne Titel if titel titel Ohne Titel Titel ausgeben echo lt h3 gt titel lt h3 gt Nickname ausgeben if mail E Mail Adresse vorhanden gt Nickname als Link echo von lt a href mailto mail gt nick lt a gt else Nur Nickname echo von nick Datum ausgeben echo datum lt br gt lt br gt Text ausgeben echo text Trennlinie echo lt hr gt Link zum Antworten echo lt a href forum php mode e p id gt Beitrag beantworten lt a gt Folge Postings ausgeben falls vorhanden echo lt h3 gt Bisherige Antworten lt h3 gt zeige thread id 0 elseif mode e Schreibmodus Beitragsformular
14. e enable layout Layoutname erm glicht alternativ oder zus tzlich zur Angabe eines Verzeichnisses die Auswahl eines Installationslayouts das die Verzeich nisse f r die verschiedenen Komponenten festlegt Die Datei config layout ent h lt die Definitionen der verschiedenen Layouts Sie k nnen sie mit einem Texteditor ffnen um das f r Sie passende Layout zu finden oder nach dem Schema in der Datei selbst zu erstellen e with mpm MPM Modul w hlt ein sogenanntes Multi Processing Modul MPM oder auch Laufzeitmodell aus Eine der wichtigsten Neuerungen von Apache 2 besteht darin dass er verschiedene f r unterschiedliche Plattformen opti mierte Methoden zur Verarbeitung mehrerer gleichzeitiger Clientverbindun gen kennt Unter Unix wird standardm ig das MPM prefork installiert das f r jede Verbindung einen eigenen Prozess einsetzt Moderne Linux Systeme unterst tzen neben Prozessen auch die speicherschonenden Threads Wenn Sie keine exotischen Module verwenden kann sich deshalb die Einstellung with mpm worker lohnen sie installiert das Thread basierte Worker MPM F r Windows und andere Nicht Unix Systeme gibt es brigens spezielle MPMs 24 Kapitel2 Installation und Inbetriebnahme bung nicht mit Thread MPMs einzusetzen Das Problem dabei ist u dass einige PHP Erweiterungen nicht Thread sicher sind Um Schwierigkeiten zu vermeiden sollten Sie Apache 2 auf Unix Syste men mit dem rein prozessbasierten MPM pre
15. lt input type submit value Abschicken gt lt br gt lt form gt Nat rlich hat die Klasse in dieser Form noch keinen besonderen Nutzen aber es w re zum Beispiel ohne Weiteres denkbar sie um Formatierungen mittels Tabellen oder CSS zu erweitern Web Features Dieser kurze Abschnitt behandelt zwei wichtige Techniken die in gr eren Weban wendungen h ufig ben tigt werden Sessions und Cookies Die bedeutendste web spezifische Funktion das Einlesen von Formulardaten wurde bereits in Kapitel 3 ausf hrlich behandelt Sessions Das Webprotokoll HTTP ist zustandslos zwischen zwei Anfragen desselben Brow sers an denselben Server besteht keine Verbindung Bei der Durchf hrung von Gesch ftsabschl ssen und sonstigen umfangreicheren Transaktionen ber das Web ist das ein Problem da sich alle Aktionen desselben Besuchers aufeinander beziehen m ssen etwa um beliebig viele Artikel in einen virtuellen Warenkorb zu legen und sp ter alle auf einmal zu bestellen Eine h ufig genutzte L sung f r dieses Problem ist das sogenannte Session Tracking Dabei wird beim Aufruf der ersten Seite durch einen bestimmten Benut zer eine eindeutige Nummer generiert die Session ID Diese wird an die URL jedes Hyperlinks und jeder Formulardaten bertragung angeh ngt so dass jedes einzelne Skript der Webanwendung erkennen kann zu welchem Besucher der Aufruf geh rt So k nnen Daten zwischen den einzelnen Seiten weitergereich
16. In den meisten Unix Terminals die UTF 8 einsetzen lautet das passende Kom mando dagegen mysql gt SET NAMES utf8 Nach diesen Vorbereitungen k nnen Sie beliebige SQL Abfragen sowie interne Befehle des Clients selbst eingeben F r eine erste bersicht ber Letztere k nnen Sie Folgendes eingeben mysql gt h F r jeden internen Befehl gibt es eine Abk rzung mit vorangestelltem Backslash h ist beispielsweise die Kurzfassung f r help Ein weiteres Synonym f r help ist brigens das Fragezeichen sowohl mit als auch ohne Backslash Abbil dung 4 1 zeigt den Start des Clients und die Ausgabe des help Befehls unter open SUSE 10 2 In Abbildung 4 2 wird dasselbe auf einem Windows System gezeigt wie Sie sehen stehen dort etwas weniger Optionen zur Verf gung Der Kommandozeilenclient mysql 103 Befehlsfenster Konsole m Sitzung Bearbeiten Ansicht Lesezeichen Einstellungen Hilfe Isascha l inuxbox1023 gt mysql u root p Enter password elcome to the MySQL monitor Commands end with or 5g Your MyS L connection id is 5 to server version 5 0 27 max Type helpz or h for help Type c to clear the buffer mysql gt h For information about MyS L products and services visit http www mysql com For developer information including the HyS L Reference Manual visit httpt dev mysql com To buy MySQL Network Support training or other products visit httpst sho
17. Zum Abschicken des Formulars an die Action URL wird ebenfalls ein lt input gt Ele ment verwendet diesmal mit dem Attribut type submit value enth lt in diesem Fall die Beschriftung zum Beispiel lt input type submit value Abschicken gt Betrachten Sie das folgende kleine Formular als Beispiel f r die Erl uterung wie Formulardaten in PHP eingelesen werden lt form action umfrage php method get gt Wohin m amp ouml chten Sie reisen lt br gt lt input type radio name ziel value Paris Paris lt br gt lt input type radio name ziel value K ouml 1in gt K amp ouml In lt br gt lt input type radio name ziel value London London lt br gt lt br gt Ihre E Mail Adresse lt input type text name mail size 40 maxlength 50 gt lt br gt lt input type submit value Abschicken gt lt form gt Angenommen ein Benutzer w hlt Paris gibt die E Mail Adresse klaus example com ein und klickt auf Abschicken Da die Formularversandmethode GET ist sendet der Browser eine Anfrage URL wie diese http www test local umfrage php ziel Paris amp mail klaus example com In dem Skript umfrage php sollen diese Daten ausgelesen und verarbeitet werden Grunds tzlich stehen GET Felder in PHP als Elemente der speziellen Array Variab Die PHP Skripten 73 len _GET zur Verf gung w hrend POST Felder automatisch in _POST gespeichert werden Sie k nnten die beide
18. denaufruf Mit der nummerierten Bandliste ist nun auch bekannt welche Band zu welchem Album eingegeben werden muss Legen Sie also beispielsweiese damit los gt gt Album create title gt Die Bestie in Menschengestalt gt release_year gt 1993 band_id gt 3 320 Anhang B Sonstige APIs Wenn Sie einen Fehler machen k nnen Sie zum Beispiel die Methode update_ attribute eines Datensatzobjekts aufrufen um ihn zu beheben Die ben tigten Attribute sind Feldname und neuer Wert Angenommen Sie legen das Metallica Album Metallica das sogenannte Black Album an und geben als Jahr 1990 statt 1991 ein gt gt Album create title gt Metallica gt release_year gt 1990 band_id gt 1 Um die Daten eines konkreten Albums zu ndern m ssen Sie das entsprechende Album zun chst einmal finden Statt einer bestimmten ID k nnen Sie bei find auch die Kombination all und conditions gt Bedingungen angeben Die Bedin gungen sind praktisch derjenige Teil einer SQL Abfrage den Sie in einem SELECT hinter das WHERE schreiben w rden zum Beispiel gt gt Album find all conditions gt title like Met each a gt puts a title gt Metallica Mithilfe dieser Information k nnen Sie das Jahr korrigieren gt gt Album find all conditions gt title like Met each a gt a update_attribute release_year 1991 gt gt lt Album 0x381cccc at
19. einige spezielle SQL Funktionen zur Verarbeitung von Textinhalten im XML Format Plugin API standardisierte Schnittstelle zur Entwicklung eigener Erweiterun gen des MySQL Servers Grundlegendes zu MySQL 13 Alpha Beta RC Software Entwicklungsstadien Im Allgemeinen werden sowohl bei kommerzieller als auch bei Open Source Soft ware folgende Bezeichnungen f r Entwicklungsstadien verwendet Alpha Versionen Bieten eine reine Funktionsvorschau sie sind meist instabil und kaum f r den praktischen Einsatz geeignet Beta Versionen Werden zum Testen unter realistischen Nutzungsbedingungen ver ffentlicht bei gr eren Problemen kann sich aber noch einiges ndern Release Candidates RC Werden manchmal auch Gamma Versionen genannt es handelt sich um eine zur Ver ffentlichung vorgesehene Version an der nur noch ein paar letzte Feh ler beseitigt werden Final Die als stabil geltende Version die schlie lich ver ffentlicht wird 14 Kapitel 1 Einf hrung In diesem Kapitel KAPITEL 2 Zu Unrecht gef rchtet das Arbeiten mit der Konsole nsta lati 0 n u n d e Apache 2 installieren und konfigurieren MySQL installieren Inbetriebnahme e PHP installieren phpMyAdmin einrichten Wer eine H tte baut f ngt nicht mit dem Strohdach an Chinesisches Sprichwort In diesem Kapitel erfahren Sie zun chst wie Sie einen Computer als Server f r MySQL basierte PHP Anwendungen
20. 192 Kapitel6 SQL Abfragen mysql gt SELECT ht_bad AS Badausstattung COUNT AS Anzahl gt FROM rb_hotels GROUP BY ht_bad Badausstattung Anzahl Dusche 10 Bad 13 Da COUNT Datens tze beziehungsweise Ergebniszeilen z hlt spielt es in der Regel keine Rolle welchen Spaltennamen Sie als Argument angeben das hier eingesetzte alle Spalten ist meist die einfachste L sung Nat rlich lassen sich Aggregatfunktionen auch mit Joins kombinieren Beispiels weise k nnte es interessant sein zu erfahren wie viele Hotels in den einzelnen St d ten gebucht werden k nnen Dazu muss der zu ht_stadt passende St dtename jeweils aus der Tabelle rb_staedte ausgelesen werden Die fertige Abfrage sieht so aus mysql gt SELECT st_name AS Stadt COUNT AS Anzahl Hotels gt FROM rb_staedte INNER JOIN rb_hotels ON st_nr ht_stadt gt GROUP BY st_nr gt ORDER BY st_name ASC Amsterdam Athen Barcelona Berlin Br ssel Dublin Edinburgh stanbul 1 k ln 2 Lissabon 1 London 2 Lyon adrid 1 Paris 2 Prag Rom Venedig arschau SQL Ausdr cke und Funktionen 193 Weitere Abfragetypen Neben den bereits besprochenen Erstellungs Einf ge und Auswahlabfragen kennt SQL noch einige andere Abfragetypen Im Wesentlichen handelt es sich um nde rungsabfragen f r Daten und Tabellenstrukturen sowie um L
21. Druckansicht vollst ndige Textfelder Bi Exportieren 30 Datens tze beginnend ab o untereinander 8 angeordnet und wiederhole die Kopfzeilen nach 100 Datens tzen T gt land hauptstadt kontinent Frankreich Paris Europa Italien Rom Europa Japan Tokyo Asien Marokko Rabat Afrika Australien Canberra Australien Kanada Ottawa Nordamerika Argentinien Buenos Aires Sdamerika Alle ausw hlen Auswahl entfernen markierte 4 X 5 Zeige 30 Datens tze beginnend ab 0 untereinander Zn E angeordnet und wiederhole die Kopfzeilen nach 1100 Datens tzen XXXXXXX o o o o o o o pa Abbildung 2 5 Der erste Test von phpMyAdmin 62 Kapitel 2 Installation und Inbetriebnahme In diesem Kapitel KAPITEL 3 Die Datenbank erstellen a Mi Die erste e Ver ffentlic ung un est Webanwendung Die eigentliche Kunst liegt viel weniger in der Kenntnis der Grunds tze als in der Art ihrer Anwendung Honor de Balzac Als erstes vollst ndiges Beispiel f r eine PHP Webanwendung wird in diesem Kapi tel ein Online Gewinnspiel entwickelt das zur Er ffnung des Reiseb ros veranstal tet wird So lernen Sie anschaulich und bersichtlich die wichtigsten Grundlagen des Datenbankdesigns und der Programmierung von Webanwendungen kennen In den nachfolgenden Kapiteln werden diese Themen systematischer erl utert und weiter vertieft Im Einzelnen enth lt dieses Kapitel die folgenden dr
22. Kapitel 7 Fortgeschrittene Datenbankfunktionen mysql gt EXECUTE random hotels Hotel Einzel Doppel Stadt Hotel de la Gare 85 150 Paris Hotel Vieu Lyon 60 100 Lyon Fiaker Hotel 80 125 Wien Hotel Bahar 50 80 Istanbul The New Maitland Hotel 60 100 Edinburgh mysql gt EXECUTE random hotels Hotel Einzel Doppel Stadt Hotel Colonia 105 195 K ln Haus Alpenhof 90 170 Z rich Hotel Apollon 70 120 Athen Old Palace Hotel 130 240 London Hotel Solidarnosc 40 70 Warschau 5 rows in set 0 01 sec Prepared Statements k nnen beliebig oft den Platzhalter enthalten der bei EXECUTE mit konkreten Werten gef llt werden muss Hier als Beispiel eine abgewandelte Variante der vorigen Abfrage Sie enth lt nur den Doppelzimmerpreis f r den ein Maximalwert angegeben werden kann mysql gt PREPARE random hotel_choice FROM gt SELECT ht_name AS Hotel ht_dzpreis AS Doppel gt st_name AS Stadt gt FROM rb_hotels INNER JOIN rb_staedte ON ht_stadt st_nr gt WHERE ht_dzpreis lt gt ORDE
23. ServerAdmin Hier sollte bei ffentlichen Webservern die E Mail Adresse des Administrators meist webmaster lt Ihre Domain gt angegeben werden Wenn der Apache automatisch Seiten erzeugt vor allem f r Fehlermeldungen wie Seite nicht gefunden kann er einen Link auf diese Adresse anzeigen damit Benutzer entsprechende Fehlermitteilungen versenden k nnen Beispiel ServerAdmin webmaster test local Apache 2 installieren und konfigurieren 29 ServerName Mithilfe von ServerName wird der Netzwerkname des Webservers angegeben Beispiel ServerName wnw test local Beachten Sie dass diese Einstellung nur der Selbstidentifikation des Servers dient Damit er tats chlich unter diesem Namen im Netzwerk erreichbar ist m ssen Sie einen entsprechenden Eintrag auf einem Nameserver vornehmen F r den Hausgebrauch gen gt es auch eine Zeile wie die folgende in die Datei etc hosts Windows lt Windows Verzeichnis gt System32 drivers etc hosts aller beteiligten Rechner zu schreiben 192 168 0 2 wnw test local Statt 192 168 0 2 m ssen Sie nat rlich die richtige IP Adresse Ihres Webserver Rechners angeben Wenn Sie Webserver und Browser auf demselben Rechner ausf h ren ist der Server stets auch unter der speziellen IP Adresse 127 0 0 1 die Loopback Adresse f r Selbstgespr che erreichbar meist ist ihr auch der besondere Hostname localhost zugeordnet Geben Sie also im Browser http 127 0 0 1 oder http
24. email interest cgi_param wish 0 if uname email interest 0 korrekt 0 Etwas nicht ausgef llt if korrekt header Location spiel php fehler 1 else Die PHP Skripten 85 Beispiel 3 3 teilnahme php Benutzereingabe in die Datenbank schreiben PDO Version Fortsetzung Infos in die Datenbank schreiben rows conn gt exec ANSERT INTO gw teilnehmer tn_uname tn email tn _interest VALUES uname email interest if rows 0 header Location error html else Teilnehmer ID ermitteln query conn gt query SELECT tn_id from gw teilnehmer WHERE tn_email email list id query gt fetch for i 1 i lt 4 i conn2 pdo_conn rows conn2 gt exec INSERT INTO gw_teilnahme VALUES id i antwort i if rows 0 header Location error html conn2 null conn null catch PDOException e echo Fehler e getMessage gt Den Gewinner ziehen Das letzte PHP Skript ist wie bereits erw hnt dem Website Betreiber vorbehalten Weiter unten wird entsprechend erl utert wie Sie es in einem gesch tzten Website Verzeichnis ablegen k nnen Zuerst werden in einer HTML Tabelle alle Teilnehmer aufgelistet die richtig geantwortet haben Darunter erscheint der Name eines zuf l lig gew hlten Einsenders als Gewinner Damit der Site Adm
25. fr_frage varchar 80 YES NULL fr korrekt int 11 YES NULL 3 rows in set 0 01 sec Der Kommandozeilenclient mysql 107 Weitere Optionen Mithilfe des Befehls tee oder T k nnen Sie auch im laufenden Betrieb eine Datei festlegen an die s mtliche Befehlseingaben und Ergebnisse angeh ngt werden zum Beispiel mysql gt tee mysql log Wenn Sie die Dialoge nicht mehr in eine Datei kopieren m chten k nnen Sie den Befehl notee oder t verwenden mysql gt notee Sehr interessant ist auch der Befehl source Dateiname Kurzfassung Er dient dazu SQL Abfragen aus einer externen Text Datei zu lesen und auszuf hren Das folgende Beispiel bezieht sich auf die Erstellung der ab dem n chsten Kapitel ben tigten Datenbank reisebuero mysql gt reisebuero sql Die Datei reisebuero sql finden Sie brigens im Verzeichnis databases auf der beilie genden CD ROM Alternativ k nnen Sie SQL Quelldateien brigens auch per Eingabeumleitung an den mysql Client bergeben wenn er noch nicht l uft mysql u root p lt reisebuero sql Enter password Speziell f r solche Quelldateien ist es brigens n tzlich jede einzelne Abfrage mit p Print vor dem Semikolon abzuschlie en dadurch werden nicht nur Ergebnisse wie Database created sondern auch die Abfragen selbst angezeigt Das folgende Bei spiel ist die erste Zei
26. lennamen hier pr_angebote und die Anzahl der Felder beziehungsweise Spalten 3 ein Nach einem Klick auf OK wird eine Seite zur Definition der Tabellenspalten angezeigt siehe Abbildung 4 10 122 Kapitel 4 Mit MySQL arbeiten localhost localhost promo pr_angebote phpMyAdmin 2 10 0 rc1 Mozilla Firefox Datei Bearbeiten Ansicht Chronik Lesezeichen Yahoo Extras Hilfe RE 4 Ne tlocahest ehemyadnin Erste Schritte E Aktuelle Nachrichten 8 Server localhost Datenbank promo Tabelle pr_angebote g Feld fania anname an_preis Typ VARCHAR x INT Datenbank L ngelSet Kollation romo 0 i L_ R y Attribute T Es wurden keine Tabellen Null a in der Datenbank gefunden Msa not nun 3 Standard I Extra auto_increment IM 0 0 o o Kommentare Tabellen Kommentar Tabellenformat Kollation InnoDB v oder Felder hinzuf gen 1 Wenn das Feld vom Typ ENUM oder SET ist benutzen Sie bitte das Format a b c Wann immer Sie ein Backslash oder 2 Bitte geben Sie jeweils nur einen Standardwert ohne Escape oder Anf hrungszeichen an Abbildung 4 10 Definition der Felder einer neuen Tabelle in phpMyAdmin Das Eingabeformular enth lt f r jedes Fel
27. localhost ein DocumentRoot Hier wird das Stammverzeichnis der Website angegeben Bei einer Unix Stan dardinstallation sieht der Eintrag beispielsweise so aus DocumentRoot usr local apache2 htdocs Eine Clientanfrage mit der URL http www test local products info html w rde in diesem Fall auf die Datei usr local apache2 htdocs products info html verwei sen Hier noch ein Windows Beispiel DocumentRoot C Programme Apache Software Foundation Apache2 2 htdocs Beachten Sie in diesem Zusammenhang die Anf hrungszeichen sie sind bei Apache Direktiven zwingend erforderlich sobald ein Parameter Leerzeichen enth lt lt Directory gt lt Directory gt Dies ist eine von mehreren sogenannten Container Direktiven Die darin ent haltenen Einstellungen beziehen sich nur auf das angegebene Verzeichnis und seine Unterverzeichnisse Das wichtigste Beispiel sind die weiter unten gezeig ten Voreinstellungen f r alle Verzeichnisse und f r die DocumentRoot Letzteres sieht bei einer Unix Standardinstallation schematisch so aus lt Directory usr local apache2 htdocs gt Voreinstellungen f r die DocumentRoot lt Directory gt 30 Kapitel 2 Installation und Inbetriebnahme lt Location gt lt Location gt hnelt lt Directory gt sehr mit dem Unterschied dass sich die Angabe auf einen URL Pfad bezieht Betrachten Sie dazu das folgende Beispiel Location info gt Einstellungen f r URL Pfad info
28. mysql gt d mysql gt d Ein weiteres besonderes K rzel ist c clear Es erm glicht den Abbruch einer bereits begonnenen insbesondere mehrzeiligen Eingabe zum Beispiel mysql gt SELECT FROM gw_fragen gt WHERE c Beachten Sie dass dies innerhalb von Anf hrungszeichen nicht funktioniert Sie m ssen diese zuerst schlie en Das folgende Beispiel f gt einen l ngeren Text in eine fiktive Tabelle ein und versucht dann die Eingabe abzubrechen Dies funk tioniert erst beim zweiten Anlauf nachdem die Anf hrungszeichen geschlossen wurden mysql gt INSERT INTO test beschreibung VALUES Dieser Text gt geht ber mehrere Zeilen c gt hinweg gt C Die Langfassungen interner Befehle die nicht f r sich stehen sondern andere Befehle erg nzen oder manipulieren k nnen Sie nur dann verwenden wenn Sie den Client mit der speziellen Option named commands gestartet haben Ein Beispiel w re ein ausgeschriebenes clear statt c Einen der wichtigsten internen Befehle des Clients haben Sie bereits kennengelernt use Datenbank Kurzfassung u Datenbank w hlt die angegebene Datenbank aus was erheblich komfortabler ist als in jeder Abfrage Datenbank Tabellenname schrei ben zu m ssen Wenn in derselben Zeile kein weiterer Befehl steht kommt use auch ohne Semikolon aus Beispiel mysql gt use gewinnspiel Database changed M chten Sie herausfinden welche Datenbank gerade Standard ist k nnen Sie per
29. relationale Datenbank ausmachen wurden lange Zeit nicht implementiert zum Beispiel Unterabfragen oder die Transaktionsunterst t zung F r Letztere wurde inzwischen eine MySQL typisch pragmatische L sung gefunden MySQL kann unterschiedliche Tabellentypen verarbeiten von denen einige Transaktionen beherrschen Sie k nnen sich also f r jede einzelne Daten bank aussuchen ob Sie Transaktionen ben tigen oder zugunsten einer besseren Performance darauf verzichten m chten Noch immer kann MySQL nicht ganz mit der ungeheuren Ausstattung manch anderer RDBMS wie etwa Oracle oder PostgreSQL mithalten Auch der SQL99 Standard wird nicht vollst ndig unterst tzt Wie dieses Buch noch zeigen wird k nnen Sie mit MySQL fast alles machen die wenigen Features die noch nicht verf gbar sind lassen sich oft durch einen kleinen zus tzlichen Aufwand in der Anwendungsprogrammierung kompensieren Tier im Logo den Delfin Sakila Die bekannten Tiere auf den u O Reilly Covern regten urspr nglich wohl zu dieser Tradition an und sp testens seit dem Linux Pinguin Tux kommt bessere Open Source Software nicht mehr ohne Wappentier aus u Wie die meisten Open Source Anwendungen f hrt auch MySQL ein Bitte beachten Sie Die Bezeichnung MySQL steht f r ein ganzes B ndel von Soft ware Die wichtigste Komponente ist der MySQL Server Sein eigentlicher Pro grammname lautet mysqld wobei das abschlie ende d f r Daemon steht in der 4
30. 000o nnana 63 Die Datenbank erstellen annan a ananuna 63 Die PHP Skripten sissie renaire aa e a a en ea ar a 69 Ver ffentlichung und Test 2 2222ceeeeesseeeeeeenennen 95 4 MitMySQLarbeiten aaae 101 Der Kommandozeilenclient mysql o on annuuuu 101 PhpMyAdniin ig iee yE ne ee N E E p in 112 5 Datenbanken entwerfen undeerstellen 2222220 127 Der Datenbankentwurf net releer oae 2a ne an REN 127 Datenbanken und Tabellen erstellen 22222ceeeeeenen 142 MYSOL Datentypen oa easa i 2 Er ansehe De Pen 147 Schl ssel und Indizes 2 4 cett i iao eu see Maaar avia Ki 153 B ten einf gen vasari por rasen itertnr a 160 SOLA bira gen ee ee 163 A swahbl bfragen s ann At a E A E E G 163 SQL Ausdr cke und Funktionen sisrieris tieda p t EIn A E 184 Weitere Abfragetypen el a rrur Br dh 194 Fortgeschrittene Datenbankfunktionen 199 Transaktionen ru a sr ana ee a 199 VIEWS e E BE E an re un Bil nee Br see A 203 Prepared Statements isisa 2 a a era 206 Stored Procedures siaina Ju ie T EE A EN EVE 208 Trigger 2 an Seesen E A E RA DET a A 212 Webanwendungen mit PHP und MySQL 215 PHP Grundlagen orrien 2 2 san ara de a a a ia 215 Die MySQL Schnittstellen in PHP 222cu2ccceeeeeenenn 229 Clientseitiges Scripting mit JavaScript und Ajax 22ce 2ccc 244 Die Reiseb ro Anwendung 2222ceecce
31. 305 AS Klausel 165 Ausdr cke ausgeben 164 in CREATE TABLE 146 DISTINCT ROW Klausel 166 INNER JOIN Klausel 180 f r INSERT 161 INTO OUTFILE Option 297 JOIN Klausel 180 Joins 179 LIKE Klausel 171 LIMIT Klausel 166 NOT LIKE Klausel 172 ORDER BY Klausel 183 REGEXP Klausel 173 Unterabfrage 192 in Views 203 WHERE Klausel 43 166 SEQUEL SQL Vorl ufer 3 ServerAdmin Apache Direktive 29 ServerName Apache Direktive 30 ServerRoot Apache Direktive 29 session_start PHP Funktion 228 Sessions PHP 227 SET MySQL Datentyp 153 SET NAMES MySQL Anweisung 103 SET PASSWORD MySQL Anweisung 41 50 287 setAttribute PDO 238 setcookie PHP Funktion 229 Shell 18 SHOW COLLATION MySQL Anwei sung 168 SHOW CREATE TABLE MySQL Anwei sung 307 SHOW DATABASES MySQL Anwei sung 107 307 SHOW MASTER STATUS MySQL Anwei sung 301 SHOW PROCEUDRE STATUS MySQL An weisung 211 SHOW TABLES MySQL Anweisung 107 307 SHOW TRIGGERS MySQL Anweisung 214 SIGN MySQL Funktion 186 SIN MySQL Funktion 186 sizeof PHP Funktion 221 Slave Replikation 301 SMALLINT MySQL Datentyp 148 Sortieren Abfrageergebnisse 183 phpMyAdmin 121 Sortierreihenfolge siche Kollation SOURCE mysql Client Anweisung 108 SPACE MySQL Funktion 188 346 Index Spencer Henry 173 spiel php PHP Formular 75 mysql Syntax 76 mysqli Syntax 78 PDO Syntax 79 SQL Aggregatfunktionen 192 ALTER PROCEDURE Anweisung 211 ALTER TABLE Anweisung 196 305
32. Dabei werden die Antwortm glichkeiten als Radio Buttons Optionsfelder darge stellt so dass f r jede Frage immer nur eine Antwort ausgew hlt werden kann Darunter werden einige pers nliche Daten erfragt ein Benutzername eine E Mail Adresse f r die eventuelle Gewinnbenachrichtigung sowie die marke tingrelevante Information welche von vier angegebenen europ ischen Gro st dten der Benutzer in n chster Zeit besuchen m chte e Durch das Absenden des Formulars wird ein zweites PHP Skript aufgerufen Zun chst berpr ft es ob alle Formularfelder ausgef llt wurden falls nicht verweist es automatisch auf das vorige Skript zur ck Ansonsten werden die Informationen in die Datenbank geschrieben sollte dabei etwas schiefgehen erfolgt die Weiterleitung zu einer Fehlermeldungsseite Hat alles funktioniert erh lt der Benutzer eine kurze Dankesch n Mitteilung Das dritte Skript wird nicht von ffentlichen Benutzern der Website ausge f hrt sondern vom Betreiber der Site Es zeigt nach dem Stichtag alle Einsen der mit richtigen L sungen an und w hlt per Zufallsgenerator den Gewinner aus Offensichtlich m ssen Daten aus folgenden Kategorien gespeichert werden e Fragen und Antworten f r das Gewinnspiel e pers nliche Daten der Spielteilnehmer e gew hlte Antworten der Spielteilnehmer Bei n herem Hinsehen bestehen die Fragen und Antworten aus folgenden Einzel aspekten e Fragetext e drei Antworttexte e Nummer der
33. INDEX e_titel gt Nun geht es an die Entwicklung des G stebuch Skripts G steb cher bestehen aus mindestens drei verschiedenen Betriebsmodi Eintr ge lesen einen neuen Eintrag verfassen und den neuen Eintrag speichern Diese lassen sich entweder als getrennte PHP Dokumente realisieren oder es wird wie in der vorliegenden L sung ein Kriterium ben tigt das per if Fallentscheidung zwischen diesen Aspekten unter scheidet und jeweils die erforderlichen Aktionen durchf hrt und Inhalte anzeigt In diesem Skript fungiert ein Parameterfeld namens mode als Unterscheidungskrite rium Zu Beginn des Skripts wird es ausgelesen Je nachdem welchen Wert es besitzt werden die vorhandenen Eintr ge angezeigt Wert r f r read das Formu lar f r einen Neueintrag wird zur Verf gung gestellt e f r entry der neue Eintrag wird gespeichert s f r save oder eine Fehlermeldung wird ausgegeben unbe kannter Wert Falls mode gar nicht vorhanden ist wird praktischerweise das Lesen als Standardwert gesetzt Schematisch besitzt das Skript also folgenden Aufbau mode cgi param mode r if mode r Eintr ge anzeigen elseif mode e Formular f r neuen Eintrag anzeigen elseif mode s Formulardaten lesen und in Datenbank speichern else Fehlermeldung unbekannter Modus Der erste Abschnitt zeigt alle bisherigen G stebucheintr ge an Dazu wird folgende SQL Abfrage verwendet d
34. In vielen F llen muss nach Textmustern gesucht werden etwa um Strings zu finden die eine bestimmte Zeichenkombination enthalten Die traditionelle SQL Methode f r die Mustersuche ist der Operator LIKE der zwei einfache Platzhalter zur Verf gung stellt Moderner und erheblich leistungsf higer sind die ber den Operator REGEXP bereitgestellten regul ren Ausdr cke siehe n chster Abschnitt In einem Konstrukt mit dem Schema Feldname LIKE Muster stehen die beiden folgen den Platzhalter zur Verf gung Das Prozentzeichen steht f r beliebig viele belie bige Zeichen w hrend der Unterstrich _ genau ein beliebiges Zeichen repr sentiert Das folgende Beispiel w hlt die vollst ndigen Namen aller Kunden aus deren Vor namen mit M beginnen mysql gt SELECT kd_vorname kd_name FROM rb_kunden gt WHERE kd_vorname LIKE M kd_vorname kd_name Martina Vogel Michael Huber Michaela Becker Das n chste Beispiel w hlt die Namen und K rzel aller Fluggesellschaften aus deren Namen mindestens ein n enthalten mysql gt SELECT ai_name ai_kuerzel FROM rb_airlines gt WHERE ai_name LIKE n Auswahlabfragen 171 ai_name ai_kuerzel Air France AF Austrian Airlines os Germanwings 4U Lufthansa LH
35. RADIANS MySQL Funktion 186 RAND MySQL Funktion 186 rand PHP Funktion 89 RDBMS 3 readyState Ajax 252 REAL MySQL Datentyp 149 Record siehe Datensatz Redundanz 4 REGEXP MySQL Klausel 173 Regul re Ausdr cke Beispiele 175 Gro Kleinschreibung 176 MySQL 173 PHP 222 Platzhalter 174 Zeichenklassen 174 reisebuero Beispieldatenbank 138 Struktur 138 Relation 1 1 130 im Entity Relationship Modell 131 m n 131 Relational Database Management System RDBMS 3 Index 345 Relationale Datenbank Beispiel 4 Entity Relationship Modell 129 Grundlagen 3 Normalisierung 132 Prim rschl ssel 4 Redundanz 4 Tabelle 3 removeChild DOM 250 RENAME USER MySQL Anweisung 284 Replikation 301 Load Balancing 302 responselext Ajax 252 responseXML Ajax 252 RETURN MySQL Anweisung 212 return PHP Anweisung 224 RETURNS MySQL Klausel 212 REVERSE MySQL Funktion 188 REVOKE MySQL Anweisung 286 RFC 2616 HTTP 69 Right Joins 182 ROLLBACK TO SAVEPOINT Anweisung 201 ROLLBACK MySQL Anweisung 200 Rolle Entity Relationship Modell 130 ROUND MySQL Funktion 186 RTRIM MySQL Funktion 188 Ruby on Rails 315 Active Record 315 Ruby MySQL Schnittstelle in 312 Rundung MySQL 186 S Sakila MySQL Maskottchen 11 SAP DB heute MaxDB 12 SAVEPOINT MySQL Anweisung 201 Savepoints 201 Schleife PHP 219 Schl ssel 153 Schnittstelle zur Datenbank 6 sed Unix Dienstprogramm 173 SELECT MySQL Anweisung 43 75 163
36. Wie hei t die Hauptstadt von Italien 2 Welche dieser Hauptst dte hie einst Lutetia 3 Bratislava ist die Hauptstadt von 4 Welche dieser St dte ist keine Hauptstadt 44 22 2222 2222222222222222 2224024022000 Die Frage wird als normaler Text ausgegeben anschlie end werden mithilfe der fol genden Abfrage die zugeh rigen Antworten ausgelesen SELECT an_antwort an _text FROM gw antworten WHERE an_frage fr_id ORDER BY an_antwort ASC Es werden also Antwortnummer an_antwort und Antworttext an_text aus denje nigen Datens tzen ausgew hlt in denen an_frage zugeordnete Frage der aktuellen Fragenummer fr_id entspricht Anschlie end werden die Antwortm glichkeiten als Radio Buttons dargestellt Das Attribut name bildet die Fragenummer mit vorange stelltem f als value wird die jeweilige Antwortnummer eingetragen echo lt input type radio name f fr_id value an _antwort gt an_text lt br gt me u In SQL Abfragen werden spezielle Schl sselw rter die das Standard verhalten einer Anweisung modifizieren als Klauseln englisch u clauses bezeichnet Die wichtigste und bekannteste von allen ist die WHERE Klausel sie beschr nkt die Wirkung der Abfrage auf diejenigen Datens tze die dem angegebenen Kriterium entsprechen In Beispiel 3 1 sehen Sie das vollst ndige Listing in klassischer mysql Syntax Beispiel 3 1 spiel php das Formular zur Teilnahme am Gewinns
37. also GET oder POST e url ist die URL des angesprochenen serverseitigen Skripts bei GET Anfragen werden oft Daten in der Form Feldi Werti8 amp Feld2 Wert2 angeh ngt e asynchron ist true f r eine asynchrone oder false f r eine synchrone HTTP Anfrage Letztere wartet unt tig auf die Serverantwort was manchmal n tzlich ist wenn Anfangsdaten ben tigt werden ohne die eine Anwendung nicht funktioniert anfrage onreadystatechange gibt den Namen der Funktion an die beim Eintreffen der Serverantwort aufgerufen wird Zum Schluss wird send aufgerufen um die Anfrage abzuschicken Bei POST Anfragen wird ein Body mitgeschickt standardm ig eben falls im Format application x www urlencodeg das hei t Feldi Wert18Feld2 Wert2 bei GET Anfragen ignoriert der Server den Body so dass Sie bei diesen null schreiben k nnen Das folgende Beispiel sendet eine asynchrone GET Anfrage mit einem Feld namens such an das Skript staedte php wenn die Antwort vorliegt soll die Funktion stadt Liste aufgerufen werden anfrage open GET staedte php such such true anfrage onreadystatechange stadtliste anfrage send null Die unter onreadystatechange angegebene Funktion wird bei jeder nderung der Anfrageeigenschaft readyState aufgerufen Dieser Bereitschaftszustand kann Werte von 0 bis 4 annehmen wobei 4 dem Eintreffen der Serverantwort entspricht Zus tzlich sollten Sie die Eigenschaft anfrage status berpr fen sie enth lt
38. also 3 2 1 beziehungsweise z y x Die Angabe eines zweiten Felds wird nur dann beachtet wenn die Spalte mit dem prim ren Sortierkriterium mehrmals denselben Wert enth lt Das folgende Beispiel gibt die Vor und Nachnamen der Kunden aus und sortiert sie aufsteigend nach den Nachnamen mysql gt SELECT kd_vorname kd_name FROM rb_kunden gt ORDER BY kd_name ASC kd_vorname kd_name Ludwig Becker Michaela Becker Sven Berger Annette Gruber Michael Huber Siegfried J ger Klaus Klein Heinrich eier Klaus Schmitz Susanne Schmitz Martina Vogel Zuf lligerweise sind die Personen mit dem gleichen Nachnamen bereits korrekt nach Vornamen sortiert Sollte das nicht der Fall sein k nnten Sie es mithilfe der folgenden Abfrage erreichen SELECT kd_vorname kd_name FROM rb kunden ORDER BY kd_name ASC kd_vorname ASC Auswahlabfragen 183 Hier ein weiteres Beispiel es gibt die f nf teuersten Hotels Doppelzimmerpreis mitsamt ihren St dten aus mysql gt SELECT ht_name AS Hotel st_name AS Stadt ht_dzpreis AS Preis gt FROM rb_hotels INNER JOIN rb_staedte gt ON ht_stadt st_nr gt ORDER BY ht_dzpreis DESC gt LIMIT 0 5 Hotel Stadt Preis Old Palace Hotel London 240 Hotel au Jardin Paris 200 Hote
39. bige Beschreibung ndern Darunter l sst sich das Tabellenformat nachtr glich modifizieren N heres ber die verschiedenen MySQL Tabellentypen erfahren Sie im n chsten Kapitel Anschlie end kann die voreingestellte Kollation der Tabelle ge ndert werden Spalten die eine eigene Einstellung besitzen sind davon nicht phpMyAdmin 121 betroffen Zuletzt k nnen Sie in diesem Bereich bestimmen welcher Wert f r den n chsten auto_increment Eintrag eingef gt werden soll Verschiebe Tabelle nach geht ber das Umbenennen innerhalb derselben Datenbank hinaus und erm glicht auch den Umzug der Tabelle in eine andere Datenbank auf demselben MySQL Server Die Option Kopiere Tabelle nach besitzt mehr Einstellungsm glichkeiten als die bis her genannten Punkte Unter der Angabe von Zieldatenbank und tabelle k nnen Sie bestimmen ob Nur Struktur Struktur und Daten oder Nur Daten kopiert wer den sollen Letzteres erfordert als Ziel eine Tabelle mit identischen Spaltendefinitio nen Die Zusatzoption F ge DROP TABLE hinzu l scht eine eventuell vorhandene Tabelle gleichen Namens AUTO_INCREMENT Wert hinzuf gen erstellt einen nummerierten Schl ssel f r die neuen Daten Zur kopierten Tabelle wechseln zeigt nach getaner Arbeit die soeben erstellte Kopie an u F r die gesamte Datenbank gibt es eine vergleichbare Seite Sie errei chen sie wenn Sie den Link Operationen auf der bersichtsseite s einer Datenbank anklicken Dort k nnen
40. e ATA E w hlt alle Felder aus die mit einem der Buchstaben A bis E anfangen Auf die Eigennamen der St dte wirkt sich das wie folgt aus mysql gt SELECT st_eigen FROM rb_staedte gt WHERE st_eigen REGEXP A E Amsterdam Athina Barcelona Berlin Bruxelles Dublin D sseldorf Edinburgh Beachten Sie dass regul re Ausdr cke in MySQL seit Version 3 23 4 nicht mehr zwischen Gro und Kleinschreibung unterscheiden Sollte das erforderlich sein m ssen Sie das entsprechende Feld mithilfe der Funktion BINARY ausdr cklich als bin r betrachten Hier sehen Sie beispielsweise eine Abfrage f r die Namen aller St dte die ein E enthalten mysql gt SELECT st_name FROM rb_staedte gt WHERE st_name REGEXP E Amsterdam Athen Barcelona Berlin Br ssel D sseldorf Edinburgh Venedig Wien Hier nun die BINARY Variante die Sie verwenden m ssen wenn Sie ausdr cklich ein gro es E meinen mysql gt SELECT st_name FROM rb_staedte gt WHERE BINARY st_name REGEXP E st name Edinburgh 176 Kapitel6 SQL Abfragen u Ich empfehle Ihnen das hervorragende Buch Regul re Ausdr cke von Jeffrey E F Friedl O Reilly Verlag wenn Sie mehr ber dieses fas u zinierende Thema wissen m chten In diesem Buch wird das Thema nicht nur gr ndlich und in diversen Implementierungen f r verschie dene Programmiersprachen und Umgebungen sondern auc
41. gt prepare querytext query execute while my hotel stadt query gt fetchrow array printf s in s n hotel stadt conn gt disconnect Java JDBC Auch die Programmiersprache Java verf gt ber eine eigene Bibliothek mit Daten bankschnittstellen namens JDBC F r MySQL ben tigen Sie den Treiber MySQL Connector der auf der Website http www mysql com unter Connectors herunter geladen werden kann zurzeit in Version 3 1 auf der beiliegenden CD ROM ist er im Verzeichnis tools zu finden Zu Beginn einer Java Anwendung die JDBC verwenden soll m ssen Sie die JDBC Klassen importieren import java sql Innerhalb des Programms wird als N chstes der MySQL Treiber geladen der Feh ler dass er nicht vorhanden ist muss per try catch abgefangen werden try Class forName com mysql jdbc Driver newInstance catch ClassNotFoundException e System out println MySQL ConnectorJ nicht gefunden 310 Anhang B Sonstige APIs Beachten Sie dass alle datenbankbezogenen Operationen ebenfalls von einem try catch Block umschlossen werden m ssen in diesem Fall muss eine SQLException also ein Datenbanktfehler abgefangen werden Anschlie end wird mithilfe der Klasse java sql DriverManager eine Datenbankver bindung hergestellt Das sieht schematisch folgenderma en aus Connection conn DriverManager getConnection jdbe mysql Host Datenbank Benutzername Passwort
42. index 0 Bytes Kollation latini_svedish ci Index ber 1 Spalten anlegen OK Insgesamt 15 384 Bytes Erzeugtam 26 Februar 2007 um 12 35 Neues php MyAdmin Fenster Abbildung 4 6 Die Struktur der Tabelle gw_antworten in phpMyAdmin Oben werden zun chst die wichtigsten Eigenschaften aller Tabellenspalten ange zeigt e Feld Name der Spalte e Typ SQL Datentyp der Spalte e Kollation Sprach Sortierreihenfolge von Spalten mit Textdatentypen e Attribute Zusatzeigenschaften einer Spalte zum Beispiel UNSIGNED vorzeichen los e Null Gibt an ob Felder in der Spalte leer bleiben d rfen oder nicht e Standard Standardwert f r die Felder der Spalte falls definiert e Extra Falls die Spalte automatisch hochgez hlt wird steht hier auto_ increment e Aktion Schaltfl chen f r Operationen mit dieser Spalte Von links nach rechts stehen folgende Optionen zur Verf gung Zeige nur unterschiedliche Werte jeder in der Spalte vorkommende Wert wird einmal angezeigt ndern Spal teneigenschaften modifizieren L schen Spalte und ihre Inhalte entfernen Prim rschl ssel diese Spalte als Prim rschl ssel der Tabelle einstellen Unique festlegen dass jedes Feld der Spalte einen eindeutigen Wert enthalten muss Index einen Index f r die Spalte einrichten Volltext einen Volltextindex erstellen nur f r einfache Texttypen in MyISAM Tabellen phpMyAdmin 117 Die einzelnen
43. jeweils in ihnen befindlichen Hotels als Aufz hlungen ausgibt 240 Kapitel 8 Webanwendungen mit PHP und MySQL Beispiel 8 3 Liste der St dte und ihrer Hotels mit verschachtelten PDO Abfragen lt php Funktion f r PDO Verbindungsaufbau function pdo_conn erbindungsparameter host localhost user rbuser pass R3153n db reisebuero try conn new PDO mysql host host dbname db user pass array PDO ATTR_ERRMODE gt PDO ERRMODE EXCEPTION PDO ATTR_PERSISTENT gt 1 catch PDOException e echo FEHLER e gt getMessage return null return conn gt lt html gt lt head gt lt title gt St amp auml dte und Hotels PDO lt title gt lt head gt lt body gt lt php try Erste u ere Verbindung herstellen conn1 pdo_conn St dte und L nder auslesen und anzeigen sql1 SELECT st_nr st_name la_name FROM rb staedte INNER JOIN rb_laender ON st_land la_nr ORDER BY la_name st_name query1 conn1 gt query sql1 query1 gt setFetchMode PDO FETCH_NUM Alle Datens tze als verschachteltes Array auslesen rows query1 gt fetchAll foreach rows as row list stadt_nr stadt land row echo lt h2 gt stadt land lt h2 gt n echo lt ul gt n Zweite innere Verbindung herstellen conn2 pdo_conn Hotels der aktuellen Stadt auslesen und anzeigen sql2 SELECT ht_name FROM
44. keine Fehlermeldung Unter Umst nden werden Variablenwerte je nach Kontext unterschiedlich interpre tiert zum Beispiel a 42 String durch Anf hrungszeichen a 23 numerische Addition gt Gesamtwert 65 a 56 String Verkettung gt Ergebnis 6556 brigens existieren Variablen automatisch ab der ersten Wertzuweisung eine Deklaration ist nicht n tig Eine interessante Besonderheit von PHP ist die automatische Variablensubstitution in Strings Variablen werden anhand des Dollarzeichens erkannt und automatisch ausgewertet Hier ein Beispiel betrag 100 echo Ich habe betrag Euro lt br gt 216 Kapitel8 Webanwendungen mit PHP und MySQL Das HTML Ergebnis sieht folgenderma en aus Ich habe 100 Euro lt br gt Wenn Sie in einer Zeichenkette ein Dollarzeichen ben tigen m ssen Sie eine Escape Sequenz daraus machen indem Sie ihm einen Backslash voranstellen zum Beispiel echo Ich habe betrag lt br gt Ergebnis Ich habe 100 lt br gt brigens k nnen Sie die Substitution unterdr cken indem Sie einfache Anf h rungszeichen verwenden Das obige Beispiel in dieser Schreibweise f hrt daher zu einem anderen Ergebnis echo Ich habe betrag lt br gt Ergebnis Ich habe betrag lt br gt Operatoren In jeder Programmiersprache gibt es unterschiedliche Operatoren zur Konstruktion komplexer Ausdr cke Hier eine kurze bersicht der wichtigste
45. nick Anonymous Titel leer gt Ohne Titel if titel titel Ohne Titel Titel ausgeben echo lt h3 gt titel lt h3 gt Nickname ausgeben if mail E Mail Adresse vorhanden gt Nickname als Link echo von lt a href mailto mail gt nick lt a gt else nur Nickname echo von nick Datum ausgeben echo datum lt br gt lt br gt Text und Trennlinie ausgeben echo text lt hr gt elseif mode e Schreibmodus Eintragsformular anzeigen gt lt h2 gt Neuer G amp auml stebucheintrag lt h2 gt lt a href gast php mode r gt Eintr amp auml ge lesen lt a gt lt form action gast php method post gt lt input type hidden name mode value s gt lt table border 0 cellpadding 4 gt Die Reiseb ro Anwendung 263 Beispiel 8 6 gast php das G stebuch des Reiseb ros Fortsetzung lt tr gt lt td Nickname lt td gt lt td gt lt input type text name nick size 50 lt td gt lt tr gt lt tr gt lt td gt E Mail optional lt td gt lt td gt lt input type text name mail size 50 lt td gt lt tr gt lt tr gt lt td gt Titel lt td gt lt td gt lt input type text name titel size 50 lt td gt lt tr gt lt tr gt lt td valign top gt Ihr Eintrag lt td gt lt td gt lt textarea name eintr cols 40 rows 7
46. nschenswert mehrere Datens tze bei denen das aktu u F r jede Zeile wird ein Kontrollk stchen zum Ausw hlen angezeigt damit Sie mit hilfe der Schaltfl chen unter der Tabelle mehrere Datens tze bearbeiten Stiftsym bol l schen rotes X beziehungsweise exportieren Tabellensymbol k nnen Die Link Symbole zum ndern sowie zum L schen finden Sie zus tzlich bei jedem ein zelnen Datensatz Manuelle SQL Eingabe Auf der Registerkarte SQL siehe Abbildung 4 8 finden Sie ein umfangreiches Text feld zur freien Eingabe von SQL Abfragen Rechts daneben befindet sich ein Aus wahlfeld mit s mtlichen Spalten der aktuellen Tabelle Wenn Sie darin einen Feldnamen anklicken und anschlie end die daneben liegende Pfeilschaltfl che bet tigen Kurzfassung Doppelklick wird dieser Name ordentlich in Backticks eingefasst an die Cursorposition des Eingabefelds gesetzt Der automatisch vor gegebene Eintrag dient der Auswahl s mtlicher Spalten und aller Datens tze Kriterium WHERE 1 er entspricht der Tabellenoption Anzeigen localhost localhost gewinnspiel gw_ fragen phpMyAdmin 2 10 0 rc1 Mozilla Firefox Datei Bearbeiten Ansicht Chronik Lesezeichen Yahoo Extras Hilfe gt RR A Htto Mocahestiohemyadmin gt amp Erste Schritte E Aktuelle Nachrichten PhpsslyAd nin 8 Server localhost Datenbank gewinnspiel Tabelle gw_fragen innoDB free 8
47. openSUSE LAMP Pakete 55 Source Installation 16 Operatoren MySQL arithmetische 185 logische Verkn pfung 177 Vergleiche 167 Operatoren PHP 217 Options Apache Direktive 31 OR MySQL Operator 177 Order Apache Direktive 31 ORDER BY MySQL Klausel 183 ORM 315 OUT Stored Procedure Parameter 209 oc 000000 P Parameter in Prepared Statements 207 in Stored Procedures 209 PASSWORD MySQL Funktion 287 Index 343 Passwort MySQL 287 PDO 50 Abfragen 239 bindParam Methode 243 exec Methode 242 execute Methode 243 Fehlermodus 238 fetch Methode 239 fetchAllO Methode 240 Persistenz 237 Prepared Statements 242 query Methode 239 setAttribute 238 berblick 236 Verbindungsaufbau 237 Verbindungsoptionen 237 PDO PDO PDO PDO PDO PDO PDO PDO ATTR_LAUTOCOMMIT 237 ATTR_ERRMODE 238 ATTR_PERSISTENT 237 FETCH_ASSOC 239 FETCH_BOTH 239 FETCH_LAZY 239 FETCH_NAMED 239 FETCH_NUM 239 pdo_mysql MySQL Schnittstelle 50 PDOException 238 Perl MySQL API 309 Regul re Ausdr cke 173 Persistenz 10 Persistenz PDO 237 PHP Anwendungen testen 98 als Apache Modul Linux 45 als Apache Modul Windows 47 array Funktion 220 array_push Funktion 87 Arrays 87 220 bedingte HTML Bl cke 75 als CGI Sprache Linux 45 als CGI Sprache Windows 47 cgi_param eigene Funktion 74 class Deklaration 225 Cookies 228 date Funktion 223 Datum Uhrzeit 223 Diskussi
48. sselbeziehungen In MySQL sind Trigger seit Version 5 0 verf gbar erst im Release 5 0 10 wurden sie so weit erg nzt dass sich sinnvoll damit arbeiten l sst 212 Kapitel 7 Fortgeschrittene Datenbankfunktionen Die allgemeine Syntax f r einen Trigger lautet CREATE TRIGGER Triggername BEFORE AFTER INSERT UPDATE DELETE On Tabellenname FOR EACH ROW SOL Anweisung en Den Triggernamen k nnen Sie frei w hlen er muss nur innerhalb der jeweiligen Datenbank eindeutig sein BEFORE oder AFTER bestimmt ob der Trigger unmittelbar vor oder unmittelbar nach der mit ihm verkn pften Operation aufgerufen wird Anschlie end wird die Art der Abfragen festgelegt f r die der Trigger gilt die m g lichen Schl sselw rter INSERT UPDATE und DELETE kennen Sie bereits aus den vorigen Kapiteln Der Tabellenname gibt nat rlich an f r welche Tabelle der angegebene Abfragetyp berwacht wird Hinter FOR EACH ROW folgt eine oder mehrere SQL Anweisungen Wenn Sie mehrere verwenden m chten m ssen Sie wie bei Stored Procedures BEGIN und END einsetzen auch die nderung des Delimiters ist in diesem Fall wieder erforderlich In den SQL Anweisungen des Triggers k nnen Sie Bezug auf die Spalten der Tabelle nehmen die von der untersuchten Abfrage betroffen ist Dazu stehen die speziellen Formulierungen OLD Feldname und NEW Feldname zur Verf gung dabei steht OLD f r den Inhalt vor der nderung und NEN f r den ge nderten Inhalt Bei INSERT ist nu
49. und H chstwert im vorliegenden Fall die Indexgrenzen des Arrays korr_ teilnehmer 0 und die um 1 verminderte L nge des Arrays gnummer rand 0 sizeof korr_teilnehmer 1 Zu guter Letzt wird der Teilnehmer mit dieser Nummer aus der Datenbank ausge w hlt und angezeigt gewinner korr_teilnehmer gnummer gw query mysql query SELECT tn_uname tn_email FROM gw teilnehmer WHERE tn_id gewinner list tn_uname tn_email mysql_fetch_row gw_query echo Gewonnen hat lt b gt tn_uname lt b gt lt a href mailto tn_email gt tn_email lt a gt In Beispiel 3 4 sehen Sie das vollst ndige Listing dieser Anwendung Wie bereits erw hnt wird hier die mysqli Syntax verwendet die mysql Variante wurde bereits in den Erl uterungen gezeigt Beispiel 3 4 auswert php Antworten berpr fen und Gewinner ziehen mysqli Version lt php Nerbindungsparameter host localhost user winuser pass G3winn3n db gewinnspiel Nerbindung herstellen und Datenbank w hlen conn new mysqli host user pass db gt 4 Da Pseudozufallszahlen besonders f r starke Kryptografie immer noch zu vorhersagbar sind versucht man inzwischen Computer mit Quellen echter Entropie zu f ttern zum Beispiel radioaktiven Zerfall oder das Rauschen einer Radiofrequenz Besuchen Sie die Website http www random org wenn das Thema Sie interessiert DiePHP Skripten 89 Bei
50. wendet die mit CREATE DATABASE beziehungsweise CREATE TABLE beginnen Da Sie die Datenbank reisebuero bereits in Ihren Datenbankserver importiert haben sollten brauchen Sie die Beispiele in diesem Abschnitt nicht einzutippen Wenn Sie es zu bungszwecken dennoch tun m chten sollten Sie zun chst eine zus tzliche Daten bank daf r erstellen CREATE DATABASE erstellt eine neue Datenbank und besitzt nicht viele Optionen In aller Regel wird lediglich der Name der Datenbank angegeben zum Beispiel CREATE DATABASE reisebuero 142 Kapitel 5 Datenbanken entwerfen und erstellen Optional k nnen Sie mithilfe der Option DEFAULT CHARACTER SET oder kurz CHARSET einen Zeichensatz und mittels COLLATE eine Sortierreihenfolge angeben F r Deutsch bieten sich der Zeichensatz latinl ohnehin Standard und die Kollation latin1_ germanl_ci Sortierung in W rterbuchreihenfolge an Die ganze Abfrage sieht in diesem Fall folgenderma en aus CREATE DATABASE reisebuero CHARACTER SET latini COLLATE latini_germani_ci Zeichensatz und Kollation gelten zun chst einmal automatisch f r jede Tabelle und jedes Text Datenfeld in der Datenbank es sei denn Sie stellen auf einer dieser untergeordneten Ebenen ausdr cklich einen anderen Wert ein Eine letzte zus tzliche M glichkeit f r die Tabellenerstellung bietet die Klausel IF NOT EXISTS Die Datenbank wird nur dann angelegt falls noch keine gleichnamige Datenbank existiert Die folgende Abfrage
51. wird korrekt auf 0 gesetzt das Formular wurde nicht vollst ndig ausgef llt 80 Kapitel3 Die erste Webanwendung Danach werden auch die restlichen Eingaben Benutzername E Mail Adresse und gew nschte Stadt gelesen uname cgi_param uname email cgi_param email interest cgi_param wish 0 if uname email interest 0 korrekt 0 Sollte korrekt nach der Auswertung aller Eingaben den Wert 0 haben wird auto matisch zum Frage Skript spiel php zur ckgesprungen Dazu wird mithilfe der PHP Funktion header der HTTP Header Location gesetzt if korrekt header Location spiel php fehler 1 nur benutzt werden kann wenn noch kein einziges HTML Zeichen erzeugt wurde Sie muss also in einem PHP Block ganz am Anfang der Datei stehen vor dessen Beginnsequenz lt php darf nicht einmal ein Leerzeichen stehen u Beachten Sie in diesem Zusammenhang dass die Funktion header u Der Location Header sorgt f r eine automatische Weiterleitung indem er den Browser anweist die angegebene URL zu laden Das GET Feld fehler 1 wird hier einfach programmgesteuert an die URL angeh ngt Auf der Formularseite wird dadurch wie oben beschrieben die zus tzliche Fehlermeldung angezeigt Der Rest des Programmcodes befindet sich im else Teil der obigen Fallentscheidung Die Ausf hrung von PHP Skripten wird n mlich nach einer HTTP Weiterleitung kei neswegs abgebroc
52. wird eine solche Anfrage als asynchron bezeichnet Die Serverantwort ist manchmal einfacher Text h ufig aber XML das mithilfe von DOM Operationen zerlegt wer den kann Auch zum Einf gen der Antwortdaten in das bestehende Dokument kommt in der Regel DOM zum Einsatz Der erste Schritt beim Schreiben einer Ajax Anwendung ist die Erzeugung des besagten Anfrageobjekts Da es in verschiedenen Browsern unterschiedlich hei t k nnen Sie zum Beispiel folgenden Code daf r verwenden Referenzvariable deklarieren var anfrage null try Firefox Opera IE7 anfrage new XMLHttpRequest catch err_new try IE 6 x anfrage new ActiveXObject Msxml2 XMLHTTP catch err_ie6 try IE 5 x anfrage new ActiveX0Object Microsoft XMLHTTP catch err_noajax Ajax unf higer Browser anfrage null if anfrage null Fehlermeldung alert Ihr Browser versteht leider kein Ajax Die Variable anfrage enth lt danach ein Ajax Anfrageobjekt sofern der verwendete Browser eines unterst tzt Als N chstes wird die Ajax Anfrage an ein serverseitiges Skript vorbereitet und abgesendet Die notwendigen Schritte sehen formal wie folgt aus anfrage open methode url asynchron anfrage onreadystatechange callbackFunktion anfrage send Body Clientseitiges Scripting mit JavaScript und Ajax 251 Die Methode open ben tigt drei Argumente e methode ist die bereits bekannte HTTP Methode
53. 1 Die Ajax Demoanwendung im Einsatz Die Reiseb ro Anwendung In diesem Abschnitt werden einige l ngere PHP Skripten vorgestellt ein G ste buch ein Diskussionsforum sowie einige wichtige Teile der Reisebuchungsanwen dung Die abgedruckten Beispiele verwenden ausschlie lich die Schnittstelle mysqli da diese f r PHP 5 und MySQL 5 empfehlenswerter ist als das klassische mysql Auf der beiliegenden CD ROM sind diese und alle weiteren Beispiele aber in allen drei Varianten enthalten Jede Version der Anwendung besteht aus folgenden Dateien e util inc php allgemein genutzte PHP Funktionen e utils js eine allgemein genutzte JavaScript Funktion e index php Startseite e login php Benutzer Login oder Neuanmeldung e testlog php berpr fung des Logins e newuser php Eintragung eines neuen Users in die Datenbank e logout php Benutzerabmeldung e auskunft php Suche nach Reiseangeboten e ergebnis php Suchergebnisse mit Buchungsformular e buchung php Eintrag der Buchung in die Datenbank 256 Kapitel8 Webanwendungen mit PHP und MySQL e buchabschl php Best tigung oder Storno der Buchung e buchungen php bersicht ber alle Buchungen des aktuellen Users e gast php das G stebuch e forum php das Diskussionsforum e info php Informationen ber die Reiseziele und ihre Sehensw rdigkeiten e admin index php Liste der Buchungen aller User Login admin Passwort reise e main cs
54. 186 CREATE DATABASE MySQL Anwei sung 42 66 142 303 CREATE FUNCTION MySQL Anweisung 212 CREATE INDEX MySQL Anweisung 155 CREATE PROCEDURE MySQL Anwei sung 209 CREATE TABLE MySQL Anweisung 42 67 143 304 FOREIGN KEY 157 LIKE Klausel 146 SELECT Unterabfrage 146 CREATE TRIGGER MySQL Anwei sung 213 CREATE USER MySQL Anweisung 284 CREATE VIEW MySQL Anweisung 203 createTextNode DOM 250 Cross Joins 179 CSV MySQL Tabellentyp 144 CSV Dateien 297 f r Excel 297 D DataBase Management System DBMS 1 DATABASE MySQL Funktion 106 164 306 date PHP Funktion 223 DATE MySQL Datentyp 150 DATE_ADD MySQL Funktion 189 DATE_FORMAT MySQL Funktion 189 DATE_SUB MySQL Funktion 189 Dateisystem 19 Datenbank Abfrage in PHP 81 aktuelle ermitteln 106 als Anwendungsbasis 6 Attribut 4 Auswahlabfrage 43 Datenfeld 4 Datensatz siehe Datensatz Definition 1 Einf geabfrage 42 Entity 4 Entity Relationship Modell 129 Entwurf siehe Datenbankentwurf erstellen 142 erstellen phpMyAdmin 122 Fehlerpr fung PHP 87 Geschichte 2 Hauptbeispiel 138 kontra Dateien 1 Namenskonventionen 66 Normalisierung 132 objektorientierte 137 Prim rschl ssel 4 relationale 3 Schnittstellen 6 Server 6 Tabelle siehe Datenbanktabelle Verbindung PHP 50 verf gbare ermitteln 107 w hlen mysql Client 66 Datenbankabstraktion 7 Datenbankanwendungen 6 Three Tier L sungen 8 Two Tier L sungen 7 webbasierte 8 Datenbankentw
55. 5 Datenbanken entwerfen und erstellen Kunden i Buchungen 1 Reisen KundeNr BuchungNr ReiseNr Name N Kunde Reisedatum Vorname Reise J Reiseziel Wohnort Verkehrsmittel Abbildung 1 1 Grafische Darstellung der Relationen zwischen den drei Tabellen Datenbankgest tzte Anwendungen In diesem Buch geht es um Webanwendungen die ihren Datenvorrat aus einer MySQL Datenbank sch pfen und neu hinzugekommene Informationen wieder in diese hineinschreiben Das Prinzip einer Webanwendung unterscheidet sich ein wenig von einem allgemeinen Computerprogramm In diesem Abschnitt erhalten Sie eine kurze bersicht ber datenbankgest tzte Anwendungen im Allgemeinen und datenbankgest tzte Webanwendungen im Besonderen Bei einem gew hnlichen Anwendungsprogramm das seine Informationen in einer Datenbank aufbewahrt sind zwei Komponenten beteiligt das Programm selbst sowie der Datenbankserver Server ist hier gar nicht unbedingt im Sinne eines Netzwerkservers gemeint sondern allgemeiner als Programm das den Datenbank dienst zur Verf gung stellt Damit Sie eine solche L sung einsetzen k nnen muss eine Kommunikationsschnittstelle zwischen dem Programm und dem Datenbank server bestehen Generell gibt es vier grundlegende Arten solcher Schnittstellen e Die Schnittstelle verbindet ein bestimmtes DBMS mit einer bestimmten Pro grammiersprache Beispielsweis
56. An dieser Stelle h tte man ber eine Auslagerung der gesamten Flugsuche in eine Funktion nachdenken k nnen aller dings w re dies wegen der diversen ge nderten beziehungsweise vertauschten Para meter ein wenig unpraktisch Falls auch Hotelausk nfte ausgegeben werden sollen werden diese mithilfe der fol genden Abfrage ausgew hlt und anschlie end in einer Tabelle dargestellt auch hier m ssen Sie sich die Radio Buttons dazudenken SELECT ht_name ht_ezpreis ht_dzpreis ht_bad ht _mahlzeit FROM rb hotels WHERE ht_stadt ziel In Abbildung 8 4 k nnen Sie das Ergebnis der zuvor angeforderten Reiseauskunft sehen Beispiel 8 9 zeigt den Quellcode des Skripts Die Reiseb ro Anwendung 277 Reiseb ro Reiseangebot Mozilla Firefox Datei Bearbeiten Ansicht Chronik Lesezeichen Yahoo Extras Hilfe C A O reo tMocahostimsaloldisteimysch_nalergebnis ohe z ie7 responsexmi amp Erste Schritte E Aktuelle Nachrichten EuroCityTravel Abbildung 8 4 Anzeige der gefundenen Reiseangebote mit Buchungsformular Beispiel 8 9 ergebnis php Ausgabe der Reiseangebote lt php include util inc php conn db_connect reisebuero rbuser R3153n Funktion zur Wahl eines Datums function datumswahl feldname Tagesw hler echo lt select name feldname tag size 1 gt n echo lt option value 0 gt Tag lt option gt n f
57. Beispiel dient der einfachen Eingabe eines neuen Herstellers Der IN Parameter ist dessen Name Geben Sie die folgende Prozedur mitsamt Austausch des Delimiters ein d CREATE PROCEDURE neu_hersteller IN h VARCHAR 40 BEGIN Stored Procedures 209 INSERT INTO hersteller h_name VALUES h END Y d Wie Sie sehen wird der Parameter h innerhalb der Stored Procedure ohne Anf h rungszeichen verwendet Andernfalls w rde MySQL den Wert nat rlich als Zeichen kette h interpretieren Aufgrund des Datentyps m ssen die Anf hrungszeichen aber in einer CALL Anweisung f r diese Prozedur stehen CALL neu_hersteller Airbus Das folgende letzte Beispiel bietet einen kleinen Ausblick auf die unz hligen weite ren M glichkeiten von Stored Procedures Es erm glicht die Eingabe eines Flug zeugs samt Hersteller wobei die Prozedur selbst berpr ft ob der angegebene Hersteller bereits existiert und ihn gegebenenfalls hinzuf gt Auch den Bezug auf die Hersteller ID stellt sie selbst her Geben Sie zun chst den Code mit den obliga torischen Delimiter nderungen ein d CREATE PROCEDURE neu flugzeug IN h VARCHAR 40 IN f VARCHAR 40 BEGIN SET anzahl SELECT COUNT FROM hersteller WHERE h_name h IF anzahl 0 THEN INSERT INTO hersteller h_name VALUES h END IF SET hnr SELECT h_id FROM hersteller WHERE h_name h INSERT INTO flugzeuge f_typ f_herst VALUES f hnr END 41 d Hier b
58. Datenbanken oder Tabellen mit fehlerhaften Umlauten erzeugen Die meisten modernen Linux Terminals verwenden utf 8 also geben Sie hier Folgendes ein mysql gt SET NAMES utf8 u Sehr wahrscheinlich ist der Zeichensatz Ihres Konsolenfensters MySQL installieren 41 Die Windows Eingabeaufforderung verwendet dagegen als DOS Erbe einen ganz eigenen Zeichensatz der auch zur grafischen Ober fl che von Windows inkompatibel ist Geben Sie hier deshalb fol gende Anweisung ein mysql gt SET NAMES cp850 Als N chstes wird eine Datenbank mit einer kleinen Tabelle angelegt Die Eingabe in mysql ist etwas gew hnungsbed rftig Befehle werden nicht durch Enter abge schlossen sondern erst durch ein Semikolon Dies gibt Ihnen Gelegenheit l ngere Anweisungen in mehrere Zeilen zu strukturieren in Nachfolgezeilen wird statt mysql gt ein Pfeil gt angezeigt Geben Sie zun chst Folgendes ein um die Daten bank zu erstellen mysql gt CREATE DATABASE geotest Query OK 1 row affected 0 18 sec Beachten Sie dass bei SQL Abfragen nicht zwischen Gro und Kleinschreibung unterschieden wird traditionell und auch hier im Buch werden sie komplett in Gro buchstaben geschrieben Bei den Namen von Datenbanken Tabellen Feldern und anderen selbst gew hlten Bezeichnern ist die Unterscheidung zwischen Gro und Kleinschreibung dagegen plattformabh ngig Unter Unix wird sie beachtet unter Windows nicht genau wie bei Dateien a
59. Die zum Sortieren verwendete Klausel ORDER BY wurde bereits in fr heren Kapiteln erw hnt im bern chsten Abschnitt wird sie ausf hrlich erl utert Sehen Sie nun noch ein weiteres Beispiel aus der Reiseb ro Datenbank Es w hlt die Namen und Vornamen aller Kunden aus deren Namen mit A bis M beginnen also kleiner als N sind und sortiert sie nach den Nachnamen mysql gt SELECT kd_vorname kd_name FROM rb_kunden gt WHERE kd_name lt N ORDER BY kd_name ASC kd_vorname d_name Ludwig Becker ichaela Becker Sven Berger Annette Gruber ichael Huber Siegfried J ger Klaus Klein Heinrich eier brigens k nnen Sie nat rlich nicht nur Felder mit festen Ausdr cken vergleichen sondern auch beliebige Felder miteinander Die nachfolgende SQL Anweisung w hlt alle St dte aus bei denen sich deutscher Name und Eigenname unterscheiden mysql gt SELECT st_name st_eigen FROM rb_staedte gt WHERE st_name st_eigen st_name st_eigen Rom Roma Athen Athina Br ssel Bruxelles Warschau Warszawa Prag Praha Venedig Venezia Lissabon Lisboa Datums und Uhrzeit Spalten k nnen ebenfalls mithilfe der Vergleichsoperatoren berpr ft werden Ein Zeitpunkt ist kleiner als ein anderer wenn er vor diesem stattfindet Genau wie bei der
60. Edit View Quer Script Tools Help SELECT FROM rb_airlines N Gobeck Wert Refresh Executew Stop Y Q Resultset 1 l Schemata Bookmarks History Van inm S aia Ea gt 1 AirFrance AF pm 2 Austrian Airlines 05 gt ww tb_airlines 3 British Airways BA gt wu rb_airports 4 Germanwings 4U wy rb_buchungen 5 Lufthansa LH u rb_fluege 6 KLM KM gt m eg gt 7 Iberia IB k a j b_kunden 8 Alitali AZ a 3 ir PE 2 rb_kundenkontakte T rb_laender 10 Olympic Airways DA J 11 Turkish Airlines THY TK Syntax Functions Params Trx Operators j f f lt f lt gt toe f lt ft lt fO gt f gt 4 fO ISNULL Lies ferched 00170 000 gP Edk 1 9 Post charos 36 Discard changes a Fim pi tan 2 soach BT m worum BESI Abbildung C 2 Durchf hrung einer Auswahlabfrage im MySQL Query Browser 328 Anhang C Weitere Clients In diesem Anhang AN HANG D B cher e Webressourcen Ressourcen und Tools Einige B cher soll man schmecken andere verschlucken und einige wenige kauen und verdauen Francis Bacon Dieser Anhang gibt einen berblick ber weitere Ressourcen B cher und Web sites mit deren Hilfe Sie Ihre Kenntnisse nach dem Erlernen der MySQL Grund lagen vertiefen k nnen sowie n tzliche Zusatzsoftware B cher MySQL 5 von Michael Kofler M nchen 2005 Addison Wesley Ein umfassendes Handbuch zur neuesten MySQL Versio
61. Eingabe k nnen Sie auch bei Vergleichen einzelne Teile von Daten und Uhrzeiten eingeben Das folgende Beispiel w hlt alle Fl ge aus die ab September 2007 stattfinden SELECT FROM rb_fluege WHERE fl_datum gt 2007 09 170 Kapitel6 SQL Abfragen u Vergleiche mit Datums und Uhrzeitbestandteilen sind nur mit den verschiedenen Arten von Ungleichheitsoperatoren m glich f r sind u sie sinnlos und liefern daher ein leeres Ergebnis Ein Zeitpunkt kann dem Kriterium gt 2007 09 gen gen wenn er am 2007 09 01 oder sp ter stattfindet es gibt aber keinen Zeitpunkt der genau 2007 09 entspricht Der spezielle Operator lt gt wurde in MySQL 3 23 eingef hrt Er korrigiert das Fehl verhalten von bei NULL Werten das hei t bei Feldern ohne Inhalt Beispielsweise ergibt der Ausdruck Feldname NULL f r Felder mit dem Inhalt NULL nicht etwa TRUE sondern NULL SELECT liefert also nicht die entsprechenden Datens tze sondern ein leeres Ergebnis Feldname lt gt NULL gibt dagegen alle Datens tze zur ck in denen die Spalte Feldname leer ist Dasselbe gilt f r Vergleiche zwischen anderen Werten wenn sie NULL sind Eine Alternative sind die speziellen Operationen IS NULL bezie hungsweise IS NOT NULL die Sie mithilfe der unten besprochenen AND oder OR Ver kn pfungen mit anderen Bedingungen kombinieren k nnen Mustervergleiche mit LIKE F r Zeichenketten sind die Vergleichsoperatoren manchmal nicht ausreichend
62. Einige neuere O Reilly Buchreihen verwenden keine Tiere In der vorliegenden Basics Reihe kommen beispielsweise R ntgenmotive von Alltagsgegenst nden zum Einsatz Grundlegendes zu MySQL 11 Unix Terminologie ein im Hintergrund laufendes Dienstprogramm Hinzu kommt der Kommandozeilenclient mysql zur direkten Manipulation des Servers durch die Eingabe von SQL Abfragen Daneben werden noch zahlreiche Tools und Verwal tungsprogramme mitgeliefert Der MySQL Server steht in drei verschiedenen Varianten zur Verf gung MySQL Community Server Standard Dies ist die unter der GPL lizenzierte reine Open Source Variante des MySQL Servers MySQL Community Server Max Auch diese Version ist Open Source Software unter der GPL sie enth lt einige Erweiterungen gegen ber der Standardversion zum Beispiel zus tzliche Tabel lentypen Wenn ein in diesem Buch behandeltes Feature nur in der Max Ver sion verf gbar ist wird in der Regel darauf hingewiesen MySQL Enterprise Der Enterprise Server ist die kommerzielle Version des MySQL Datenbankser vers Der Funktionsumfang ist in etwa identisch mit MySQL Max aber zus tz lich gibt es direkten Support durch die MySQL AB sowie die bereits erw hnte Erlaubnis den MySQL Server in eigene kommerzielle Softwareprodukte einzu betten u Neben diesen Varianten des MySQL Servers bietet die MySQL AB noch einen Datenbankserver namens MaxDB an Verwechseln Sie diesen nicht mit MySQL Max es ha
63. IN OUT INOUT ParamName Typ BEGIN MySOL Anweisung en END Ein Problem ergibt sich bei der Eingabe von Stored Procedures im mysql Client Da die MySQL Anweisungen zwischen BEGIN und END mit einem Semikolon enden nimmt der Client an dass die Eingabe abgeschlossen ist Deshalb m ssen Sie vor der Eingabe den DELIMITER Eingabeabschluss siehe Kapitel 4 auf eine Zeichenfolge setzen die in der Stored Procedure selbst nicht vorkommt hier zum Beispiel mysql gt d Nun kann die Prozedur eingegeben werden CREATE PROCEDURE zeige flugzeuge BEGIN SELECT h_name f_typ FROM hersteller INNER JOIN Flugzeuge ON h_id f_herst END Nat rlich ist es f r die weitere Arbeit einfacher den Delimiter nun zun chst zur ckzusetzen mysql gt d Jetzt k nnen Sie die Prozedur mithilfe einer CALL Anweisung ausprobieren mysql gt CALL zeige _flugzeuge 4 4 4 h name f typ TEER 4 2 Boeing 737 800 Forsas EEEE Die Klammern hinter dem Prozedurnamen sind normalerweise f r Parameter gedacht Felder mit einem beliebigen SQL Datentyp die einfache Prozedur zeige_ flugzeuge ben tigt allerdings keine Jeder Parameter wird durch eines von drei Schl sselw rtern charakterisiert IN kennzeichnet reine Eingabeparameter die der Prozedur einen Wert bergeben OUT bezeichnet Ausgabeparameter die einen Wert an die CALL Umgebung zur ckgeben INOUT schlie lich erledigt beides in einem Das n chste
64. LOAD DATA INFILE Das folgende Beispiel exportiert alle Datens tze der reisebuero Tabelle rb_airports mit den Standardoptionen als Datei namens airports txt SELECT FROM rb_airports INTO OUTFILE airports txt Das n chste Beispiel exportiert die Daten aus rb_airlines trennt sie aber durch Kommata statt durch Tabulatoren SELECT FROM rb_airlines INTO OUTFILE airlines txt FIELDS TERMINATED BY Solche CSV Dateien Comma Separated Values also durch Kommata getrennte Werte werden zum Beispiel von Tabellenkalkulationsprogrammen wie Microsoft Excel unterst tzt Erweiterte Exportoptionen stehen in phpMyAdmin unter dem Link Exportieren zur Verf gung In Abbildung 9 3 wird die entsprechende Seite angezeigt Sie fasst einige Optionen von mysqldump und WRITE DATA INTO OUTFILE zusammen Links k nnen Sie zun chst die gew nschten Tabellen der aktuellen Datenbank sowie eines der folgenden Exportformate ausw hlen e SQL in der Abbildung zu sehen exportiert die gew nschten Tabellen im SQL Format und entspricht damit im Wesentlichen den weiter oben erl uterten Optionen von mysqldump e LaTeX exportiert die Daten als Quelldokument in der Textsatzsprache LaTeX Mithilfe des gleichnamigen Satzprozessors lassen sich daraus sehr hochwertig formatierte PostScript oder PDF Dokumente generieren e CSV Daten f r MS Excel exportiert die Daten im CSV Format mit Besonderhei ten die das verbreitete Tabellenkalkulationsprogramm Microsoft
65. MySQL AB bietet zus tzlich die beiden grafischen Tools MySQL Administrator und MySQL Query Browser an siehe Anhang C Eine weitere beliebte L sung ist das Open Source Tool phpMyAdmin Wie der Name schon sagt ist es in PHP geschrieben und kann in jedem beliebigen Web browser ausgef hrt werden wobei es keine Rolle spielt ob phpMyAdmin und der MySQL Server auf demselben oder auf unterschiedlichen Rechnern ausgef hrt wer 56 Kapitel 2 Installation und Inbetriebnahme den Zudem wird phpMyAdmin von etlichen Webhostern bereitgestellt um die in vielen Hosting Tarifen enthaltenen MySQL Datenbanken zu verwalten Aus diesen Gr nden habe ich mich dazu entschlossen phpMyAdmin in diesem Buch als Stan dardwerkzeug zur Datenbankbearbeitung einzusetzen Sie finden die zurzeit aktuelle Version 2 10 1 auf der beiliegenden CD ROM eine neuere k nnen Sie sich gegebenenfalls von der Website des Projekts http www phpmyadmin net herunterladen Eine Installation im eigentlichen Sinn ist nicht erforderlich Im Wesentlichen brau chen Sie die Archivdatei nur zu entpacken und unter einer URL in Ihrem PHP f higen Webserver verf gbar zu machen F r Windows ist die ZIP Version phpMyAdmin 2 10 1 all languages zip am besten geeignet Sie k nnen sie wie blich mit WinZip oder XP Bordmitteln entpacken F r Linux eignet sich dagegen eher die gzip Datei verwenden Sie die bliche Anweisung zum Auspacken tar xzvf phpMyAdmin 2 10 1 all langua
66. Namen und Zugangsdaten der verwendeten Datenbanken enth lt e script enth lt einige vorgefertigte Hilfsskripten die nicht innerhalb Ihrer Rails Anwendung ausgef hrt werden sondern Ihnen bei der Entwicklung helfen Das Skript generate erzeugt beispielsweise die Grundger ste Ihrer MVC Kom ponenten und server ist der WEBrick Server ein kleiner Webserver der die Anwendung zu Testzwecken ausf hrt e public enth lt eine CGI Konfiguration Mit ihrer Hilfe kann die Rails Anwen dung praktisch von jedem CGl f higen Webserver bereitgestellt werden Wei ter unten wird nat rlich die entsprechende Konfiguration von Apache erl utert e test stellt eine Umgebung f r sogenannte Unit Tests bereit ein beliebtes Mittel zum automatisierten Testen objektorientierter Programme Die zweite Aufgabe besteht darin das Model zu erstellen Sie umfasst vier Einzel schritte e Erzeugen der Datenbanken und Tabellen e Eintragen der Datenbanknamen und zugriffsparameter in die Konfigurations datei config database yml e Automatisches Generieren der zugeh rigen Model Klassen e Anpassen der erzeugten Klassen durch Hinzuf gen der Tabellenrelationen Starten Sie f r den ersten Schritt den Konsolenclient mysql gt mysql u root p Passwort 316 Anhang B Sonstige APIs Eine Rails Anwendung ben tigt bis zu drei Datenbanken die standardm ig mit Anwendungsname_development Anwendungsname_test und Anwendungsname_pro duction bezeichn
67. Optionen dieser bersicht werden weiter unten genauer erl utert wenn es darum geht sie manuell einzugeben beziehungsweise festzulegen Unter der Tabellenansicht finden Sie einen Satz Schaltfl chen die den soeben beschriebenen Aktionen entsprechen Auf diese Weise lassen sich die Aktionen auf mehrere per Kontrollk stchen ausgew hlte Spalten gleichzeitig anwenden In die sem Zusammenhang sind auch die beiden Links Alle ausw hlen und Auswahl entfernen sehr praktisch Im n chsten Abschnitt finden Sie zun chst drei Links Druckansicht stellt die Tabel lenstruktur auf einer n chternen druckoptimierten Seite ohne Einstellungsm g lichkeiten dar und enth lt zus tzlich die passende Schaltfl che zum Drucken Die Beziehungs bersicht stellt definierte Verkn pfungen zur referenziellen Integrit t dar N heres dar ber erfahren Sie in Kapitel 5 Der n chste Punkt Tabellenstruktur analysieren vergleicht die Datentypen der Tabelle mit den tats chlich enthaltenen Feldwerten und macht gegebenenfalls nicht immer praxistaugliche Verbesse rungsvorschl ge Als N chstes erhalten Sie die M glichkeit eine frei w hlbare Anzahl neuer Spalten Felder der Tabelle hinzuzuf gen Sie k nnen sich aussuchen ob sie am Anfang der Tabelle an ihrem Ende oder hinter einer bestimmten vorhandenen Spalte einge f gt werden sollen Wenn Sie die gew nschten Einstellungen vorgenommen und die Schaltfl che OK angeklickt haben gelangen Sie auf ein
68. PDO Methode query verwendet Genau wie die gleichnamige mysqli Methode nimmt sie als Argument einen String mit SQL Code entgegen Sie liefert ein PDOStatement Objekt zur ck aus dem Sie bei Auswahlabfragen die Ergebnisdatens tze oder bei nderungsabfragen die Anzahl der betroffenen Datens tze auslesen k nnen Eine Besonderheit der Methode query ist dass sie anstelle eines fetch Aufrufs auch selbst als Schleifenbedingung fungieren kann um das Ergebnis einer Auswahl abfrage zeilenweise auszulesen Das folgende Beispiel geht davon aus dass conn eine g ltige PDO Verbindung zur Datenbank reisebuero ist und liest zeilenweise die Namen und St dte der Hotels aus sql SELECT ht_name st_name FROM rb hotels INNER JOIN rb_staedte ON ht_stadt st_nr ORDER BY st_name ht_name foreach conn gt query sql as row echo row ht_name row st_name lt br gt n Bei dieser Herangehensweise stehen die Ergebnisdatens tze sowohl mit numeri schen Indizes als auch mit Spaltennamenschl sseln zur Verf gung Statt row ht_ name und row st_name k nnten Sie also auch row 0 beziehungsweise row 1 schreiben Auch wenn Sie fetch als Schleifenbedingung verwenden ist dies stan dardm ig der Fall Allerdings k nnen Sie dann optional eine bestimmte Array Variante w hlen indem Sie fetch eine der folgenden Konstanten als Parameter bergeben es gibt weitere Varianten die hier aus Platzgr nden wegfallen
69. PRIVILEGES Jetzt k nnen die Tabellen erstellt werden die das Model der Anwendung bilden sollen Hier sollten konsequent englische Namen zum Einsatz kommen weil Rails bei Beziehungen zwischen Tabellen automatisch den Plural beziehungsweise Singu lar englischer Standardw rter bildet one band has many albums oder formaler band has_many albums bis hin zu eingebauten Ausnahmen wie person lt gt people Wenn Sie deutsche oder sehr seltene englische Namen verwenden m chten m s sen Sie die Pluralregeln einzeln in config environment rb angeben Zun chst brauchen Sie nur in der Entwicklungsdatenbank Tabellen W hlen Sie diese als Standarddatenbank aus mysql gt USE rock_n_roll_development Die beiden Tabellen sollen bands und albums hei en Eine Band wird dabei durch ihren Namen und ihr Herkunftsland charakterisiert ein Album durch Titel Erscheinungsjahr und Band Letzteres ist eine Relation mit einem Datensatz in bands Da eine Band beliebig viele Alben produzieren kann handelt es sich um eine 1 n Relation Die Rails Konventionen gehen davon aus dass jede Tabelle einen Pri m rschl ssel namens id besitzt und dass ein Feld mit Bezug auf eine andere Tabelle einen Namen nach dem Schema andereTabelle_id erh lt Ruby on Rails Active Record 317 Geben Sie also folgenden SQL Code ein um die Tabellen anzulegen mysql gt CREATE TABLE bands gt id INT AUTO_INCREMENT PRIMARY KEY gt name VARCHAR 40 gt
70. Peter Morcinek FHTW Berlin http forums mysql com Diskussionsforen zu Themen rund um MySQL in denen die MySQL Entwick ler mitunter selbst teilnehmen http lists mysql com bersichtsseite zu den offiziellen Mailinglisten der MySQL AB f r Anwender Entwickler und alle anderen Nach dem Abonnement erhalten Sie alle Postings per E Mail und k nnen ebenso antworten oder neue Beitr ge schreiben F r die Teilnahme an Mailinglisten sollte ein automatisch sortierender Mailclient ver wendet werden da das Mailaufkommen recht hoch werden kann Webressouren 331 http www phpforum de Eine deutschsprachige PHP Foren Community in der ber PHP MySQL und verwandte Themen diskutiert wird http www apachefriends org f In den Foren der Apache Friends geht es neben Apache und dem Projekt XAMPP ebenfalls um MySQL und PHP http www 4t2 com mysql Hier k nnen Sie eine unabh ngige deutschsprachige Mailingliste zu MySQL abonnieren http buecher lingoworld de apache2 dirs php Erl uterung zahlreicher Apache Konfigurationsdirektiven die jeweils neueste l sst sich zudem als t glicher Newsletter abonnieren Ein kostenloser Zusatz service zu meinem Buch Apache 2 http dev mysql com doc refman S5 O en spatial extensions html Die offizielle Dokumentation zur Verwendung von Geodaten in MySQL http dev mysql com doc refman 5 O en error messages server html Vollst ndige Liste der MySQL Fehlernummern und ihrer SQLSta
71. Pfad der Dokumente die das Cookie lesen d rfen e domain Domain unter der das Cookie gilt e secure 1 oder 0 1 bedeutet dass das Cookie nur ber eine gesicherte SSL Verbindung bertragen wird Da Cookies als HTTP Header gesetzt werden muss setcookie genau wie die Session Anweisungen in einem PHP Block am Anfang der Datei verwendet wer den Das folgende Beispiel setzt ein 14 Tage lang g ltiges Cookie mit dem Namen letzterbesuch dessen Wert der aktuelle Zeitpunkt also time ist setcookie letzterbesuch time time 14 86400 Um Cookies wieder auszulesen steht das globale Array _COOKIE zur Verf gung Hier ein Beispiel das das Cookie letzterbesuch wieder ausliest besuch COOKIE lastvisit besuchformat date d m Y H i besuch echo Ihr letzter Besuch war am besuchformat lt br gt Die MySQL Schnittstellen in PHP Die drei MySQL Schnittstellen der Programmiersprache PHP das klassische mysql das moderne objektorientierte mysqli und die Datenbankabstraktion PHP Data Objects PDO wurden in diesem Buch bereits intuitiv verwendet In diesem Abschnitt werden sie systematisch vorgestellt mysql und mysqli Tabelle 8 1 zeigt zun chst einen berblick ber die wichtigsten Elemente der bei den Schnittstellen mysql und mysqli Beachten Sie dass mysqli hier nur in objekt orientierter Syntax dargestellt wird der ebenfalls verf gbare weitgehend an mysql angelehnte imp
72. Reisen ReiseNr Reisedatum Reiseziel Verkehrsmittel R001 02 06 2007 Paris Reisebus R002 07 06 2007 London Bahn R003 10 06 2007 Rom Flugzeug R004 05 10 2007 Istanbul Flugzeug Als Letztes muss nun die Verkn pfung zwischen den Kunden und ihren Reisen erfol gen Wie bereits festgestellt wurde k nnen mehrere Kunden ein und dieselbe Reise buchen aber genauso gut kann ein Kunde mehrere Reisen wahrnehmen sofern sie nicht gleichzeitig stattfinden Im Jargon der relationalen Datenbanken ist dies eine m n Relation mehrere Datens tze des einen Typs k nnen mit jeweils mehreren eines anderen Typs verkn pft werden Die Reisenummern k nnen also nicht als Ver weis in der Kunden Tabelle stehen und umgekehrt geht es auch nicht F r m n Rela tionen wird immer eine dritte Tabelle ben tigt die beliebig viele Kunden mit beliebig vielen Reisen verkn pfen kann Tabelle 1 4 zeigt die L sung die alle Beziehungen aus der urspr nglichen Tabelle in Bez ge auf die Tabellen 1 2 und 1 3 umwandelt Tabelle 1 4 Die Datenbanktabelle Buchungen BuchungNr Kunde Reise B0001 K001 R001 B0002 K002 R002 B0003 K003 R001 Datenbanken 5 Tabelle 1 4 Die Datenbanktabelle Buchungen Fortsetzung BuchungNr Kunde Reise B0004 K004 R003 B0005 K005 R002 B0006 K001 R004 In Abbildung 1 1 werden die Beziehungen zwischen den drei Tabellen noch einmal verdeutlicht Eine genaue Erl uterung derartiger Relationsdiagramme finden Sie in Kapitel
73. SELECT Abfrage den Wert der Funktion DATABASE ermitteln mysql gt SELECT DATABASE 106 Kapitel 4 Mit MySQL arbeiten gewinnspiel 1 row in set 0 01 sec Sollten Sie keine spezielle Datenbank ausgew hlt haben erhalten Sie die Ausgabe NULL Die SQL Anweisung SHOW erm glicht die Anzeige weiterer Informationen SHOW DATABASES gibt alle auf dem Server verf gbaren Datenbanken aus zum Beispiel mysql gt SHOW DATABASES buchliste essen fachbuecher gewinnspiel mysql reisebuero test 17 rows in set 0 02 sec SHOW TABLES zeigt dagegen die Tabellen der aktuellen Datenbank an nat rlich nur sofern eine Standarddatenbank ausgew hlt wurde mysql gt SHOW TABLES Tables_in_gewinnspiel gw_antworten gw_fragen gw_teilnahme gw_teilnehmer 4 rows in set 0 00 sec Auch die Struktur einer Tabelle k nnen Sie anzeigen lassen Die zust ndige Abfrage besitzt die Syntax DESCRIBE Datenbank Tabelle oder kurz DESC Den Datenbank namen ben tigen Sie nur falls sich die gew nschte Tabelle nicht in der aktuellen Datenbank befindet Hier sehen Sie ein Beispiel mysql gt DESCRIBE gw_fragen Field Type Null Key Default Extra fr_id int 11 PRI NULL auto increment
74. Sie eine neue Tabelle erstellen und die Datenbank umbenennen oder kopieren Au erdem l sst sich die Kollation der Datenbank selbst ndern was nur Tabel len betrifft f r die keine explizite Kollation definiert wurde Datenbanken und Tabellen erstellen Wechseln Sie auf die Startseite Haussymbol im linken Frame wenn Sie eine neue Datenbank anlegen m chten Sie m ssen einen Namen f r die Datenbank angeben nat rlich darf noch keine Datenbank mit dem gew nschten Namen existieren Zus tzlich k nnen Sie eine Kollation also eine Standard Sortierreihenfolge aus w hlen Sobald Sie auf OK klicken erscheint die bersichtsseite der neuen Daten bank nat rlich noch ohne Tabellen Als Beispiel soll eine separate Datenbank f r eine Promotion Aktion erstellt wer den eine Liste kostenloser Zusatzleistungen die ab einem angegebenen Buchungs preis gew hrt werden Geben Sie den Datenbanknamen promo ein F r die Sprache Deutsch gibt es zwei verschiedene Kollationen latinl_germanl_ci sortiert gem W rterbuch so dass die Umlaute d und mit den Buchstaben a o und u gleichgesetzt werden latinl_german2_ci sortiert dagegen nach der Telefonbuch Reihenfolge die die Umlaute als ae oe und ue behandelt Im vorliegenden Fall soll ten Sie latinl_germanl_ci w hlen Im n chsten Schritt k nnen Sie die erste Tabelle in der neuen Datenbank erstellen Geben Sie dazu unter Neue Tabelle in der Datenbank promo erstellen einen Tabel
75. Spalten einer relationalen Datenbanktabelle werden durch das Schl sselwort attribute einen Datentyp und eine Bezeichnung definiert Eine ODL Definition der Entfernungstabelle k nnte beispielsweise folgenderma en aussehen class Ort attribute string Name struct Entfernung relationship Ort Zielort attribute short Kilometer b array struct Entfernung Entfernungen DerDatenbankentwurf 137 Das Schl sselwort array bezeichnet eine Liste mehrerer Elemente desselben Daten typs genau wie in vielen Programmiersprachen Hier wird eine Entfernung als Struktur aus einer Beziehung relationship zu einem anderen Ort und der zugeh rigen Kilometeranzahl gebildet Die Entfernungen selbst werden in einem Array aus Elementen dieser Datenstruktur dargestellt Neben den rein objektorientierten Datenbanken existieren auch Mischtypen zwi schen relationalen und objektorientierten Techniken Eines der am weitesten ver breiteten Datenbanksysteme mit objektrelationalen Funktionen ist die Open Source Datenbank PostgreSQL a Sehr elegant l sst sich dieses Problem brigens l sen indem man die geografischen Koordinaten der Orte speichert und die Entfernungen einfach berechnet In MySQL sind diese sogenannten GIS Features Geospacial Information System recht neu in Anhang D finden Sie eine Web URL zu diesem Thema Die Beispieldatenbank Die Datenbank reisebuero besteht aus elf Tabellen Der Umfang dieser Datenbank ist an
76. Struktur RSQL Suche Einf gen fEiExportieren filmportieren Operationen f Leeren Datenbank SERSEHuN gewinnspiel 4 r Tabelle sortieren nach r Verschiebe Tabelle nach Datenbank Tabellenname EnEn frid 4 einmalig aufsteigend 4 1und1 gw_fragen E gw_antworten AUTO_INCREMENT Wert hinzuf gen B gw_fragen E gw_teilnahme E gw_teilnehmer r Tabellenoptionen r Kopiere Tabelle nach Datenbank Tabellenname Tabelle umbenennenin gw_fragen gewinnspiel i O Nur Struktur Struktur und Daten Tabellenformat InnoDB v Nur Daten O F ge DROP TABLE hinzu Kollation latinI_swedish_ci M O AUTO_INCREMENT Wert hinzuf gen auto_increment 5 O Zur kopierten Tabelle wechseln Tabellen Kommentar Hilfsmittel berpr fe Tabelle Tabelle defragmentieren Optimiere Tabelle Leeren des Tabellencaches FLUSH T Neues phpMyAdmin Fenster Abbildung 4 9 phpMyAdmin Tabellenoperationen Tabelle sortieren nach weist der Tabelle eine automatische Vorsortierung nach dem gew hlten Kriterium zu Das kann n tzlich sein um die Ausgabe der Tabelle in der gew nschten Standardsortierung zu beschleunigen Mithilfe der Option Tabelle umbenennen in k nnen Sie der Tabelle einen neuen Namen zuweisen Als N chstes k nnen Sie den Tabellen Kommentar eine belie
77. Tabellen konsequent die Kollation latinl_germanl_ci so dass innerhalb dieser Datenbank kein Raum f r entspre chende Experimente existiert Deshalb folgt hier ein kurzes separates Beispiel zum Ausprobieren Zun chst sollten Sie eine separate Testdatenbank erstellen und als Standarddatenbank ausw hlen mysql gt CREATE DATABASE texttest mysql gt USE texttest In der neuen Datenbank wird zun chst eine Tabelle mit einer einzigen Spalte und der Kollation latinl_germanl_ci erstellt mysql gt CREATE TABLE deutsch txt VARCHAR 50 gt COLLATE latini1_germani_ci 168 Kapitel6 SQL Abfragen In diese Tabelle sollen die vier W rter Bach Buch angeln und backen ein getragen werden mysql gt INSERT INTO deutsch VALUES gt Bach gt Buch gt angeln gt backen Nun werden zwei weitere Tabellen mit anderen Kollationen als Kopien von deutsch erstellt mysql gt CREATE TABLE grossklein gt COLLATE latin1_general_cs gt SELECT FROM deutsch mysql gt CREATE TABLE binaer gt COLLATE latini1_bin gt SELECT FROM deutsch Wenn Sie sich nun die Inhalte aller drei Tabellen sortiert anzeigen lassen erkennen Sie die Unterschiede zwischen den Kollationen mysql gt SELECT FROM deutsch ORDER BY txt ASC angeln Bach backen Buch angeln Bach Buch backen txt Bach Buch angeln backen Auswahlabfragen 169
78. Verbindung zwischen dem Webserver und einer SQL Datenbank herstellt ein Treiber f r MySQL ist separat zum Download verf gbar Die einzige mitgelie ferte Nutzanwendung ist bisher das Modul mod_authn_dbd das Vergleichspassw r ter zur Authentifizierung per Datenbankabfrage einliest F r die Zukunft sind aber durchaus weitere Module denkbar die etwa Logdaten in eine Datenbanktabelle schreiben oder Webanwendungen einen abstrahierten Datenbankzugriff zur Verf gung stellen 3 Ungl cklicherweise erlaubt die Inkompatibilit t zwischen Apache Lizenz und GPL es nicht den MySQL Treiber mit der Apache Distribution zu liefern 22 Kapitel 2 Installation und Inbetriebnahme Apache Module Eine der wichtigsten Eigenschaften von Apache ist sein modularer Aufbau Fast jeder Aspekt seines Leistungsspektrums wurde als separates Modul realisiert das Sie je nach Bedarf einkompilieren oder weglassen k nnen Mit der sogenannten DSO Unterst tzung siehe Option enable so weiter unten lassen sich die Module sogar bei jedem Start von Apache ein oder ausschalten Tabelle 2 2 zeigt eine bersicht einiger wichtiger Module Neben den Namen und Aufgaben der Module erfahren Sie auch ob diese zum Lieferumfang von Apache 2 geh ren und ob sie in diesem Fall bei einer Standardinstallation automatisch aktiviert werden Unter http modules apache org erhalten Sie zudem zahlreiche Drittanbietermodule Mithilfe der Apache API k nnen einigerma en
79. Wunsch k nnen hinter der Typbezeichnung zwei durch Komma getrennte Zahlen in Klammern angegeben werden Die erste ist die bereits bei den ganzzahli gen Typen erw hnte Anzeigebreite die sich hier nur auf die Stellen vor dem Komma bezieht die zweite ist die Anzahl der Nachkommastellen die angezeigt werden sollen Beispielsweise stellt FLOAT 5 2 Zahlen mit bis zu f nf Stellen vor dem Komma ordentlich untereinander dar und zeigt genau zwei Nachkommastel len an Bei einer Begrenzung der Nachkommastellen wird mathematisch korrekt gerundet In einem FLOAT 5 2 Feld wird 25 3349 noch als 25 33 dargestellt aber Werte ab 25 335 als 25 34 Manche Zahlen besitzen eine von vornherein festgelegte Anzahl von Nachkomma stellen das bekannteste Beispiel sind nat rlich W hrungsbetr ge F r diesen Zweck definiert SQL neben den Flie kommazahlen auch sogenannte Festkomma werte der entsprechende Datentyp hei t DECIMAL oder NUMERIC In lteren MySQL Versionen werden diese Werte intern als Strings codiert so dass sie relativ viel Spei cher ben tigen und zudem recht langsam verarbeitet werden seit Version 5 0 3 werden sie dagegen bin r gespeichert Die Verwendung von DECIMAL ist nur dann sinnvoll wenn die Anzeigebreite und die Anzahl der Nachkommastellen im Format DECIMAL m n angegeben werden Zum Beispiel legt DECIMAL 6 2 eine Anzeigebreite von sechs Stellen vor dem Komma fest und definiert zwei Nachkommastellen 4 Intern wird ein bin res Spei
80. aktuellen Frage formulieren an_query SELECT an_antwort an _text FROM gw antworten WHERE an _frage fr_id ORDER BY an antwort ASC foreach conn2 gt query an query as an_row Antwortteile auslesen an antwort an_row an antwort an text an_row an_text Radio Button und Antwort ausgeben echo lt input type radio name f fr_id value an_antwort gt an_text lt br gt Antworten Verbindung schlie en conn2 null echo lt br gt Fragen Verbindung schlie en conn null catch PDOException e print ERR e gt getMessage gt Daten in die Datenbank bernehmen Das zweite Skript tr gt den Namen teilnahme php es hat die Aufgabe die Antwor ten und Eingaben der Benutzer in die Datenbanktabellen gw_teilnehmer und gw_ teilnahme einzuf gen Zun chst werden mithilfe der bereits besprochenen Funktion cgi_param die verschiedenen Formulareingaben ausgelesen Zuvor wird die Hilfs variable korrekt auf 1 gesetzt das Skript geht zun chst davon aus dass die Einga ben vollst ndig sind Die Antworten auf die vier Quizfragen werden mithilfe der folgenden Schleife ermittelt for i 1 i lt 4 i antwort i cgi_param f i 0 if antwort i 0 korrekt 0 Die jeweilige Feldbezeichnung wird aus dem Buchstaben f und dem aktuellen Wert des Schleifenz hlers i gebildet Sollte eine Antwort fehlen Vorgabewert 0
81. als String selbst in Anf hrungszeichen steht Sie sind kein Bestandteil von SQL Die MySQL Funktion NOW haben Sie bereits kennenge lernt hier dient sie dazu den aktuellen Zeitpunkt in das Feld e_datum einzutragen Beispiel 8 6 zeigt das gesamte mit einigen Kommentaren versehene PHP Skript gast php Beispiel 8 6 gast php das G stebuch des Reiseb ros lt php Include Datei laden include util inc php Datenbankverbindung herstellen conn db_connect gaestebuch rbuser R3153n Bereits eingeloggt session start user nummer session _param user 0 Aktuellen Modus ermitteln Lesen r Eintragen e oder Speichern s Standard ist Lesen mode cgi_param mode r gt lt html gt lt head gt lt title gt Reiseb amp uuml ro G amp auml stebuch lt title gt Die Reiseb ro Anwendung 261 Beispiel 8 6 gast php das G stebuch des Reiseb ros Fortsetzung lt link rel stylesheet type text css href main css gt lt script language JavaScript type text javascript src utils js gt lt script gt lt head gt lt body gt lt table border 0 width 750 align center gt lt tr gt lt td gt amp nbsp lt br gt lt div align center gt lt img src logo gif width 480 height 80 alt EuroCityTravel gt lt div gt lt br gt lt Einfache Navigationsleiste gt lt a href index php gt Home lt a gt lt a href auskunft
82. also der eigentliche Inhalt der Antwort In unserem Beispiel wurde er auf die ersten drei Zeilen gek rzt Formulardaten lesen Eine der wichtigsten F higkeiten von Webserver Programmiersprachen ist das Aus lesen und Verarbeiten von Daten aus HTML Formularen Sie bilden die Benutzer oberfl che von Webanwendungen Deshalb soll an dieser Stelle kurz erl utert werden wie Formulare aufgebaut sind und wie sich die entsprechenden Benutzer eingaben mit PHP auslesen lassen Grunds tzlich wird jedes HTML Formular von folgenden Tags umschlossen lt form action URL method HTTP Methode gt lt form gt Die URL bestimmt wohin das Formular versandt wird wenn ein Benutzer den Absendeknopf bet tigt In aller Regel handelt es sich um die Adresse eines serversei tigen Skripts zum Beispiel PHP das mit den Formulardaten umgehen kann Die HTTP Methode kann get oder post sein Ihre Bedeutung wurde im vorigen Abschnitt bereits angesprochen Bei get werden die Formulardaten durch ein Fra gezeichen getrennt an die URL der HTTP Anfrage angeh ngt Eine solche URL l sst sich beispielsweise verlinken Sie k nnten folgenderma en einen Link auf die Google Suche nach mysql setzen lt a href http www google de search g mysql gt MySOL suchen lt a gt post versendet die Daten dagegen separat Dadurch ist diese Methode f r den Versand beliebig gro er Datenmengen geeignet Zwischen lt form gt und lt form gt k nnen Sie beli
83. anzeigen Parent ID lesen Standard O neuer Beitrag pid cgi_param p 0 gt 270 Kapitel 8 Webanwendungen mit PHP und MySQL Beispiel 8 7 forum php ein Diskussionsforum Fortsetzung lt h2 gt Forumsbeitrag verfassen lt h2 gt lt a href forum php mode r gt Eintr auml ge lesen lt a gt lt form action forum php method post gt lt input type hidden name mode value s gt lt input type hidden name p value lt php echo pid gt gt lt table border 0 cellpadding 4 gt lt tr gt lt td gt Nickname lt td gt lt td gt lt input type text name nick size 50 lt td gt lt tr gt lt tr gt lt td gt E Mail optional lt td gt lt td gt lt input type text name mail size 50 lt td gt lt tr gt lt tr gt lt td gt Titel lt td gt lt td gt lt input type text name titel size 50 lt td gt lt tr gt lt tr gt lt td valign top gt Ihr Eintrag lt td gt lt td gt lt textarea name eintr cols 40 rows 7 wrap virtual gt lt textarea gt lt td gt lt tr gt lt tr gt lt td gt nbsp lt td gt lt td gt lt input type submit value Eintragen gt lt tr gt lt table gt lt php elseif mode s Speichermodus Neuen Beitrag speichern Formularfelder auslesen pid cgi_param p nick cgi_param nick mail cgi_param mail titel cgi_param titel
84. aus Abbildung 2 3 angezeigt Klicken Sie den Link Setup Skript an um das empfohlene Konfigurati onsskript aufzurufen Es f hrt Sie mithilfe von Webformularen durch die Erzeu gung der Konfigurationsdatei Zugriff verweigert Mozilla Firefox Datei Bearbeiten Ansicht Chronik Lesezeichen Yahoo Extras Hilfe amp i 44 httpijocalhost phpmyadminy W Erste Schritte B Aktuelle Nachrichten Willkommen bei phpMyAdmin 2 10 0 rc1 Eine m gliche Ursache w re dass sie noch keine Konfigurationsdatei angelegt haben Verwenden Sie in diesem Fall doch das Setup Skript um eine solche zu erstellen Fehler MySQL meldet Neues phpMyAdmin Fenster Abbildung 2 3 Meldung beim ersten Start von phpMyAdmin die besagt dass noch keine Konfigurationsdatei existiert Normalerweise zeigt das Skript zwei Fehlermeldungen an Not secure Connection die Empfehlung besser eine SSL verschl sselte Verbindung zu verwenden k n nen Sie auf dem eigenen Rechner ignorieren Die andere ist dagegen wichtig Das Skript ben tigt ein Unterverzeichnis namens config im phpMyAdmin Verzeichnis f r das der Webserver Schreibrechte besitzt Auf Unix Systemen funktioniert dies sehr einfach ber die Konsole beispielsweise mithilfe folgender Anweisungen cd lt phpMyAdmin Verzeichnis gt mkdir config chmod a w config Unter Windows k nnen Sie zun chst versuchen das Verzeichnis einfach zu e
85. auseinanderzuhalten Hier ein Beispiel das alle verf gbaren Flugstrecken ab K ln Bonn beschr nkt auf die ersten zehn alphabetisch sortiert nach Zielflugh fen zeigt mysql gt SELECT DISTINCT start ap_name Ab ziel ap_name An gt FROM rb_flugstrecken INNER JOIN rb_airports start gt INNER JOIN rb_airports ziel gt ON fs_start start ap_nr AND fs_ziel ziel ap_nr gt WHERE start ap_name K ln Bonn ORDER BY ziel ap_name ASC gt LIMIT 0 10 K ln Bonn Athen International K ln Bonn Amsterdam Schiphol K ln Bonn Berlin Tegel 182 Kapitel 6 SQL Abfragen K ln Bonn Dublin Airport K ln Bonn Edinburgh Airport K ln Bonn Frankfurt Airport K ln Bonn Istanbul Atat rk K ln Bonn Lissabon Portela K ln Bonn London Heathrow Airport K ln Bonn Madrid Barajas 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 i 1 Ergebnisse sortieren die ORDER BY Klausel Mithilfe der bereits erw hnten Klausel ORDER BY lassen sich die Ergebnisse von Aus wahlabfragen nach einer oder mehreren Spalten sortieren Die grunds tzliche Syn tax dieser Klausel sieht folgenderma en aus ORDER BY Feldname ASC DESC Feldname ASC DESC ASC beziehungsweise DESC gibt die Sortierrichtung an ASC ist die Abk rzung f r ascending aufsteigend die Richtung ist 1 2 3 oder a b c DESC descending gibt dagegen die absteigende Richtung an
86. ausgew hlten Spalten mit dem Ziel bereinstimmen Das fol gende Beispiel entf hrt die ersten drei Kunden aus der Kundentabelle des Reise b ros in die Tabelle mit den Gewinnspielteilnehmern mysql gt INSERT INTO gw_teilnehmer tn_uname tn_email tn_interest gt SELECT kd_vorname kk_mail 2 gt FROM reisebuero rb_kunden INNER JOIN gt reisebuero rb_kundenkontakte gt ON kd_nr kk_nr AND kd_nr lt 3 Query OK 3 rows affected 0 41 sec Records 3 Duplicates O0 Warnings 0 Die etwas umst ndliche Angabe der Datenbank reisebuero ist hier erforderlich weil sie zurzeit nicht die Standarddatenbank ist Als bevorzugte Stadt wird die Konstante 2 eingef gt da die Quelltabellen keine ad quate Information enthalten Die kom plexe INNER JOIN Syntax die die Tabellen rb_kunden und rb_kundenkontakte anhand der identischen Kundennummern miteinander verkn pft wird im n chsten Kapitel genau erl utert Ein abschlie endes SELECT zeigt das Ergebnis der letzten drei Einf geabfragen mysql gt SELECT FROM gw_teilnehmer tn id tn_ uname tn_email tn_interest 1 Klaus klaus example com 2 2 Sabine sabine example net 3 3 Hans hans example org 4 4 Heinz heinz example net 1 5 Herbert herbert gmz de 3 6 Jana jana aof com 2 7 Angelika angelika coldmail com 4 8 Ludwig becker ber
87. cksichtigt siehe Kapitel 5 10 Windows Options Hier geht es darum MySQL als Windows Dienst einzurich ten Install As Windows Service der beim Hochfahren des Systems automa tisch gestartet wird Launch the MySQL Server automatically und permanent im Hintergrund aktiv ist Der Dienstname sollte MySQL lauten solange Sie nicht mehrere MySQL Dienste parallel betreiben Der Betrieb von MySQL als Dienst ist meist die passende Option Die Daten bank steht so immer zur Verf gung ohne allzu viele Ressourcen zu verbrau chen selbst die Performance leistungshungriger 3 D Action Spiele wird nicht wesentlich beeintr chtigt wenn Sie Apache und MySQL als automatisch gestartete Dienste betreiben Die Option Include Bin Directory in Windows PATH ist ebenfalls n tzlich Sie f gt lt MySQL Verzeichnis gt bin der Umgebungsvariablen PATH hinzu so dass Sie die im Laufe dieses Buchs vorgestellten MySQL Dienstprogramme aus jedem beliebigen Arbeitsverzeichnis heraus aufrufen k nnen 6 Das gilt nat rlich nicht mehr wenn diese Serverdienste ber das Netzwerk stark beansprucht werden sondern nur f r einen weitgehend passiven Standby Betrieb auf einem Entwicklerrechner MySQL installieren 39 11 Security Options Hier werden grundlegende Anmelde und Sicherheitseinstel 12 lungen vorgenommen Zun chst sollten Sie Modify Security Settings ankreuzen Geben Sie unter New root password ein sicheres Passwort f r den MySQL Admini
88. davon aus dass Sie das Skript dreimal ausf hren und dabei fol gende Eingaben t tigen zweimal richtig einmal falsch e Alle Antworten richtig Rom Paris Slowakei Istanbul Benutzername Klaus E Mail klaus example com Wunschstadt London e Alle Antworten richtig siehe oben Benutzername Sabine E Mail sabine example net Wunschstadt Instanbul e Zwei Antworten richtig und zwei falsch Rom London Slowenien Istanbul Benutzername Hans E Mail hans example org Wunschstadt Rom Nach diesen Operationen hat die Datenbanktabelle gw_teilnehmer folgende Inhalte tn_id tn_uname tn email tn_interest 1 Klaus klaus example com 2 2 Sabine sabine example net 3 3 Hans hans example org 4 tl_tln tl_ frag tl_antw 1 2 1 2 3 1 3 1 1 4 2 2 2 2 2 3 2 3 T 2 4 2 3 2 3 2 2 3 3 2 3 4 2 Jedes Mal wenn Sie in spiel php die Schaltfl che Abschicken anklicken erscheint die Ausgabe von teilnahme php In Abbildung 3 3 sehen Sie ein Beispiel f r den Teilnehmer Klaus Nun sind gen gend Testdaten vorhanden um das Administrati onsskript auswert php ausprobieren zu k nnen Geben Sie also dessen URL z B
89. den Statuscode der HTTP Antwort Akzeptabel ist nur 200 OK 404 Not Found weist dagegen zum Beispiel darauf hin dass das angesprochene Skript nicht exis tiert Deshalb hat praktisch jede Ajax Callback Funktion folgende Grundstruktur function stadtListe Liegt die Antwort vor if anfrage readyState 4 Ist die Antwort in Ordnung if anfrage status 200 Antwort verarbeiten else alert Leider ist ein Fehler aufgetreten Die Antwort wird aus der Eigenschaft anfrage responseText gelesen wenn es sich um einfachen Text handelt XML basierte Antworten stehen dagegen in anfrage responseXML zur Verf gung es handelt sich um den Wurzelknoten eines DOM Baums der sich mithilfe der weiter oben vorgestellten DOM Konstrukte durchsu chen l sst 252 Kapitel8 Webanwendungen mit PHP und MySQL Das folgende einfache Beispiel stellt ein Texteingabefeld zur Verf gung Bei jeder nderung der Eingabe wird eine Ajax Anfrage an das PHP Skript staedte php gesen det das eine Liste aller zur aktuellen Eingabe passenden St dte aus der Reiseb ro Datenbank zur ckliefert Das Prinzip hnelt Google Suggest http labs google com suggest wo die jeweils am h ufigsten vorkommenden Suchbegriffe zur bisherigen Eingabe angezeigt werden In Beispiel 8 4 sehen Sie zun chst die HTML Datei mit s mtlichem JavaScript Auf der CD ROM finden Sie diese Anwendung im Verzeichnis beispiele ajax demo B
90. e PDO FETCH_NUM liefert die Ergebnisdatens tze nur als nummerierte Arrays e PDO FETCH_NAMED PDO FETCH_ASSOC liefert nur die benannten Schl ssel e PDO FETCH_BOTH ist Standard beide Varianten werden zur ckgeliefert e PDO FETCH_LAZY ist eine PDO Besonderheit Jede Ergebniszeile ist ein Objekt die Felder stehen als Instanzvariablen mit den Namen der Spalten zur Verf gung Hier eine Variante des obigen Beispiels die explizit nummerierte Arrays anfordert um die Daten in eine list von Einzelvariablen einzulesen sql SELECT ht_name st_name FROM rb hotels INNER JOIN rb_staedte ON ht_stadt st_nr ORDER BY st_name ht_name query conn query sql while list hotel stadt query gt fetch PDO FETCH _NUM echo hotel stadt lt br gt n Die MySQL SchnittstelleninpHP 239 Die etwas eigenwillige Schreibweise mit dem Modus PDO FETCH_LAZY sieht dagegen so aus sql SELECT ht_name st_name FROM rb hotels INNER JOIN rb_staedte ON ht_stadt st_nr ORDER BY st_name ht_name query conn gt query sql while row query gt fetch PDO FETCH_LAZY echo row gt ht_name row gt st_name lt br gt n brigens k nnen Sie den Modus auch vor dem ersten Aufruf von fetch festlegen dazu dient die Methode setFetchMode Das folgende Beispiel stellt den Modus PDO FETCH_ASSOC ein query conn gt query sql query gt setFetchMode PDO FETCH_ASSOC Neben fe
91. erfahrene C Programmierer sogar selbst Apache Module schreiben Tabelle 2 2 bersicht ber einige wichtige Apache Module Modul Bedeutung mitgeliefert aktiviert mod _authz_hostname Host basierte Zugriffskontrolle Order Allow Deny ja ja siehe unten mod_alias Um und Weiterleitung ja ja mod_auth_basic Klartextbasierte Benutzeranmeldung Authentifizierung ja ja mod_auth_digest Verschl sselte Authentifizierung ja nein mod authn file Anmeldedaten aus Textdateien ja ja mod authz user Zugriffskontrolle f r angemeldete Benutzer ja ja mod authz_groupfile Zugriffskontrolle aufgrund von Gruppenzugeh rigkeiten ja ja mod_autoindex Automatisch erstellter Verzeichnisindex ja ja mod_cgi CGl Skripten altmodische Webserver Anwendungen ja ja mod_dir Definition der Indexseite ja ja mod_log_config Protokollierung Logdateien ja ja mod_mime Zuweisungen von Dateityp Zeichensatz und Sprache ja ja mod_negotiation Content Negotiation MIME Varianten je nach Client ja ja vorgabe mod_perl In Apache integrierter Perl Interpreter nein mod_php In Apache integrierter PHP Interpreter siehe unten nein mod_ssl Verschl sselte Verbindungen https ja nein a Bis einschlie lich Apache 2 0 x hie dieses Modul mod access Installation unter Linux In vielen Linux Distributionen ist der Apache Webserver bereits ab Werk enthalten oder kann bei der Installation des Systems optional ausgew hlt werden Falls dies bei Ihnen der Fall ist k nnen Sie d
92. erfolgen dieses Konzept wurde bereits in Kapitel 3 erl utert auskunft php berpr ft ob ihm eine Fehlermeldung bergeben wurde und gibt diese aus 276 Kapitel8 Webanwendungen mit PHP und MySQL Die ersten beiden Datenbankabfragen ermitteln anhand der Stadtnummern jeweils den Prim rschl ssel den Namen und das K rzel des Start beziehungsweise Ziel flughafens SELECT ap_nr ap name ap _kuerzel FROM rb airports WHERE ap_stadt start SELECT ap_nr ap name ap _kuerzel FROM rb airports WHERE ap_stadt ziel Zun chst werden alle infrage kommenden Hinfl ge aus der Tabelle rb_flugstrecken herausgesucht SELECT fs_nr fs_onr FROM rb_flugstrecken WHERE fs_start start_ap nr AND fs ziel ziel ap nr Alle Ergebnisse dieser Abfrage werden nun auf die Tabelle rb_fluege angewendet in der die konkreten Flugdaten stehen Aus dieser Tabelle werden Uhrzeit und Flug preis ermittelt wobei das gew nschte Reisedatum als Auswahlkriterium dient SELECT fl_preis fl_zeit FROM rb_fluege WHERE fl_strecke fs_ nr AND fl_datum flugdatum Entspricht der Flug dem gew nschten Datum wird er mit allen relevanten Informa tionen ausgegeben In der vollst ndigen Anwendung auf der beiliegenden CD ROM ist in der Zeile zus tzlich ein Radio Button enthalten mit dem die Kunden den jeweiligen Flug ausw hlen k nnen F r den R ckflug werden noch einmal die gleichen Schritte unternommen dabei werden lediglich die beiden Orte vertauscht
93. fortschreiten den Verlagerung von B rot tigkeiten in die EDV lag es nahe entsprechende Organisationsformen f r Daten im Computer nachzubilden Allerdings gab es zu Beginn der Computergeschichte bis in die 60er Jahre hinein ein technisches Problem Die Daten wurden zur dauerhaften Aufbewahrung in Lochkarten oder Lochstreifen gestanzt Diese konnten ausschlie lich sequenziell das hei t der Reihe nach eingelesen und verarbeitet werden Eine solche Form der Informationsspeicherung erlaubt also keine Zugriffe in beliebiger Reihenfolge engl random access und somit keine gezielte Suche nach bestimmten Merkmalen F r den Betrieb datenbank hnlicher Strukturen sind derartige mechanische Speicher medien deshalb ungeeignet Erst die Einf hrung der magnetischen Datentr ger lieferte die notwendige Grund voraussetzung f r den Datenbankbetrieb Zun chst wurden Magnetb nder verwen det die ihrer Bauart gem ebenso sequenziell waren wie die Lochstreifen oder kartenstapel Allerdings konnte geeignete Software f r den ben tigten Random Access Betrieb sorgen Den endg ltigen Durchbruch brachten aber erst die seit 1973 entwickelten Festplatten 2 Kapitel 1 Einf hrung Die ersten Datenbanksysteme waren hierarchisch organisiert und hnelten so eher den heutigen Dateisystemen mit ihrer verschachtelten Verzeichnisstruktur 1970 entwarf Edgar F Codd bei IBM das Modell der relationalen Datenbank das MySQL und den meisten anderen Date
94. gt n for i 1 i lt 12 i echo lt option value i gt i lt option gt n echo Ak jahr lt select gt n tuelles Jahr ermitteln date Y time W hler f r aktuelles und nachfolgendes Jahr echo lt select name feldname _jahr size 1 gt n echo lt option value jahr selected selected gt jahr lt option gt n jahr echo lt option value jahr gt jahr lt option gt n lt select gt n Bereits eingeloggt session start Liste staedte query user nummer session _param user 0 aller St dte auslesen stnr array array querytext SELECT st_nr st_ name la_name FROM rb staedte INNER JOIN rb_laender ON st _land la_nr ORDER BY la_name ASC st_name ASC conn gt query querytext while list nr stadt land query gt fetch_row array push stnr nr array push staedte stadt land gt lt html gt lt head gt lt title gt Reiseb amp uuml ro Auswahl lt title gt lt link rel stylesheet type text css href main css gt lt script language JavaScript type text javascript src utils js gt lt script gt lt head gt lt body gt lt table border 0 width 750 align center gt lt tr gt lt td gt 274 Kapitel8 Webanwendungen mit PHP und MySQL Beispiel 8 8 auskunft php Auswahl der Reisedaten Fortsetzung am
95. gt Zielort lt td gt lt td gt lt select name ziel size 1 gt lt option value 1 gt Bitte w auml hlen lt option gt lt php for i 0 i lt sizeof staedte i nr stnr i stadt staedte i echo lt option value nr gt stadt lt option gt n gt lt select gt lt td gt lt tr gt lt tr gt lt td gt Abreisedatum lt td gt lt td gt Datum lt php datumswahl start gt lt td gt lt tr gt lt tr gt lt td gt R uuml ckreisedatum lt td gt lt td gt Datum lt php datumswahl ende gt lt td gt lt tr gt 280 Kapitel 8 Webanwendungen mit PHP und MySQL Beispiel 8 9 ergebnis php Ausgabe der Reiseangebote Fortsetzung lt tr gt lt td gt Mit Hotelangebot lt td gt lt td gt lt input type radio name hotel value 1 checked checked gt ja lt input type radio name hotel value 0 gt nein lt td gt lt tr gt lt tr gt lt td gt amp nbsp lt td gt lt td gt lt input type submit value Anfrage senden gt lt tr gt lt table gt lt form gt lt td gt lt tr gt lt table gt lt body gt lt html gt Die Reiseb ro Anwendung 281 In diesem Kapitel KAPITEL 9 Benutzerverwaltun e e e 5 MSOLSenemoganme MySQL Administration e Import und Export von Tabellen daten e Konfigurationsdateien e Replikation Herrschen lernt sich leicht Regieren schwer Johann Wolf
96. gt close lt table gt lt body gt lt html gt nderungsabfragen werden ebenfalls mit mysql_query beziehungsweise mysqli gt query an den Server gesendet Da diese Abfragen keine Datens tze zur ckgeben m ssen Erfolg oder Misserfolg anders festgestellt werden Die Funktion mysql_ affected _rows beziehungsweise die mysgqli Eigenschaft affected_rows geben je weils die Anzahl der bei der letzten Operation ge nderten Datens tze an Es folgt ein kurzer Beispielausschnitt der das Prinzip demonstriert Das Hotel Koni gin Juliana in Amsterdam soll in Hotel Konigin Beatrix umbenannt werden Die Abfrage kann als erfolgreich betrachtet werden wenn genau ein Datensatz ge ndert wurde Hier die mysql Version Inhalt der Abfrage querytext UPDATE rb_ hotels SET ht_name Hotel Konigin Beatrix WHERE ht_name LIKE Juliana Abfrage an Server senden mysql query querytext Hat es funktioniert if mysql _affected_rows 1 echo amp Auml nderung erfolgt lt br gt n else echo amp Auml nderung nicht m amp ouml glich lt br gt n In mysqli ist affected_rows keine Methode sondern eine Eigenschaft das zeigt sich wieder an den fehlenden Parameterklammern Hier dasselbe Beispiel in dieser Vari ante Die MySQL SchnittstelleninpHP 235 Inhalt der Abfrage querytext UPDATE rb_hotels SET ht_name Hotel Konigin Beatrix WHERE ht_name LIKE Juliana Abfra
97. gw_teilnehmer tn_id tn_uname tn_ email tn_interest 1 Klaus klaus example com 2 2 Sabine sabine example net 3 3 Hans hans example org 4 4 Heinz heinz example net 1 Wenn Sie trotz Anwesenheit von AUTO INCREMENT oder TIMESTAMP Spalten auf die Angabe der Felder verzichten m chten k nnen Sie dieselben einfach mit NULL f llen die korrekten Werte werden automatisch eingetragen Hier die entsprechende Vorgehensweise f r gw_teilnehmer mysql gt INSERT INTO gw_teilnehmer gt VALUES NULL Herbert herbert gmz de 3 Query OK 1 row affected 0 02 sec Sie k nnen auch mehrere Datens tze gleichzeitig einf gen indem Sie beliebig viele von ihnen durch Kommata trennen Hier sind beispielsweise noch zwei weitere Gewinnspielteilnehmerinnen 160 Kapitel 5 Datenbanken entwerfen und erstellen mysql gt INSERT INTO gw_teilnehmer tn_uname tn_email tn_interest gt VALUES gt Jana jana aof com 2 gt Angelika angelika coldmail com 4 Query OK 2 rows affected 0 05 sec Records 2 Duplicates 0 Warnings 0 Sie k nnen sich auch aus anderen Tabellen bedienen um Daten einzuf gen Dazu wird eine INSERT Abfrage mit einem SELECT gekoppelt Wichtig ist dass die Anzahl und Datentypen der
98. ihren tats chlichen Speicher platz in der Tabelle versehen Auf diese Weise verringert sich die Suchdauer erheb lich und auch das Sortieren nach der entsprechenden Spalte wird beschleunigt Schl ssel und Indizes 153 MySQL definiert mehrere Arten von Indizes die f r verschiedene Einsatzzwecke geeignet sind e INDEX oder KEY Standardindex geeignet f r alle Tabellen und Spaltentypen UNIQUE Index mit der zus tzlichen Einschr nkung dass jeder Feldwert nur genau einmal in der Tabelle vorkommen darf FULLTEXT Optimierter Index f r die Volltextsuche ist nur f r CHAR VARCHAR und TEXT Spalten verf gbar und zwar ausschlie lich in MyISAM Tabellen P RIMARY KEY Der Prim rschl ssel ist mehr als ein einfacher Index Wie bereits in den Abschnitten zum Tabellendesign besprochen kennzeichnet der Prim r schl ssel die Datens tze einer Tabelle eindeutig damit aus einer anderen Tabelle heraus Bezug auf sie genommen werden kann Das impliziert automa tisch die Option UNIQUE Es gibt zwei verschiedene Methoden um Indizes zu definieren Entweder werden sie unmittelbar bei der Erstellung einer Tabelle eingef gt oder sie werden nachtr g lich erzeugt In der Tabellendefinition werden die Indexoptionen nach den Spaltendefinitionen eingetragen CREATE TABLE Tabellenname Feld1 Datentyp Optionen Feld2 Datentyp Optionen PRIMARY KEY Feldname INDEX Feldname UNIQUE Feldname PRIMARY KEY kann
99. in einer separaten Zeile ausgegeben Das ist n tzlich wenn die Spalten einer Abfrage zu breit sind so dass die Tabelle nicht korrekt dar gestellt werden kann Hier die obige Abfrage in diesem Format mysql gt SELECT fr_frage an_text gt FROM gw_fragen gw_antworten gt WHERE fr_id an_frage AND fr_korrekt an_antwort G REKEN yi FREE RE RRE RR fr_frage Wie hei t die Hauptstadt von Italien an_text Rom RERE ERRE ER ERE ERE kk S roa EEEE EREEREER EERE EKE kR fr_frage Welche dieser Hauptst dte hie einst Lutetia an_text Paris EEEE EEEE E E E E E k k kkk k k kkk kk 3 row EEE SEE SE EEEE E E E E K k k kK k kk kkk k k fr_frage Bratislava ist die Hauptstadt von an_text Slowakei o o k 1 roy PREE kkk kkk k fr_frage Welche dieser St dte ist keine Hauptstadt an_text Istanbul 4 rows in set 0 00 sec Auf Wunsch k nnen Sie das Semikolon auch durch ein anderes Zeichen ersetzen Erforderlich wird dies zum Beispiel bei der manuellen Eingabe von Stored Procedu res und Triggern da diese Semikola enthalten siehe Kapitel 7 Verwenden Sie hier Der Kommandozeilenclient mysql 105 f r den Befehl DELIMITER oder d In der Langform m ssen Sie dazu das bisherige Schlusszeichen anh ngen das folgende Beispiel stellt den Doppelpunkt ein mysql gt delimiter Zur ck zum Semikolon geht es danach wie folgt mysql gt delimiter Die Kurzfassung d macht diese Einstellungen bersichtlicher und verst ndlicher
100. jeweils aus dem Kon text der Beschreibungen hervorgehen Tabelle 9 1 Die wichtigsten Benutzerrechte f r GRANT und REVOKE Anweisungen Berechtigung Beschreibung ALL PRIVILEGES alle Rechte au er GRANT OPTION USAGE keine Rechte nur Anmeldung SELECT Auswahlabfragen mit SELECT INSERT Einf gen von Daten mit INSERT Benutzerverwaltung 285 Tabelle 9 1 Die wichtigsten Benutzerrechte f r GRANT und REVOKE Anweisungen Fortsetzung Berechtigung Beschreibung UPDATE nderung von Daten mit UPDATE DELETE L schen von Daten mit DELETE CREATE Tabellenerstellung mit CREATE TABLE DROP L schen von Tabellen mit DROP TABLE ALTER Tabellen nderung mit ALTER TABLE INDEX Indexverwaltung mit CREATE INDEX undDROP INDEX CREATE VIEW Erstellung von Views mit CREATE VIEW FILE Import Export mit SELECT INTO OUTFILEund LOAD DATA INFILE SHOW DATABASES Anzeigen der Datenbankliste mit SHOW DATABASES SHOW VIE Anzeigen eines Views mit SHOW CREATE VIEW CREATE ROUTINE Erstellung von Stored Procedures Functions ALTER ROUTINE nderung von Stored Procedures Functions EXECUTE Ausf hren von Stored Procedures Functions CREATE USER Benutzerverwaltung mit CREATE DROP USER SHUTDOW Server beenden mit mysqladmin shutdown REPLICATION CLIENT Ermitteln der Replikationseinstellungen REPLICATION SLAVE MySQL als Replikationsslave einrichten SUPER Serveradministration z B CHANGE MASTER KILL usw GRANT OPTION Rechteverwaltung mit GRANT REVOKE
101. lt Location gt Die Direktiven in diesem Container betreffen also auf das obige Beispiel bezo gen alle URLs die mit http www test local info beginnen Options Options stellt verschiedene Einstellungen f r das Verhalten eines Verzeichnisses zur Verf gung Beispiele Indexes generiert automatisch eine Liste mit Hyper links auf die Dateien im Verzeichnis wenn keine Indexseite DirectoryIndex siehe unten gefunden wird Includes aktiviert die Ausf hrung von SSI Server Side Includes FollowSymLinks l st symbolische Links Verweise auf Dateien in anderen Verzeichnissen auf Beispiel Options Indexes FollowSymLinks AllowOverride Innerhalb der Website selbst k nnen zus tzliche Dateien mit Konfigurationsdi rektiven stehen die nur das jeweilige Verzeichnis betreffen Der Standardname einer solchen Datei lautet htaccess Dieser Name kann auf Wunsch mithilfe der hier nicht n her beschriebenen Direktive AccessFileName ge ndert werden Die Direktive AllowOverride legt fest ob und welche Direktiven in htaccess Dateien innerhalb der Verzeichnisse der Website selbst berschrieben werden d rfen Neben All jede grunds tzlich verzeichnisf hige Direktive und None keine k nnen einige Gruppen angegeben werden zum Beispiel FileInfo Dateieinstellungen oder AuthConfig Authentifizierung und Zugriffskontrolle Beispiel AllowOverride FileInfo Wenn Sie eine einzelne Website betreiben die nur von Ihnen administriert wir
102. lt a gt lt body gt lt html gt 94 Kapitel3 Die erste Webanwendung Ver ffentlichung und Test Nachdem alle Skripten fertiggestellt sind geht es daran sie zu testen In diesem Abschnitt wird beschrieben wie Sie sie im Webserver ver ffentlichen und im Brow ser ausprobieren k nnen Die Anwendung im Webserver bereitstellen Bevor Sie die Skripten testen k nnen m ssen Sie sie in das Website Verzeichnis Ihres Webservers kopieren und einige Vorbereitungen treffen Wo Sie das Site Ver zeichnis von Apache finden wurde im vorigen Kapitel im Rahmen der Installation beschrieben Die nachfolgenden Beschreibungen gehen beispielsweise davon aus dass die Site unter Linux im Verzeichnis usr local apache2 htdocs und unter Win dows in C Programme Apache Software Foundation Apache2 2 htdocs liegt Erstellen Sie unter htdocs zun chst ein neues Verzeichnis namens contest Kopieren Sie die Dateien spiel php teilnahme php und error html hinein Das Skript auswert php das nur vom Webmaster und nicht von externen Benutzern aufgerufen werden darf soll in einem passwortgesch tzten Unterverzeichnis liegen Erstellen Sie dazu innerhalb des Verzeichnisses contest ein Unterverzeichnis mit der Bezeichnung admin Falls Web und Datenbankserver nicht auf Ihrem eigenen Rechner ausgef hrt wer den sondern bei einem Webhosting Provider m ssen Sie die Dateien per FTP in Ihren Webspace bertragen G ngige FTP Software erm glicht es Ihne
103. lt a gt Zuklappen echo lt br lt br gt Thread Startbeitr ge mit Parent ID 0 ausw hlen querytext SELECT f_id f titel f_nick FROM fo_eintraege WHERE f_pid 0 ORDER BY f id DESC Abfrage senden query conn gt query querytext Sind Beitr ge vorhanden anzahl query gt num_rows if anzahl 0 268 Kapitel8 Webanwendungen mit PHP und MySQL Beispiel 8 7 forum php ein Diskussionsforum Fortsetzung Noch kein Beitrag da echo Bisher keine Beitr auml ge else Liste anzeigen while list id titel nick query gt fetch_row Nickname leer gt Anonymous if nick nick Anonymous Titel leer gt Ohne Titel if titel titel Ohne Titel Beitrag anzeigen echo lt a href forum php mode r id id gt titel lt a gt von nick Thread anzeigen falls aufgeklappt if offen echo lt br lt br gt zeige thread id 1 Trennlinie echo lt hr gt elseif mode r Lesemodus Eintrag anzeigen echo lt h2 gt Diskussionsforum lt h2 gt Links f r Liste Neueintrag echo lt a href forum php mode e p 0 gt Neuer Beitrag lt a gt lt a href forum php mode 1 amp 0 1 gt Zur amp Uuml bersicht lt a gt lt br gt lt br gt ID lesen Standard 1 f r nicht vorhanden id cgi_param id 1
104. mit eindeuti gem Wert zugewiesen der sogenannte Prim rschl ssel englisch Primary Key Soll nun in einer anderen Tabelle auf einen solchen Datensatz Bezug genommen wer den braucht nur noch dieser Schl ssel aufzutauchen So l sst sich die doppelte Speicherung von Daten Redundanz vermeiden die durch Eingabefehler oder durch das Vergessen von Aktualisierungen sonst leicht zu Inkonsistenzen f hren kann Ein einfaches Beispiel macht diese theoretischen Erl uterungen verst ndlicher Stel len Sie sich vor diverse Kunden buchen verschiedene Pauschalreisen Tabelle 1 1 zeigt den untauglichen Versuch die Details der Kunden und ihrer Reisen in einer gemeinsamen Tabelle abzulegen Tabelle 1 1 Nicht relationaler Tabellenentwurf Name Vorname Wohnort Reisedatum Reiseziel Verkehrsmittel Schmitz Klaus K ln 02 06 2007 Paris Reisebus M ller Andrea Mannheim 07 06 2007 London Bahn Huber Ludwig M nchen 02 06 2007 Paris Reisebus Jansen Jutta Hamburg 10 06 2007 Rom Flugzeug Becker Peter Bonn 07 06 2007 London Bahn Schmitz Klaus K ln 05 10 2007 Istanbul Flugzeug Die Probleme sind offenkundig Mehrere Personen buchen gleiche Reisen und umgekehrt bucht eine Person zwei verschiedene Reisen Stellen Sie sich nun zum Beispiel vor die Reise nach Paris wird auf den 03 06 verlegt oder wird mit der Bahn statt mit dem Bus durchgef hrt Dann m sste die entsprechende nderung in allen Zeilen durchgef hrt werden in denen eine Paris Buchung ste
105. nahe auch Datenbanken im XML Format oder zur Spei cherung von XML Strukturen einzusetzen Diese moderneren Ans tze konnten sich bisher nicht gegen die bermacht der rela tionalen Datenbanken behaupten und es sieht auch nicht danach aus dass sich dies in n chster Zeit ndern w rde Die Standardisierung der inzwischen ISO genormten Abfragesprache SQL die Verf gbarkeit von leistungsf higen Tools und Schnittstellen sowie eine breite Basis erfahrener Datenbankadministratoren machen die relationalen Systeme auch weiterhin zur ersten Wahl Relationale Datenbanken In einem relationalen Datenbankverwaltungssystem RDBMS werden alle Daten in Tabellen abgelegt Der Name stammt daher dass die Tabellen aus mathematischer Sicht Relationen sind Jede Zeile einer Tabelle wird als Datensatz englisch Record Datenbanken 3 bezeichnet Sie enth lt in den einzelnen Spalten verschiedene Informationen ber einen einzelnen Gegenstand der in diesem Zusammenhang Entity zu Deutsch Entit t genannt wird In jeder Tabellenspalte befindet sich eine bestimmte Infor mationskategorie In der Datenbanktheorie hei t eine solche Kategorie Attribut eines Datensatzes in der Praxis wird sie auch oft als Datenfeld bezeichnet Das Interessanteste an relationalen Datenbanken ist die M glichkeit die Informa tionen in verschiedenen Tabellen miteinander zu verkn pfen Zu diesem Zweck wird jedem Datensatz einer bestimmten Tabelle ein spezielles Attribut
106. neu_flugzeug Airbus A380 CALL neu_flugzeug Tupolew Tu 144 Ein erneuter Aufruf der Prozedur zeige flugzeuge sollte danach ergeben dass alles wie erwartet funktioniert hat mysql gt CALL zeige_flugzeuge Boeing 737 800 Airbus A380 Tupolew Tu 144 Herzen geheng Wenn Sie eine Stored Procedure ndern m chten wird ALTER PROCEDURE verwendet die Syntax ist mit CREATE PROCEDURE identisch L schen k nnen Sie eine Prozedur mit DROP PROCEDURE ProzedurName Um eine Liste aller bestehenden Prozeduren zu erhalten k nnen Sie Folgendes ein geben hier in vertikaler Darstellung da die Tabellenansicht zu breit w re mysql gt SHOW PROCEDURE STATUS G L okk 1 roy PEE kkk Db flieger Name neu_flugzeug Type Definer Modified Created Security_type Comment FEE K K KE E K K K K K kK k k kK kk k k kkk F Db Name Type Definer Modified Created Security_type Comment PROCEDURE root localhost 2007 03 05 11 07 51 2007 03 05 11 07 51 DEFINER TOW FREE KK K flieger neu_hersteller PROCEDURE root localhost 2007 03 05 11 07 20 2007 03 05 11 07 20 DEFINER Stored Procedures 211 EEEE EEEE EEEE 3 roy PEE kk Db flieger Name zeige_flugzeuge Type PROCEDURE Definer root localhost Modified 2007 03 05 11 06 34 Created 2007 03 05 11 06 34 Security type DEFINER Comment Eine besondere Form der Stored Procedures sind Stored Functions Diese werden mittels CREAT
107. or information about MySQL products and services visit http www mysql com or developer information including the MySQL Reference Manual visit http dev mysql com o buy MySQL Network Support training or other products visit https shop mysql com ist of all MySQL commands lote that all text commands must be first on line and end with lt N Synonym for help lear sc Clear command onnect lt r Reconnect to the server Optional arguments are db and host elimiter d gt Set statement delimiter NOTE Takes the rest of the line as new delimiter go NG Send command to mysql server display result vertically xit Ng Exit mysql Same as quit o lt g gt Send command to mysql server elp lt h Display this help otee lt st Don t write into outfile rint Sp Print current command rompt lt R gt Change your mysql prompt uit Ng Quit mysql ehash lt N Rebuild completion hash ource lt N Execute an SQL script file Takes a file name as an argument tatus Ss Get status information from the server ee lt T gt Set outfile to_outfilel Append everything into given outfile se su Use another database Takes database name as argument harset C C Switch to another charset Might be needed for processing binlog with multi byte char ets arnings lt C W Show warnings after every statement owarning w gt Don t show warnings after every statement or server side hel
108. php gt Reisesuche lt a gt lt a href info php gt Touristeninfo lt a gt lt php if user_nummer gt 0 echo lt a href javascript logout gt Logout lt a gt else echo lt a href login php gt Login lt a gt gt lt php if user_nummer echo lt a href buchungen php gt Buchungen lt a gt gt G amp auml stebuch lt a href forum php gt Forum lt a gt lt Ende der Navigationsleiste gt lt php if mode r Lesemodus Eintr ge anzeigen echo lt h2 gt G amp auml stebuch lesen lt h2 gt Link f r Neueintrag echo lt a href gast php mode e gt Ins G amp auml stebuch eintragen lt a gt lt br gt lt br gt Abfrage f r alle Eintr ge neuester zuerst querytext SELECT DATE_FORMAT e datum d m Y H i e nick e mail e titel e inhalt FROM gb _eintraege ORDER BY e datum DESC 262 Kapitel8 Webanwendungen mit PHP und MySQL Beispiel 8 6 gast php das G stebuch des Reiseb ros Fortsetzung query conn query querytext Anzahl der Eintr ge ermitteln anzahl query gt num_rows if anzahl 0 Meldung falls keine Eintr ge vorhanden sind echo Noch keine Eintr auml ge vorhanden lt br gt else alle Eintr ge anzeigen while list datum nick mail titel text query gt fetch_row Nickname leer gt Anonymous if nick
109. rb_hotels WHERE ht_stadt stadt_nr query2 conn2 gt query sql2 query2 gt setFetchMode PDO FETCH_LAZY while row query2 gt fetch Die MySQL SchnittstelleninpHP 241 Beispiel 8 3 Liste der St dte und ihrer Hotels mit verschachtelten PDO Abfragen Fortsetzung echo lt 1i gt row gt ht_name lt li gt n Innere Verbindung schlie en conn2 null echo lt ul gt n u ere Verbindung schlie en conn1 null catch PDOException e echo Fehler e getMessage gt lt body gt lt html gt Zu guter Letzt noch ein Wort zu nderungsabfragen in PDO Wenn Sie diese mit tels query senden k nnen Sie anschlie end die Methode rowCount des PDOState ment Objekts aufrufen um die Anzahl der betroffenen Datens tze zu ermitteln Alternativ k nnen Sie nderungsabfragen mithilfe der Methode exec absetzen das Ergebnis ist dann sofort die Anzahl Hier beide Varianten im Vergleich der Ein zelzimmerpreis des Hotels Nummer 1 wird mithilfe von query vor bergehend erh ht und dann mittels exec wieder zur ckgesetzt Den aktuellen Preis zun chst auslesen query conn gt query SELECT ht_ezpreis FROM rb_ hotels WHERE ht_nr 1 ist preis query gt fetch PDO FETCH NUM echo Aktueller Preis preis lt br gt n Abfrageressource freigeben um Verbindung wiederzuverwenden query null nderungsabfrage mit query senden
110. ros laufen Es besteht eine direkte Verbindung zwi 2 Das englische Wort tier bedeutet Schicht oder Lage Datenbankgest tzte Anwendungen 7 schen dem f r den Benutzer sichtbaren Anwendungsprogramm und dem Daten bankserver Die Benutzer interagieren nur mit dem Anwendungsprogramm von der Datenbank auf die im Hintergrund zugegriffen wird bekommen sie nichts mit Anwendung Datenbankserver Flug Nr 4U 382 l Dynamische Daten Flug na nach Paris 4U 382 Paris Buchen 7 Tickets Benutzereingaben 2 Flug Tick 4U382 2 Abbildung 1 2 Two Tier Anwendung mit Datenbankserver und Benutzeroberfl che Das Beispiel in der Abbildung besteht aus zwei Arbeitsschritten Zun chst werden Daten aus einer Tabelle der Datenbank gelesen hier konkret Nummer und Ziel eines Flugs Diese Informationen stellt das Anwendungsprogramm auf dem Bild schirm dar Anschlie end kann der Benutzer hier wahrscheinlich ein Angestellter des Reiseb ros die Anzahl der Tickets eingeben die f r diesen Flug reserviert wer den sollen Diese Eingabe wird ber die Schnittstelle wieder an den Datenbankser ver geschickt der sie in einer anderen Tabelle ablegt Technisch gesehen sendet die Anwendung zun chst eine SQL Abfrage an den Datenbankserver um die Daten auszulesen Ohne auf Details einzugehen die in sp teren Kapiteln vertieft werden Bei dieser ersten Kommunikation mit dem RDBMS handelt es sich u
111. schabfragen Daten nderungsabfragen Um den Inhalt von Datens tzen zu ndern wird die SQL Anweisung UPDATE ver wendet Im Wesentlichen hat sie die folgende Syntax UPDATE Tabelle SET Spaltei Werti Spalte2 Wert2 WHERE Kriterium Sollen alle Datens tze einer Tabelle auf dieselbe Weise ge ndert werden kann die Angabe eines Kriteriums mittels WHERE entfallen Solche F lle sind eher selten Im brigen ist ein UPDATE ohne WHERE sehr gef hrlich da Sie durch das berschreiben s mtlicher Datens tze mit einem identischen Spaltenwert wichtige Daten verlieren k nnten Genau aus diesem Grund soll eine Kopie der Tabelle rb_hotels angefertigt werden damit Sie in den restlichen Abschnitten dieses Kapitels nach Belieben damit spielen k nnen Die folgenden beiden Abfragen erstellen die Kopie und machen aus ht_nr wieder einen Prim rschl ssel wenn auch ohne AUTO_INCREMENT das f r diesen Zweck nicht n tig ist mysql gt CREATE TABLE rb_hotels2 SELECT FROM rb_hotels Query OK 23 rows affected 0 18 sec Records 23 Duplicates O Warnings 0 mysql gt ALTER TABLE rb_hotels2 ADD PRIMARY KEY ht_nr Query OK 23 rows affected 0 30 sec Records 23 Duplicates 0 Warnings 0 Die Syntax von ALTER TABLE zur nderung der Tabellenstruktur wird im n chsten Abschnitt genauer beleuchtet In der neuen Tabelle soll nun als Erstes eingetragen werden dass alle Hotels ab sofort ber Zimmer mit richtigem Bad verf gen mysql gt UPDA
112. ssel Wert Schl ssel Wert Der Treiber f r MySQL hei t mysql die beiden wichtigsten Schl ssel sind host f r den Hostnamen und dbname f r den Namen der Standarddatenbank Das folgende Beispiel ist die URL f r eine Verbindung zur MySQL Datenbank reisebuero auf dem lokalen Rechner mysql host localhost dbname reisebuero Die n chsten beiden Argumente sind ebenfalls Strings sie enthalten den Daten bank Benutzernamen und das zugeh rige Passwort und funktionieren wie bei den anderen Schnittstellen Sie sind nicht f r alle Datenbanktreiber n tig aber f r MySQL durchaus Eine PDO Besonderheit ist das optionale letzte Element Sie k nnen ein assoziatives Array aus Schl ssel gt Wert Paaren hinzuf gen das diverse Optionen f r die Verbin dung festlegt Die Schl ssel sind dabei Konstanten der Klassen PDO im Format PDO KONSTANTE Die m glichen Werte vieler Konstanten sind wahr oder falsch wof r typischerweise 1 und 0 verwendet werden Die wichtigsten sind PDO ATTR_PERSISTENT gt 1 0 Wenn Sie diesen Wert auf 1 setzen wird versucht eine persistente dauerhafte Verbindung wiederzuverwenden Dies beschleunigt stark frequentierte Anwen dungen und schont ihren Ressourcenverbrauch Den Wert 0 brauchen Sie nicht explizit zu setzen da er Standard ist PDO ATTR_AUTOCOMMIT gt 1 0 Wenn die angesprochenen Tabellen Transaktionen unterst tzen bei MySQL also InnoDB Tabellen wird normalerweise standardm ig der Au
113. wenn B weg gelassen wird Logarithmus zur Basis 2 Logarithmus zur Basis 10 der Wert von 7 x Grad gt Bogenma Zufallszahl mit Random Seed N stets gleiches Ergebnis runden auf D Nachkommastellen Vorzeichen als 1 o oder 1 Sinus Quadratwurzel Tangens nach D Nachkommastellen abschneiden Beispiel CRC32 Hallo Welt gt 1344803957 DEGREES PI EXP 1 gt FLOOR 4 9 gt LN 3 gt LOG 4 8 gt 1 LOG2 1024 gt LOG10 100000 PI gt 180 2 71828 4 09861 5 10 2 3 gt 3 14159 POW 3 4 gt 81 RADIANS 180 gt 3 14159 RAND gt 0 23998 RAND 4 gt 0 1 5595 immer ROUND 1 88 gt 2 ROUND 1 88 1 SICN 7 gt 1 SICN 3 gt 1 gt 1 9 SIN PI 2 gt 1 SORT 256 gt 1 TAN 3 gt 0 1 6 4255 TRUNCATE 1 88 1 gt 1 8 a Alle trigonometrischen Funktionen nehmen Winkel im Bogenma entgegen ebenso lie funktionen Bogenma als Ergebnis Im Bogenma gilt 360 27 ern ihre Umkehr Zwischen dem Funktionsnamen und der ffnenden Klammer darf anders als in vielen Programmiersprachen kein Leerzeichen stehen andernfalls erhalten Sie eine Fehlermeldung Oft werden mehrere mathematische Funktionen miteinander kombiniert um sinn volle Ausdr cke zu bilden Das folgende Beispiel simuliert mithilfe von RAND und CEIL drei W rfe eines W rfels mysql gt SELECT CEIL RAND 6 A
114. wrap virtual gt lt textarea gt lt td gt lt tr gt lt tr gt lt td gt amp nbsp lt td gt lt td gt lt input type submit value Eintragen gt lt tr gt lt table gt lt php elseif mode s Speichermodus neuen Eintrag speichern Formularfelder auslesen nick cgi param nick mail cgi param mail titel cgi_param titel eintr cgi param eintr kein Text SOL String f r die Einf geabfrage querytext INSERT INTO gb_eintraege e datum e nick e mail e titel e inhalt VALUES NOW nick mail titel eintr Abfrage senden conn gt query querytext Hat es geklappt if conn gt affected_rows 1 echo lt br lt br Ihr Eintrag wurde erfolgreich hinzugef uuml gt lt br gt lt br gt else echo lt br lt br Aufgrund eines Fehlers konnte Ihr Eintrag leider nicht hinzugef uuml gt werden lt br lt br gt echo lt a href gast php mode r gt Eintr amp auml ge lesen lt a gt else 264 Kapitel8 Webanwendungen mit PHP und MySQL Beispiel 8 6 gast php das G stebuch des Reiseb ros Fortsetzung gt lt h2 gt Fehler lt h2 gt Ung uuml 1tiger Zugriff auf das G amp auml stebuch lt br gt lt a href gast php mode r gt Zur amp uuml ck lt a gt lt php TS lt td gt lt tr gt lt table gt l
115. x A fi http 27127 0 0 1 contest admin auswert php O Go eg L Mozilla Firefox Deutsch User Support Forum Mozilla Firefox Hilfe Plug in FAQ Gewinnspiel Auswertung Folgende Teilnehmer haben alle Fragen richtig beantwortet Teilnehmer E Mail Lieblingsstadt Klaus Kaus example com London Sabine sabine example net Istanbul Gewonnen hat Sabine sabine example net Fertig Abbildung 3 5 Ermittlung des Gewinners aus allen richtigen Einsendungen 100 Kapitel 3 Die erste Webanwendung In diesem Kapitel KAPITEL 4 Der Kommandozeilenclient mysql L pian Mit MySQL arbeiten Arbeit um der Arbeit willen ist gegen die menschliche Natur John Locke Nach dem praktischen Schnelleinstieg im vorigen Kapitel erfahren Sie in den folgen den Kapiteln ausf hrlich wie Sie MySQL Datenbanken erstellen und bearbeiten k nnen Zun chst werden in diesem Kapitel zwei wichtige Tools f r die Arbeit mit MySQL genauer behandelt der Kommandozeilenclient mysql und der Webclient phpMyAdmin Der Kommandozeilenclient mysql In den beiden vorangehenden Kapiteln haben Sie bereits intuitiv mit dem Konsolen tool mysql gearbeitet An dieser Stelle werden seine wichtigsten Funktionen syste matischer vorgestellt Einf hrung Wie Sie bereits erfahren haben wird das Programm blicherweise mit den Optionen u lt Benutzername gt und p ohne Wert f r die anschlieRende Pass
116. zugreifen darf Wenn der angegebene User nicht bereits angemeldet ist m ssen Sie auch sein Passwort angeben indem Sie User Passwort Datenbankhost zum Beispiel root geheim 192 168 0 2 schreiben Verwechseln Sie dieses Konzept nicht mit der in Kapitel 9 vorgestellten Repli kation die tats chlich lokale Livekopien entfernter Datenbanken erzeugt e BLACKHOLE Diese spezielle Engine verwirft s mtliche Daten die in ihren Tabellen gespeichert werden Datenbanken und Tabellen erstellen 145 Das folgende gek rzte Beispiel erstellt die Tabelle rb_kunden als InnoDB Tabelle CREATE TABLE rb_kunden ENGINE InnoDB Auch f r einzelne Tabellen k nnen Sie Zeichens tze und Sortierreihenfolgen ange ben Das geschieht wiederum mithilfe der Optionen DEFAULT CHARACTER SET bezie hungsweise COLLATE Das nachfolgende Beispiel stellt den Standardzeichensatz latin1 und die Sortierreihenfolge Deutsch Telefonbuch ein CREATE TABLE rb kunden DEFAULT CHARACTER SET latini COLLATE latini1_german2_ci Sogar f r einzelne Spalten ist die Angabe alternativer Zeichens tze beziehungsweise Kollationen m glich Dies ist beispielsweise n tzlich wenn Sie eine w rterbuchar tige Tabelle anlegen in der Sprachen mit verschiedenen Schriften vorkommen Das folgende Beispiel w re die passende Struktur f r eine in diesem Buch nicht weiter ausgef hrte Zusatztabelle in der Datenbank reisebuero die wichtige Begriffe und Phrasen f r das berleb
117. 0 aber nicht 6000 14 7 00 findet z B 100 oder 500 aber nicht 300 oder 800 aus findet Maus Haus oder raus aber nicht aus r aus findet raus oder aus 1 0 findet 10 110 oder 11111110 aber nicht o 10 findet 1 10 oder 1000000 0 9 5 findet deutsche Postleitzahlen 20 2 4 findet 200 2000 oder 20000 ha findet z B ha oder hahaha K ln Bonn D sseldorf findet jede der drei St dte alpha findet einen beliebigen Buchstaben er findet erleben aber nicht aber er findet aber aber nicht erleben lt welt findet hallo welt aber nicht unterwelt haus gt findet ins haus gehen aber nicht nach hause gehen In Tabelle 6 3 finden Sie s mtliche Zeichenklassen f r Klasse Konstrukte Tabelle 6 3 Zeichenklassen zur Verwendung in regul ren Ausdr cken Klasse Bedeutung alnum alphanumerische Zeichen Ziffern und Buchstaben alpha alphabetische Zeichen blank Whitespace Leerzeichen Tabulatoren entrl Steuerzeichen digit Ziffern 174 Kapitel 6 SQL Abfragen Tabelle 6 3 Zeichenklassen zur Verwendung in regul ren Ausdr cken Fortsetzung Klasse Bedeutung graph Grafikzeichen lower Kleinbuchstaben print Grafik und Leerzeichen punct Interpunktion space Leerzeichen Tabulatoren Zeilenumbr che zupper Gro buchstaben xdigit Hexadezimalziff
118. 1 3 Bios gt 2 1 Br ssel gt 2 2 London gt 2 3 Paris gt 3 1 Slowakei gt 3 2 Slowenien gt 3 3 Tschechien gt 4 1 Ljubljana gt 4 2 Istanbul gt 4 3 Oslo Die Tabelle gw_teilnehmer mit den Teilnehmerstammdaten wird folgenderma en erstellt mysql gt CREATE TABLE gw_teilnehmer gt tn_id INT AUTO_INCREMENT PRIMARY KEY gt tn_uname VARCHAR 40 gt tn email VARCHAR 50 gt tn_interest VARCHAR 40 gt Als Letztes wird die Tabelle gw_teilnahme erzeugt die die Antworten der einzelnen Spieler aufnehmen soll mysql gt CREATE TABLE gw _teilnahme gt tl tln INT gt tl frag INT gt tl antw INT 68 Kapitel3 Die erste Webanwendung Alle drei Felder sind numerisch und beziehen sich auf Felder anderer Tabellen tl_ tIn verweist auf die Teilnehmer ID tn_id den Prim rschl ssel der Tabelle gw_ teilnehmer tl_frag bezieht sich auf die Nummer der beantworteten Frage das hei t auf das Prim rschl sselfeld fr_id der Tabelle gw_fragen tl_antw schlie lich ist kein direkter Verweis sondern speichert die vom Benutzer gegebene Antwort auf die jeweilige Frage sie wird sp ter bei der Auswertung mit dem Feld fr_korrekt aus der Tabelle gw_fragen verglichen Die PHP Skripten Nachdem die Datenbank eingerichtet ist kann das Erstellen der PHP Skripten beginnen Ihre jeweiligen Aufgaben wurden weiter oben bereits erl utert Be
119. 192 kB TA Alg Anzeigen Struktur ASAL Suche Einf gen FEExportieren fjlmportieren Debak Operationen fileeren L schen gewinnspiel 4 r SQL Befehlfe in Datenbank gewinnspiel ausf hren gewinnspiel 4 SELECT FROM gu fragen WHERE 1 Felder B gw_antworten frid fr_frage fr_korrekt E gw_teilnehmer EJ Begrenzer SQL Befehl hier wieder anzeigen Neues php MyAdmin Fenster Abbildung 4 8 Der phpMyAdmin Bereich zur manuellen Eingabe von SQL Abfragen 120 Kapitel 4 Mit MySQL arbeiten Sie k nnen diese Registerkarte vor allem nutzen um die in Kapitel 6 vorgestellten SQL Auswahlabfragen auf komfortable Weise nachzuvollziehen und ihre Ergeb nisse in bersichtlicher Form zu lesen Tabellenoperationen Wenn Sie den Link Operationen am oberen Rand von Tabellenseiten anklicken k n nen Sie einige interessante nderungen an Tabellen durchf hren Abbildung 4 9 zeigt alle Optionen im berblick localhost localhost gewinnspiel gw_fragen phpMyAdmin 2 10 0 rc1 Mozilla Firefox Datei Bearbeiten Ansicht Chronik Lesezeichen Yahoo Extras Hilfe OR 24 httpijocahostiphomyadminindex php gt Cz Erste Schritte E Aktuelle Nachrichten PhpyAdmnin g Server localhost amp Datenbank gewinnspiel Tabelle gw_fragen nnoDB free 8192 kB A aje Anzeigen
120. 3 php4 und phtml hinzuf gen Haben Sie PHP nicht als Modul installiert und m chten Ihre Skripten stattdessen als CGI Anwendungen ausf hren m ssen Sie an den jeweils passenden Stellen der Konfigurationsdatei folgende Zeilen einf gen Alias php usr local php bin Action application x httpd php php php Nat rlich muss der PHP Pfad in der Alias Direktive an Ihr System angepasst wer den Beachten Sie dass Sie Apache nach der PHP Installation meist beenden und wieder starten m ssen ein einfacher Neustart gen gt nicht Anschlie end k nnen Sie PHP testen Speichern Sie die drei folgenden Zeilen in einer Datei mit der Endung php zum Beispiel info php in Ihrem Website Verzeichnis bei einer Apache Standard installation usr local apache2 htdocs lt php phpinfo gt PHP installieren 45 Wenn Sie dieses Dokument nun ber http localhost info php in einem Browser ff nen wird eine umfangreiche bersicht ber die aktuelle PHP und Apache Konfi guration angezeigt Beachten Sie dass Sie PHP Dokumente nicht als lokale Dateien im Browser ffnen k nnen es ist ein Webserver erforderlich der den PHP Code ausf hrt Installation unter Windows F r Windows wird PHP in zwei Varianten angeboten als Installer und als ZIP Archivdatei Der Installer konnte bis vor Kurzem nur die CGI Variante installieren Inzwischen enth lt er auch experimentelle Unterst tzung f r die automatische Installation als
121. 5 welche Pakete Sie auf einem openSUSE 10 2 System f r eine vollst ndige LAMP Umgebung aktivieren m ssen Wenn Sie auf einem Unix System die Quellcode Pakete der Hersteller installieren m chten brauchen Sie einen ANSI konformen C Compiler gcc eignet sich beson ders gut da er wahrscheinlich am h ufigsten getestet wurde Er ist in praktisch jeder Linux oder Unix Distribution enthalten wird aber bei einer Standardinstalla tion oft nicht mitinstalliert Bem hen Sie also gegebenenfalls den Paketmanager und die Hilfedateien Ihrer Distribution Unter openSUSE 10 2 k nnen Sie zum Bei spiel YaST verwenden siehe oben genannten Kasten um mithilfe der Suchfunk tion folgende Pakete zu finden und nachzuinstallieren e gcc e gCC C e glibc devel e Flex e libxml2 devel 16 Kapitel2 Installation und Inbetriebnahme F r Windows Rechner werden fast durchweg Installer Pakete angeboten die Ihnen per mehrseitigem Dialog den Weg durch die Installation weisen Manche Software wird dagegen in einem ZIP Archiv geliefert in diesem Fall muss das Verzeichnis in das Sie es entpacken oft in eine Konfigurationsdatei eingetragen werden u Den fr heren Privatkunden Windows Versionen 95 98 ME fehlt eine wichtige Eigenschaft f r den Betrieb von Serversoftware n m lich die Unterst tzung sogenannter Dienste die im Hintergrund ausgef hrt werden Wenngleich einige der hier besprochenen Server anwendungen dies auf verschiedene Art k
122. 54 Klausel 76 Kommandozeilenclient 41 101 Konfiguration 283 Konfigurationsdateien 298 LIKE Klausel 146 171 LIMIT Klausel 166 Lizenzen 10 LOAD DATA INFILE Anweisung 296 Logdateien 299 logische Operatoren 177 L schabfragen 198 make_binary_distribution Hilfsprogramm 290 mathematische Funktionen 185 MAX Funktion 192 MEMORY Tabellentyp 144 MIN Funktion 192 Mustervergleiche 171 MyISAM Tabellentyp 144 myisamchk Hilfsprogramm 290 mysql Kommandozeilenclient 101 mysaql server Startskript 290 I I I I I I MySQL Fortsetzung mysql_fix_privilege_tables Skript 290 mysql_install_db Skript 290 mysqladmin Hilfsprogramm 294 mysqlbug Hilfsprogramm 290 mysqld Optionen 291 mysqld Server Programm 289 mysqld_multi Startskript 290 mysqld_safe Startskript 289 mysqld_safe Optionen 292 mysqld max Server Programm 289 mysqldump Hilfsprogramm 108 295 mysqlmanager Hilfsprogramm 290 NOT Operator 177 NOT LIKE Klausel 172 NOW Funktion 150 NUMERIC Datentyp 149 OLD_PASSWORD Funktion 287 Operatoren 167 Optionen phpMyAdmin 112 OR Operator 177 ORDER BY Klausel 183 PASSWORD Funktion 287 Perl API f r 309 PREPARE Anweisung 206 Prepared Statements 206 Prim rschl ssel 154 PRIMARY KEY 154 Programme 289 REAL Datentyp 149 REGEXP Klausel 173 RENAME USER Anweisung 284 Replikation 301 RETURN Anweisung 212 RETURNS Klausel 212 REVOKE Anweisung 286 ROLLBACK TO SAVEPOINT 201 ROLLBAC
123. 55 ALTER VIEW MySQL Anweisung 205 AND MySQL Operator 177 333 nderungsabfrage Daten 194 Struktur 196 Apache Webserver 22 Alias Direktive 32 Allow Direktive 31 AllowOverride Direktive 31 AuthBasicProvider Direktive 97 Authentifizierung 95 AuthName Direktive 97 AuthType Direktive 97 AuthUserFile Direktive 97 automatisch starten 26 Deny Direktive 31 Directory Direktive 30 DirectoryIndex Direktive 32 Direktiven 28 DocumentRoot Direktive 30 htaccess Datei 31 97 htpasswd Tool 96 Installation Linux 23 Installation Windows 26 Installation Windows Vista 26 Konfiguration 28 Listen Direktive 29 LoadModule Direktive 29 lt Location gt Direktive 31 Loopback Betrieb 30 Module 23 Options Direktive 31 Order Direktive 31 Passwortschutz 95 PHP Modul Linux 45 PHP Modul Windows 47 ServerAdmin Direktive 29 ServerName Direktive 30 ServerRoot Direktive 29 Sites ver ffentlichen 95 appendChild DOM 250 ARCHIVE MySQL Tabellentyp 145 arithmetische Operatoren MySQL 185 array PHP Funktion 220 array_push PHP Funktion 87 Arrays PHP 87 220 AS MySQL Klausel 165 ASIN MySQL Funktion 185 ATAN MySQL Funktion 185 atomar 132 Attribut 4 Entity Relationship Modell 129 Ausdr cke MySQL 184 auskunft php PHP Skript 273 Auswahlabfrage 43 75 163 sortieren 183 AuthBasicProvider Apache Direktive 97 Authentifizierung Apache Webserver 95 AuthName Apache Direktive 97 AuthType Apache Direkti
124. ALTER VIEW Anweisung 205 arithmetische Operationen 185 Ausdr cke 184 Auswahlabfrage 75 AUTO_INCREMENT Eigenschaft 68 Benutzervariablen 207 CALL Anweisung 209 COMMIT Anweisung 200 CREATE DATABASE Anweisung 42 66 142 303 CREATE FUNCTION Anweisung 212 CREATE INDEX Anweisung 155 CREATE PROCEDURE Anweisung 209 CREATE TABLE Anweisung 42 67 143 304 CREATE TRIGGER Anweisung 213 CREATE VIEW Anweisung 203 Datentypen 147 DEALLOCATE PREPARE Anweisung 208 DELETE Anweisung 198 306 DESCRIBE Anweisung 107 DISTINCT ROW Klausel 166 DROP DATABASE Anweisung 198 DROP PROCEDURE Anweisung 211 DROP TABLE Anweisung 198 305 DROP TRIGGER Anweisung 214 DROP VIEW Anweisung 206 Einf geabfrage 68 Entwicklung 3 ENUM Datentyp 42 EXECUTE Anweisung 206 FOREIGN KEY Klausel 157 Funktionen 184 Gro und Kleinschreibung 42 GROUP BY Klausel 192 IF Anweisung 210 INSERT Anweisung 42 68 160 305 Klausel 76 L schabfragen 198 mathematische Funktionen 185 PREPARE Anweisung 206 ROLLBACK Anweisung 200 SELECT Anweisung 43 75 163 305 SHOW DATABASES Anweisung 107 SHOW TABLES Anweisung 107 START TRANSACTION Anweisung 200 Unterabfrage 192 UPDATE Anweisung 194 306 USING Klausel 207 VARCHAR Datentyp 42 Variablen 207 WHERE Klausel 43 SQL Dateien mysql Client 108 SORT MySQL Funktion 186 Standard MySQL Variante 12 START SLAVE MySQL Anweisung 302 START TRANSACTION MySQL Anwei sung 200 status Ajax 252 STATUS m
125. ATE_ADD 2007 04 02 INTERVAL 2 MONTH DATE _ADD 2007 04 02 INTERVAL 2 MONTH 2007 02 02 mysql gt SELECT DATE_SUB 2007 04 02 INTERVAL 2 MONTH DATE _SUB 2007 04 02 INTERVAL 2 MONTH 2007 02 02 Die wichtigsten Arten von Zeitintervallen sind SECOND Sekunden MINUTE Minu ten HOUR Stunden DAY Tage MONTH Monate und YEAR Jahre Erst seit MySQL 5 0 stehen WEEK Wochen und QUARTER Quartale zur Verf gung DATE_FORMAT Datum Formatstring erm glicht die beliebige Formatierung einer Zeit angabe oder ihrer Bestandteile Diese SQL Funktion hnelt der PHP Funktion date oder dem gleichnamigen Unix Systembefehl ihre Kenntnis ersetzt im Grunde alle einzelnen Extrahierungsfunktionen wie DAY Datum zur Ermittlung des Tages im Monat Tabelle 6 6 f hrt alle wichtigen Platzhalter f r Formatstrings auf Tabelle 6 6 Platzhalter f r Datumsformate in MySQL Platzhalter Bedeutung a Wochentag Abk rzung Sun bis Sat b Monat Abk rzung Jan bis Dec C Monat numerisch 0 bis 12 D Tag mit englischem Suffix 1st 2nd 3rd usw d Tag des Monats numerisch zweistellig 00 bis 31 SQL Ausdr cke und Funktionen 189 T
126. AUTO INCREMENT Einstellungen und manche Indizes nicht bernommen Zudem wer den manche Datentypen falsch kopiert berpr fen Sie das Ergebnis auf jeden Fall ganz genau Sie k nnen auf diese Weise nicht nur bestehende Tabellen kopieren sondern auch beliebige Abfrageergebnisse als neue Tabellen anlegen N heres ber die vielf ltigen M glichkeiten von SELECT Abfragen erfahren Sie im n chsten Kapitel Zur Tabellenerstellung geh ren auch die MySQL Datentypen sowie Schl ssel und Indizes sie werden in den n chsten beiden Abschnitten behandelt Daneben gibt es noch weitere Tabellenoptionen die aber nicht ganz so wichtig sind Die vollst n dige Liste finden Sie im Abschnitt 13 1 5 der offiziellen MySQL Dokumentation Verzeichnis docs auf der beiliegenden CD MySQL Datentypen Die zul ssigen Datentypen f r Felder in MySQL Tabellen entsprechen bis auf wenige Ausnahmen dem SQL Standard Es gibt folgende Gruppen von Datentypen e sanzzahlige Typen e Flie kommatypen e Datum und Uhrzeit e Zeichenketten e Text und Bin rdatenbl cke e Aufz hlungstypen geografische geometrische Typen GIS dieses Thema geht ber den Umfang des vorliegenden Buchs hinaus in Anhang D finden Sie die URL einer Website zu diesem Thema Ganzzahlige Typen Der Standardtyp f r ganzzahlige Werte ist INT Es handelt sich um einen 32 Bit Integer der Werte zwischen 2 147 483 648 und 2 147 483 647 annehmen kann Mit der speziellen Option UNSIG
127. Auflage 2007 Die Darstellung eines Eimers im Zusammenhang mit dem Thema MySQL mit PHP ist ein Warenzeichen des O Reilly Verlags Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie detaillierte bibliografische Daten sind im Internet ber http dnb ddb de abrufbar Lektorat Inken Kiupel K ln Korrektorat Sibylle Feldmann D sseldorf Satz Tim Mergemeier reemers publishing services gmbh Krefeld www reemers de Umschlaggestaltung Michael Oreal K ln Produktion Karin Driesen K ln Belichtung Druck und buchbinderische Verarbeitung Druckerei K sel Krugzell www koeselbuch de ISBN 13 978 3 89721 717 1 Dieses Buch ist auf 100 chlorfrei gebleichtem Papier gedruckt Inhalt Vorwort zur 2 Auflage 22222cccceeeeeeeeeeeeeeeeenn vi 1 Einf hipies s as see 1 Datenbanken a tern ie ee er nen erde 1 Datenbankgest tzte Anwendungen 222cceeseeeeeeeennnenn 6 Grundlegendes zu MySQL 2222222cceeeeeeeneeeeneneeen 10 2 Installation und Inbetriebnahme 222222ecsce0 15 Zu Unrecht gef rchtet das Arbeiten mit der Konsole 17 Apache 2 installieren und konfigurieren 2 222222 2222 eeeeeennn 22 MySQL inst llieren 2222 22 ern Are le 33 PHP installieren sus hrs ae enr aha R n 43 phpMyAdmin einrichten casinu snein i ian a e a a a 56 3 Die erste Webanwendung
128. Class forName com mysql jdbc Driver catch ClassNotFoundException e System out println MySQL ConnectorJ nicht gefunden Ergebnisvariablen String airport String kuerzel String land JavaJDBC 311 try Verbindung herstellen Connection conn DriverManager getConnection jdbc mysql localhost reisebuero rbuser R3153n Statement f r Abfragen Statement st conn createStatement Abfragetext String gtext SELECT ai_name ai kuerzel la_name FROM rb airlines INNER JOIN rb_laender ON ai land 1la_nr Abfrage senden ResultSet rs st executeQuery gtext Ergebnis in einer Schleife ausgeben while rs next airport rs getString ai name kuerzel rs getString ai_kuerzel land rs getString la_name System out println airport kuerzel land Statement und Verbindung schlie en st close conn close catch SOLException e System out println Datenbankfehler Die MySQL Schnittstelle in Ruby Die objektorientierte Skriptsprache Ruby Informationen und Download unter http www ruby lang org besitzt eine optionale MySQL Schnittstelle sie hnelt stark der PHP Schnittstelle mysqli Das Folgende ist eine hier an das Reiseb ro Beispiel angepasste Kurzfassung des entsprechenden Abschnitts aus meinem Buch Praxis wissen Ruby das 2007 ebenfalls in der vorliegenden O Reilly Buchreihe erschienen ist u
129. E FUNCTION erstellt und geben einen Wert zur ck Der Datentyp dieses Werts muss mithilfe einer RETURNS Klausel angegeben werden die eigentliche Wert r ckgabe erfolgt mittels RETURN Anweisung Stored Functions k nnen nicht auf Datens tze aus Tabellen zugreifen sondern nur auf ihre Eingabeparameter und dar aus berechnete Werte Hier ein ganz einfaches Beispiel das die beiden numerischen Eingabewerte addiert und die Summe zur ckgibt CREATE FUNCTION summe z1 INT z2 INT RETURNS INT BEGIN RETURN z1 z2 END Eine weitere Besonderheit Da in Stored Functions ausschlie lich Eingabeparameter erlaubt sind wird die Parameterart nicht durch ein Schl sselwort gekennzeichnet Der Aufruf einer solchen Funktion erfolgt nicht durch CALL sondern im Kontext eines beliebigen Ausdrucks vorausgesetzt der Datentyp passt zur Umgebung Hier als Beispiel eine SELECT Abfrage die summe verwendet mysql gt SELECT summe 10 20 summe 10 20 30 Trigger Ein Trigger ist eine SQL Anweisung oder eine Abfolge von Anweisungen die auto matisch vor oder nach einer bestimmten Daten nderungsabfrage aufgerufen wird Somit erm glichen Trigger die Ausf hrung zus tzlicher Arbeitsschritte nach dem Einf gen ndern oder L schen von Daten Sinnvolle Anwendungen sind beispiels weise Plausibilit tskontrollen f r eingef gte Werte oder eine komplexere Bearbei tung von Fremdschl
130. ER TABLE die wichtigsten Aspekte ihrer Syntax lauten folgenderma en ALTER TABLE Tabellenname ADD COLUMN Spaltenname Typ Optionen FIRST AFTER Spaltenname DROP COLUMN Spaltenname CHANGE COLUMN Spaltenname NeuerSpaltenname Typ Optionen FIRST AFTER Spaltenname ADD INDEX Indexname Indextyp Spaltenname DROP INDEX Indexname ADD PRIMARY KEY Spaltenname DROP PRIMARY KEY RENAME TO NeuerTabellenname Zum Ausprobieren dieser Optionen sollten Sie wieder die im vorigen Abschnitt erstellte Tabellenkopie rb_hotels2 benutzen ADD COLUMN f gt eine zus tzliche Spalte hinzu das Schl sselwort COLUMN selbst ist brigens stets optional FIRST bedeutet dass die neue Spalte ganz links eingef gt wird mit AFTER Spaltenname k nnen Sie dagegen eine bestimmte Spalte angeben hinter der sie erscheinen soll Wenn Sie keine Angabe machen wird die neue Spalte ans Ende gesetzt Das folgende Beispiel f gt hinter ht_mahlzeit eine neue Spalte namens ht_lang hinzu ein SET mit den garantiert im jeweiligen Hotel gesprochenen Fremdsprachen ALTER TABLE rb_hotels2 ADD COLUMN ht_lang SET de en fr es it AFTER ht_mahlzeit Eine DESC RIBE Anweisung hier manuell gek rzt damit sie in den Satzspiegel passt zeigt dass es funktioniert hat mysql gt DESC rb_hotels2 Field Type Null Key Default Ext
131. Event Handler Dabei handelt es sich um spezielle Attribute von HTML Tags Beispielsweise k nnen Sie dem lt body gt Tag die Attribute onload und onunload Clientseitiges Scripting mit JavaScript und Ajax 245 hinzuf gen um JavaScript unmittelbar nach dem Laden der aktuellen beziehungs weise als Letztes vor dem Laden einer anderen Seite auszuf hren beispielsweise lt html gt lt head gt lt title gt JavaScript Gru amp szlig und Abschied lt title gt lt head gt lt body onload alert Herzlich Willkommen onunload alert Auf wiedersehen gt lt a href http www mysql com gt Infos amp uuml ber MySQL lt a gt lt body gt lt html gt Sobald diese Seite geladen wird erscheint ein Pop up Dialog mit dem Gru Herz lich willkommen Erst wenn Sie OK anklicken k nnen Sie die Seite verwenden Auch beim Klick auf den Link Infos ber MySQL oder bei Eingabe einer neuen URL wird ein solcher alert Dialog ausgef hrt Die restlichen wichtigen Event Handler werden in HTML Formularen eingesetzt F r Textfelder stehen zum Beispiel die Event Handler onchange Text nderung onkeyup Tastendruck onfocus Aktivierung per Mausklick oder Tab und onblur Deaktivierung zur Verf gung Auch ein spezielles Element mit dem Schema lt input type button value Beschriftung gt kommt im Zusammenhang mit JavaScript h ufig zum Einsatz Es sieht aus wie ein Submit oder Reset Button Es besitzt den H
132. Excel ben tigt e CSV Daten produziert ebenfalls CSV Dateien allerdings in einer allgemeineren Version die von einigen anderen Programmen importiert werden kann e XML speichert die Datenbank und ihre Tabellen als XML Dokument genau wie die bereits erw hnte mysqldump Option xml Import und Export von Tabellendaten 297 localhost localhost reisebuero rb_kunden phpMyAdmin 2 10 0 rc1 Mozilla Firefox Datei Bearbeiten Ansicht Chronik Lesezeichen Yahoo Extras Hilfe e Gb Ak http iocalhost phpmyadminy Ele acoge Erste Schritte B Aktuelle Nachrichten Php yAdmin g Server localhost amp Datenbank reisebuero amp Tabelle rb_kunden innoDB free 12288 kB 4 me Anzeigen Struktur ASAL Suche Einf gen Exportieren flmportieren 3 Operationen WLeeren L schen Datenbank reisebuero 13 4 nn Dump Schema der Tabelle anzeigen reisebuero 13 r Exportieren rSQL Optionen airl hotel_orte o CSV Daten Individuelle Kommentare f r den Kopfbereich n erzeugt einen B rb_airlines Zeilenumbruch E rb_airports O CSV Daten f r MS B rb_buchungen Excel B rb_fluege OExpor in einer Transaktion zusammenfassen E rb_flugstrecken DFremdschl ssel berpr fung deaktivieren B rb_hotels Microsoft Excel z SQL Kompatibilit tsmodus B rb_kunden 2000 B rb_kundenkontakte NONE 4 B J7725 O Microsoft Word E rb_staedte 2000 r Struktur
133. Funktionen zum Beispiel CONCAT TRIM SUBSTRING e Datums und Uhrzeitfunktionen zum Beispiel DATE_ADD und DATE_FORMAT e Aggregatfunktionen zum Beispiel SUM MAX COUNT f r einzelne Daten gruppen mittels GROUP BY Spalte Daten nderungsabfragen UPDATE Datenbank Tabelle SET Spaltei Werti Spalte2 Wert2 WHERE Kriterium L schabfragen DELETE FROM Datenbank Tabelle WHERE Kriterium AE Bei UPDATE und DELETE Abfragen m ssen Sie darauf achten dass Sie auf keinen Fall die WHERE Klausel vergessen andernfalls werden alle Datens tze der Tabelle ge ndert beziehungsweise gel scht Informationen und Organisatorisches Standarddatenbank festlegen USE Datenbank Aktuelle Standarddatenbank anzeigen SELECT DATABASE 306 Anhang A Kurzreferenz Die Namen aller Datenbanken des MySQL Servers anzeigen optional nur diejeni gen die dem angegebenen LIKE Suchmuster entsprechen SHOW DATABASES LIKE Muster Die Namen aller Tabellen der Standarddatenbank anzeigen SHOW TABLES LIKE Muster Die Struktur einer Tabelle anzeigen DESC RIBE Tabellenname Eine CREATE Anweisung anzeigen die die angegebene Tabelle erstellen w rde SHOW CREATE TABLE Tabellenname MySQL Funktionen in PHP Tabelle A 1 zeigt eine bersicht ber die verschiedenen Funktionen beziehungs weise Methoden der beiden Schnittstellen mysql und mysqli Tabelle A 1 Die wichtigsten Elemente der Schni
134. Halbpension oder Vollpension e Postanschrift des Hotels e URL der Hotel Website Die Spalten Stadt und Postanschrift sind brigens keineswegs redundant Die Stadt muss separat gespeichert werden weil sie das f r die Buchung relevante Reiseziel darstellt w hrend die Postanschrift lediglich eine hilfreiche Kundeninformation ist Um Flug und Hotelangebote miteinander in Einklang zu bringen ist es im brigen sinnvoll nicht den Namen der Stadt zu speichern sondern einen Bezug auf eine St dte Tabelle Es zeigt sich also dass f r die Hotelinformationen der Zugriff auf eine weitere Tabelle erforderlich ist Der genaue Aufbau dieser fremden Tabelle tut hier noch nichts zur Sache sie enth lt zus tzliche Touristeninformationen ber die einzelnen St dte und wird weiter unten vorgestellt Wichtig ist hier nur dass sie ein automatisch durchnummeriertes Feld als Prim rschl ssel enth lt der jeweilige Wert dieses Felds bildet den Eintrag in der Stadt Spalte der Hotel Tabelle Der n chste Schritt besteht darin sich zu berlegen welchen Datentyp die einzel nen Spalten besitzen sollen Genaueres ber die MySQL Felddatentypen erfahren Sie weiter unten hier geht es zun chst um eine allgemeine eher intuitive Entschei dung Sie basiert auf der Frage welche Arten von Daten in den einzelnen Feldern gespeichert werden sollen Diese berlegung stellt sich f r die geplanten Felder wie folgt dar e Index Die automatische Durchnummerierung AU
135. Hotels In der Tabelle rb_hotels ist lediglich ein Verweis auf die jeweilige Stadt in rb_staedte gespeichert diese Tabelle speichert das Land als Relation auf rb_laender L sen l sst sich das Problem nat rlich trotzdem und zwar mithilfe der folgenden etwas komplexeren Abfrage wobei in diesem Fall bekannt ist dass Deutschland durch die Nummer 1 bezeichnet wird 184 Kapitel6 SQL Abfragen mysql gt SELECT ht_name AS Hotel st_name AS Stadt gt ht_ezpreis 1 19 AS EZ Netto gt ht_dzpreis 1 19 AS DZ Netto gt FROM rb_hotels INNER JOIN rb_staedte gt ON ht_stadt st_nr AND st_land 1 EZ Netto Bergerhof Hotel Colonia Stadt K ln K ln Hotel Eichenhof Berlin Neben der hier verwendeten Division Netto Berechnung nicht geeignet 120 DIV 1 19 ergibt nicht 103 sondern 120 DZ Netto 100 8403 163 8655 109 2437 stellt MySQL nat rlich auch die anderen bekannten arithmetischen Operationen zur Verf gung Addition Subtraktion und Multiplikation Zus tzlich existiert noch der Operator DIV zur ganzzahli gen Division Beachten Sie dass er nicht nur das Ergebnis sondern auch die Ope randen mathematisch korrekt zu ganzen Zahlen rundet Daher ist er f r die obige Die Modulo Operation MOD oder kurz liefert den Rest einer ganzzahlig
136. INCLUDE_PATH Include Dateien sucht doc_root S Stammverzeichnis f r PHP Skripten in der Regel PFAD1 PFAD2 Apache DocumentRoot user_dir VERZEICHNIS NULL Benutzerverzeichnis mit PHP Dateien home USER extension_dir PFAD Umgebungsvariable Verzeichnis f r PHP Extensions PHP_EXTENSION_DIR extension PFAD diverse angegebene Erweiterung laden bei relativer Pfadangabe aus extension_dir file_uploads o 1 Sy 1 erlaubt Datei Uploads upload_tmp_dir PFAD NULL Systemvor tempor res Upload Verzeichnis gabe upload max_filesize 2M maximale Gr e f r Upload Dateien M K B a Sinnvoll im Zusammenhang mit der Apache Direktive UserDir die benutzerspezifische Websites wie http www test local username zul sst Siehe http httpd apache org docs 2 0 mod mod_userdir html Den MySQL Zugriff konfigurieren und testen Die Kommunikation zwischen PHP und dem MySQL Server erfolgt aufgrund einer Benutzeranmeldung Benutzername und Passwort sind Parameter der PHP Funk tionen f r die Datenbankverbindung Einen solchen Benutzer m ssen Sie zun chst einmal erstellen aus Sicherheitsgr nden sollten Sie nicht das MySQL Administra torkonto root einsetzen Angenommen Sie m chten einen Benutzer namens phpuser mit dem Passwort PHP4ever einrichten der alle Operationen an der Testdatenbank geotest vorneh PHP installieren 49 men darf ffnen Sie dazu den Kommandozeilenclient mysql siehe oben und ge
137. In der ersten Zeile werden Links auf die aktuelle Hierarchie aus Host Datenbank und Tabelle angezeigt Die zweite Zeile enth lt Links auf diverse Seiten zur Tabellenbearbeitung e Anzeigen Stellt die Inhalte der Tabelle mit Bl tter und Sortierm glichkeiten dar standardm ig je 30 Datens tze pro Seite e Struktur aktuelle Seite Stellt den Grundaufbau aber nicht den Inhalt der Tabelle dar e SQL Erm glicht die manuelle Eingabe oder den Datei Upload von SQL Abtra gen Auf der Struktur Seite befindet sich ebenfalls ein solches Formular das in K rze beschrieben wird phpMyAdmin 115 3 localhost localhost gewinnspiel gw_fragen phpMyAdmin 2 10 0 rc1 Mozilla Firefox Datei Bearbeiten Ansicht Chronik Lesezeichen Yahoo Extras Hilfe amp RR A hetn IMocahest phemyadninindex ohe gt C ss amp Erste Schritte E Aktuelle Nachrichten PhpMlyAd nin g Server localhost Datenbank gewinnspiel m Tabelle gw_fragen innoDB free 8192 kB AEN Anzeigen Struktur SAL Suche Einf gen fBiExportieren fEilmportieren 2Operationen Leeren L schen Datenbank PEADEREIEN Feld Typ Kollation Attribute Null Standard Extra oO frid int 11 Nein auto_increment 2 O fr frage varchar 80 latini_swedish_ci Ja NULL B 2 A O fr korrekt int 11 Jda NULL E 2 E gw_teilnahme t Alle ausw hlen Auswahl entfernen markierte 2 X M D E gu teilnehmer gewinn
138. K Anweisung 200 root Passwort 41 Ruby Schnittstelle f r 312 Rundungsfunktionen 186 Sakila 11 SAVEPOINT Anweisung 201 Schl ssel 153 Schnittstellen inPHP 229 SELECT Anweisung 43 75 163 305 SET Datentyp 153 SET NAMES Anweisung 103 SET PASSWORD Anweisung 41 50 287 SHOW COLLATION Anweisung 168 Index 341 MySQL Fortsetzung SHOW CREATE TABLE Anweisung 307 SHOW DATABASES Anweisung 107 307 SHOW MASTER STATUS Anweisung 301 SHOW PROCEUDRE STATUS Anweisung 211 SHOW TABLES Anweisung 107 307 SHOW TRIGGERS Anweisung 214 Skripten 289 Spalten ndern 197 Spalten hinzuf gen 196 Spalten l schen 197 START SLAVE Anweisung 302 START TRANSACTION Anweisung 200 Stored Functions 212 Stored Procedures 208 String Datentypen 150 String Funktionen 187 SUM Funktion 192 Tabellen l schen 198 Tabellenstruktur ermitteln 107 TEXT Datentyp 151 Textblock Datentypen 151 TIME Datentyp 150 TIMESTAMP Datentyp 150 Transaktionen 199 TYPE Klausel 143 NIQUE Index 154 NIX_TIMESTAMP Funktion 191 NSIGNED Typoption 147 nterabfrage 192 nternehmen 10 pdatable Views 204 PDATE Anweisung 194 306 SE Anweisung 306 SING Klausel 207 VARBINARY Datentyp 151 VARCHAR Datentyp 42 151 Variablen 207 Varianten 12 Verbindung PHP 50 verf gbare Datenbanken 107 verf gbare Tabellen 107 Vergleichsoperatoren 167 VERSION Funktion 164 ae au ae ara GE G GEHN GEN en MySQL Fortsetzung Views 203 Vor und
139. L schen Datenbank Tabelle gewinnspiel 4 amp 3 Eintr geY Typ Kollation Gr e berhang 12 InnoDB latini_swedish_ci 16 0 KiB 4 InnoDB latinI_swedish_ci 16 0 KiB gw_teilnahme 12 InnoDB latini_swedish_ci 16 0 KiB a an gw_teilnehmer 4 InnoDB latini_swedish_ci 16 0 KiB E gw_teilnahme 4 Tabellen 32 InnoDB latini_swedish_ci 64 0 KiB LIOHLLENLD t_ Alle ausw hlen Auswahl entfernen markierte x amp Druckansicht h Strukturverzeichnis gw_antworten gw_fragen gewinnspiel 4 ua gu ga uge amp 3 Neue Tabelle in Datenbank gewinnspiel erstellen Name Anzahl der Felder Neues phpMyAdmin Fenster Abbildung 4 4 bersichtsseite einer Datenbank in phpMyAdmin diesem Buch verwendet wird oder auch im Microsoft Internet u Explorer werden die Funktionen aller phpMyAdmin Schaltfl chen als Tooltipps angezeigt sobald Sie mit der Maus dar berfahren S mtliche Schaltfl chenbezeichnungen im vorliegenden Buch bezie hen sich auf diese Tooltipps u In vielen Browsern zum Beispiel in Firefox der f r die Beispiele in Tabellenoptionen Wenn Sie im linken Frame eine Tabelle ausw hlen sieht der Hauptframe so aus wie es in Abbildung 4 5 f r die Tabelle gw_fragen gezeigt wird Die Seite entspricht der Auswahl Struktur auf der Hauptseite einer Datenbank Ganz oben auf der Seite befinden sich einige Links auf wichtige Datenbankbereiche und Tabellenoptionen
140. MySQL Anweisung 42 66 106 306 SING MySQL Klausel 207 SG Ge GGG er V VALUES INSERT Klausel 160 VARBINARY MySQL Datentyp 151 VARCHAR MySQL Datentyp 42 151 Variablen MySQL 207 PHP 216 Stored Procedures 210 Variablensubstitution PHP 216 Vergleichsoperatoren MySQL 167 Versandmethoden Formulare 72 Verschl sselung MySQL Passw rter 287 VERSION MySQL Funktion 164 Verzeichnisstruktur 19 Vierte Normalform 135 Views 203 ndern 205 l schen 206 Updatable Views 204 Volltextsuche 154 Vor und Nachteile von MySQL 11 Ww WAMP System 11 Installation 15 Webanwendungen 8 Problem der Persistenz 10 statt Desktop Programmen 9 testen 98 Website Authentifizierung 95 Indexdokument Startseite 32 ver ffentlichen 95 Weiterleitung HTTP 81 WHERE Klausel 43 166 in DELETE Abfragen 198 in UPDATE Abfragen 195 while PHP Anweisung 219 Widenius Michael Monty VII 10 Windows Apache Installation 26 Dateisystem 19 Eingabeaufforderung starten 17 Konsolenbefehle 21 Laufwerk wechseln 20 MySQL Installation 36 PHP Installation 46 Prompt 18 348 Index Windows 9x Probleme 17 Windows Vista Apache Installation 26 X XAMPP 17 XML Antwort Ajax 252 XMLHttpRequest Objekt Ajax 251 XOR MySQL Operator 178 Y YaST 55 YEAR MySQL Datentyp 150 Z Zeichenkette siehe String Zeichensatz MySQL Clients 103 Unix Terminals 103 Windows Eingabeaufforderung 103 Zeichensatz bei Datenbankerstel
141. MySQL Command Line Shell ist der Kommandozeilenclient siehe Kapitel 4 die MySQL Command Line Utilities sind zus tzliche Administrationstools die vor allem in Kapitel 9 beschrieben werden und die auf den n chsten Seiten behandelte MySQL Server Instance Config dient der Einrichtung des Servers nach der Installation Alle drei Kom ponenten sind f r den erfolgreichen Betrieb eines MySQL Servers und zum Durcharbeiten dieses Buchs unerl sslich Der MySQL Instance Manager ist ein 36 Kapitel 2 Installation und Inbetriebnahme neueres Kommandozeilentool das ebenfalls in Kapitel 9 angesprochen wird Die Documentation die vollst ndige MySQL Dokumentation in diversen Dateiformaten k nnen Sie weglassen wenn Sie Platz sparen m chten sie ist jederzeit online unter http dev mysql com doc mysgql verf gbar Die Developer Components schlie lich werden seltener ben tigt sie dienen speziellen Ent wicklungsaufgaben Die C Include Files Lib Files erm glichen den Zugriff auf MySQL Datenbanken aus eigenen C oder C Programmen heraus Scripts Examples stellt einige Beispiele f r die verschiedenen Programmieraufgaben bereit Mit einem Klick auf Change l sst sich au erdem das Installationsverzeichnis ndern eine gute Wahl ist etwa C MySQL 4 Install wenn Sie Ihre Auswahl best tigen wird nun die eigentliche Installation durchgef hrt 5 Signup zum Schluss k nnen Sie sich freiwillig f r die Website MySQL com re
142. N ht_ezpreis AVG ht_ezpreis gt FROM rb_hotels MAX ht_ezpreis MIN ht_ezpreis AVG ht_ezpreis 130 40 80 8696 Nat rlich n tzen H chst und Tiefstpreise nicht viel wenn Sie nicht wissen um welches Hotel es sich jeweils handelt Allerdings f hrt der folgende Ansatz zu einer Fehlermeldung mysql gt SELECT ht_name MIN ht_ezpreis FROM rb_hotels ERROR 1140 42000 Mixing of GROUP columns MIN MAX COUNT with no GROUP columns is illegal if there is no GROUP BY clause Da Aggregatfunktionen die Aufgabe haben Daten zu gruppieren k nnen sie nicht gemeinsam mit einem einzelnen Wert ausgew hlt werden Die L sung bringt erst eine Unterabfrage mysql gt SELECT ht_name ht_ezpreis FROM rb_hotels gt WHERE ht_ezpreis SELECT MIN ht_ezpreis FROM rb_hotels ht_name ht_ezpreis Hotel Solidarnosc 40 blicher und einfacher ist es dagegen die Aggregatfunktionen tats chlich zur Gruppierung von Informationen einzusetzen Dazu wird die gew nschte Spalte mit hilfe einer GROUP BY Klausel zusammengefasst Das folgende Beispiel zeigt wie viele Hotels jeweils ber eine bestimmte Badausstattung verf gen
143. NED vorzeichenlos sind Werte von 0 bis 4 294 967 295 m glich Neben INT definiert MySQL weitere ganzzahlige Typen wie SMALLINT und BIGINT Tabelle 5 4 zeigt eine bersicht mit den entsprechenden Bitbreiten und Wertebereichen MySQL Datentypen 147 Tabelle 5 4 Bitbreiten und Wertebereiche der verschiedenen ganzzahligen SQL Typen Typ Bit Wertebereich UNSIGNED Wertebereich TINYINT 8 128 bis 127 0 bis 255 SMALLINT 16 32 768 bis 32 767 0 bis 65 535 MEDIUMINT 24 8 388 608 bis 8 388 607 0 bis 16 777 215 INT oder 32 2 147 483 648 bis 2 147 483 647 0 bis 4 294 967 295 INTEGER BIGINT 64 9 223 372 036 854 775 808 bis 0 bis 18 446 744 073 709 551 615 9 223 372 036 854 775 807 Hinter jedem INT Typ k nnen Sie in runden Klammern die gew nschte Darstel lungsbreite einen Wert zwischen 1 und 255 angeben Der Kommandozeilenclient mysql stellt die Werte daraufhin rechtsb ndig in Spalten mit der angegebenen Breite dar Ein Beispiel seriennr INT 20 Die Option UNSIGNED speichert wie bereits erw hnt nur vorzeichenlose Werte Damit verdoppelt sich der Wertebereich f r positive Zahlen w hrend negative wegfallen F r Seriennummern Lagerbest nde oder hnliche grunds tzlich positive Informationen ist dies praktisch Eine weitere nicht so h ufig eingesetzte Option ist ZEROFILL S mtliche nicht besetzten Stellen bis zur Anzeigebreite werden mit Nullen aufgef llt Angenommen Sie definieren eine Spalte als INT 10 ZER
144. Nachteile 11 WHERE Klausel 43 166 XOR Operator 178 YEAR Datentyp 150 ZEROFILL Typoption 148 Zufallsgenerator 186 Zugriff per PHP testen 49 MySQLAB 10 MySQL Administrator 325 MySQL Enterprise 12 MySQL Instance Manager 290 MySQL Max 12 MySQL Query Browser 327 MySQL Standard 12 mysql PHP Schnittstelle 50 einrichten 44 Verbindung 50 mysql server MySQL Startskript 290 MySQL Connector Java Schnittstelle 310 mysql_affected_rows PHP Funktion 81 235 mysql_close PHP Funktion 233 mysql_connect PHP Funktion 50 230 mysql_fetch_array PHP Funktion 232 mysql_fetch_row PHP Funktion 82 232 mysql_fix_privilege_tables Hilfsprogramm 290 mysql_install_db Skript 290 mysql_query PHP Funktion 51 81 231 mysql_select_db PHP Funktion 230 mysqladmin Hilfsprogramm 294 mysqlbinlog Hilfsprogramm 300 mysqlbug Hilfsprogramm 290 mysql Client 41 101 Abschlusszeichen 105 Anmeldung 101 beenden 43 111 Befehls bersicht 103 CLEAR Anweisung 106 Datenbank festlegen 102 Datenbank wechseln 106 DELIMITER Anweisung 105 Eingabe 42 Eingabepuffer l schen 106 Eingabevervollst ndigung 109 exit Anweisung 111 help Anweisung 103 342 Index Hilfe 102 Host angeben 102 Kommandozeilenparameter 102 Logdateien 102 108 NOTEE Anweisung 108 quit Anweisung 111 root Passwort 41 SOURCE Anweisung 108 SQL Dateien laden 108 Start 101 STATUS Anweisung 108 TEE Anweisung 108 USE Anweisung 42 66 106 Zeic
145. O LaTeX F ge DROP TABLE hinzu OF ge IF NOT EXISTS hinzu Open Document BJAUTO_INCREMENT Wert hinzuf gen Kalkulationstabelle Tabellen und Feldnamen in einfachen Anf hrungszeichen Text DiErzeugungs Aktualisierungs berpr fungszeiten Open Document k Kommentarbereich einbeziehen o PDF r BDaten m Vollst ndige NSERT s O XML HErmweiterte NSERT s Maximale L nge der erstellten Abfrage 50000 O Verz gerten INSERT Befehl verwenden OFehler bergehenden INSERT Befehl verwenden BlHexadezimalschreibweise f r Bin rfelder verwenden Exporttyp INSEOHT S SAL Abbildung 9 3 Der Export Dialog in phpMyAdmin hier f r eine einzelne Tabelle Je nach gew hltem Format werden rechts unterschiedliche Optionen angezeigt Die Einstellungen f r SQL entsprechen im Wesentlichen den mysqldump Parametern diejenigen der anderen Formate sollten Sie bei Gelegenheit ausprobieren Das For mat XML besitzt gar keine Optionen Konfigurationsdateien Bereits in Kapitel 2 wurde darauf hingewiesen dass MySQL grunds tzlich auch ohne Konfigurationsdateien funktionieren kann Wenn Sie welche erstellen m ch ten um bestimmte Standardeinstellungen zu ndern k nnen Sie auf einem Unix System die beiden Dateien etc my cnf allgemeine Konfigurationsdatei f r den Ser ver Clients und Dienstprogramme sowie my cnf im Home Verzeichnis eines Benutzers Konf
146. OFILL und weisen einem Feld dieser Spalte den Wert 123 zu Der angezeigte Wert ist in diesem Fall 0000000123 Beachten Sie dass ZEROFILL automatisch UNSIGNED bedingt Werden ganzzahlige Felder durch die weiter unten behandelten Einf geabfragen SQL Anweisung INSERT mit Werten belegt ergeben sich folgende Besonderheiten e Wird ein Wert eingegeben der f r den zul ssigen Wertebereich eines Felds zu gro oder zu klein ist wird der gr te beziehungsweise kleinste zul ssige Wert eingetragen und eine Warnung ausgegeben Zum Beispiel erh lt ein Feld vom Typ TINYINT den Wert 127 wenn Sie versuchen 129 oder gar 278 einzutragen Ein INT UNSIGNED Feld bekommt dagegen den Wert 0 wenn ein negativer Wert eingef gt wird e Bei der Eingabe von Flie kommawerten wird gerundet Werte bis einschlie lich 0 5 ber einer ganzen Zahl werden auf die n chstkleinere Zahl abgerundet Zahlen mit h herem Wert aufgerundet 17 2 17 49 und auch 17 5 werden bei spielsweise zu 17 17 51 oder 17 7 dagegen zu 18 Wenn Sie selbst Kontrolle ber den Rundungsprozess aus ben m chten k nnen Sie die im n chsten Kapitel vorgestellten mathematischen Funktionen von MySQL verwenden Eine besondere Sorte ganzzahliger Werte erlaubt der in MySQL 5 0 3 eingef hrte Datentyp BIT n Der Wert von n kann zwischen 1 und 64 liegen und gibt an dass die Spalte die angegebene Bitbreite aufweisen soll Als Werte f r solche Bitfelder 148 Kapitel 5 Datenbanken entwerfe
147. P BY MySQL Klausel 192 H hasChildNodes DOM 248 Header HTTP Anfrage 70 Antwort 71 Index 337 HEAP MySQL Tabellentyp 144 help mysql Client Anweisung 103 HEX MySQL Funktion 187 htaccess lokale Apache Konfigurationsdatei 31 97 HTML HyperText Markup Language lt form gt Tag 72 lt input gt Tag 72 bedingte Bl cke in PHP 75 Formulare 72 htpasswd Apache Tool 96 HTTP HyperText Transfer Protocol 10 69 Anfrage Header 70 Antwort Header 71 Client Anfrage 70 Eigenschaften 69 GET Methode 70 72 Methoden 72 POST Methode 72 Server Antwort 71 Statuscode 71 Weiterleitung 81 httpd conf Apache Konfigurationsdatei 28 HyperText Transfer Protocol siehe HTTP IF MySQL Anweisung 210 IF NOT EXISTS MySQL Klausel 143 if PHP Anweisung 218 mplode PHP Funktion 222 mport MySQL 294 N Stored Procedure Parameter 209 nclude PHP Funktion 257 ndex 153 Fremdschl ssel 156 Prim rschl ssel 154 NDEX MySQL 154 NNER JOIN MySQL Klausel 180 nner Joins 180 nnoDB MySQL Tabellentyp 144 NOUT Stored Procedure Parameter 209 lt input gt HTML Iag 72 INSERT MySQL Anweisung 42 68 160 305 mehrere Datens tze einf gen 160 mit SELECT 161 VALUES Klausel 68 160 HreHrHHmo m Installation Apache Linux 23 Apache Windows 26 Apache Windows Vista 26 MySQL Linux 33 MySQL Windows 36 PHP Linux 44 PHP Windows 46 phpMyAdmin 56 INSTR MySQL Funktion 188 INT MySQL Datentyp 147 Intrane
148. PHP Skripten sehr n tzlich sind Das G stebuch G steb cher sind auf Websites weit verbreitet sie gestalten den Kontakt zwischen Unternehmen oder privatem Website Betreiber und Site Besuchern pers nlicher Auch die Reiseb ro Website soll mit einem G stebuch ausgestattet werden Nat rlich w re es unpraktisch die G stebuchdaten in der gro en Gesch ftsdaten bank reisebuero aufzubewahren Stattdessen wird zu diesem Zweck eine separate Datenbank angelegt Starten Sie dazu den Kommandozeilenclient oder auch phpMyAdmin und erstellen Sie folgende Datenbank mysql gt CREATE DATABASE gaestebuch Wenn Sie mysql verwenden m ssen Sie die Datenbank nun als Standard aus w hlen mysql gt USE gaestebuch Auch auf diese Datenbank soll der Benutzer rbuser Vollzugriff erhalten mysql gt GRANT ALL PRIVILEGES ON gaestebuch TO rbuser localhost mysql gt FLUSH PRIVILEGES Zu guter Letzt wird die einzige Tabelle der neuen Datenbank erstellt Sie enth lt folgende Spalten eine laufende Eintragsnummer als Prim rschl ssel Datum und Die Reiseb ro Anwendung 259 Uhrzeit des Eintrags den Nickname des jeweiligen Eintragenden dessen E Mail Adresse einen Titel f r den Eintrag sowie den eigentlichen Text mysql gt CREATE TABLE gb_eintraege gt e_id INT AUTO_INCREMENT PRIMARY KEY gt e_datum DATETIME gt e_nick VARCHAR 40 gt e mail VARCHAR 40 gt e titel VARCHAR 100 gt e_inhalt TEXT gt
149. Praktischer Einstieg MySQL mit DH p Behandelt MySQL 5 0 und 5 1 sowie PHP 5 2 basics N Pa Pe orm lt 3 Schritt f r Schritt zur datenbankgest tzten Webanwendung Mit umfangreichem Beispielmaterial und vielen Software Paketen auf CD ROM OREILLY Shakan ZWEITE AUFLAGE Praktischer Einstieg in MySQL mit PHP Sascha Kersken O REILLY Beijing Cambridge Farnham K ln Paris Sebastopol Taipei Tokyo Die Informationen in diesem Buch wurden mit gr ter Sorgfalt erarbeitet Dennoch k nnen Fehler nicht vollst ndig ausgeschlossen werden Verlag Autoren und bersetzer bernehmen keine juristische Verantwortung oder irgendeine Haftung f r eventuell verbliebene Fehler und deren Folgen Alle Warennamen werden ohne Gew hrleistung der freien Verwendbarkeit benutzt und sind m glicherweise eingetragene Warenzeichen Der Verlag richtet sich im wesentlichen nach den Schreibweisen der Hersteller Das Werk einschlie lich aller seiner Teile ist urheberrechtlich gesch tzt Alle Rechte vorbehalten einschlie lich der Vervielf ltigung bersetzung Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen Kommentare und Fragen k nnen Sie gerne an uns richten O Reilly Verlag Balthasarstr 81 50670 K ln Tel 0221 9731600 Fax 0221 9731608 E Mail kommentar oreilly de Copyright 2007 by O Reilly Verlag GmbH amp Co KG 1 Auflage 2005 2
150. R BY RAND LIMIT 0 5 Zur bergabe eines konkreten Werts muss eine SQL Benutzervariable definiert werden Das erledigt eine SET Anweisung wie diese SET preis 100 Nun kann das Prepared Statement ausgef hrt werden die Variable wird mithilfe einer USING Klausel bergeben mysql gt EXECUTE random hotel_choice USING preis Hotel Doppel Stadt Hotel Central 90 Prag Hotel Solidarnosc 70 Warschau Hotel Bahar 80 Istanbul Prepared Statements 207 Da es nur drei Hotels gibt in denen ein Doppelzimmer weniger als 100 Euro pro Nacht kostet werden nur diese angezeigt allerdings wechselt die Reihenfolge bei jedem Aufruf Wenn Sie ein Prepared Statement nicht mehr verwenden m chten k nnen Sie es mithilfe der Anweisung DEALLOCATE PREPARE StatementName entfernen zum Beispiel DEALLOCATE PREPARE random hotel choice Abgesehen davon werden Prepared Statements mit dem Ende der aktuellen MySQL Clientsitzung automatisch gel scht Stored Procedures Der gr te Nachteil von Prepared Statements ist die soeben erw hnte beschr nkte Lebensdauer nach einer einzelnen Clientsitzung ist Schluss Die in MySQL 5 0 neu eingef hrten Stored Procedures werden dagegen permanent auf dem Datenbank server gespeichert Datenbanksysteme die Stored Procedures schon l nger u
151. ROM gw_t ein und bet tigen Sie dann die Tab Taste Da die beiden Tabellen gw_teilnehmer und gw_teilnahme mit gw_t beginnen wird der Text zu gw teiln erg nzt Nun k n nen Sie beispielsweise ein e oder a eingeben und nochmals Tab dr cken um den Tabellennamen fertigzustellen Alternativ k nnen Sie auch an jeder Stelle zweimal hintereinander Tab dr cken um eine Liste aller verf gbaren M glichkeiten Tabel len und enthaltener Spalten zu generieren Beispiel mysql gt SELECT from gw_teiln Tab Tab gw_teilnahme gw_teilnehmer tn_email gw_teilnahme tl_antw gw teilnehmer tn_id gw_teilnahme tl_frag gw_teilnehmer tn_interest gw teilnahme tl_tIn gw_teilnehmer tn_uname gw_teilnehmer mysql gt SELECT from gw_teiln Eine weitere interessante Option besteht darin den Prompt des Clients zu ndern Standardm ig lautet er bekanntlich mysql gt Der Befehl zur Modifikation hei t R oder in der Langform prompt Der gew nschte Text wird ohne Anf hrungszeichen dahinter gesetzt wenn Sie ein Leerzeichen am Ende haben m chten m ssen Sie es auch hinschreiben Das folgende Beispiel setzt den Prompt auf und danach wieder zur ck auf mysql gt mysql gt R PROMPT set to R mysql gt PROMPT set to mysql gt mysql gt Der Kommandozeilenclient mysql 109 Neben beliebigen Zeichen k nnen Sie auch eine Reihe spezieller Platzhalter einset zen Das folgende Beispiel stellt den Hostnamen h einen Doppelpunk
152. S Wurf1 gt CEIL RAND 6 AS Wurf2 gt CEIL RAND 6 AS Wurf3 Wurf1 Wurf2 Wurf3 1 6 5 186 Kapitel 6 SQL Abfragen RAND bietet einen interessanten zus tzlichen Nutzen Sie k nnen Tabellen nach Zufall sortieren indem Sie die Klausel ORDER BY RAND einsetzen Hier ein Beispiel das zweimal f nf zuf llige St dte ausw hlt mysql gt SELECT st_name FROM rb_staedte ORDER BY RAND LIMIT 0 5 st name Paris Dublin K ln Venedig Barcelona st_name Frankfurt Main K ln Edinburgh Warschau Barcelona Einige der mathematischen Funktionen zum Beispiel die Rundungsfunktionen werden in den Praxisbeispielen im bern chsten Kapitel zum Einsatz kommen andere sind dagegen eher exotisch oder haben mit der Reiseb ro Anwendung nichts zu tun String Funktionen Zur Verarbeitung von Strings gibt es noch mehr Funktionen als f r die Mathematik Tabelle 6 5 zeigt nur die wichtigsten da einige Funktionen sehr spezielle Aufgaben erf llen Tabelle 6 5 Die wichtigsten String Funktionen von MySQL Funktion Bedeutung Beispiel BIN N Bin rwert der Zahl N BIN 76 gt 1001100 CO CAT String1 String2 Verkn pfung CONCAT Hallo 24 n Welt gt Hallo
153. SACTION Anschlie end k nnen Sie in der aktuellen Datenbank beliebig viele verschiedene Abfragen auf InnoDB Tabellen ausf hren Zum Schluss m ssen Sie sich entschei den ob die Transaktion best tigt oder zur ckgesetzt werden soll Zum Best tigen wird die folgende Anweisung verwendet COMMIT Soll die Transaktion dagegen r ckg ngig gemacht werden lautet die Anweisung wie folgt ROLLBACK Eine Alternative zu einem expliziten START TRANSACTION besteht darin Autocommit auszuschalten Dies geschieht mithilfe der folgenden Anweisung SET autocommit false 200 Kapitel 7 Fortgeschrittene Datenbankfunktionen Danach sind SQL Anweisungsfolgen auf InnoDB Tabellen grunds tzlich Transak tionen jedes COMMIT oder ROLLBACK startet implizit eine neue Transaktion Den aktu ellen Zustand von autocommit k nnen Sie wie folgt abfragen wobei 1 f r true und 0 f r false ausgegeben wird mysql gt SELECT autocommit Hessen autocommit Jitske neea o EROE Ein weiteres interessantes Konzept innerhalb von Transaktionen sind Savepoints Wenn Sie einen Savepoint setzen k nnen Sie statt eines vollst ndigen Rollbacks auch ein Teil Rollback zu einem bestimmten Savepoint durchf hren Um einen Savepoint zu erstellen schreiben Sie einfach SAVEPOINT Name Wenn Sie sp ter zu diesem Savepoint zur ckkehren m chten funktioniert dies wie folgt ROLLBACK TO SAVEPOINT Name Praktischer Test Da in der reiseb
154. Sie mithilfe der Schaltfl che Execute ausf hren k nnen Rechts werden die Schemata das hei t eine Baumansicht der Datenban ken Tabellen und Spalten angezeigt Ein Doppelklick auf eine Datenbank w hlt diese als Standard aus so dass Sie sich in Abfragen ohne Angabe des Datenbankna mens auf ihre Tabellen beziehen k nnen Wenn Sie dagegen auf eine Tabelle dop pelklicken wird in das Abfragefeld automatisch eine Abfrage nach folgendem Schema eingetragen SELECT FROM Tabelle Im Bereich Syntax darunter k nnen Sie auf Schl sselw rter Operatoren und Funk tionen doppelklicken um sich deren Beschreibung im integrierten MySQL Hand buch anzeigen zu lassen Abbildung C 2 zeigt den MySQL Query Browser bei der Ausf hrung einer Auswahl abfrage die alle Datens tze der Tabelle rb_airlines ausgibt In der Tabellenansicht k nnen Sie die Datens tze durch Klicken auf einen Spaltentitel einfach nach dem jeweiligen Kriterium sortieren lassen L ngere Abfragen lassen sich als Script eingeben W hlen Sie dazu zun chst File gt New Script Tab In dem gro en Editorfeld k nnen Sie nun eine beliebige Abfolge von SQL Anweisungen eingeben Mithilfe der Schaltfl che Save k nnen Sie das Ergebnis als Datei speichern Um die Abfrage sp ter erneut auszuf hren kann sie mit Load wieder geladen werden MySQL Query Browser 327 MySQL Query Browser root localhost 3306 reisebuero Iofx Fie
155. Sie tippen 3 Gro e Macht bedingt gro e Verantwortung Zu Unrecht gef rchtet das Arbeiten mit der Konsole 21 Tabelle 2 1 Die wichtigsten Konsolenbefehle f r Windows und Unix Gew nschte Wirkung Windows Befehl Unix Befehl Laufwerk wechseln Laufwerkbuchstabe z B C oder F Arbeitsverzeichnis wechseln absoluter cd Verz Unterv cd Verz Unterv Pfad In Unterverzeichnis des aktuellen Arbeits cd Verz Unterv cd Verz Unterv verzeichnisses wechseln In bergeordnetes Verzeichnis wechseln ed CAR In das eigene Home Verzeichnis wechseln cd Neues Verzeichnis erstellen mkdir Name mkdir Name md Name Inhalt des aktuellen Verzeichnisses anzei dir ls gen ausf hrlich 1s 1 Datei l schen del Name rm Name Datei kopieren copy AltName NeuName cp AltName NeuName Platzhalter alle Dateien im aktuellen Et Verzeichnis Bildschirm l schen cls clear oft auch Strg L Apache 2 installieren und konfigurieren Der Apache Webserver oder Apache HTTP Server ist das Kernst ck Ihres LAMP WAMP Systems Er kommuniziert mit den Browsern der Benutzer und liefert ihnen unter anderem die Ausgabe von PHP Skripten umgekehrt kann er Benutzereinga ben aus Webformularen wiederum an PHP Skripten weiterleiten Eine direkte Kommunikation mit der MySQL Datenbank f hrt er dagegen in der Regel nicht durch Seit Apache 2 2 gibt es allerdings das optionale Modul mod_dbd das ber einen Trei ber eine
156. Sie wurde 1995 von Net scape eingef hrt und seitdem st ndig weiterentwickelt ber eine Objekthierarchie k nnen damit wichtige Aspekte von Browserfenster und Dokument im laufenden Betrieb modifiziert werden Seit 1999 unterst tzen die g ngigsten Browser auch das vom WWW Konsortium W3C standardisierte Document Object Model DOM das den gesamten Inhalt einer Webseite als Baumstruktur betrachtet in der Sie Inhalte beliebig einzuf gen entfernen oder modifizieren k nnen Die aktuellste Neuentwicklung ist die Ajax Technik Durch die Kombination eini ger F higkeiten die einzeln schon seit einigen Jahren verf gbar sind erm glicht sie den Austausch einzelner Seitenbestandteile mithilfe separater HTTP Anfragen Ein serverseitiges Skript liefert dabei die neuen Inhalte typischerweise aus einer Daten bank Die Anfragen finden asynchron statt so dass der Browser nicht passiv auf ihr Ergebnis wartet sondern den Nutzer normal weiterarbeiten zum Beispiel scrollen oder ein Formular ausf llen l sst 244 Kapitel 8 Webanwendungen mit PHP und MySQL JavaScript Um JavaScript in einem HTML Dokument unterzubringen wird es in ein lt script gt Tag verschachtelt das wie folgt aussieht lt script language JavaScript type text javascript gt lt script gt Soll etwas gleich beim Laden des Dokuments an einer bestimmten Stelle ausgege ben werden kann ein solches Konstrukt im Body stehen ansonsten wird es eher in den Head geset
157. TE rb_hotels2 SET ht_bad Bad Query OK 10 rows affected 0 04 sec Rows matched 23 Changed 10 Warnings 0 Die Meldung Changed 10 macht deutlich dass MySQL nur diejenigen Datens tze ndert in denen der gew nschte Wert nicht bereits besteht Das h rt sich spitzfindig an sorgt aber in sehr umfangreichen Datenbanken f r Geschwindigkeitsvorteile In UPDATE Abfragen k nnen Sie auf die bisherigen Werte der Felder zur ckgreifen und diese ndern Das n chste Beispiel reduziert alle Doppelzimmerpreise in der kopierten Tabelle auf 90 ihres bisherigen Werts Hier zum Vergleich zun chst die alten Werte der ersten f nf Hotels 194 Kapitel6 SQL Abfragen mysql gt SELECT ht_name ht_dzpreis FROM rb_hotels2 LIMIT 0 5 ht_name ht_dzpreis Bergerhof 120 Hotel Colonia 195 Hotel de la Gare 150 Hotel au Jardin 200 Otel Bahar 80 Die Abfrage zur Preisreduktion sieht wie folgt aus mysql gt UPDATE rb_hotels2 SET ht_dzpreis ht_dzpreis 0 9 Query OK 23 rows affected 0 05 sec Rows matched 23 Changed 23 Warnings O Nach der nderung lauten die ersten f nf nach wie vor ganzzahligen Preise so mysql gt SELECT ht_name ht_dzpreis FROM rb_hotels2 LIMIT 0 5 ht_name ht_dzpreis Bergerhof 108 Hot
158. TO_INCREMENT verwendet den Datentyp INT der zur Darstellung ganzer Zahlen dient e Name Kurzer Text variabler L nge bis etwa 60 Zeichen in SQL hei t das VARCHAR 60 Zus tzlich soll ein Index f r dieses Feld erstellt werden um eine eventuelle Suche nach Hotelnamen zu beschleunigen e Stadt Bezug auf den numerischen Prim rschl ssel der St dte Tabelle daher Ganzzahl INT 128 Kapitel 5 Datenbanken entwerfen und erstellen e Preise Der Einfachheit halber sind alle Preise in dieser Datenbank ganzzahlig also INT e Bad Eine berschaubare Aufz hlung fester Werte die in SQL ENUM genannt wird e Verpflegung Ebenfalls eine festgelegte Aufz hlung ENUM e Postanschrift Text variabler L nge bis etwa 100 Zeichen VARCHAR 100 e URL Ebenfalls variabler Text hier gen gt erfahrungsgem VARCHAR 50 Die SQL Abfrage zur Erstellung dieser Tabelle lautet mit den genannten Vorgaben CREATE TABLE rb hotels ht_nr INT AUTO_INCREMENT PRIMARY KEY t_ name VARCHAR 60 t_ezpreis INT t_dzpreis INT t bad ENUM ohne WC Dusche Bad t mahlzeit ENUM ohne Fr hst ck HP VP t anschrift VARCHAR 100 t_ url VARCHAR 50 NDEX ht_name EEE e a E a Wie bereits im Einf hrungsbeispiel in Kapitel 3 wird auch hier mit Pr fixen f r die Tabellen und Feldnamen gearbeitet Der Name jeder Tabelle in der Datenbank reisebuero beginnt mit rb_ w hrend die Felder der einzeln
159. Turkish Airlines THY TK Mit der nachfolgenden Abfrage werden alle Flugh fen ausgew hlt deren Websites mit der Top Level Domain de Deutschland enden mysql gt SELECT ap_kuerzel ap_url FROM rb_airports gt WHERE ap_url LIKE de 442 2222222222 2222422224242 240200 ap_kuerzel ap_ url 442 2 222222222 2222422222240 CGN http wmw koeln bonn airport de TXL http www berlin airport de DUS http wmw duesseldorf international de FRA http www frankfurt airport de 442 2 222222222222 2222222222240 4202n Hier eine M glichkeit um den Flughafen K ln Bonn zu ermitteln wenn Sie sich nicht mehr sicher sind ob K ln Bonn oder K ln Bonn gespeichert wurde mysql gt SELECT ap_name ap_zusatz FROM rb_airports gt WHERE ap_name LIKE K ln_Bonn ap name ap_zusatz K ln Bonn Konrad Adenauer Wenn Sie tats chlich ein Prozentzeichen oder einen Unterstrich als Zeichen ben ti gen m ssen Sie ihnen einen Backslash voranstellen F r den Backslash selbst gilt das Gleiche Das folgende etwas konstruierte Beispiel sucht nach Dateinamen von Stadtbildern die mindestens einen Unterstrich enthalten SELECT st_name st_ bild url FROM rb_staedte WHERE st bild url LIKE _ Die Umkehrung v
160. Webserver Modul aber diese funktioniert noch nicht zuverl ssig Deshalb beschr nkt sich die folgende Anleitung auf die ZIP Datei zurzeit php 5 2 2 Win32 zip 1 Entpacken Sie die Datei in das gew nschte PHP Verzeichnis Die nachfolgen den Anweisungen gehen von C php aus aber Sie k nnen nat rlich auch ein anderes Verzeichnis w hlen 2 Kopieren Sie die Datei php ini dist die Vorlage f r die PHP Konfigurationsda tei in Ihr Systemverzeichnis zum Beispiel C Windows oder C WinNT und benennen Sie sie dort in php ini um 3 Nehmen Sie in der neuen php ini Datei die folgenden nderungen vor diese Zeilen existieren bereits Sie m ssen nur die konkreten Verzeichnisse eintra gen doc_root C Apache2 htdocs Ihre Apache DocumentRoot extension dir C php ext ext in Ihrem PHP Verzeichnis Als N chstes werden die gew nschten PHP Erweiterungen mysql mysqli und oder pdo_mysql aktiviert extension php mysql dll extension php mysqli dll extension php_pdo dll extension php_pdo mysql dll Manche der gew nschten Zeilen sind m glicherweise bereits vorhanden sind aber durch ein f hrendes Semikolon auskommentiert das Sie in diesem Fall nur zu entfernen brauchen Andere m ssen Sie m glicherweise manuell hinzu f gen Daneben k nnen Sie nach Belieben weitere Erweiterungen aktivieren Das Web Interface phpMyAdmin siehe unten ben tigt beispielsweise die Erweite rung mbstring dll l schen Sie hier ebenfalls das Kommen
161. Welt CONV N Basis1 Basis2 konvertiert Zahl N von Basis1 nach CONV AB 16 8 gt 253 Basis2 je 2 bis 36 CONV AB 16 10 gt 171 HEX N konvertiert N in einen hexadezimalen HEX 154 gt 9A Wert SQL Ausdr cke und Funktionen 187 Tabelle 6 5 Die wichtigsten String Funktionen von MySQL Fortsetzung Funktion Bedeutung Beispiel INSTR String Teilstring Positionvon TeilstringinString INSTR Hallo Welt Welt oder 0 gt f LCASE String Umwandlung in Kleinbuchstaben LOWER KLEINE Buchstaben LOWER String gt kleine buchstaben LENGTH String L nge des Strings LENGTH K ln gt 4 LTRIM String f hrende Leerzeichen entfernen LTRIM Text gt Text REVERSE String String umkehren REVERSE lager gt regal RTRIM String abschlie ende Leerzeichen entfernen RTRIM Hallo gt Hallo SPACE N N Leerzeichen SPACE 7 gt SUBSTRING String N Zeichen langer Teilstring ab Pos SUBSTRING K lner 2 2 Pos N ohne N bis Ende gt l UCASE String Umwandlung in Gro buchstaben UPPER grosse Buchstaben UPPER String gt GROSSE BUCHSTABEN Selbstverst ndlich k nnen all diese Funktionen mit Abfrageergebnissen kombiniert werden was in der Praxis auch meistens der Fall ist Das folgende Beispiel zeigt den anders lautenden Eigennamen der entsprechenden St dte in Klammern hinter dem deutschen Namen an mysql gt SELECT CONCAT st_name st_eigen AS Stadt
162. _COOKIE und _SERVER mit HTTP Daten und Umgebungsvariablen ein aus arg_separator output amp Trennzeichen das PHP in selbst erzeugte Query STRING Strings einf gt arg _separator input amp Trennzeichen die PHP beim Auswerten von STRING Query Strings akzeptiert mehrere m glich zum Beispiel amp variables_order STRING EGPCS Variablenreihenfolge f r register_globals E Umgebungsvariablen G GET Felder P POST Felder C Cookies S Servervariablen 48 Kapitel 2 Installation und Inbetriebnahme Tabelle 2 3 Wichtige Einstellungen f r die PHP Konfigurationsdatei php ini Fortsetzung Direktive Vorgabewert Aufgabe register_argc_argv On GET Variablen und Kommandozeilenargumente on off als argc Anzahl und Array argv Werte im c Stil post max size M K B 8M maximale Gr e f r POST Daten auto prepend file x automatisch am Kopf jeder Datei importierte DATEIPFAD Include Datei auto append file automatisch am Fu jeder Datei importierte DATEIPFAD Incude Datei default_mimetype text html Standardwert f r Content Type TYPE SUBTYPE default_charset iso 8859 1 Standardzeichensatz f r Content Type ZEICHENSATZ always populate raw post o 1 erzeugt stets HTTP_RAW_POST_DATA data o 1 String mit nicht getrennten POST Daten include_path Umgebungsvariable Verzeichnisse in denen PHP automatisch nach PFAD1 PFAD2 PHP_
163. _nr Diese View ist nun dauerhaft mit den Hotels und ihren St dten verkn pft sobald ein Hotel ge ndert hinzugef gt oder entfernt wird zeigt sich das auch in der View Die Informationen aus der View selbst lassen sich wiederum mithilfe einer beliebi gen Auswahlabfrage auslesen Das folgende Beispiel zeigt die ersten f nf Zeilen mysql gt SELECT FROM hotel_orte LIMIT 0 5 Hotel Stadt Bergerhof K ln Hotel Colonia K ln Hotel de la Gare Paris Hotel au Jardin Paris Otel Bahar Istanbul Eine besondere Form von Views sind Updatable Views in ihnen k nnen Informa tionen nicht nur gelesen sondern auch ver ndert werden dies ndert nat rlich auch die Daten in der zugrunde liegenden Tabelle Eine View besitzt diese F higkeit nur dann wenn alle enthaltenen Spalten aus einer einzelnen Tabelle stammen oder aus einer anderen View die ihrerseits auf nur einer Tabelle basiert Im brigen darf die Abfrage die der View zugrunde liegt keine Aggregatfunktionen enthalten Das folgende Beispiel erstellt eine einfache View auf die Tabelle rb_airports mit weniger Informationen CREATE VIEW air AS SELECT ap_name ap _kuerzel ap stadt FROM rb airports Die folgende Einf geabfrage erstellt einen neuen Datensatz f r Sabiha den zweiten Flughafen von Istanbul INSERT INTO air1 VALUES Istan
164. a 2 Paris 2 1 Hotel de la Gare 2 Paris gt 2 Hotel au Jardin Der Prim rschl ssel dieser Tabelle ist kein einzelnes Feld sondern aus stadt_id und hotel_id zusammengesetzt Die Spalte hotel_name h ngt allerdings nicht vom gesamten Prim rschl ssel ab sondern nur von hotel_id Daher werden Informa tionen ber die St dte unn tigerweise doppelt gespeichert was zu Inkonsistenzen f hren kann Die L sung besteht in der Aufteilung der Informationen auf zwei Tabellen wobei der Bezug auf die Stadt als Fremdschl ssel in der Hotel Tabelle gespeichert wird stadt_id stadt_name land 1 K ln 1 2 Paris 2 Der Datenbankentwurf 133 hotel_id hotel_name stadt 1 Bergerhof 1 2 Hotel Colonia 1 3 Hotel de la Gare 2 4 Hotel au Jardin 2 Dritte Normalform Die dritte Normalform 3NF gilt wenn die zweite Normalform erf llt ist und alle Felder voneinander funktional unabh ngig sind Eine Tabelle verletzt die dritte Nor malform wenn sie eine eindeutig zu einem einzelnen Feld geh rige Zusatzinforma tion enth lt obwohl dieses Feld nicht den Schl ssel bil
165. abelle 6 6 Platzhalter f r Datumsformate in MySQL Fortsetzung Platzhalter Bedeutung e Tag des Monats numerisch 0 bis 31 f Mikrosekunden 000000 bis 999999 H Stunde zweistellig 24h 00 bis 23 h oder I Stunde zweistellig 12h 01 bis 12 i Minuten zweistellig 00 bis 59 j Tag im Jahr 001 bis 366 k Stunde 24h 0 bis 23 Stunde 12h 1 bis 12 M Monatsname January bis December m Monat numerisch zweistellig 00 bis 12 p AM oder PM r Zeit 12h mit AM PM z B 03 59 42 PM S oder s Sekunden 00 bis 59 T Zeit 24h z B 15 59 42 U Woche ab Sonntag 00 bis 53 u Woche ab Montag 00 bis 53 AN Wochentag Sunday bis Saturday w Wochentag numerisch 0 Sonntag bis 6 Samstag Y Jahr vierstellig z B 1998 2007 y Jahr zweistellig z B 98 07 Prozentzeichen Hier zwei Beispiele f r die Formatierung des aktuellen Datums SELECT DATE FORMAT NOW d m Y H i Uhr Ergebnis 02 04 2007 17 05 Uhr SELECT DATE FORMAT NOW W M D Y Ergebnis Monday April 2nd 2007 Wochentag und Monatsnamen stehen leider nur in englischer Sprache zur Verf gung Wenn Sie deutsche Namen verwenden m chten k nnen Sie sich Datenbank tabellen anlegen die die Nummern den entsprechenden Namen zuordnen Hier ein Beispiel f r die Wochentage 1 Erstellen Sie in der gew nschten Datenbank eine neue Tabelle namens wtage CREATE TABLE wtage tag_nr INT PRIMARY KEY tag_name VARCHAR 12
166. abellenname SELECT Auswahlkriterien Die wichtigsten Tabellentypen MyISAM schneller und InnoDB Unterst tzung f r Transaktionen und weitere mo derne Features Datentypen e Ganzzahlige TINYINT SMALLINT MEDIUMINT INT BIGINT e Flie komma FLOAT DOUBLE Synonym REAL e Festkomma DECIMAL Stellen Nachkommastellen e Datum Uhrzeit DATETIME DATE TIME YEAR TIMESTAMP e Strings CHAR n VARCHAR n e Textbl cke TINYTEXT TEXT MEDIUMTEXT LONGTEXT e Bin rbl cke TINYBLOB BLOB MEDIUMBLOB LONGBLOG e Aufz hlungstypen ENUM Wert1 Wert2 SET Werti Wert2 Wichtige Feldoptionen e AUTO INCREMENT automatische Nummerierung NOT NULL Feld darf nicht leer sein e UNSIGNED vorzeichenlos e ZEROFILL f hrende Stellen mit Nullen auff llen 304 Anhang A Kurzreferenz Tabellenstruktur ndern ALTER TABLE Tabellenname ADD COLUMN Spaltenname Typ Optionen FIRST AFTER Spaltenname DROP COLUMN Spaltenname CHANGE COLUMN Spaltenname NeuerSpaltenname Typ Optionen FIRST AFTER Spaltenname ADD UNIQUE FULLTEXT INDEX Indexname Indextyp Spaltenname ROP INDEX Indexname DD PRIMARY KEY Spaltenname ROP PRIMARY KEY ENAME TO NeuerTabellenname J7o gt Oo Bedeutung der einzelnen Befehle e ADD COLUM Spalte hinzuf gen e DROP COLUMN Spalte l schen e CHANGE COLUMN Spalte ndern umbenennen verschieben ADD INDEX Index hinzuf gen
167. able border 2 cellpadding 4 gt lt tr gt lt th gt Land lt th gt lt th gt Hauptstadt lt th gt lt th gt Kontinent lt th gt lt tr gt lt php Parameter f r die Datenbankverbindung host localhost user phpuser pass PHP4ever db geotest Datenbankverbindung herstellen connID mysql_connect host user pass Datenbank ausw hlen mysql select_db db MySOL Abfrage result mysql_query SELECT FROM laender ORDER BY land ASC 52 Kapitel 2 Installation und Inbetriebnahme Beispiel 2 1 laender_mysql php eine SQL Abfrage auslesen und als HTML Tabelle anzeigen Fortsetzung Schleife zum Auslesen und Anzeigen der Ergebnisse while list land hauptstadt kontinent mysql fetch_row result echo lt tr gt n echo lt td land lt td gt n echo lt td gt hauptstadt lt td gt n echo lt td kontinent lt td gt n echo lt tr gt n Datenbankverbindung schlie en mysql_close gt lt table gt lt body gt lt html gt Beispiel 2 2 laender_mysqli php dasselbe Skript in objektorientierter mysqli Syntax lt html gt lt head gt lt title gt Einfache MySQL Abfrage mit PHP mysqli Version lt title gt lt head gt lt body gt lt h1 gt Einige L amp auml nder ihre Hauptst amp auml dte und Kontinente lt h1 gt lt table border 2 cellpadding 4 gt lt tr gt lt th gt Land lt th gt lt th gt Hauptst
168. ache oder bei der MySQL Quellcode Distribution m ssen die drei Befehle confi gure make und make install ausgef hrt werden Das Skript configure bietet zahlreiche Optionen Wenn Sie alle nachlesen wollen k nnen Sie es mit der Option help aufrufen siehe oben die MySQL Installations anleitung Hier nur die vier wichtigsten Optionen e Mit der Option prefix lt Pfad gt k nnen Sie das Verzeichnis der PHP Installa tion w hlen blicherweise usr local php oder usr local php35 e Wenn PHP als Apache 2 Modul installiert werden soll muss die Option with apxs2 verwendet werden Sie ben tigt den Pfad zu dem Skript apxs Apache Extension Tool im bin Verzeichnis Ihrer Apache Installation zum Beispiel with apxs2 usr local apache2 bin apxs e F r die Programmierung MySQL basierter Webanwendungen sind die MySQL Schnittstellen wichtig Wie Sie im Verlauf dieses Buchs erfahren wer den gibt es drei verschiedene mysql mysqli sowie PHP Data Objects PDO mit MySQL Treiber bestehend aus den beiden Erweiterungen pdo und pdo_ mysql Die klassische mysql Schnittstelle wird mittels with mysql lt MySQL Pfad gt hinzugef gt zum Beispiel with mysql usr local mysql e Um die moderneren Schnittstellen mysqli und PDO einzurichten wird die Option with mysqli beziehungsweise with pdo with pdo mysql verwen det Als Argument ben tigen sie den Pfad des Tools mysql_config im bin Ver zeichnis der MySQL Installation also beispiels
169. ada Ottawa Nordamerika Marokko Rabat Afrika Fertig Abbildung 2 1 Darstellung der einfachen MySQL Abfrage im Browser Beispiel 2 3 laender_pdo php dritte Variante des Skripts in PDO Syntax lt html gt lt head gt lt title gt Einfache MySQL Abfrage mit PHP PDO Version lt title gt lt head gt lt body gt lt h1 gt Einige L amp auml nder ihre Hauptst amp auml dte und Kontinente lt h1 gt lt table border 2 cellpadding 4 gt lt tr gt lt th gt Land lt th gt lt th gt Hauptstadt lt th gt lt th gt Kontinent lt th gt lt tr gt lt php Parameter f r die Datenbankverbindung host localhost user phpuser 54 Kapitel 2 Installation und Inbetriebnahme Beispiel 2 3 laender_pdo php dritte Variante des Skripts in PDO Syntax Fortsetzung pass PHP4ever db geotest Nerbindung herstellen und Datenbank ausw hlen conn new PDO mysql host host dbname db user pass MySQL Abfrage result conn gt query SELECT FROM laender ORDER BY land ASC Schleife zum Auslesen und Anzeigen der Ergebnisse while list land hauptstadt kontinent result gt fetch echo lt tr gt n echo lt td land lt td gt n echo lt td gt hauptstadt lt td gt n echo lt td gt kontinent lt td gt n echo lt tr gt n Datenbankverbindung schlie en conn null gt lt table gt lt body gt lt html gt Distributi
170. adt lt th gt lt th gt Kontinent lt th gt lt tr gt lt php Parameter f r die Datenbankverbindung host localhost user phpuser pass PHP4ever db geotest Nerbindung herstellen und Datenbank ausw hlen conn new mysqli host user pass db MySQL Abfrage result conn gt query SELECT FROM laender ORDER BY land ASC Schleife zum Auslesen und Anzeigen der Ergebnisse while list land hauptstadt kontinent result gt fetch_row echo lt tr gt n echo lt td land lt td gt n echo lt td hauptstadt lt td gt n echo lt td kontinent lt td gt n echo lt tr gt n PHP installieren 53 Beispiel 2 2 laender_mysqli php dasselbe Skript in objektorientierter mysqli Syntax Fortsetzung Datenbankverbindung schlie en conn gt close gt lt table gt lt body gt lt html gt Einfache MySQL Abfrage mit PHP mysql Version Mozilla Firefox Datei Bearbeiten Ansicht Gehe Lesezeichen Extras Hilfe E r gt r a amp A E http 7127 0 0 1 laender_mysql php z O Go IC i Mozilla Firefox Deutsch User Support Forum Mozilla Firefox Hilfe Plug in FAQ Einige L nder ihre Hauptst dte und Kontinente Land Hauptstadt Kontinent Argentinien Buenos Aires S damerika Australien Canberra Australien Frankreich Paris o Europa talien Rom Europa Japan Tokyo i Asien Kan
171. age standardm ig auch dann alle Datens tze aus wenn mehrere identisch sind Dies k nnen Sie mithilfe der Klausel DISTINCT oder DISTINCTROW Synonym ndern Das folgende Beispiel w hlt den Badezimmertyp der ersten f nf Hotels aus mysql gt SELECT ht_bad FROM rb_hotels LIMIT 0 5 Dusche Bad Dusche Bad Dusche M chten Sie dagegen herausfinden welche der definierten Badtypen berhaupt in allen verf gbaren Hotels eingesetzt werden k nnen Sie die Abfrage wie folgt um ein DISTINCTROW erg nzen mysql gt SELECT DISTINCTROW ht_bad FROM rb_hotels Dusche Bad Suchkriterien die WHERE Klausel In der Regel werden nicht alle Datens tze einer Tabelle ben tigt sondern es soll eine Auswahl nach bestimmten Kriterien getroffen werden Daf r ist die SQL Klau sel WHERE zust ndig Sie wird hinter FROM Tabellenname angegeben SELECT Feld er FROM Tabellenname WHERE Ausdruck Diese Abfrage w hlt diejenigen Datens tze aus auf die der verwendete Ausdruck zutrifft Es gibt unz hlige M glichkeiten f r die Formulierung dieses Ausdrucks Am h ufigsten wird eine Spalte mit einem bestimmten Wert verglichen Das folgende Bei spiel w hlt nur die Fluggesellschaft mit dem K rzel 4U Germanwings aus mysql gt SELECT ai_name ai_kuerzel FROM rb_airlines gt WHERE ai_kuerzel 4U ai_name ai_kuerzel Germanwing
172. ahren werden die Standards des Internets und seiner Vorl ufernetze in solchen ffentlich verf gbaren Dokumenten festgelegt Dass diese Standards Allgemeingut sind und weder durch das Copyright einzelner Firmen noch durch die uns glichen Softwarepatente beschr nkt werden ist einer der wichtigsten Gr nde f r den langfristigen Erfolg der Internetprotokolle DiePHP Skripten 69 blicherweise sendet der Client eine Anfrage an den Server und zwar sobald Sie eine URL in die Adresszeile Ihres Browsers eintippen oder einen Link anklicken Eine HTTP Anfrage sieht beispielsweise folgenderma en aus GET seiten info html HTTP 1 1 Accept Accept Language de en US Accept Encoding gzip deflate User Agent Mozilla 5 0 Windows U WinNT4 0 de DE rv 1 7 5 Gecko 20041108 Firefox 1 0 Host www test local Connection Keep Alive Die erste Zeile ist der eigentliche Befehl Er besteht aus der HTTP Methode hier GET dem Pfad der angeforderten Ressource info html im Website Unterverzeich nis seiten sowie der HTTP Protokollversion standardm ig HTTP 1 1 Die Methode GET fordert eine Ressource vom Server an Eine andere bekannte HTTP Methode ist zum Beispiel POST sie kann zus tzlich gr ere Datenmengen meist aus Webformularen an den Webserver senden Alle anderen Zeilen sind HTTP Header die dem Server weitere Aspekte ber den Client und die Anfrage mitteilen Accept gibt eine Liste von MIME Typen der D
173. alfenster 18 list PHP Funktion 221 Listen Apache Direktive 29 Lizenz MySQL 10 LN MySQL Funktion 186 LOAD DATA INFILE MySQL Anweisung 296 Load Balancing 302 LoadModule Apache Direktive 29 lt Location gt Apache Direktive 31 LOG MySQL Funktion 186 LOG10 MySQL Funktion 186 LOG2 MySQL Funktion 186 Logdateien Error Log 299 sonstige 300 Update Log 300 wechseln 300 logische Operatoren MySQL 177 LONGBLOB MySQL Datentyp 151 LONGTEXT MySQL Datentyp 151 Loopback IP Adresse 30 L schabfragen 198 LOWER MySQL Funktion 188 ls UNIX Konsolenbefehl 21 LTRIM MySQL Funktion 188 M m n Relation 131 Mac OS X Dateisystem 19 Konsolenbefehle 21 Prompt 18 Shell 18 Terminalfenster 18 make_binary_distribution MySQL Hilfsprogramm 290 Master Replikation 301 mathematische Funktionen MySQL 185 MAX MySQL Funktion 192 Max MySQL Variante 12 MaxDB 12 MEDIUMBLOB MySQL Datentyp 151 MEDIUMINT MySQL Datentyp 148 MEDIUMTEXT MySQL Datentyp 151 mehrwertige Abh ngigkeit 135 MEMORY MySQL Tabellentyp 144 Microsoft Excel Datenaustausch mit 297 MIN MySQL Funktion 192 mkdir Konsolenbefehl 20 MOD MySQL Funktion 185 Module Apache 23 mSQL als MySQL Vorl ufer 10 Mustervergleiche MySQL 171 my cnf Konfigurationsdatei 40 298 my ini Konfigurationsdatei 40 298 Index 339 MyISAM MySQL Tabellentyp 144 MySQL Fortsetzung myisamchk Hilfsprogramm 290 Constraints 156 MySQL COUNT Funkti
174. alhost ehemyacminiindex ohp Ele C amp Erste Schritte E Aktuelle Nachrichten Php yAd nin 8 Server localhost amp Datenbank gewinnspiel Tabelle gw_fragen InnoDB free 8192 kB A AJQ Anzeigen Struktur RSQL Suche Einf gen f Exportieren f lmportieren Operationen leeren L schen Datenbank gewinnspiel 4 4 gewinnspiel 4 Zeige Datens tze 0 3 4 insgesamt die Abfrage dauerte 0 0004 sek B gw_antworten Ei gw_fragen rSQL Befehl B gw_teilnahme SELECT E gw _teilnehmer FROM gw fragen LIMIT 0 30 Bearbeiten SQL erkl ren PHP Code erzeugen Aktualisieren r Operationen f r das Abfrageergebnis Druckansicht Druckansicht vollst ndige Textfelder Exportieren Zeige go Datens tze beginnend ab 0 untereinander angeordnet und wiederhole die Kopfzeilen nach Datens tzen Nach Schl ssel sortieren keine w gt fr_id fr_frage fr_korrekt 1 Wie hei t die Hauptstadt von Italien 2 Welche dieser Hauptst dte hie einst Lutetia 3 Bratislava ist die Hauptstadt von 4 Welche dieser St dte ist keine Hauptstadt Alle ausw hlen Auswahl entfernen markierte Z X 5 Zeige 30 Datens tze beginnend ab o untereinander angeordnet und wiederhole die Kopfzeilen nach100 Datens tzen Neues phplMyAdmin Fenster Ab
175. allieren Suchen Sie einfach auf der Website von Microsoft http www microsoft com nach diesem Begriff 26 Kapitel 2 Installation und Inbetriebnahme forderung als Administrator ffnen indem Sie Start gt Alle Programme gt Zubeh r w hlen den Eintrag Eingabeaufforderung mit der rechten Maustaste anklicken und Als Administrator ausf hren w hlen Bewegen Sie sich danach mithilfe von cd Befehlen siehe den ersten Abschnitt dieses Kapitels in das Verzeichnis mit der MSI Datei und geben Sie Folgendes ein um sie zu starten gt msiexec i apache_2 2 4 win32 x86 no_ssl msi Folgen Sie anschlie end in jedem Fall Schritt f r Schritt den Installationsanweisun gen auf den folgenden Dialogseiten 1 Information dass Apache 2 installiert wird Klicken Sie hier wie auch auf allen folgenden Bildschirmen Next an um fortzufahren 2 Anzeige der Apache Lizenz Es handelt sich um eine GPL hnliche Open Source Lizenz im Wesentlichen erlaubt sie den freien Einsatz und die Ver nde rung von Apache und sch tzt die Entwickler vor der Vereinnahmung durch kommerzielle Unternehmen oder gar Softwarepatente W hlen Sie I accept the terms in the license agreement 3 Kurze bersicht ber die Features von Apache 2 und weitere Informations quellen 4 Eingabe einiger Grundeinstellungen Network Domain ist Ihr Domainname f r einen lokalen Testserver k nnen Sie zum Beispiel test local eingeben Server Name ist der Name des Webserve
176. ander verkn pften Tabellen in denen Informa tionen so organisiert sind dass sie sich sehr schnell heraussuchen sortieren oder modifizieren lassen Ihr besonderer Nutzen ergibt sich aus der Tatsache dass es Schnittstellen f r Programmiersprachen gibt so dass Anwendungsprogramme auf die Datenbank zugreifen k nnen Der wichtigste Anwendungsbereich von MySQL sind ohne Zweifel PHP Webanwen dungen Da viele Webhoster diese Kombination bereits in relativ g nstigen Tarifen anbieten steht sie auch in der Praxis einem breiten Publikum zur Verf gung Denn dass die Software selbst Open Source und damit unter anderem kostenlos ist n tzt bei Webanwendungen nichts solange die Webhoster sie ihren Kunden nicht zur Ver f gung stellen Die meisten Websites liegen nicht auf eigenen Servern sondern in gemietetem Webspace wo die Software durch den Provider vorgegeben ist vi Dar ber hinaus bringen die MySQL Versionen 5 0 und 5 1 einige Neuerungen mit die bisher vor allem in teuren kommerziellen Datenbanksystemen zu finden waren Das macht MySQL zuk nftig zu einer noch besseren Wahl f r Gesch fts oder Ver waltungsanwendungen aller Art Dieses Buch behandelt den Umgang mit dem Datenbankserver MySQL und seinen Bestandteilen sowie die Kombination mit der Programmiersprache PHP um daten bankbasierte Webanwendungen zu schreiben Zun chst erhalten Sie etwas Hinter grundwissen ber Datenbanken und die Webprogrammierung anschlie end wird d
177. andler onclick der beim Anklicken die ser Schaltfl che aktiviert wird Innerhalb der Anf hrungszeichen des Event Handler Werts gilt die JavaScript Syn tax Wenn Sie darin wiederum Anf hrungszeichen ben tigen wie in den obigen alert Beispielen m ssen Sie einfache verwenden In der Regel schreibt aber nie mand l ngere Abfolgen von JavaScript Anweisungen direkt in den Event Handler sondern ruft eine selbst geschriebene Funktion auf Diese wird mithilfe des Schl s selworts function definiert und besitzt dieselbe Syntax wie die weiter oben beschrie benen PHP Funktionen Das folgende Beispiel stellt ein Formular bereit mit dem Sie eine Suchanfrage an Google senden k nnen das Google Suchskript erwartet einen Parameter namens q mit dem Suchbegriff so dass das Textfeld hier diesen Namen erh lt Vor dem Ver senden stellt die JavaScript Funktion testForm allerdings erst fest ob berhaupt etwas eingegeben wurde und beschwert sich andernfalls Hier zun chst der kom plette Code lt html gt lt head gt lt title gt Google Suchanfrage senden lt title gt lt script language JavaScript type text javascript gt 246 Kapitel 8 Webanwendungen mit PHP und MySQL Funktion testForm Formular vor dem Versand berpr fen function testForm Ist das Textfeld leer if document formular q value Warnung ausgeben alert Bitte zuerst Ihren Suchbegriff eingeben Eingabefokus auf das Textfeld
178. andozeilenclient mysql zur manuellen Eingabe von Befehlen und den PHP basierten Webclient phpMyAdmin Kapitel 5 Datenbanken entwerfen und erstellen ist gewisserma en der erste Teil eines umfangreichen SQL Tutorials Zun chst werden Modelle und Vor gehensweisen f r den Datenbankentwurf angesprochen anschlie end werden ausf hrlich alle wichtigen SQL Anweisungen zur Datenbank und Tabellener stellung behandelt Kapitel 6 SQL Abfragen ist der zweite umfangreichere Teil der SQL Einf h rung In diesem Kapitel lernen Sie alle erforderlichen SQL Anweisungen zum Ausw hlen und Bearbeiten von beliebig verkn pften Datenbanktabellen kennen In Kapitel 7 Fortgeschrittene Datenbankfunktionen werden einige Features vor gestellt die in anderen Datenbanksystemen schon l nger existieren in MySQL aber erst in neueren Versionen eingef hrt wurden In Kapitel 8 Webanwendungen mit PHP und MySQL werden einige umfangrei chere datenbankbasierte PHP Anwendungen vorgestellt Zuvor erhalten Sie eine Einf hrung in die wichtigsten Konzepte von PHP selbst und einen syste matischen berblick ber die MySQL Datenbankschnittstellen der Sprache sowie ber die Grundlagen von JavaScript DOM und Ajax Kapitel 9 MySQL Administration bietet eine bersicht zu den wichtigsten Themen der Administration des MySQL Servers selbst Benutzer und Pass wortverwaltung Optionen und Parameter der wichtigsten mit MySQL geliefer ten Hilfs Programme Konfigurationsd
179. ariable 74 preg_match Funktion 222 preg_replace Funktion 222 random Funktion 89 Regul re Ausdr cke 222 return Anweisung 224 Schleifen 219 session_start Funktion 228 Sessions 227 setcookie Funktion 229 sizeof Funktion 221 spiel php Formular 75 Sprachgrundlagen 216 teilnahme php Skript 80 time Funktion 223 try catch 238 Variablen 216 Variablensubstitution 216 Verf gbarkeit 44 Web Features 227 while Anweisung 219 Zend Engine II 44 Zufallsgenerator 89 PHP Data Objects siehe PDO php ini Konfigurationsdatei 48 phpMyAdmin 112 Benutzerverwaltung 287 Daten eingeben 124 Datenbank erstellen 122 Druckansicht 118 Export 297 Installation 56 Konfigurationsfehler 114 MySQL Optionen 112 Optionen 113 Spaltenoptionen 123 Startbildschirm 112 Tabelle erstellen 122 Tabelle kopieren 122 Tabelle sortieren 121 Tabelleninhalt 118 Tabellenkommentar 121 Tabellenliste 114 Tabellenoperationen 121 Tabellenoptionen 115 Tabellenstruktur 116 PIC MySQL Funktion 186 POST HTTP Methode 72 _POST PHP Variable 74 POW MySQL Funktion 186 preg_match PHP Funktion 222 preg_replace PHP Funktion 222 PREPARE MySQL Anweisung 206 Prepared Statements 206 Platzhalter 207 ausf hren 206 l schen 208 Parameter 207 PDO 242 USING Klausel 207 Prim rschl ssel 4 154 PRIMARY KEY MySQL Index 154 AUTO_INCREMENT 156 Prompt 18 Q query PDO Methode 239 quit mysql Client Anweisung 111 R
180. as alle Daten s tze ordentlich als HTML Tabelle ausgibt Es werden drei L sungen f r die ver schiedenen Schnittstellen mysql mysqli und pdo_mysql erstellt Formal betrachtet sind PHP Dateien gew hnliche HTML Dokumente Die eigent lichen PHP Anweisungen befinden sich an beliebigen Stellen darin und werden von einem Block wie diesem umschlossen lt php hier PHP Anweisungen gt Als Erstes muss in dem Skript die Verbindung zum MySQL Server hergestellt und die Standarddatenbank ausgew hlt werden Mit der klassischen mysql Schnittstelle funktioniert das folgenderma en Datenbankverbindung localhost User phpuser Passwort PHP4ever connID mysql_connect localhost phpuser PHP4ever Datenbank geotest ausw hlen mysql_select_db geotest 50 Kapitel 2 Installation und Inbetriebnahme Die Sequenz leitet brigens einen PHP Kommentar ein der Rest der Zeile wird ignoriert Alternativ k nnen Sie auch verwenden zus tzlich wird der mehrzeilige Kommentar im C Stil unterst tzt Wenn Sie die Schnittstelle mysqli verwenden ben tigen Sie nur eine Zeile Hier wird ein Verbindungsobjekt erstellt in dem unter anderem die Standarddatenbank gespeichert ist conn new mysqli localhost phpuser PHP4ever geotest Bei PHP Data Objects wird ebenfalls ein Objekt erzeugt in diesem Fall von der Klasse PDO Es werden drei Argumente ben tigt Das erste ist ein String mit dem Treiber
181. assen sich idealerweise innerhalb der Bedingung einer while Schleife platzieren um alle Datens tze nacheinander auszulesen Hier ein Beispiel f r den Einsatz von fetch_row while line result fetch_row printf s in s n line o line 1 end Das m sste folgende Ausgabe liefern Bergerhof in K ln Hotel Colonia in K ln Hotel de la Gare in Paris Hotel au Jardin in Paris Otel Bahar in Istanbul Mit fetch_hash funktioniert die Abfrage im Prinzip genauso bis auf den besser les baren Zugriff auf die Felder while line result fetch_hash printf s in s n line ht_name line st_name end Bei nderungsabfragen die keine Datens tze zur ckliefern brauchen Sie keine Ergebnisvariable Stattdessen k nnen Sie nach Durchf hrung der Abfrage die Eigenschaft affected_rows Ihres Verbindungsobjekts auslesen Sie gibt an wie viele Datens tze ge ndert wurden Das folgende Beispiel f gt einen neuen Kunden zur Kundentabelle hinzu und gibt danach an ob es funktioniert hat conn query INSERT INTO rb kunden kd mail VALUES new test com if conn affected_rows gt 0 puts Kunde erfolgreich hinzugef uuml gt else puts Kunde konnte nicht hinzugef uuml gt werden end 314 Anhang B Sonstige APIs Alle MySQL Methoden l sen Exceptions vom Typ Mysql Error aus Wenn Sie diese abfangen k nnen Sie n tzliche Informationen ber den genauen Fehler erhal ten Das folgende Beispiel versucht Daten aus einer ni
182. at diese Umsetzung erledigt MySQL selbstst ndig Der Zeichensatz eines Unix Terminalfensters wird nach System und Terminalan wendung unterschiedlich ge ndert lesen Sie gegebenenfalls die Dokumentation Ihrer konkreten Benutzeroberfl che Hier nur zwei der verbreitetsten Terminals als Beispiel In der KDE Konsole wird der Men befehl Einstellung gt Kodierung gt Westeurop isch iso 8859 1 verwendet Im GNOME Terminal lautet der Men punkt dagegen Terminal gt Zeichenkodierung festlegen gt Westlich ISO 8859 15 15S0 8859 15 ist brigens eine modernere Variante von Latin 1 der einzige Unter schied besteht darin dass das Eurozeichen hinzugef gt wurde Wenn Sie den voreingestellten Zeichensatz der Windows Eingabeaufforderung ndern m chten k nnen Sie folgenden Befehl eingeben gt chcp 1252 Windows 1252 ist nicht ganz aber fast identisch mit Latin 1 Nun m ssen Sie noch zus tzlich die Titelleiste des Eingabeaufforderungsfensters mit der rechten Maustaste anklicken und auf der Registerkarte Schriftart die Schrift Lucida Console w hlen da die alte DOS Rasterschriftart nicht mit dem Windows Zeichensatz kompatibel ist Einfacher als die nderung des Konsolen Zeichensatzes ist oft die Anpassung des Zeichensatzes ber den der Client mit dem MySQL Server kommuniziert Dazu wird der MySQL Befehl SET NAMES verwendet In der Windows Eingabeaufforde rung wird dann Folgendes eingegeben mysql gt SET NAMES cp850
183. ateien Datenimport und export sowie Replikation Vorwort zur 2 Auflage IX In den Anh ngen werden die folgenden Themen behandelt e Anhang A die Kurzreferenz bietet eine kurze bersicht ber die Syntax der wichtigsten SQL Anweisungen sowie der PHP Funktionen f r den Datenbank zugriff zum schnellen Nachschlagen e In Anhang B Sonstige APIs werden im Schnellverfahren die MySQL Schnitt stellen der Programmiersprachen Perl Java und Ruby sowie des Web Frame works Ruby on Rails vorgestellt e Anhang C Weitere Clients stellt einige andere Clientprogramme zum Arbeiten mit MySQL Datenbanken vor die Sie alternativ oder erg nzend zu mysql und phpMyAdmin einsetzen k nnen e In Anhang D Ressourcen und Tools werden einige erg nzende B cher und Websites zu den Themen dieses Buchs empfohlen Inhalt der beiliegenden CD ROM Damit Sie mit MySQL und PHP sofort in die Praxis einsteigen k nnen liegt diesem Buch eine CD ROM mit der ben tigten Software und allen Beispieldateien bei Einen genauen berblick ber ihren Inhalt erhalten Sie wenn Sie die im Wurzelver zeichnis enthaltene Datei index html in einem Browser ffnen Im Einzelnen enth lt die CD ROM Folgendes e Die aktuellen Versionen Stand Mai 2007 der ben tigten Software Apache 2 2 PHP 5 2 MySQL 4 1 MySQL 5 0 und MySQL 5 1 sowie phpMyAdmin 2 10 jeweils f r Linux und Windows e XAMPP ein Server Komplettpaket mit vorkonfigurierten Versionen der gesam
184. ation mit MySQL Datenbanken Wie in Syntax schemata blich stehen kursiv dargestellte Teile f r Elemente die Sie durch etwas Konkretes ersetzen m ssen w hrend eckige Klammern optionale Teile einer Anweisung bezeichnen Ein vertikaler Strich steht dagegen zwischen Elementen von denen eines ausgew hlt werden soll MySQL Abfragen In diesem Abschnitt finden Sie Syntaxschemata der wichtigsten MySQL Anweisun gen und Funktionen sie alle werden in den verschiedenen Kapiteln dieses Buchs n her erl utert Fortgeschrittene SQL M glichkeiten wie Fremdschl ssel Con straints Transaktionen oder Stored Procedures werden in diesem Anhang nicht behandelt lesen Sie dazu bitte die entsprechenden Abschnitte in den Kapiteln 5 und 6 Datenbanken erstellen CREATE DATABASE Datenbankname DEFAULT CHARACTER SET Zeichensatz COLLATE Sortierreihenfolge Liste aller Zeichens tze SHOW CHARACTER SET Liste aller Kollationen SHOW COLLATION 303 Tabellen erstellen Grundform CREATE TABLE Tabellenname Spaltennamei Datentyp Optionen Spaltenname2 Datentyp Optionen MARY KEY Indexname Spaltenname NIQUE FULLTEXT INDEX Indexname Spaltenname 5 P Di DEFAULT CHARACTER SET Zeichensatz lt COLLATE Sortierreihenfolge ENGINE Tabellentyp Kopie der Tabellenstruktur CREATE TABLE Tabellenname LIKE Datenbank Tabellenname Kopie des Tabelleninhalts CREATE TABLE T
185. auch direkt in der gew nschten Felddefinition stehen CREATE TABLE Tabellenname Feld1 Datentyp Optionen PRIMARY KEY Feld2 Datentyp Optionen PRIMARY KEY Feldname INDEX Feldname UNIQUE Feldname 7 a Hier sehen Sie beide Versionen f r die Kunden Tabelle mit einem einfachen Index auf die Nachnamen CREATE TABLE rb kunden kd_nr INT AUTO INCREMENT kd_name VARCHAR 40 kd_vorname VARCHAR 40 kd_gdatum DATE 154 Kapitel 5 Datenbanken entwerfen und erstellen kd_bemerk VARCHAR 100 PRIMARY KEY kd_nr INDEX kd_name 5 CREATE TABLE rb kunden kd_nr INT AUTO INCREMENT PRIMARY KEY kd name VARCHAR 40 kd vorname VARCHAR 40 kd_gdatum DATE kd_bemerk VARCHAR 100 INDEX kd_name Optional k nnen Sie den Klammern einen Indexnamen voranstellen Die folgende Variante verwendet die Bezeichnung name_key CREATE TABLE rb kunden kd_nr INT AUTO INCREMENT PRIMARY KEY kd_name VARCHAR 40 kd_vorname VARCHAR 40 kd_gdatum DATE kd_bemerk VARCHAR 100 INDEX name _ key kd_name Ein Index kann sich auch auf mehrere Spalten beziehen In der Kunden Tabelle k nnte es beispielsweise sinnvoll sein die Kombination aus Vor und Nachname separat zu indizieren da diese h ufig verwendet wird Die nachfolgende Version definiert einen entsprechenden zus tzlichen Schl ssel namens full_name_key CREATE TABLE rb kunden kd_nr INT AUTO INCREMENT PRIMARY KEY kd_name VARCHAR 40 kd_vorna
186. aus der angegebenen Datei ausf hren s status Statusinformationen anzeigen T tee Protokollierung der gesamten Ein und Ausgabe in die angegebene Datei u use Standarddatenbank wechseln C charset Zeichensatz ndern nicht zu verwechseln mit SET NAMES W warnings Warnungen automatisch anzeigen ansonsten nur einzeln durch SHOW WARNINGS w nowarning Warnungen nicht mehr automatisch anzeigen Der Kommandozeilenclient mysql 111 phpMyAdmin In Kapitel 2 wurde bereits beschrieben wie Sie den webbasierten Client phpMyAd min einrichten und starten k nnen Wenn Sie diese Installationsanleitung befolgt haben m sste phpMyAdmin unter http localhost phpmyadmin zur Verf gung ste hen andernfalls m ssen Sie die URL gem Ihrer eigenen Konfiguration eingeben Je nachdem wie Sie die Benutzeranmeldung eingerichtet haben m ssen Sie nach Aufruf der URL Benutzername und Kennwort eingeben oder auch nicht Anschlie Bend gelangen Sie auf die in Abbildung 4 3 gezeigte phpMyAdmin Startseite localhost localhost phpMyAdmin 2 10 0 rc1 Mozilla Firefox Datei Bearbeiten Ansicht Chronik Lesezeichen Yahoo Extras Hilfe e RR 44 http Mocahostiphpomyadminy z gt Cso Erste Schritte E Aktuelle Nachrichten localhost phpMyAdmin 2 10 0 rc1 8 Server Version 5 1 15 beta community nt MySQL Client Version 5 0 22 Protokoll Version 10 Verwandte php Erweiterunge
187. ay Anzahl Ergebnisdatens tze Auswahlabfrage Anzahl ge nderter Zeilen nderungsabfragen Zuletzt eingef gte auto_increment ID Verbindung schlie en PDO Code query conn gt query sql arr query gt fetch PDO FETCH NUM arr query gt fetch PDO FETCH_ASSOC nicht verf gbar wenn Sie die Anzahl vorab ben tigen ist eine sepa rate SELECT COUNT Abfrage erforderlich lines query gt rowCount id conn gt lastInsertId conn null 308 Anhang A Kurzreferenz In diesem Anhang AN HANG B e Perl DBI pa DRC Sonstige APIs Die MySQL Schnittstelle in Ruby e Ruby on Rails Active Record Alle Sprache ist Bezeichnung der Gedanken Immanuel Kant Neben PHP verf gen auch zahlreiche andere Programmiersprachen und Anwen dungen ber Schnittstellen zu MySQL Datenbanken Nachdem es in den Kapiteln ausschlie lich um PHP ging sollen in diesem Anhang exemplarisch zwei weitere Schnittstellen vorgestellt werden Perl DBI und Java JDBC Perl DBI Die Skriptsprache ist besonders bei Unix Systemadministratoren aber auch zur klassischen Webprogrammierung ber die CGlI Schnittstelle beliebt Sie enth lt eine allgemeine Datenbankschnittstelle namens DBI DataBase Interface F r kon krete Datenbanken ben tigt sie einen Treiber derjenige f r MySQL ist bereits ab Werk enthalten Zu Beginn Ihres Perl Skripts m ssen Sie das Modul DBI einbinden use DBI An
188. b list class AlbumController lt ApplicationController def list end end Erg nzen Sie list zu folgendem Gesamtcode die Active Record Methodenaufrufe sollten Ihnen nach den obigen Erl uterungen bekannt sein def list Listeninhalt privat erstellen bandlist lt ul gt ber alle Bands iterieren Band find all each b bandlist lt li gt lt b gt b name b country lt b gt lt 1li gt ber alle Alben der Band iterieren bandlist lt ul gt Album find all conditions gt band_id b id each al bandlist lt li gt a title a release_year lt li gt bandlist lt ul gt bandlist lt ul gt Liste als Instanzvariable ver ffentlichen bandlist bandlist end Nun m ssen Sie nur noch die entsprechende View app views list rhtml erg n zen Sie hat momentan folgenden Inhalt lt h1 gt Albumt tlist lt h1 gt lt p gt Find me in app views album list rhtml lt p gt Erstellen Sie stattdessen den folgenden HTML Code mit eingebettetem Ruby soge nanntem eRuby lt html gt lt head gt lt title gt Rock n Rails Bands und ihre Alben lt title gt lt head gt lt body gt lt h1 gt Alle Bands und ihre Alben lt h1 gt lt p gt lt bandlist gt lt p gt lt body gt lt html gt 322 Anhang B Sonstige APIs Wie Sie sehen brauchen Sie nicht mehr eRuby Code als die Ausgabe der Instanzva riablen bandlist Start
189. bale au erhalb einer Funktion definierte Variablen k nnen in PHP nur dann in einer Funktion verwendet werden nachdem sie mittels global angek ndigt wur 266 Kapitel8 Webanwendungen mit PHP und MySQL den Andernfalls w rde jede Verwendung der Variablen als lokal nur innerhalb dieser Funktion g ltig betrachtet werden In Beispiel 8 7 sehen Sie das vollst ndige Skript Beispiel 8 7 forum php ein Diskussionsforum lt php Include Datei laden include util inc php Datenbankverbindung herstellen conn db_connect forum rbuser R3153n Bereits eingeloggt session start user nummer session _param user 0 Aktuellen Modus ermitteln Liste 1 Lesen r Eintragen e oder Speichern s Standard ist Liste mode cgi_param mode 1 Die Funktion zeige thread zeigt alle auf den angegebenen Beitrag folgenden Eintr ge rekursiv an function zeige thread pid stufe Auf die globale Datenbankverbindung zugreifen global conn Daten aller Postings mit der Parent ID id auslesen query conn gt query SELECT f id f titel f_ nick FROM fo _eintraege WHERE f_pid pid ORDER BY f_ id ASC while list id titel nick query gt fetch_row Einr ckung for i 0 i lt stufe i echo amp nbsp nbsp Nickname leer gt Anonymous if nick nick Anonymous Titel leer gt Ohne Tite
190. bank ausw hlen mysql _select_db db Abfrage senden fr_query mysql_query SELECT fr_id fr_frage FROM gw fragen ORDER BY fr_id ASC Zeilen lesen und Fragen stellen while list fr_id fr_frage mysql_fetch_row fr_query Fragetext ausgeben echo lt b gt fr_id fr_frage lt s b gt lt br gt lt br gt Antworten holen an query mysql query SELECT an _antwort an text FROM gw_ antworten WHERE an _frage fr_id ORDER BY an antwort ASC Radio Buttons und Antworten ausgeben DiePHP Skripten 77 Beispiel 3 1 spiel php das Formular zur Teilnahme am Gewinnspiel Fortsetzung while list an_antwort an_text mysql _fetch row an_query echo lt input type radio name f fr_id value an antwort gt an_text lt br gt echo lt br gt Datenbankverbindung schlie en mysql_close gt lt h2 gt Pers amp ouml nliche Angaben lt h2 gt lt table border 0 cellpadding 4 gt lt tr gt lt td gt Benutzername lt td gt lt td colspan 3 gt lt input type text name uname gt lt tr gt lt tr gt lt td gt E Mail lt td gt lt td colspan 3 gt lt input type text name email gt lt tr gt lt tr gt lt td colspan 4 gt Welche dieser St amp auml dte w amp uuml rden Sie bald am liebsten besuchen lt td gt lt tr gt lt td gt lt input type radio name wish value 1 Paris lt td gt lt td gt lt input ty
191. beiden Tabellen mit Werten gef llt Die vier Fragen ihre m glichen Antworten und die jeweilige Nummer der richtigen Antwort finden Sie in Tabelle 3 1 2 Manche objektrelationalen Mapper wie etwa Active Record aus dem Web Framework Ruby on Rails besitzen etwas andere Benennungsvorgaben siehe Anhang B Die Datenbank erstellen 67 Tabelle 3 1 Fragen und Antwortm glichkeiten f r das Gewinnspiel Frage Antwort 1 Antwort 2 Antwort 3 Korrekt Wie hei t die Hauptstadt von Italien Ram Rom Bios 2 Welche dieser Hauptst dte hie einst Lutetia Br ssel London Paris 3 Bratislava ist die Hauptstadt von Slowakei Slowenien Tschechien 1 Welche dieser St dte ist keine Hauptstadt Ljubljana Istanbul Oslo 2 Mithilfe der folgenden SQL Abfrage k nnen Sie die Werte in die Tabelle gw_fragen einf gen mysql gt INSERT INTO gw_fragen fr_frage fr_korrekt VALUES gt Wie hei t die Hauptstadt von Italien 2 gt Welche dieser Hauptst dte hie einst Lutetia 3 gt Bratislava ist die Hauptstadt von 1 gt Welche dieser St dte ist keine Hauptstadt 2 Da das Feld fr_id durch die Eigenschaft AUTO_INCREMENT automatisch ausgef llt wird k nnen Sie die restlichen Felder vor VALUES explizit nennen und brauchen dann nur Werte f r sie anzugeben Die Werte f r gw_antworten werden durch folgende Abfrage eingef gt mysql gt INSERT INTO gw_antworten VALUES gt 1 1 Ram gt 1 2 Rom gt
192. beitsspeicher laden soweit sie hineinpassen und dort bearbeiten aber auf diese Weise k me es bei einem eventuellen Programmabsturz oder Stromausfall zu Datenverlusten e Sobald mehrere Anwendungen gleichzeitig dieselben Daten ndern m chten kommt es gelinde gesagt zu Ungereimtheiten Stellen Sie sich beispielsweise vor Anwendung 1 speichert eine nderung an einer Datei an der Anwendung 2 noch arbeitet Wenn Anwendung 2 sp ter ihre eigenen nderungen spei chert verschwinden diejenigen von Anwendung 1 im Daten Nirvana Verschiedene Betriebssysteme erlauben unterschiedliche Formate Verzeich nisstrukturen und Dateinamen Dies erschwert die Programmierung kompatib ler Anwendungen Immer mehr Programme arbeiten verteilt ber lokale Netzwerke oder das Internet Der gemeinsame Zugriff auf Dateien und Verzeichnisse ber ein Netz werk f hrt zu neuen Herausforderungen und Kompatibilit tsproblemen All diese Schwierigkeiten lassen sich jedoch effizient vermeiden wenn Sie zur Datenverwaltung und bearbeitung ein Datenbanksystem einsetzen Das ist nicht weiter verwunderlich denn genau solche berlegungen haben seit etwa 1965 zur Entwicklung der ersten Datenbanken gef hrt Kurze Geschichte der Datenbanken Die Idee Informationen ber mehrere gleichartige Elemente geordnet abzulegen entstand schon lange vor der Computertechnik Denken Sie zum Beispiel an h l zerne Karteik sten Aktenordner oder Terminkalender Im Zuge der
193. beitungsseite die Struktur einer Tabelle dar Sie erscheint wenn Sie im linken Frame eine Tabelle ausw hlen oder wenn Sie den Link Struktur auf einer anderen Tabellenseite anklicken In Abbildung 4 6 sehen Sie die Strukturansicht der Tabelle gw_antworten 116 Kapitel 4 Mit MySQL arbeiten localhost localhost gewinnspiel gw_antworten phpMyAdmin 2 10 0 rc1 Mozilla Firefox Datei Bearbeiten Ansicht Chronik Lesezeichen Yahoo Extras Hilfe i A heto sMocahest ohemyadminiindex ohp ED Erste Schritte B Aktuelle Nachrichten PhpsslyAd n n g Server localhost Datenbank gewinnspiel Tabelle gw_antworten InnoDB free 8192 kB 4 AIQ Anzeigen Struktur SAL Suche Einf gen Exportieren flmportieren 2Operationen WLeeren L schen Datenbank gewinnspiel 9 Feld Typ Kollation Attribute Null Standard Extra O an_frage int 11 Ja NULL O an_antwort int 11 Ja NULL ns O anltext varchar 50 latinI_swedish_ci Ja NULL 5 gw_teilnahme t_ Alle ausw hlen Auswahl entfernen markierte IR io E gw _teilnehmer gewinnspiel 4 amp Druckansicht 48 Beziehungs bersicht 8 Tabellenstruktur analysieren 1 Felder hinzuf gen An das Ende der Tabelle An den Anfang der Tabelle ONach an_frage m Indizes Speicherplatzverbrauch Zeilenstatistik Typ Verbrauch Angaben Wert A Kein Index definiert Daten 16 904 Bytes Format CRESS
194. ben Sie folgende Befehle ein mysql gt CREATE USER phpuser localhost IDENTIFIED BY PHP4ever mysql gt GRANT ALL PRIVILEGES ON geotest TO phpuser localhost mysql gt FLUSH PRIVILEGES In der Praxis sollten Sie die Rechte von PHP MySQL Benutzern erheblich ein schr nken In der Regel gen gt beispielsweise der Zugriff auf einzelne Datenbankta bellen auch ALL PRIVILEGES alle Rechte muss nicht sein Mehr ber das MySQL Berechtigungsmanagement erfahren Sie in Kapitel 9 MySQL Administration Wenn Web und MySQL Server auf unterschiedlichen Rechnern laufen m ssen Sie localhost durch den Domainnamen oder die IP Adresse des gew nschten Rech ners ersetzen Sie k nnen den Zusatz auch ganz weglassen um den Zugriff von beliebigen Rechnern aus zu gestatten das ist allerdings weniger sicher und daher nicht zu empfehlen AE Auf keinen Fall d rfen Sie den hier als Beispiel verwendeten Benut zernamen phpuser zusammen mit dem Passwort PHP4ever verwen den Die Informationen in diesem Buch sind ffentlich verf gbar so dass potenzielle Angreifer auf die Idee kommen k nnten diese Werte auf Verdacht gegen fremde MySQL Server auszuprobieren Um zu testen ob Sie unter der neuen Benutzer ID aus PHP Skripten auf die MySQL Datenbank zugreifen k nnen sollten Sie zun chst eine kleine Testdaten bank einrichten Das Staaten Hauptst dte Beispiel aus dem vorigen Abschnitt reicht daf r v llig aus Hier wird ein kurzes PHP Skript vorgestellt d
195. beziehungsweise _jahr eindeutig bezeichnet Die Auslagerung in eine Funktion lohnt sich weil in diesem Skript zwei Datumseingaben erforderlich sind In Abbildung 8 3 sehen Sie wie das ausgef llte Auskunftsformular im Browser aus sieht Datei Bearbeiten Ansicht Chronik Lesezeichen Yahoo Extras Hilfe Reiseb ro Auswahl Mozilla Firefox amp f C http flocalhost mysal_old site mysqli_ng auskunft php ie7 responsexml amp x EuroCityTravel K ln Deutschland C o e Erste Schritte E Aktuelle Nachrichten a Abbildung 8 3 Das ausgef llte Reisesuche Formular Beispiel 8 8 stellt den ausf hrlich kommentierten Quellcode dar Beispiel 8 8 auskunft php Auswahl der Reisedaten lt php include util inc php conn db_connect reisebuero rbuser R3153n Die Reiseb ro Anwendung 273 Beispiel 8 8 Funkti function auskunft php Auswahl der Reisedaten Fortsetzung on zur Wahl eines Datums datumswahl feldname Tagesw hler echo echo lt select name feldname tag size 1 gt n lt option value 0 gt Tag lt option gt n for i 1 i lt 31 i echo lt option value i gt i lt option gt n echo lt select gt n Monatsw hler echo echo lt select name feldname monat size 1 gt n lt option value 0 gt Monat lt option
196. bige frei verkn pfte Datenstrukturen Objektorientierte Datenbanken enthalten Klassen und Objekte die ge nauso aufgebaut sind wie in objektorientierten Programmiersprachen a pr Ein Beispiel f r Daten f r die das relationale Datenbankmodell wenig geeignet ist sind Entfernungsangaben zwischen Orten Tabelle 5 1 versucht diese Informa tionen relational zu speichern Tabelle 5 1 Eine f r das relationale Modell wenig geeignete Datenbanktabelle Startort Zielort Entfernung K ln Paris 490 K ln Rom 1400 K ln Istanbul 2400 Paris Rom 1410 Paris Istanbul 2740 Rom Istanbul 1450 Zwei Spalten in der Tabelle enthalten Ortsangaben also gleichartige Daten Kein logi sches Kriterium kann bestimmen welche St dte als Startort und welche als Zielort ein getragen werden Auch die Darstellung der Entfernungen in beide Richtungen w re keine L sung da sie Redundanzen erg be die zu Inkonsistenzen f hren k nnen F r die objektorientierte Modellierung sind diese Entfernungen dagegen ohne Schwierigkeiten darstellbar Eine Klasse namens Ort enth lt eine Liste von Zielen zu denen direkte Verbindungen bestehen Die Ziele sind nichts weiter als Verweise auf andere Elemente vom Typ Ort In der Object Definition Language ODL einer Art standardisierter objektorientier ter Modellierungssprache bilden die durch das Schl sselwort class gekennzeichne ten Klassen die bergeordnete Datenstruktur Attribute vergleichbar mit den
197. bildung 4 7 Darstellung des Tabelleninhalts von gw_fragen in phpMyAdmin In der n chsten Zeile k nnen Sie sich weitere Darstellungsoptionen aussuchen Der Standardmodus untereinander stellt die Datens tze in vertikaler und die Spalten in horizontaler Ansicht dar Die Option horizontal gedrehte Bezeichner dreht die Spaltenbezeichnungen um 90 was bei Spalten mit schmalen Inhalten einiges an Platz spart allerdings funktioniert das bisher nur im Internet Explorer Der Modus nebeneinander schlie lich vertauscht die Tabellenachsen die Datens tze stehen in Spalten ihre einzelnen Felder untereinander Als N chstes geht es um die Sortierreihenfolge der angezeigten Datens tze Das Pull down Men Nach Schl ssel sortieren erm glicht die Auswahl des Prim r schl ssels und anderer indizierter Spalten als Sortierkriterium Viel intuitiver und einfacher ist es dagegen den Titel der Spalte anzuklicken nach der sortiert werden soll Sobald Sie dieselbe Spalte zum zweiten Mal anklicken wird brigens die Sor tierrichtung umgekehrt ein kleines Dreieck neben dem Spaltentitel markiert die aktuelle Einstellung phpMyAdmin 119 elle Sortierkriterium denselben Wert hat in sich nach einem zweiten Kriterium zu sortieren Ein h ufiger Fall ist etwa das Sortieren nach Vornamen bei identischem Nachnamen In phpMyAdmin funk tioniert dies leider nur per manueller Eingabe einer SQL Abfrage N heres erfahren Sie in Kapitel 6 u Oft ist es w
198. bindungs ID zur ck function db connect database user pass host 127 0 0 1 connID mysql_connect host user pass mysql select _db database return connID Ein entsprechender Aufruf hat folgende Syntax include util inc php connID old db connect reisebuero rbuser R3153n 258 Kapitel8 Webanwendungen mit PHP und MySQL Auch eine externe JavaScript Datei namens utils js wird in jede Datei eingebettet Dies geschieht mithilfe des folgenden lt script gt Tags lt script language JavaScript type text javascript src utils js gt lt script gt Die Datei enth lt nur eine Funktion namens logout function logout var lo confirm Wirklich ausloggen if lo location href logout php Diese Funktion wird beim Klick auf den Hyperlink Logout aufgerufen der nur angezeigt wird wenn gerade ein Benutzer angemeldet ist Die JavaScript Funktion confirm enth lt im Unterschied zu alert zwei Schaltfl chen die mit OK und Abbrechen beschriftet sind und beim Klick auf diese true beziehungsweise false zur ckgeben Mithilfe von location href k nnen Sie eine JavaScript Weiterleitung zur angegebenen URL erzeugen Der eigentliche Link ruft nur diese Funktion auf was wie folgt funktioniert lt a href javascript logout gt Logout lt a gt Auf diese Weise lassen sich Sicherheitsabfragen realisieren die beispielsweise auch beim L schen von Datens tzen in
199. bul Sabiha SAW 3 Dass die Daten tats chlich in die Originaltabelle bernommen wurden zeigt eine Auswahlabfrage die alle Datens tze von rb_airports mit der Stadt Nummer 3 aus gibt mysql gt SELECT ap_name ap_stadt FROM rb_airports WHERE ap_stadt 3 ap_name ap_stadt Istanbul Atat rk 3 Istanbul Sabiha 3 204 Kapitel7 Fortgeschrittene Datenbankfunktionen Auch L schabfragen aus Updatable Views sind m glich und aus Gr nden der Kon sistenz mit den Beispielen im n chsten Kapitel sollten Sie Istanbul Sabiha nun tat s chlich wieder l schen DELETE FROM air1 WHERE ap _name Istanbul Sabiha Eine erneute Auswahlabfrage f r Stadt 3 d rfte zeigen dass es funktioniert hat Zum ndern einer View wird eine ALTER VIEW Anweisung verwendet Ihre Syntax ist mit CREATE VIEW identisch so dass die gesamte SELECT Abfrage wiederholt und vari iert werden muss Hier ein Beispiel das airl um den Beinamen der Flugh fen erweitert ALTER VIEW air1 AS SELECT ap_name ap _zusatz ap _kuerzel ap stadt FROM rb airports Innerhalb der Datenbank erscheinen Views in derselben bersicht wie gew hnliche Tabellen probieren Sie es aus und geben Sie Folgendes ein um die Liste aller Tabellen und Views in der Datenbank reisebuero zu erhalten mysql gt SHOW TABLES Tables_in_reisebu
200. ch ausschlie lich behandelte ist die Perl kompatible Variante die mehrere Funktionen mit dem Pr fix preg_ zur Verf gung stellt In MySQL werden regul re Ausdr cke in der Implementierung von Henry Spencer verwendet diese Bibliothek ist POSIX konform und damit nicht ganz so leistungs f hig wie Perl kompatible regul re Ausdr cke In der Regel ist der Leistungsumfang aber bei Weitem ausreichend f r Datenbankoperationen Tabelle 6 2 zeigt zun chst die wichtigsten RegExp Konstrukte in MySQL mit Beispielen Auswahlabfragen 173 Tabelle 6 2 Von MySQL unterst tzte Konstrukte f r regul re Ausdr cke Konstrukt abc Nabc n m n Ausdruck Klasse Bedeutung eines der angegebenen Zeichen beliebiges Zeichen mit Ausnahme der angegebenen Zeichenbereich einzelne Zeichen und Zeichenbereich ein beliebiges Zeichen vorheriger Teilausdruck optional vorheriger Teilausdruck mindestens einmal vorheriger Teilausdruck beliebig oft vorheriger Teilausdruck genau n mal vorheriger Teilausdruck mindestens m h chstens n mal dient der Gruppierung des enthaltenen Teilausdrucks alternative Gruppen findet Zeichen einer bestimmten Gruppe vollst ndige Liste in Tabelle 6 3 Beginn des Strings Ende des Strings Wortanfang Wortende Beispiel HM aus findet Haus und Maus aber nicht raus h auen findet kauen und bauen aber nicht hauen 1 5 000 findet z B 1000 oder 400
201. ch hier macht die Auswahl der globalen Berechtigungen den Haupt anteil aus Darunter befindet sich der wichtige nur hier vorhandene Punkt Daten bankspezifische Rechte der es Ihnen erm glicht dem Benutzer Berechtigungen an einzelnen Datenbanken und von der nachfolgenden Seite aus auch an einzelnen Tabellen zu erteilen Unter diesem Bereich finden Sie einige weitere Optionen etwa um den Benutzernamen oder das Passwort zu ndern 288 Kapitel 9 MySQL Administration localhost localhost phpMyAdmin 2 10 0 rc1 Mozilla Firefox Datei Bearbeiten Ansicht Chronik Lesezeichen Yahoo Extras Hilfe e Gb 44 http ocalhost phpmyadminy ze kso Erste Schritte B Aktuelle Nachrichten PhpMyAdmin Server localhost 4 glg Datenbanken SQL Status Variablen Zeichens tze Formate Rechte Prozesse Exportieren lmportieren Datenbank a Datenbanken K amp Neuen Benutzer hinzuf gen Bitte Datenbank ausw hlen rLogininformationen Benutzername Textfeld verwenden M Ineuerbenutzer Host Lokal localhost Passwort Textfeld verwenden al Wiederholen ernennen Passwort generieren Generieren Kopieren BjPymf dPseSU7Fe r Datenbank f r Benutzer Keine O Erstelle eine Datenbank mit gleichem Namen und gew hre alle Rechte O Gew hre alle Rechte auf Datenbanken die mit dem Benuterznamen beginne
202. che Software Foun dation im Programme Verzeichnis Apache 2 installieren und konfigurieren 27 7 Klicken Sie im letzten Bildschirm auf Install um die Installation mit den gew hlten Einstellungen zu starten oder auf Back falls Sie doch noch etwas ndern m chten Nach der Installation als Dienst wird Apache automatisch gestartet Im Systray rechter Rand der Taskleiste erscheint das kleine Feder Icon des Apache Service Monitor Klicken Sie es mit der rechten Maustaste an um den Monitor zu ffnen Hier k nnen Sie Apache steuern zum Beispiel nach einer Konfigurations nderung neu starten In Windows Vista funktioniert der Apache Monitor nicht Entfernen Sie ihn daher zun chst aus dem Autostart indem Sie Start gt Alle Programme gt Autostart w hlen ihn mit der rechten Maustaste anklicken und Entfernen w hlen Zur Steuerung von Apache m ssen Sie unter Vista stattdessen die Diensteverwaltung verwenden die Sie unter Start gt Systemsteuerung gt Verwaltung gt Dienste finden Basiskonfiguration Nun ist Apache installiert und Sie k nnen sich um die Grundkonfiguration k m mern bevor Sie ihn einsetzen Bei einer Apache Standardinstallation befinden sich s mtliche Einstellungen in einer einzigen Konfigurationsdatei namens httpd conf die sich im conf Verzeichnis des Servers befindet Welches Verzeichnis dies unter Linux bei Ihrem Installationslayout ist k nnen Sie in der Datei config layout im Eintrag sysconfdir e
203. cherformat also x 2 benutzt P MySQL Datentypen 149 Auch Flie und Festkommatypen k nnen mit der Option UNSIGNED versehen wer den Dadurch werden negative Werte unzul ssig aber anders als bei den ganzzahli gen Datentypen wird dadurch der zul ssige Wertebereich f r positive Zahlen nicht erweitert Datum und Uhrzeit Viele allt gliche Informationen sind mit bestimmten Zeitpunkten verkn pft Im Fall des Reiseb ros sind etwa Flugdatum und uhrzeit besonders wichtig MySQL stellt folgende verschiedene Spaltentypen zur Speicherung von Daten und Uhrzeiten zur Verf gung DATETIME DATE TIME YEAR und TIMESTAMP DATETIME speichert einen voll st ndigen Zeitpunkt im Format JJJJ MM TT hh mm ss also beispielsweise 2007 03 12 17 26 48 DATE enth lt ein Datum ohne Uhrzeit etwa 2007 03 19 In TIME Feldern wird dagegen nur eine Uhrzeit abgelegt zum Beispiel 17 28 32 YEAR Felder enthal ten ausschlie lich eine Jahreszahl wie 2007 TIMESTAMP Felder erf llen einen etwas anderen Zweck Zum Zeitpunkt der Entste hung eines Datensatzes werden automatisch das aktuelle Datum und die aktuelle Uhrzeit eingef gt Das Format von TIMESTAMP Spalten entspricht DATETIME Es ist allerdings ganz einfach auch in alle anderen Arten von Datums und Uhrzeitspalten den aktuellen Zeitpunkt einzuf gen Die MySQL Funktion NOW ohne Argu mente liefert Systemdatum und uhrzeit im genannten Format der Datenbankser ver sucht sich automatisch die
204. chiedliche Shells Befehls Interpreter ausgef hrt werden k nnen wodurch sich die Syntax mancher Eingaben etwas ndert In den drei genannten Beispielf llen ist es so gut wie immer die bash Soweit die Arbeit mit der Shell in diesem Abschnitt geschildert wird macht dies aber keinen Unterschied A Beachten Sie dass innerhalb von Unix Terminalfenstern unter Nachdem Sie die jeweilige Konsole ge ffnet haben wird ein Prompt die eigentliche Eingabeaufforderung angezeigt Windows Rechner verwenden standardm ig die Schreibweise Arbeitsverzeichnis gt zum Beispiel C Dokumente und Einstellungen Sascha Eigene Dateien gt Bei Unix Systemen kann der Prompt sehr unterschiedlich aussehen Recht h ufig ist die Form Username Rechner Arbeitsverzeichnis gt Das eigene Home Verzeichnis meist home Username wird dabei in der Regel durch abgek rzt Somit sieht der gesamte Prompt beispielsweise wie folgt aus sascha linuxbox gt Wenn Sie als root arbeiten wird meistens kein Username angezeigt und das Schlusszeichen wechselt von gt oder zu einer Raute zum Beispiel linuxbox home sascha In diesem Abschnitt und im Rest dieses Buchs werden normalerweise solange der konkrete Prompt keine Rolle spielt folgende Zeichen verwendet um den Prompt zu kennzeichnen e gt Windows Prompt sowie allgemeiner Prompt wenn eine Eingabe f r alle Betriebssysteme gilt 18 Kapitel 2 Installation und Inbetriebnahme e U
205. chieht mithilfe der Methode select_db Die Datenbank reisebuero wird beispielsweise wie folgt ausgew hlt conn select_db reisebuero Nun l sst sich die Verbindung ganz einfach f r Datenbankabfragen verwenden Auswahlabfragen mit SELECT die Datens tze zur ckliefern sollten Sie einer Variab len zuweisen Diese hat den Datentyp Mysql Result und enth lt verschiedene Methoden zum Auslesen des Ergebnisses Das folgende Beispiel ermittelt die Kom bination aus Hotels und St dten result conn query SELECT ht_name st_name FROM rb hotels INNER JOIN rb_staedte ON ht_stadt st_nr Die erste Methode von result die Sie aufrufen sollten ist num_rows Sie liefert die Anzahl der Ergebnisdatens tze zur ck Wenn sie O ist entsprach kein Datensatz Ihrer Abfrage zum Beispiel Die MySQL SchnittstelleinRuby 313 if result num_rows gt O0 Ergebnis ausgeben else puts Keine Datens amp auml tze gefunden end Zum Auslesen der Ergebnisse kommen vor allem zwei Methoden in Frage e fetch_row liest einen Datensatz als nummeriertes Array aus Die Reihenfolge der Felder innerhalb einer Ergebniszeile entspricht den Angaben in Ihrer Abfrage bei alle Felder wird die Reihenfolge der Tabelle selbst gew hlt e fetch_hash liest ebenfalls genau einen Datensatz aus Der einzige Unterschied besteht darin dass Sie einen Hash zur ckerhalten in dem die Spaltennamen aus den Datenbanktabellen die Schl ssel bilden Beide Methoden l
206. chnet und mit den entsprechenden Entity Rechtecken verbunden Eine dritte Art von Information sind die Rollen die als Rauten gezeich net werden und die Art der Beziehungen zwischen den verschiedenen Entities oder auch Attributen darstellen Abbildung 5 1 zeigt ein Entity Relationship Modell f r das oben erarbeitete Hotel Beispiel Informationen ber das Entity Hotel wie etwa Preis Badtyp oder Verpfle gung sind als Attribute eingezeichnet in der bereits vorgestellten Tabelle bilden sie die verschiedenen Spalten Der Prim rschl ssel in diesem Fall die Hotelnummer ist fett hervorgehoben Die Attribute des Entity Stadt sind in der Abbildung nicht dargestellt weil sie f r den Entwurf der Hotel Tabelle nicht relevant sind Abbildung 5 1 Einfaches Entity Relationship Modell eines Hotel Entity Die Rolle das hei t die Relationsbeschreibung ist liegt in denn jedes Hotel befin det sich in einer bestimmten Stadt Da die Verbindungen zwischen Rollen und Enti ties im ER Modell keine Richtungsangabe besitzen ist es empfehlenswert die Beziehung so darzustellen dass sie von links nach rechts beziehungsweise von oben nach unten gelesen wird Falls dies zeichnerisch nicht m glich ist sollte die Rolle anders formuliert werden wenn die Stadt sich links vom Hotel bef nde hie e eine passende Relation beispielsweise enth lt Die Entities k nnen an den Verbindungs linien optional mit 1 beziehungsweise N beschriftet w
207. cht existierenden Tabelle auszulesen begin result conn query SELECT FROM rb airline rescue Mysql Error gt e puts Fehlernummer e errno Fehlercode puts Fehlermeldung e error Meldungstext puts SOL Zustand f e sqlstate Fehler nach SQL Standard end Sie erhalten folgende Ausgabe Fehlernummer 1146 Fehlermeldung Table reisebuero rb airline doesn t exist SOL Zustand 42502 Sobald Sie die MySQL Verbindung nicht mehr ben tigen sollten Sie sie schlie en conn close Ruby on Rails Active Record Ruby on Rails kurz Rails einer der wichtigsten Gr nde f r den derzeitigen Popula rit tsschub von Ruby ist ein modernes Web Framework Es erm glicht die Erstel lung von Webanwendungen gem dem sogenannten MVC Muster Model View Controller Das bedeutet dass Datenstruktur Programmierlogik und Benutzer oberfl che sauber voneinander getrennt werden und einzeln ausgetauscht werden k nnen Das Model wird dabei in der Regel in einer Datenbank gespeichert wobei MySQL Standard ist Beachten Sie dass dazu die im vorigen Abschnitt gezeigte MySQL Erweiterung in Ruby installiert sein muss Die Datenbankverbindung in Ruby on Rails wird ber eine Komponente namens Active Record hergestellt Es handelt sich um einen sogenannten objektrelationalen Mapper ORM der die relationalen Datenbanktabellen automatisch mit einer Objekthierarchie verkn pft Die Funktionsweise von Active Record k nnen Sie n
208. client mysql das Ver waltungswerkzeug mysqladmin und das Backup Tool mysqldump sollten stets ver f gbar sein In s usr local mysql bin mysql usr bin mysql In s usr local mysql bin mysqladmin usr bin mysqladmin In s usr local mysql bin mysqldump usr bin mysqldump Zu guter Letzt k nnen Sie auch den MySQL Server so einrichten dass er automa tisch gestartet wird Als Startskript dient dabei mysql server im Unterverzeichnis support files Ihrer MySQL Installation Wohin Sie dieses Skript verkn pfen m ssen und wie Sie es aktivieren kann sich je nach Linux Distribution unterscheiden MySQL installieren 35 schlagen Sie gegebenenfalls im Handbuch Ihres Systems nach Unter openSUSE und vielen anderen Distributionen funktioniert folgende Befehlsfolge In s usr local mysql support files mysql server etc init d mysql5 chkconfig a mysql5 Installation unter Windows Der Standard Installer f r Windows ist eine ZIP Datei namens mysql 5 0 41 win32 zip Auf der MySQL Website wird auch ein kleineres Paket namens Windows Essen tials Dateiname zurzeit mysql essential 5 0 41 win32 msi angeboten das allerdings nur die unbedingt f r den Betrieb eines MySQL Servers erforderlichen Komponenten enth lt Wenn gen gend Festplattenplatz vorhanden ist was auf einem Rechner auf dem Serverdienste ausgef hrt werden sollen selbstverst ndlich sein sollte ist es bes ser das hier beschriebene Complete Paket zu installieren dam
209. com freuen mysqlbug Tool zur Fehlermitteilung Alternativ k nnen Sie MySQL Fehler auf der Site http bugs mysql com eintragen 290 Kapitel 9 MySQL Administration mysqld Optionen Der MySQL Server Daemon mysqld besitzt zahlreiche Kommandozeilenparameter ber die sein konkretes Verhalten beim Start angepasst werden kann Hier nur die allerwichtigsten im berblick help verbose Nur ausf hrliche Hilfe anzeigen und beenden ansi ANSI SQL Modus statt MySQL Eigenheiten verwenden wird in diesem Buch nicht behandelt N heres finden Sie online unter http dev mysql com doc mysql en ansi mode html basedir Pfad Das MySQL Stammverzeichnis angeben wichtig wenn mysqld selbst nicht in diesem Verzeichnis liegt bind address IP Adresse Die IP Adresse einer Netzwerkschnittstelle wichtig falls mehrere vorhanden sind und der MySQL Server nur ber eine von ihnen verf gbar sein soll datadir Pfad Das Datenverzeichnis in dem sich die MySQL Datenbanken befinden enable named pipe Clientkommunikation ber Named Pipes zulassen nur Windows NT 2000 XP und Server 2003 flush nderungen nicht puffern sondern sofort auf die Festplatte schreiben Diese Option ist besonders sicher aber langsamer install Dienstname Den MySQL Server als automatisch startenden Dienst installieren nur Win dows log Datei Verbindungen und Abfragen in eine Logdatei protokollieren log error Datei Fehler in ei
210. country VARCHAR 40 gt 5 mysql gt CREATE TABLE albums gt id INT AUTO_INCREMENT PRIMARY KEY gt title VARCHAR 40 gt release_year DATE gt band_id INT gt Verlassen Sie den MySQL Client nach diesen Eingaben oder geben Sie vorher ein paar Testdaten ein wenn Sie m chten Schon bald werden Sie allerdings auch ein praktisches Web Interface zur Datenpflege erhalten Nun ist es Zeit die Datei config database yml in einem Texteditor zu ffnen und die Datenbankverbindungsparameter einzugeben Die Datei ist im YAML Format geschrieben Es handelt sich dabei um eine sehr einfache Sprache zur Darstellung verschiedener Datenstrukturen in Textform Das Format ist knapper und weniger komplex als etwa XML Die development Sektion der automatisch erstellten Version der Konfigurationsdatei sieht so aus die Kommentare wurden entfernt development adapter mysql database rock_n_roll_development username root password host localhost Wie Sie sehen ist ein gro er Teil der Arbeit bereits getan Sogar der Datenbankad apter mysql ist bereits eingestellt da er die Standardvorgabe f r Rails ist Ersetzen Sie den username root durch rock_user und f gen Sie das Passwort rockonrails hinzu development adapter mysql database rock_n_roll_development username rock_user password rockonrails host localhost Nachdem Sie die ge nderte Datei gespeichert haben k nnen die Model Klassen erzeugt werden Geben Sie da
211. d sollten Sie htaccess Dateien mittels AllowOverride None abschalten und s mtliche Konfigurationseinstellungen in die httpd conf schreiben Diese Dateien sind nur n tzlich wenn Sie die Verantwortung f r einzelne Verzeich nisse an Dritte delegieren m chten Order Allow Deny Diese drei Direktiven bestimmen welche Hosts oder Netzwerke Zugriff auf ein bestimmtes Verzeichnis erhalten sollen Bei Allow k nnen Sie Hosts auflisten denen der Zugriff explizit gew hrt werden soll Deny verbietet ihn grunds tz lich Order kann die Werte Allow Deny oder Deny Allow jeweils ohne Leerzei chen annehmen und bestimmt so in welcher Reihenfolge Allow und Deny Angaben ausgewertet werden In aller Regel wird eine der beiden Direktiven f r Apache 2 installieren und konfigurieren 31 alle Hosts gesetzt Deny from all beziehungsweise Allow from all die jeweils andere definiert dann Ausnahmen Hier ein Beispiel URL Pfad lokal nur f r das lokale Netz Location lokal gt Order Deny Allow Deny from all Allow from 192 168 0 lt Location gt Nat rlich m ssen Sie 192 168 0 durch den Netzwerkteil der IP Adressen Ihres eigenen Netzes ersetzen Beachten Sie im brigen dass diese Direktiven nor malerweise nichts bringen wenn Sie bestimmte Benutzer ausschlie en wollen da die meisten IP Adressen dynamisch von den Internetprovidern zugewiesen werden In den Verzeichniseinstellungen der DocumentRoot befinden sich bei ffentlichen Web
212. d die folgenden Eingabem glichkeiten e Feld Name der Spalte e Typ Datentyp der Spalte eine genaue Beschreibung aller SQL Datentypen folgt im n chsten Kapitel e L nge Set Byte oder Zeichenanzahl des Datentyps beziehungsweise Werteliste von Aufz hlungstypen e Kollation Sortierreihenfolge gem Zeichensatz und Sprache nur f r Textda tentypen wenn Sie hier nichts ausw hlen wird automatisch die Kollation der gesamten Tabelle verwendet e Attribute Auswahlm glichkeiten f r Zahlentypen UNSIGNED vorzeichen los und UNSIGNED ZEROFILL vorzeichenlos f hrende Stellen bis zur Gesamtbreite mit Nullen auff llen e Null Gibt an ob das Feld leer bleiben darf null oder nicht not null Stan dard e Standard Automatischer Vorgabewert f r Felder der Spalte e Extra Auswahl des Attributs auto_increment f r automatisch durchnumme rierte Schl ssel Felder phpMyAdmin 123 e Indizes zur Auswahl Prim rschl ssel normaler Index unique jedes Feld der Spalte muss einen einmaligen Wert besitzen kein Index Standard Volltext nur in MyISAM Tabellen m glich e Kommentare Eine optionale Beschreibung jeder Spalte zum internen Gebrauch F llen Sie das Formular gem den Angaben in Tabelle 4 4 aus Tabelle 4 4 Spalten der neuen Tabelle pr_angebote Spaltenname Datentyp Weitere Optionen an_id INT auto_increment Prim rschl ssel an_name VARCHAR L nge 40 Index an_preis INT Da
213. dann wenn die Einga beaufforderung mysql gt nicht abgebildet wird Der Datenbankentwurf Bevor Sie damit beginnen SQL Abfragen zur Erzeugung von Datenbanktabellen einzugeben sollten Sie sich die Zeit nehmen ihren Aufbau sorgf ltig zu planen und zu entwerfen Es ist beraus rgerlich wenn man erst nach dem Einf gen von eini gen Hundert Datens tzen bemerkt dass das Datenbankdesign nicht allen Anforde rungen gerecht wird Deshalb werden hier zwei bekannte Ans tze f r den Entwurf relationaler Datenbanken vorgestellt das klassische Entity Relationship Modell sowie die sogenannten Normalisierungsregeln Intuitiver Ansatz Der erste Schritt zur Erstellung von Tabellen besteht darin sich zu fragen und am besten auf einem gro en leeren Blatt zu notieren welche Informationen ber haupt in der Datenbank gespeichert werden sollen Um diesen Abschnitt nicht zu berfrachten wird hier nur ein Teilaspekt der k nfti gen Beispieldatenbank betrachtet die Speicherung der verschiedenen Hotels ber jedes einzelne Hotel sollen folgende Informationen gespeichert werden konzep tionelle Einschr nkungen des Beispiels wurden bereits im Vorwort er rtert e eindeutige Nummer automatisch durchnummeriert als Prim rschl ssel e Name des Hotels Stadt in der es sich befindet e Preis eines Einzelzimmers pro Nacht e Preis eines Doppelzimmers pro Nacht Bad ohne nur WC Dusche oder Bad e Verpflegung ohne Fr hst ck
214. definiert Das geschieht mit dem Schl sselwort class Genau wie Funktionen sollten auch Klas sendefinitionen in einem PHP Block am Dokumentbeginn stehen Hier ein einfa ches Beispiel das eine Klasse f r die Erstellung von HTML Formularen definiert class Form Konstruktor function __construct u m Eigenschaften initialisieren this gt url u this gt method m PHP Grundlagen 225 Methoden function start echo lt form action this gt url method this gt method gt n function textfield n echo lt input type text name n width 40 gt lt br gt n function radiogroup n werte texte for i 0 i lt sizeof werte i echo lt input type radio name n value werte i gt texte i lt br gt n function submit v echo lt input type submit value v gt lt br gt n function end echo lt form gt n Es wurde bereits erw hnt dass eine Klasse lediglich eine Vorlage f r Objekte ist Mithilfe des Operators new wird ein Objekt eine sogenannte Instanz der Klasse erstellt Dabei wird automatisch der Konstruktor aufgerufen eine Funktion namens __construct mit zwei f hrenden Unterstrichen In der Regel wird der Konstruk tor dazu genutzt um den Eigenschaften also den Datenstrukturvariablen der Klasse ihre Anfangswerte zuzuweisen In PHP werd
215. den sich in der Paketgruppe Web und LAMP Server im Abschnitt Serverfunktionen W hlen Sie die Gruppe zur Installation aus und aktivieren Sie gegebenenfalls in der Detailansicht noch einige der Pakete die nicht automatisch hinzugef gt wurden In Abbildung 2 2 sehen Sie die betreffende Bildschirmseite in der grafischen Variante EB YaST2 linuxbox102 Datei Paket Extras Hilfe Fiter Schemata apache2 The Apache Web Server Version 2 0 2 Schema z apache2 doc Zus tzliche Dokumentation Desktopfunktionen apache2 example pages Beispielseiten f r den Apache 2 Webserver M Desktop Effekte BY apache2 mod_perl Perl Einbettung f r Apache S Grafik apache2 mod_php5 PHP5 Module for Apache 2 0 Spiele A apache2 mod_python Ein Python Modul f r den Apache 2 Webserver Entfernter Desktop A apache2 prefork Apache 2 prefork MPM Multi Processing Module 521 7 K XML und LaTeX Bearbeitungswerkzeuge A ibapr Apache Portable Runtime APR Bibliothek 244 3 K Voice Over IP Clients libapr util1 Apache Portable Runtime APR Bibliothek 136 3 K Serverfunktionen mysal A True Multiuser Multithreaded SQL Database Ser 31 8 M Dateiserver php5 ctype PHP5 Extension Module 10 6 K Netzwerkverwaltung php5 dom PHPS Extension Module 146 5K Verschiedene Server php5 gd PHP5 Extension Module 352 1 K Druckserver php5 iconv PHP5 Extension Module 31 3K Voice Over IP Server php5 mbstring PHPS Extension Module 16M Mail und News Server php5 mysql PHP5 Extension Modu
216. der auf Formulare wie der nachfolgende Abschnitt ber DOM zeigt Das Document Object Model Etwa 1997 begannen die Browserhersteller damit erweiterte JavaScript Funktiona lit t unter dem Namen Dynamic HTML einzubauen Damit konnte erstmals auch die Struktur einer bereits bestehenden Webseite nachtr glich ge ndert wer den Das rgerliche war nur dass es kein einheitliches Modell gab Microsoft und Netscape gingen v llig verschiedene Wege Clientseitiges Scripting mit JavaScript und Ajax 247 Das W3C ver ffentlichte daraufhin eine eigene Spezifikation das Document Object Model DOM Inzwischen k nnen Sie davon ausgehen dass 99 aller Webuser einen Browser verwenden der DOM versteht so dass die klassischen L sungen der Browserhersteller praktisch keine Rolle mehr spielen DOM ist brigens f r ver schiedene Programmiersprachen verf gbar und kann nicht nur HTML sondern auch beliebige XML Dokumente verarbeiten DOM betrachtet das jeweilige Dokument als Baumstruktur dessen Wurzel das u erste Tag daher auch Wurzelelement genannt bildet Bei einem HTML Doku ment ist dies das Tag lt html gt Betrachten Sie exemplarisch die folgende Gegen ber stellung eines einfachen HTML Dokuments und seiner Baumstruktur lt html gt Wurzel Element html lt head gt Element head kil lt title gt Element title DOM Baum Text DOM Baum lt title gt lt head gt lt body gt El
217. der Datenauswahl ergebnis php zeigt anschlie end die passen den Angebote an und enth lt Formularfelder damit eine Reise zur Buchung ausge w hlt werden kann Reisedaten ausw hlen Das Skript auskunft php dient der Auswahl der gew nschten Reisedaten Startort Zielort Hinreisedatum und R ckreisedatum Au erdem kann ausgew hlt werden ob Hotelinformationen erw nscht sind oder nicht Die Version auf der CD ROM enth lt eine interessante Erweiterung Das Auswahlmen f r die Zielorte wird per Ajax ge ndert sobald der Startort gew hlt ist damit nur die tats chlich verf gbaren Fl ge angeboten werden Der einzige Zugriff auf die Datenbank dient der Auswahl s mtlicher St dte samt den zugeh rigen Prim rschl sseln die als Formulardaten bertragen werden Die entsprechende Auswahlabfrage sieht folgenderma en aus 272 Kapitel 8 Webanwendungen mit PHP und MySQL SELECT st_nr st_name la_name FROM rb staedte INNER JOIN rb_laender ON st_land la_nr ORDER BY la_name ASC st_name ASC Die ermittelten Daten werden in Arrays gespeichert das spart einen zweiten Datenbankzugriff da sie in zwei Formularfeldern f r den Abreise beziehungsweise Zielort erscheinen sollen Interessant ist noch die in der Anwendung definierte PHP Funktion datumswahl Sie erwartet einen Basisnamen als Argument und gibt drei Pull down Men s f r Tag Monat und Jahr aus diese werden durch den Basis namen mit angeh ngtem Suffix _tag _monat
218. der anders verh lt sich selbstverst ndlich die AND Verkn pfung in der beide Bedingungen zutreffen m ssen im Grunde bildet OR die Vereinigungsmenge von AND und XOR Joins Der wichtigste Grund f r die Verwendung relationaler Datenbanken ist die Ver kn pfung von Daten mehrerer Tabellen Praktische Beispiele daf r haben Sie in den vorigen Kapiteln bereits gesehen hier geht es dagegen um die allgemeine Funkti onsweise der Joins Zun chst einmal ist es wichtig zu verstehen dass es in den meisten F llen keinen Sinn ergibt Daten aus mehreren Tabellen auszuw hlen ohne anzugeben wie sie miteinander verkn pft werden sollen Das ergibt n mlich jede beliebige Kombina tion der Fachausdruck f r eine solche unspezifizierte Verkn pfung lautet Cross Join oder kartesisches Produkt Stellen Sie sich dazu vor Sie h tten drei Tabellen namens suppe hauptgericht und nachtisch mit je einer gleichnamigen Spalte die die folgen den Inhalte aufweisen mysql gt SELECT FROM suppe suppe Tomatensuppe Spargelcremesuppe Zwiebelsuppe hauptgericht 4442 24 22 2222222 22220222000 Schnitzel Bauernomelett Pizza Spinaci 44 22 2222 2222220200200 Auswahlabfragen 179 mysql gt SELECT FROM nachtisch nachtisch Mousse au Chocolat Va
219. det Das folgende Beispiel zeigt eine Tabelle von Fluggesellschaften in der gleichzeitig die jeweilige Haupt stadt des Herkunftslands angegeben wird id name land hauptstadt 1 Air France Frankreich Paris 2 Austrian Airlines sterreich Wien 3 British Airways Gro britannien London 4 Germanwings Deutschland Berlin Die Hauptstadt kennzeichnet jeweils das Land aber nicht die Fluggesellschaft um die es in dieser Tabelle eigentlich geht Die L sung liegt wiederum in einer Auftei lung der Informationen auf zwei Tabellen id land hauptstadt 1 Deutschland Berlin 2 Frankreich Paris 3 Gro britannien London 4 sterreich Wien id name land 1 Air France 2 2 Austrian Airlines 4 3 British Airways 3 4 Germanwings 1 134 Kapitel 5 Datenbanken entwerfen und erstellen Boyce Codd Normalform Es existiert noch eine strengere Form der dritten Normalform die Boyce Codd Nor malform BCNF Eine Tabelle mit einem Prim rschl s
220. die die jeweils aktuelle St dteliste im XML Format liefert lt php function cgi_param feld default var default if isset _GET feld 8 amp _GET feld var _GET feld elseif isset _POST feld amp amp _POST feld var _POST feld return var host localhost user rbuser pass R3153n db reisebuero conn new mysqli host user pass db such cgi_param such ausgabe lt xml version 1 0 encoding iso 8859 1 gt n ausgabe lt staedte gt n query conn gt query SELECT st_name FROM rb_staedte WHERE st_name LIKE such while list stadt query gt fetch_row ausgabe lt stadt gt stadt lt stadt gt n query gt close ausgabe lt staedte gt n header Content type text xml charset iso 8859 1 echo ausgabe gt Abbildung 8 1 zeigt die Anwendung im Einsatz nachdem der Buchstabe a eingege ben wurde Clientseitiges Scripting mit JavaScript und Ajax 255 Dynamische St dteliste Mozilla Firefox Datei Bearbeiten Ansicht Chronik Lesezeichen Yahoo Extras Hilfe C C _httpiyiocalhostjstadtiste html gt Glz ie7 responsexmi Erste Schritte E Aktuelle Nachrichten Stadt al ni Amsterdam Athen Barcelona Frankfurt Main Istanbul Lissabon Madrid Paris Prag Warschau Abbildung 8
221. die oben beschriebene Isolation wirkt also Starten Sie nun auch im neuen Fenster eine Transaktion START TRANSACTION Als N chstes sollen zwei weitere Datens tze hinzugef gt werden INSERT INTO stationen s_name s_dauer VALUES W rzburg 60 INSERT INTO stationen s name s dauer VALUES M nchen 50 Durch SELECT l sst sich best tigen dass die neuen Daten angekommen sind w h rend die Daten der anderen Transaktion ausgeblendet bleiben die auto_increment IDs werden dagegen ber die Transaktionen hinweg korrekt vergeben mysql gt SELECT FROM stationen sid s name s_dauer 4 W rzburg 60 5 M nchen 50 Schalten Sie wieder um ins erste Fenster Hier werden nach wie vor nur die ersten drei Datens tze angezeigt Best tigen Sie sie nun indem Sie Folgendes eingeben mysql gt COMMIT 202 Kapitel 7 Fortgeschrittene Datenbankfunktionen Im zweiten Fenster sind daraufhin alle f nf Datens tze vorhanden mysql gt SELECT FROM stationen s_id s_name s_dauer 1 Kln o 2 Bonn 30 3 Frankfurt 80 4 W rzburg 60 5 M nchen 50 Angenommen die beiden letzten Datens tze sind doch unerw nscht In diesem Fall lassen sie sich durch ein Rol
222. dte antwort getElementsByTagName stadt for i 0 i lt staedte length i name staedte i firstChild nodeValue staedtenamen push name Bisherigen Inhalt der Liste leeren liste document getElementById stadtliste while liste hasChildNodes liste removeChild liste firstChild Textknoten und Zeilenumbr che f r alle St dte erzeugen und anh ngen for i in staedtenamen txt document createTextNode staedtenamen i br document createElement br liste appendChild txt liste appendChild br else alert Leider ist ein Fehler aufgetreten lt script gt lt head gt lt body gt lt form name f gt Stadt lt input type text name stadt onkeyup sucheStadt gt lt form gt lt div id stadtliste gt St amp auml dte lt div gt lt body gt lt html gt Die PHP Datei staedte php die alle zur aktuellen Suchanfrage passenden St dte her aussucht und als XML Dokument zur ckgibt wird in Beispiel 8 5 gezeigt Sie ver wendet die mysqli Schnittstelle und wird hier unkommentiert abgedruckt da Sie das verwendete PHP bereits kennen Beachten Sie nur die header Anweisung die 254 Kapitel 8 Webanwendungen mit PHP und MySQL den Content type vor der Auslieferung des eigentlichen Dokuments auf text xml setzt Mindestens im Internet Explorer funktioniert die Anwendung andernfalls nicht Beispiel 8 5 Die PHP Datei staedte php
223. dungen zu programmieren Im ersten Abschnitt werden einige PHP Grundlagen vermittelt daf r sind wie bereits erw hnt nur einige HTML Vorkenntnisse n tig Anschlie end erhalten Sie einen systematischen berblick ber die bereits angesprochenen MySQL Schnitt stellen von PHP mysql mysqli und PHP Data Objects Im letzten Abschnitt schlie lich wird die MySQL basierte PHP Webanwendung des Reiseb ros vorgestellt Dabei werden einige der Skripten vollst ndig abgedruckt und erl utert andere dagegen aus Platzgr nden eher kurz gestreift Die vollst ndige Reiseb ro Site finden Sie auf der beiliegenden CD ROM Es lohnt sich sie zu installieren auszuprobieren und auch die Quellcodes der restlichen Skripten zu studieren Sie enthalten zahlreiche erl uternde Kommentare PHP Grundlagen In diesem Abschnitt werden einige grundlegende Konzepte der Programmierspra che PHP vorgestellt die in den Anwendungsbeispielen am Ende dieses Kapitels ohne weitere Erl uterung vorausgesetzt werden Der erste der beiden Unterab schnitte behandelt Allgemeines zur Sprache der zweite webspezifische Funktionen Falls Sie bereits mit PHP vertraut sind k nnen Sie diesen Abschnitt komplett ber springen Ben tigen Sie dagegen eine gr ndlichere Einf hrung in die PHP Program mierung kann ich Ihnen das Buch PHP 5 Ein praktischer Einstieg von Ulrich G nther empfehlen das ebenfalls in der Buchreihe O Reillys Basics erschienen ist 215 All
224. e Gr e der Speicherpartition die f r MySQL reserviert werden soll datadir Pfad Datenverzeichnis in dem sich die MySQL Datenbanken befinden defaults extra file Pfad Konfigurationsdatei die zus tzlich zu den Standardoptionen verarbeitet wird defaults file Pfad Konfigurationsdatei die anstelle der Standardoptionen verarbeitet wird ledir Pfad Verzeichnis in dem sich das Serverprogramm mysqld befindet 292 Kapitel 9 MySQL Administration log error Pfad Pfad der Logdatei f r Fehler mysqld Programm Dateiname des Serverprogramms muss angegeben werden wenn Server und Datenverzeichnis verschieden sind nice Priorit t nice Priorit tswert f r den MySQL Server festlegen no defaults Keine Konfigurationsdateien einlesen open files limit Anzahl Maximale Anzahl von Dateien die der Server gleichzeitig offen halten dart pid file Pfad Die Prozess ID Datei f r den MySQL Server port Portnummer TCP Port socket Pfad des MySQL Servers Standard 3306 Unix Domain Socket f r lokale Clientverbindungen timezone Zone Angabe der Standard Zeitzone user Benutzername Benutzerkennung unter der der Server ausgef hrt werden soll in der Regel mysql P N F r Linux und andere Unix Systeme gibt es zwei verschiedene Me thoden um Daemons Serverdienste beim Booten automatisch zu starten Auf dem klassischen AT amp T Unix aufsetzende Varianten und Linux v
225. e ht_ezpreis ht_dzpreis La Barca 190 200 Danach k nnen Sie die Werte wieder zur cksetzen und die Werte erneut berpr fen mysql gt UPDATE rb_hotels SET ht_ezpreis ezpreis ht_dzpreis dzpreis gt WHERE ht_nr 10 mysql gt SELECT ht_name ht_ezpreis ht_dzpreis FROM rb_hotels gt WHERE ht_nr 10 ht_name ht_ezpreis ht_dzpreis La Barca 100 185 Um k nftig wieder vollkommen unabh ngig ber die Hotelpreise bestimmen zu k nnen sollten Sie den Trigger nun wieder l schen DROP TRIGGER ht_dzpreis_test Eine bersicht ber die vorhandenen Trigger der aktuellen Datenbank erhalten Sie brigens mithilfe der folgenden Anweisung SHOW TRIGGERS 214 Kapitel7 Fortgeschrittene Datenbankfunktionen In diesem Kapitel KAPITEL 8 PHP Grundlagen Die MySQL Schnittstellen in PHP We ba nwen d un g en Clientseitiges Scripting mit Java s eis m it P H P u nd MySQL Erst durch des Wissens Verwendung erf llt sich des Weisen Sendung J disches Sprichwort Das vorliegende Kapitel ist in gewisser Weise der Kern dieses Buchs Hier erfahren Sie wie das Datenbanksystem MySQL und die Programmiersprache PHP 5 mitein ander verkn pft werden um leistungsf hige Webanwen
226. e Informationen ber den Flug aus der Datenbank Sie erstellt aus diesen Daten und einigen festgelegten Textbaustei nen wie Flug Nr oder Buchen ein HTML Dokument das an den Browser des Benutzers bermittelt wird Der Browser zeigt das Dokument gem den enthalte nen HTML Steueranweisungen an Das Dokument enth lt ein Formular mit einem Textfeld zur Eingabe der gew nschten Ticketanzahl sowie einen Absende Button Sobald der Benutzer diesen bet tigt wird die eingegebene Anzahl an den Server zur ckgeschickt Ein weiteres Webserver Anwendungsprogramm nimmt sie entge gen und schreibt sie per nderungs oder Einf geabfrage in die Datenbank Abbil dung 1 3 illustriert den beschriebenen Ablauf Browser Webserver Datenbankserver lt html gt HTML e Daten i Flug Nr 4U 382 Dokument Flug flugnr auslesen Flug nach nach Paris nach ziel 4U 382 Pari Daten Buchen 2 Tickets Feld anzahl einf gen 3 Flug a Formulardaten 4u 3820 Abschicken EER Abbildung 1 3 Three Tier Anwendung mit Datenbankserver Webserver und Browser Diese Variante der Anwendung ist eher f r Endkunden geeignet die ber das Inter net eine Reise buchen m chten Allerdings ist auch innerhalb geschlossener Organi sationen in den letzten Jahren der Trend zu beobachten dass browserbasierte Webanwendungen die spezialisierten Einzelanwendungsprogramme abl sen Sie werden im Gegensatz zum externen Intern
227. e Typ kleiner oder weniger pr zise ist als der alte k nnen Daten verloren gehen nderungen von Flie komma in Ganzzahltypen oder Verk rzungen von Zeichenketten sind daher relativ gef hrlich Das folgende Beispiel ndert den Datentyp von ht_ezpreis von INT in TINYINT 8 Bit Integer Wertebereich 128 bis 127 mysql gt ALTER TABLE rb_hotels2 gt CHANGE COLUMN ht_ezpreis ht_ezpreis TINYINT Query OK 23 rows affected 0 22 sec Records 23 Duplicates O Warnings 0 Falls Sie die Preisminderung um 10 aus dem vorigen Abschnitt in Ihrer Version von rb_hotels2 nicht durchgef hrt haben erhalten Sie eine Warnung da der teu erste Einzelzimmerpreis 130 automatisch auf 127 gesenkt wird Schlie lich k nnen Sie CHANGE COLUMN noch verwenden um die Position von Spalten in einer Tabelle zu modifizieren Das folgende Beispiel verschiebt ht_stadt hinter ht_ dzpreis ALTER TABLE rb_hotels2 CHANGE COLUMN ht_stadt ht_stadt INT AFTER ht_dzpreis ALTER TABLE kann nicht nur Spalten sondern auch Indizes ndern ADD INDEX f gt einen Index hinzu DROP INDEX l scht ihn wieder die entsprechende Syntax wurde bereits im Abschnitt Schl ssel und Indizes im vorigen Kapitel erl utert Dasselbe Weitere Abfragetypen 197 gilt f r Prim rschl ssel die Sie mithilfe von ADD PRIMARY KEY Spaltenname hinzuf gen und mittels DROP PRIMARY KEY da es nur einen gibt ohne Namensangabe ent fernen k nnen Sie k nnen auch die Tabe
228. e Variablen in denen mehrere Werte listenartig gespeichert wer den k nnen Das er ffnet zahlreiche Automatisierungsm glichkeiten Jedes Ele ment in einem Array besitzt einen Index ber den es identifiziert werden kann dieser steht in eckigen Klammern hinter dem Variablennamen In PHP kann der Index je nach Wunsch numerisch oder ein String sein anders als zum Beispiel in Perl wo String Indizes den sogenannten Hashes einem anderen Variablentyp vor behalten sind Ein Array wird entweder durch Wertzuweisung an ein einzelnes Element oder durch die Funktion array erstellt Beispiele Einzelne Elemente laender 0 Deutschland laender 1 Frankreich laender 2 T rkei Funktion array staedte array K ln Paris Istanbul Numerische Arrays werden wie Sie sehen ab 0 durchnummeriert im zweiten Bei spiel automatisch staedte 0 hat also den Wert K ln String Indizes werden in Anf hrungszeichen in die eckigen Klammern geschrieben in der Funktion array dient der spezielle Operator gt der Verkn pfung von Index und Element Auch dazu sehen Sie hier wieder zwei Beispiele Einzelne Elemente airlines LH Lufthansa airlines 4U Germanwings airlines AF Air France Funktion array airports array CGN gt K ln Bonn IST gt Istanbul FCO gt Roma Fiumicino 220 Kapitel 8 Webanwendungen mit PHP und MySQL Wie bere
229. e abgeschlossen sind Das erledigt die Option graceful elegant apachectl graceful I F r manche Konfigurations nderungen gen gt ein graceful Neu AN start nicht und f r einige wenige m ssen Sie Apache sogar ganz beenden apachectl stop und wieder starten beispielsweise nach der weiter unten beschriebenen Installation von PHP Zu guter Letzt kann apachectl auch dazu genutzt werden Apache 2 beim Booten auto matisch zu starten In den meisten Linux Distributionen k nnen Sie dazu einen Sym link auf dieses Skript in etc init d ablegen und es anschlief end mittels chkconfig a aktivieren Beispiel In s usr local apache2 bin apachectl etc init d apache22 chkconfig a apache22 Br Der Dateiname apache22 wurde hier absichtlich gew hlt um der eventuell installierten Apache Version aus der Distribution deren s Startskript meist apache2 hei t nicht in die Quere zu kommen Installation unter Windows F r Windows bietet die Apache Software Foundation einen bequemen Bin r Instal ler im MSI Format Windows Installer an Starten Sie das Paket apache_2 2 4 win32 x86 no_ssl msi unter Windows 2000 XP oder Server 2003 per Doppelklick Unter Windows Vista funktioniert diese Startvariante nicht da Sie so keine Admi nistratorrechte f r den Installer erhalten Hier m ssen Sie zun chst die Eingabeauf 4 Bei lteren Windows Versionen als den angegebenen m ssen Sie zuerst den Windows Installer selbst inst
230. e aller Hotels mysql Version lt html gt lt head gt lt title gt Reiseb amp uuml ro Hotels lt title gt lt head gt lt body gt lt h1 gt Liste aller Hotels lt h1 gt lt table border 2 cellpadding 4 gt lt tr gt lt th gt Hotel lt th gt lt th gt Einzelzimmer lt th gt lt th gt Doppelzimmer lt th gt lt th gt Stadt lt th gt lt tr gt lt php Datenbankparameter host localhost user rbuser pass R3153n db reisebuero Nerbindung herstellen connID mysql_connect host user pass Datenbank ausw hlen mysql select_db db Abfrageinhalt querytext SELECT ht_name ht_ezpreis ht_dzpreis st_name FROM rb hotels INNER JOIN rb staedte ON ht _stadt st_nr Die MySQL Schnittstellenin PHP 233 Beispiel 8 1 Ausgabe einer Liste aller Hotels mysql Version Fortsetzung ORDER BY st_name ASC ht_name ASC Abfrage an Server senden result mysql_query querytext Ausgabeschleife while list hotel ezpreis dzpreis stadt mysql fetch row result echo lt tr gt n echo lt td gt hotel lt td gt n echo lt td align right gt ezpreis amp euro lt td gt n echo lt td align right gt dzpreis amp euro lt td gt n echo lt td gt stadt lt td gt n echo lt tr gt n Datenbankverbindung schlie en mysql_close gt lt table gt lt body gt lt html gt In Beispiel 8 2 seh
231. e des Landes la_eigen VARCHAR 40 Index Eigenname des Landes la_zkuerzel CHAR 3 Kfz Kennzeichen des Landes z B D la_dkuerzel CHAR 2 Top Level Domain z B de la_bemerk VARCHAR 100 Bemerkungen z B Einreisebestim mungen Tabelle rb_staedte st_nr INT Prim rschl ssel AUTO_INCREMENT DerDatenbankentwurf 139 Tabelle 5 3 Bedeutung der Spalten aller Tabellen der Datenbank reisebuero Fortsetzung Spalte Datentyp Optionen Bedeutung st_name VARCHAR 40 Index deutscher Name der Stadt st_eigen VARCHAR 40 Index Eigenname der Stadt st_land INT Land Bezug auf rb_laender la_nr st_bild_url VARCHAR 40 URL Dateiname einer Abbildung st_text_url VARCHAR 50 URL Dateiname einer Beschreibung Tabelle rb_airlines ai_nr INT Prim rschl ssel AUTO_INCREMENT ai_name VARCHAR 40 Index Name der Fluggesellschaft ai_kuerzel CHAR 6 K rzel z B LH f r Lufthansa ai_land INT Herkunftsland Bezug auf rb_laender la_nr ai_url VARCHAR 50 Website der Fluggesellschaft Tabelle rb_airports ap_nr INT Prim rschl ssel AUTO_INCREMENT ap_name VARCHAR 40 Index Name des Flughafens ap_zusatz VARCHAR 40 Namenszusatz z B Istanbul gt Ata t rk Intl Airport ap_kuerzel CHAR 6 internationales K rzel z B CGN f r K ln Bonn ap_stadt INT Stadt Bezug auf rb_staedte st_nr ap_url VARCHAR 50 Website des Flughafens Tabelle rb_flugstrecken fs_nr T Prim rschl ssel AUTO_INCREMENT fs_airline T Bez
232. e enth lt PHP zwei verschiedene spezielle Schnittstellen f r den Zugriff auf MySQL Datenbanken 1 Die aktuelle Version PHP 5 bem ht sich die einst besonders starke Verbindung zu MySQL zu relativie ren und die MySQL Schnittstelle als eine von vielen Datenbankschnittstellen in PHP zu behandeln 6 Kapitel 1 Einf hrung e Die Schnittstelle wird mit der Datenbank geliefert und kann durch verschie dene Programmiersprachen angesprochen werden MySQL enth lt ab Werk diverse Bibliotheken etwa f r C oder Perl e Die Schnittstelle ist in die Programmiersprache eingebaut und kann auf unter schiedliche Datenbanken zugreifen Beispiele dieses Typs sind die neuen in diesem Buch ausf hrlich behandelten PHP Data Objects PDO Perl DBI und JDBC f r Java siehe Anhang B Beachten Sie dass meist ein zus tzlicher Trei ber f r konkrete DBMS erforderlich ist e Es handelt sich um eine allgemeine Drittanbieterschnittstelle die verschiedene Datenbanken mit unterschiedlichen Programmiersprachen verkn pfen kann auch hier wird unter Umst nden ein konkreter Treiber ben tigt Die bekann teste Schnittstelle dieses Typs Microsoft ODBC ist seit vielen Jahren Bestand teil aller Windows Versionen All diese verschiedenen Arten von Schnittstellen unterscheiden sich vor allem in der Art und Weise voneinander wie die Anwendung eine Verbindung zum Datenbank server herstellt Auch die genauen Bezeichnungen der Befehle f r den Datenbankzu gr
233. e neue Seite die der wei ter unten beschriebenen Eingabeseite f r neue Tabellen entspricht Der nachfolgende Abschnitt gibt Auskunft ber die in der Tabelle definierten Indizes Ausf hrliche Informationen ber Schl ssel und Indizes erhalten Sie im n chsten Kapitel Tabelleninhalt Wenn Sie eine Tabelle ausgew hlt haben und den Link Anzeigen anklicken werden die Inhalte der Tabelle angezeigt in Abbildung 4 7 sehen Sie die Tabelle gw_fragen als Beispiel Oben erscheint der Wortlaut der SQL Abfrage die zum aktuellen Aus schnitt der Tabellendaten gef hrt hat Per Voreinstellung werden jeweils 30 Daten s tze pro Seite angezeigt was durch eine LIMIT Klausel erreicht wird Oberhalb der eigentlichen Daten und ein weiteres Mal darunter k nnen Sie festle gen welche und wie viele Datens tze angezeigt werden sollen ein Klick auf die Schaltfl che Zeige best tigt Ihre Auswahl Besitzt die Tabelle mehr Zeilen als bei der gew hlten Anzahl auf die aktuelle Seite passen werden zus tzliche Schaltfl chen zum Bl ttern bereitgestellt lt und gt bl ttern je eine Seite zur ck beziehungs weise vor w hrend lt lt und gt gt an den Anfang beziehungsweise das Ende der derzeitigen Sortierreihenfolge springen 118 Kapitel 4 Mit MySQL arbeiten localhost localhost gewinnspiel gw_fragen phpMyAdmin 2 10 0 rc1 Mozilla Firefox Datei Bearbeiten Ansicht Chronik Lesezeichen Yahoo Extras Hife m hetp loc
234. e received the usual lecture from the local System Administrator It usually boils down to these three things 1 Respect the privacy of others 2 Think before you type 3 With great power comes great responsibility Als N chstes sollten Sie noch das Kommando kennen mit dem Sie sich den Inhalt des aktuellen Verzeichnisses ausgeben lassen k nnen Unter Windows hei t es dir gt dir Auf Unix Rechnern lautet der Befehl dagegen 1s Wenn Sie die Option 1 hinzuf gen erhalten Sie ausf hrliche Informationen ber jede Datei beispielsweise den Eigent mer die Zugriffsrechte und die Gr e Is 1 Um den berblick zu behalten ist es manchmal n tzlich den Fensterinhalt zu l schen und den Prompt wieder nach links oben zu setzen Geben Sie dazu in der Windows Eingabeaufforderung Folgendes ein gt cls In den meisten Unix Terminals lautet der Befehl dagegen clear Noch praktischer ist dass Sie bei fast allen Unix Varianten einfach Strg L dr cken k nnen um denselben Effekt zu erzielen Tabelle 2 2 stellt die wichtigsten Konsolenbefehle f r beide Plattformen noch ein mal gegen ber wobei einige zus tzliche Anweisungen hinzukommen 2 bersetzung Wir vertrauen darauf dass Sie die bliche Belehrung durch den lokalen Systemadminis trator erhalten haben Sie l sst sich f r gew hnlich durch folgende drei Punkte zusammenfassen 1 Respektieren Sie die Privatsph re anderer 2 Denken Sie nach bevor
235. e und frei w hlbare Zeichens tze mit Konvertierung seit Version 4 1 Unterabfragen Subqueries das Ergebnis einer Abfrage kann als Einschr n kungskriterium einer anderen dienen in vollem Umfang seit Version 4 1 R umliche und geometrische Daten gem GIS Standard seit Version 4 1 Stored Procedures mehrzeilige SQL Funktionen auf dem Datenbankserver selbst seit Version 5 0 Trigger SQL Konstrukte die bei jeder Abfrage eines bestimmten Typs auto matisch aufgerufen werden ideal etwa zur berpr fung neu eingef gter Werte seit Version 5 0 Multi Master Replikation Replikation aus mehreren Quellen seit Version 5 0 MySQL Cluster automatische Zusammenarbeit von MySQL Server Instan zen auf mehreren Rechnern zur Performancesteigerung seit Version 5 0 MySQL 5 1 zurzeit noch in der Betaphase enth lt vor allem folgende Neuerungen Partitionierung Speicherung von Tabellen ber verschiedene Partitionen und physikalische Datentr ger hinweg Zeilenbasierte Replikation anders als bei der fr heren MySQL Replikation werden keine SQL Anweisungen kopiert sondern die Inhalte von Tabellen zeilen Event Scheduler automatische Erledigung bestimmter Aufgaben zu festgeleg ten Zeiten zum Beispiel Backups oder Anlegen neuer Logdateien Logtabellen einige Logs k nnen nun nicht mehr nur in Dateien sondern auch direkt in spezielle Tabellen der Verwaltungsdatenbank mysql geschrieben werden XML Funktionen
236. ebiges HTML einf gen vor allem For mularelemente Die meisten von ihnen werden durch das lt input gt Tag bereitgestellt Die einfachste Form ist ein Texteingabefeld mit folgender Grundsyntax lt input type text name feldname gt 72 Kapitel 3 Die erste Webanwendung Was ein Benutzer in dieses Feld eintr gt wird beim Versenden als feldname inhalt zu den Formulardaten hinzugef gt Das folgende Beispiel definiert ein Feld namens user mit einer Anzeigebreite von 40 Zeichen die maximale Eingabel nge betr gt 50 Zeichen lt input type text name user size 40 maxlength 50 gt Ein anderes Beispiel sind Radio Buttons die die Auswahl einer einzelnen Option aus mehreren erm glichen Dazu besitzen sie denselben Wert f r das Attribut name und unterschiedliche Werte f r value den Wert der bertragen wird falls jemand die entsprechende Option ausw hlt Daraus ergibt sich folgende Syntax lt input type radio name gruppenname value wert1 Beschriftung 1 lt input type radio name gruppenname value wert2 Beschriftung 2 Hier ein Beispiel zur Auswahl einer Zahlungsmethode Wie m amp ouml chten Sie zahlen lt input type radio name zahlung value kred gt Kreditkarte lt br gt lt input type radio name zahlung value bank gt Bankeinzug lt br gt lt input type radio name zahlung value rech gt Rechnung lt br gt lt input type radio name zahlung value nach gt Nachnahme
237. ebsite Verzeichnis liegen Betrachten Sie dazu folgendes Beispiel Alias phpmyadmin usr local phpMyAdmin 2 10 1 32 Kapitel 2 Installation und Inbetriebnahme Das weiter unten behandelte Datenbank Administrationstool phpMyAdmin das in diesem Beispiel in Wirklichkeit im Verzeichnis usr local phpMyAdmin 2 10 1 liegt wird unter dem URL Pfad phpmyadmin eingebunden Es kann also unter der URL http www test local phpmyadmin aufgerufen werden W Die Beispiele im weiteren Verlauf dieses Buchs gehen davon aus dass folgende besonderen Apache Konfigurationseinstellungen vor genommen werden 1 DirectoryIndex enth lt die Dateinamen index html und index php 2 Der Server ist unter dem Domainnamen www test local erreich bar Sie m ssen die Direktive ServerName entsprechend setzen und Ihre etc hosts Datei anpassen siehe oben 3 In allen Verzeichnissen die Apache ver ffentlicht kann PHP ausgef hrt werden Die entsprechende Konfiguration wird wei ter unten im Rahmen der PHP Installation erl utert MySQL installieren Der zweite Schritt ist die Installation des MySQL Datenbankservers selbst Dazu sind unter beiden Systemfamilien einige Schritte erforderlich Wenn Sie der nach folgenden ausf hrlichen Anleitung folgen werden Sie aber keine Schwierigkeiten haben Als konkrete Version wird hier 5 0 x beschrieben die Installation der bishe rigen Beta Versionen von MySQL 5 1 funktioniert aber genauso vor allem unter W
238. echenden Feld werden auto matisch fortlaufend durchnummeriert Dabei werden Werte aus gel schten Daten s tzen nicht wieder neu vergeben um die Datenintegrit t zu wahren Pro Tabelle ist maximal eine AUTO_INCREMENT Spalte zul ssig ihr Datentyp muss numerisch sein zum Beispiel INT Die Schreibweise einer solchen Definition sieht immer wie folgt aus Spaltenname Datentyp Typoptionen AUTO_INCREMENT Indexart Das folgende Beispiel stammt nicht aus der Reiseb ro Tabelle Es definiert eine automatisch durchnummerierte auf zehn Stellen mit Nullen aufzuf llende Artikel nummer als Prim rschl ssel artikelnr INT 10 ZEROFILL AUTO INCREMENT PRIMARY KEY Definierte Fremdschl ssel Zu plausiblen Beziehungen zwischen verschiedenen Tabellen geh rt mehr als die Ein haltung der weiter oben erl uterten Normalisierungsregeln Wichtig ist n mlich auch die Konsistenz der Beziehungen die sogenannte referenzielle Integrit t im laufen den Betrieb zu berwachen Beispielsweise muss ein Datensatz gel scht werden wenn er sich auf eine ebenfalls gel schte Zeile einer anderen Tabelle bezieht Stellen Sie sich im Reiseb ro Beispiel vor eine Stadt w rde komplett aus dem Programm genommen Nat rlich m ssten dann auch s mtliche Hotels dieser Stadt aus der Hotel Tabelle ver schwinden Andernfalls tritt eine sogenannte L sch Anomalie auf Ein hnliches Problem sind Update Anomalien bei denen die nderung eines Schl sselelements nich
239. ecord mysql fetch array result echo lt tr gt n echo lt td gt record ht_name lt td gt n echo lt td align right gt record ht_ezpreis amp euro lt td gt n echo lt td align right gt amp euro lt td gt n echo lt td gt record st_name lt td gt n echo lt tr gt n Bei mysqli liegt der einzige Unterschied wieder in der while Zeile record ht_dzpreis while record query gt fetch_array dieser als Index des entsprechenden Ergebnisfelds Bei berechneten Ergebnisfeldern ist dies sogar die einzige M glichkeit fetch_array zu verwenden Das folgende Beispiel liest die Namen der K lner Hotels und ihre Netto Einzelzimmerpreise mittels mysqli aus und gibt sie zeilenweise aus a W Wenn Sie ausgelesenen Spalten einen Aliasnamen zuweisen dient kd 232 Kapitel8 Webanwendungen mit PHP und MySQL sql SELECT ht_name hotel round ht_ezpreis 1 19 2 netto FROM rb hotels WHERE ht_stadt 1 query conn query sql while row query gt fetch array echo row hotel row netto amp euro netto lt br gt Nach getaner Arbeit kann die Datenbankverbindung geschlossen werden Hier die mysql Version mysql_close In mysqli sieht die Anweisung wie folgt aus conn gt close Beispiel 8 1 zeigt das gesamte Hotellistenskript in mysql Syntax Beispiel 8 1 Ausgabe einer List
240. eeeeeeneneeennenn 256 MySQL Administration 2 2222c2ccceseeeeeeenenenn 283 Benutzerverwaltung varas iana n a a a aai 283 MySQL Serverprogramme und skripten sssuu eurra 289 Import und Export von Tabellendaten 2 uaaa 294 Konfigurationsdateien s ieoi na E aa T 298 Replikation een ENEE a a UE E eig 301 Kurzieferenz ns 303 Sonstige APIS tr iton as as a 309 Weitere Clients en ren er nee EE ARAE 325 Ressourcen und Tools 22222222eeeeeeeeeeeeenen 329 MAE Adena a e a n e eea a TERN 333 Inhalt Vorwort zur 2 Auflage Das Letzte was man findet wenn man ein Werk schafft ist die Erkenntnis was man an seinen Anfang zu stellen hat Blaise Pascal In einem offenen Brief wandten sich der Linux Erfinder Linus Torvalds der PHP Sch pfer Rasmus Lerdorf und der MySQL Begr nder Michael Monty Widenius am 23 11 2004 gemeinsam an den Rat der Europ ischen Union um ihrem Protest gegen die Einf hrung von Softwarepatenten in der EU Ausdruck zu verleihen Aus gerechnet dieser traurige Anlass zeigt dass der Datenbankserver MySQL zu den wichtigsten Open Source Projekten der Welt geh rt Zumindest handelt es sich um die mit Abstand verbreitetste Open Source Datenbanksoftware Die Kombination aus Apache Webserver PHP und MySQL ist zudem die beliebteste Plattform f r Webanwendungen MySQL ist ein relationales Datenbankverwaltungssystem RDBMS Relationale Datenbanken bestehen aus mitein
241. ei Abschnitte Die Datenbank erstellen Entwurf und Einrichtung der zugrunde liegenden MySQL Datenbank Die PHP Skripten Erl uterungen und vollst ndiger Code der PHP Skripten f r diese Anwendung Ver ffentlichung und Test Bereitstellung der Skripten durch den Webserver und Praxistest im Browser Die Datenbank erstellen Bei jeder datenbankbasierten Anwendung muss die Datenbank erstellt werden bevor Sie mit dem Programmieren beginnen k nnen In diesem Abschnitt wird die Datenbank zun chst aus den Anforderungen der geplanten PHP Anwendung ent worfen anschlie end werden die praktischen Arbeitsschritte ihrer Erstellung gezeigt 6 Der Datenbankentwurf Der erste Schritt beim Entwurf einer Datenbank ist nat rlich die Frage welche Daten sie berhaupt enthalten soll Zun chst sollten grunds tzliche Kategorien aufgestellt werden anschlie end k nnen Sie berlegen welche Details ber sie gespeichert werden m ssen Erst danach kann die wichtige Entscheidung getroffen werden in welche Tabellen Sie die Daten aufteilen Bei einer datenbankgest tzten Webanwendung ist der Datenbedarf vor allem von der Funktionsweise der Anwendung abh ngig Deshalb folgt hier zun chst eine bersicht ber die geplante Anwendung e Auf der ersten Seite wird das Gewinnspiel als Webformular pr sentiert Es besteht aus vier Multiple Choice Fragen mit je drei Antwortm glichkeiten Die Fragen und Antworten sollen aus der Datenbank ausgelesen werden
242. ei httpd conf durch F r die Modulvariante m ssen Sie folgende Zeilen einf gen am besten jeweils an den Stellen an denen bereits identische Direktiven mit anderen Werten stehen LoadModule php5_module C php php5apache2 dl1 AddHandler php5 script php Nat rlich m ssen Sie die Pfadangabe in der LoadModule Direktive an Ihre PHP Installation anpassen Wenn Sie PHP ber CGI verwenden m chten m ssen die folgenden Zeilen hinzugef gt werden ScriptAlias php c php AddType application x httpd php php Action application x httpd php php php exe Nachdem Sie alle Schritte abgeschlossen haben m ssen Sie Apache beenden und wieder starten Anschlie end sollten Sie die ordnungsgem e Funktionalit t von PHP testen Dazu k nnen Sie eine PHP Datei mit folgendem Inhalt schreiben lt php phpinfo gt Speichern Sie die Datei innerhalb Ihres Apache Website Verzeichnisses zum Bei spiel C Programme Apache Software Foundation Apache2 2 htdocs PHP Doku mente k nnen nicht als lokale Dateien im Browser ge ffnet werden es ist ein Webserver erforderlich der den PHP Code ausf hrt Wenn Sie die Datei nun in einem Browser ffnen wird eine umfangreiche bersicht ber die aktuelle PHP und Apache Konfiguration angezeigt PHP installieren 47 Die Konfigurationsdatei php ini Wie bereits erw hnt k nnen Sie das Verhalten von PHP mithilfe der PHP Konfigu rationsdatei php ini anpassen Ihre Syntax wurde den klas
243. ein Benutzer anmeldet wird zun chst in der Tabelle user anhand der drei Aspekte Username Passwort und Host berpr ft ob er sich beim Server anmelden darf Anschlie end werden die vier Tabellen in der hier aufgelisteten Rei henfolge durchsucht um zu pr fen ob eine bestimmte Operation erlaubt ist Wenn ein allgemeineres Recht als das erforderliche gefunden wird endet die Suche Das bedeutet dass es nicht m glich ist eine bestimmte Form des Zugriffs allgemein zu erlauben und diese dann auf einer spezielleren Ebene einzuschr nken Beispielsweise kann ein User nicht das Recht besitzen auf eine gesamte Datenbank zuzugreifen aber auf eine bestimmte Tabelle innerhalb dieser Datenbank nicht Die korrekte L sung f r dieses Problem besteht darin dem Benutzer den Zugriff auf jede relevante Tabelle einzeln aber nicht auf die Datenbank als solche zu erlauben Allgemein kann man sagen dass Sie stets so wenige Rechte vergeben sollten wie m glich Sie m ssen sich als root anmelden um Benutzerrechte verwalten zu d rfen oder mit einem Benutzernamen dem root dieses Recht explizit erteilt hat Ein neuer Benutzer wird mithilfe der Anweisung CREATE USER angelegt Die Syntax lautet wie folgt CREATE USER Benutzer Host IDENTIFIED BY Passwort Wenn Sie das Zeichen und den Hostnamen weglassen darf der betreffende User von jedem beliebigen Host aus zugreifen Dies ist aus Sicherheitsgr nden aus nicht sonderlich empfehlenswert Fall
244. eine Webseite eingebettet wurden 70 Kapitel 3 Die erste Webanwendung Auf eine solche Anfrage antwortet der Webserver mit einer HTTP Antwort Response Diese besteht aus einer Statuszeile mehreren Antwort Headern einer Leerzeile und schlie lich dem Body der die eigentliche vom Client angeforderte Ressource liefert Hier ein Beispiel f r die HTTP Server Antwort auf eine GET Anfrage HTTP 1 1 200 OK Date Mon 26 Feb 2007 12 10 42 GMT Server Apache 2 0 53 Unix Last Modified Thu 22 Feb 2007 13 28 38 GMT ETag 39a4cb 5a3 6ef34d10 Accept Ranges bytes Content Length 2092 Connection Keep Alive Content Type text html lt DOCTYPE HTML PUBLIC W3C DTD HTML 4 0 Transitional EN gt lt html gt lt head gt BR Die Statuszeile gibt Auskunft ber die HTTP Version hier 1 1 sowie ber Erfolg oder Misserfolg der Anfrage Der Status 200 OK bedeutet dass die Anfrage mit der Lieferung der gew nschten Ressource beantwortet werden kann Andere wichtige Statusmeldungen sind etwa 404 Not Found Ressource nicht gefunden meist bei feh lerhaften URL Eingaben oder veralteten Links 500 Internal Server Error k nnte Ihnen bei Fehlern in der PHP Programmierung begegnen oder die diversen 3xx Weiterleitungen Auch bei der Antwort sind die restlichen Zeilen Header Felder die hier verwende ten bedeuten Folgendes Date gibt Datum und Uhrzeit der Lieferung an e Server ist die Selbstidentifikation der Webs
245. einrichten k nnen Schritt f r Schritt wird erl utert wie Sie ein sogenanntes LAMP Linux Apache MySQL PHP bezie hungsweise WAMP System dasselbe unter Windows installieren und in Betrieb nehmen Auf die Installation des jeweiligen Betriebssystems selbst wird hier nicht eingegan gen Alle Beschreibungen gehen davon aus dass sich auf Ihrem Rechner bereits eine korrekt installierte einigerma en aktuelle Version von Windows beziehungsweise Linux befindet Die Beschreibungen f r Linux gelten im Gro en und Ganzen auch f r andere Unix Varianten wie FreeBSD Mac OS X oder Solaris bei gravierenden Unterschieden finden Sie manchmal entsprechende Anmerkungen F r die beiden Systeme Linux und Windows wird die Installation und Grundkonfi guration folgender Komponenten beschrieben e Apache Webserver 2 2 Version 2 2 4 e MySQL Server und Tools aktuelle Versionen 5 0 41 und 5 1 18 beta die erste Alphaversion von 6 0 ist verf gbar aber noch nicht einsatzreif PHP 5 2 im Release 5 2 2 e phpMyAdmin ein browserbasiertes MySQL Administrationswerkzeug in Ver sion 2 10 1 u Wenn Sie Ihre PHP MySQL Anwendungen in gemietetem Webspace bei einem Hoster betreiben m chten oder m ssen stehen Ihnen diese neuen Versionen in aller Regel nicht zur Verf gung blich sind zurzeit oft noch Apache 1 3 x PHP 4 4 x und MySQL 4 1 x oder gar nur 4 0 x Deshalb wird in diesem Buch f r die meisten MySQL und PHP Aspekte erw hnt ab w
246. eispiel 8 4 Die Ajax basierte St dteliste stadtliste php lt html gt lt head gt lt title gt Dynamische St amp auml dteliste lt title gt lt script language JavaScript type text javascript gt Ajax Anfrage Objekt erzeugen Globale Referenzvariable deklarieren var anfrage null try Firefox Opera IE7 anfrage new XMLHttpRequest catch err_ new try IE 6 x anfrage new ActiveXObject Msxml2 XMLHTTP catch err ie6 try IE 5 x anfrage new ActiveX0bject Microsoft XMLHTTP catch err_noajax Ajax unf higer Browser anfrage null if anfrage null Fehlermeldung alert Ihr Browser versteht leider kein Ajax Anfragefunktion f r die aktuelle St dteliste function sucheStadt Formularfeld auslesen such document f stadt value Anfrage vorbereiten anfrage open GET staedte php such such true anfrage onreadystatechange stadtlListe anfrage send null Clientseitiges Scripting mit JavaScript und Ajax 253 Beispiel 8 4 Die Ajax basierte St dteliste stadtliste php Fortsetzung St dte auslesen und anzeigen function stadtListe Liegt die Antwort vor if anfrage readyState 4 Ist die Antwort in Ordnung if anfrage status 200 DOM Baum entgegennehmen antwort anfrage responseXML Alle lt stadt gt Elemente auslesen und in einem Array speichern staedtenamen new Array stae
247. el Colonia 175 Hotel de la Gare 135 Hotel au Jardin 180 Otel Bahar 72 Viel h ufiger kommt es nat rlich vor dass nur bestimmte Datens tze ge ndert wer den sollen Ihre Auswahl erfolgt ber ein WHERE Kriterium nach demselben Schema wie bei SELECT Abfragen Hier ein Beispiel das die Preise aller Hotels in K ln Stadt Nummer 1 halbiert mysql gt UPDATE rb_hotels2 SET ht_ezpreis ht_ezpreis 0 5 gt ht_dzpreis ht_dzpreis 0 5 gt WHERE ht_stadt 1 Query OK 2 rows affected 0 08 sec Rows matched 2 Changed 2 Warnings 0 Ein SELECT mit derselben Einschr nkung liefert zusammen mit der vorherigen Minderung aller Doppelzimmerpreise folgendes Ergebnis mysql gt SELECT ht_name ht_ezpreis ht_dzpreis FROM rb_hotels2 gt WHERE ht_stadt 1 ht_name ht_ezpreis ht_dzpreis Bergerhof 35 54 Hotel Colonia 52 87 Hier ein letztes Beispiel es ndert explizit den Namen eines kopierten Hotels UPDATE rb_hotels2 SET ht_name Hotel Konigin Beatrix WHERE ht_name Hotel Konigin Juliana Weitere Abfragetypen 195 Struktur nderungsabfragen Komplexer als Abfragen zur nderung von Tabelleninhalten sind diejenigen die den Aufbau von Tabellen manipulieren Die zust ndige SQL Anweisung lautet ALT
248. elcher Version sie jeweils funktionieren Wenn Sie auf Features neuerer Versionen angewiesen sind bleibt Ihnen meist nichts anderes brig als bei Ihrem Hoster keinen einfachen Webspace sondern einen virtuellen oder dedizier ten Server zu mieten in diesem Fall sind Sie aber auch selbst f r dessen Sicherheit verantwortlich Sie m ssen ihn also sicher genug konfigurieren und regelm ig Updates einspielen weil Sie ansonsten unter Umst nden zur Verantwortung gezogen werden wenn Angrei fer etwa Spam oder illegale Softwarekopien ber Ihren Server ver breiten S mtliche Software ist auf der beiliegenden CD ROM enthalten Vor der Installa tion sollten Sie aber jeweils berpr fen ob eine neuere Version verf gbar ist und diese gegebenenfalls herunterladen Die Adressen der entsprechenden Websites fin den Sie in Anhang D Auf Linux Systemen gibt es drei grunds tzliche Formate f r Software Installations pakete e Quellcode Archive zum Selbstkompilieren e Archive mit Bin rdateien und Installer Skript e spezielle Installationspakete in einem distributionsspezifischen Format Jedes der Programme deren Installation hier beschrieben wird steht in einem oder mehreren dieser Formate zur Verf gung In der Regel wird im Folgenden die Instal lation aus dem Quellcode beschrieben Als Beispiel f r eine distributionsbasierte Installation erfahren Sie weiter unten im Kasten Distributionsware LAMP unter openSUSE 10 2 auf Seite 5
249. ement body Text und Elemente sind Text Text und lt i gt Element i Knoten Text Knoten lt i gt lt body gt lt html gt Jedes Element HTML Tag und jedes Textelement wird als Knoten englisch Node bezeichnet Die Knoten bilden eine hierarchische Struktur Auf die innerhalb eines Knotens verschachtelten Unterknoten k nnen Sie mithilfe des Arrays childNodes zugreifen Der u erste Knoten ist document dieser hat einen Kindknoten n mlich das Element html und darunter sind alle anderen Tags und Textelemente als Kno ten verschachtelt Das Tag lt i gt im obigen Beispielbaum w re somit document childNodes 0 childNo des 1 childNodes 1 F r childNodes 0 gibt es alternativ die Schreibweise first Child Die Anzahl der Kinder eines Knotens ermitteln Sie mithilfe der Eigenschaft Knoten childNodes length und die Methode Knoten hasChildNodes verr t ob ein Knoten berhaupt Kindknoten besitzt true oder nicht false Jeder Knoten besitzt die Eigenschaft nodeType die den Knotentyp numerisch angibt Die wichtigsten Typen sind 1 f r ein HTML Element 3 f r Text und 9 f r das Dokument Der Tag Name eines Elementknotens kann mittels nodeName ausgelesen werden der Inhalt eines Textknotens mithilfe von nodeValue 248 Kapitel 8 Webanwendungen mit PHP und MySQL Anstatt sich von document aus durch die Kind und Enkel Knoten zu hangeln k nnen Sie auch die folgenden beiden Methoden einsetze
250. emporary director r Memory usage Key buffer 4 M v The size of the buffer used for index blocks Increase this to get better index handling for all reads and multiple writes to as much as you can afford 64M on a 256M machine that mainly runs MySQL is quite common IE Catalogs Sort buffer size 212 fa k Each thread that needs to do a sort allocates a buffer of this size M General E Default storage InnoDB Ifno specific storage engine table type is defined in an SQL Create statement the default type will be used Option File E MySQL Server 4 1 my ini DeO Abbildung C 1 MySQL Administrator mit der Seite General Parameters in der Kategorie Startup Variables Startup Variables erm glicht die Konfiguration zahlreicher Parameter des Ser vers Unter General Parameters siehe Abbildung C 1 werden beispielsweise der TCP Port die Arbeitsverzeichnisse und der Standardtabellentyp eingestellt Weitere Registerkarten betreffen etwa Netzwerk Sicherheits MyISAM oder InnoDB Einstellungen User Administration dient der Verwaltung von Benutzerkonten Registerkarte User Information und Berechtigungen Schema Privileges Server Connections zeigt eine tabellarische bersicht ber die laufenden Client verbindungen des MySQL Servers an Health gibt diverse Auslastungsdiagramme f r Clientverbindungen und Spei chernutzung aus Auf weiteren Registerkarten werden die Werte de
251. en Divi sion In fr heren Versionen musste die Funktionsschreibweise MOD Argument1 Argument2 verwendet werden seit MySQL 4 1 sind die folgenden drei Abfragen quivalent und ergeben allesamt 4 SELECT MOD 14 5 SELECT 14 MOD 5 SELECT 14 5 Mathematische Funktionen MySQL definiert zahlreiche mathematische Funktionen f r vielf ltige Einsatzzwe cke Tabelle 6 4 zeigt eine bersicht Flie kommaergebnisse in den Beispielen wur den hier auf f nf Stellen hinter dem Komma gerundet Tabelle 6 4 Die mathematischen Funktionen in MySQL Funktion ABS X ACOS X ASIN X ATAN X CEILING X CEIL X cos x coT X Bedeutung Absolutwert Arcus Cosinus Cosinus Umkehrung Arcus Sinus Arcus Tangens n chsth here Ganzzahl Cosinus Cotangens Beispiel ABS 2 gt 2 ACOS 1 gt 0 ASIN 0 gt 0 ATAN 3 gt 1 24905 CEIL 3 1 gt 4 cos o gt 1 COT 2 gt 0 45766 SQL Ausdr cke und Funktionen 185 Tabelle 6 4 Die mathematischen Funktionen in MySQL Fortsetzung Funktion CRC32 Str DEGREES X EXP X FLOOR X LN X LOG B X L0G2 X LOG10 X PI POW X Y PO ER X Y RADIANS X RAND RAND ROUND X RO UND X D SICN X SIN X SORT X TAN X TRUNCATE X D Bedeutung CRC Pr fsumme Cyclic Redundancy Check Bogenma gt Grad eX n chstniedrigere Ganzzahl nat rlicher Logarithmus Logarithmus zur Basis B entspricht LN
252. en Sie dass Sie auch ServerRoot Diese Direktive gibt das Apache Installationsverzeichnis an in der Regel wurde es beim Installationsprozess bereits richtig eingestellt Beispiel ServerRoot usr local apache2 Listen Diese Direktive stellt den TCP Port ein an dem Apache lauscht Ports werden verwendet um zu bestimmen welche Anwendungen auf zwei Rechnern in einer Netzwerkverbindung miteinander kommunizieren Serverdienste verwen den dabei in der Regel feste Portnummern zwischen 0 und 1023 w hrend Clients beliebige h here Nummern einsetzen Das HTTP Protokoll hat den Standardport 80 in der Regel steht hier also Folgendes Listen 80 Optional kann eine Netzwerkadresse angegeben werden wenn Apache nicht an allen Netzwerkschnittstellen lauschen soll sondern zum Beispiel nur im Intranet Beispiel Listen 192 168 0 2 80 Falls Apache noch an anderen Ports lauschen soll etwa 443 f r gesicherte SSL Verbindungen werden weitere Listen Direktiven ben tigt LoadModule Zum dynamischen Laden gew nschter DSO Module m ssen Sie LoadModule verwenden Die Syntax lautet LoadModule xxx_module modules mod_xxx so Das erste Argument ist die allgemeine Modulbezeichnung das zweite der Pfad der Moduldatei Letzterer kann wie hier relativ zu ServerRoot oder auch absolut sein Das folgende Beispiel l dt das Modul mod_autoindex zur automati schen Erzeugung von Verzeichnisindizes LoadModule autoindex module modules mod_autoindex so
253. en Sie dasselbe kurze Skript noch einmal in der mysqli Variante Beispiel 8 2 Ausgabe einer Liste aller Hotels mysqli Version lt html gt lt head gt lt title gt Reiseb uuml ro Hotels lt title gt lt head gt lt body gt lt h1 gt Liste aller Hotels lt h1 gt lt table border 2 cellpadding 4 gt lt tr gt lt th gt Hotel lt th gt lt th gt Einzelzimmer lt th gt lt th gt Doppelzimmer lt th gt lt th gt Stadt lt th gt lt tr gt lt php Datenbankparameter host localhost user rbuser pass R3153n db reisebuero Nerbindung herstellen Datenbank w hlen conn new mysqli host user pass db Abfrageinhalt 234 Kapitel 8 Webanwendungen mit PHP und MySQL Beispiel 8 2 Ausgabe einer Liste aller Hotels mysqli Version Fortsetzung gt querytext SELECT ht_name ht_ezpreis ht_dzpreis st_name FROM rb hotels INNER JOIN rb staedte ON ht_stadt st_nr ORDER BY st_name ASC ht_name ASC Abfrage an Server senden query conn gt query querytext Ausgabeschleife while list hotel ezpreis dzpreis stadt query gt fetch_row echo lt tr gt n echo lt td gt hotel lt td gt n echo lt td align right gt ezpreis amp euro lt td gt n echo lt td align right gt dzpreis amp euro lt td gt n echo lt td stadt lt td gt n echo lt tr gt n Datenbankverbindung schlie en conn
254. en Sie nun den WEBrick Server gt ruby rock_n roll script server Geben Sie anschlie end die URL http localhost 3000 albumj list in einen Browser ein Ruby on Rails Active Record 323 In diesem Anhang AN HANG C MySQL Administrator MYSQL Query Browser Weitere Clients It is a mistake to think you can solve any major problems just with potatoes Douglas Adams In diesem Buch wurden zwei MySQL Clients ausf hrlicher vorgestellt der Kom mandozeilenclient mysql und die webbasierte L sung phpMyAdmin Neben diesen beiden gibt es zahlreiche weitere Programme zum Bearbeiten von MySQL Daten banken Zwei von ihnen MySQL Administrator und MySQL Query Browser stammen von den MySQL Entwicklern selbst Diese werden hier kurz vorgestellt MySQL Administrator Das Tool MySQL Administrator dient der Steuerung und Administration der MySQL Serversoftware selbst Unter anderem bietet es eine grafische Konfigura tionsm glichkeit einiger Tools die in Kapitel 9 behandelt wurden Beim ersten Start von MySQL Administrator m ssen Sie sich wie blich am MySQL Server anmelden f r dieses Programm sinnvollerweise als root Die Login Daten k nnen auf Wunsch gespeichert werden In der linken Spalte des Fensters von MySQL Administrator stehen verschiedene Hauptkategorien zur Auswahl deren Konfigurationsm glichkeiten dann jeweils rechts im Hauptbereich angezeigt werden Die meisten Kategorien bestehen dabei aus
255. en Tabellen jeweils durch ein gemeinsames K rzel gekennzeichnet werden hier beispielsweise ht_ f r Hotel Die Verwendung solcher Pr fixe macht immer sofort unmissverst ndlich klar zu welcher Datenbank eine Tabelle und zu welcher Tabelle ein Feld geh rt Zudem erspart es Ihnen unter Umst nden Schreibarbeit Im Grunde ist es sinnvoll Feldern verschiedener Tabellen mit identischer Funktion denselben Namen zu geben In einer Abfrage m ssten diese als Tabellenname Feldname geschrieben werden da MySQL sonst nicht wei welches Feld gemeint ist Mit Pr fixen k nnen Sie dage gen problemlos identische Grundnamen verwenden weil das Pr fix die Felder hin reichend voneinander unterscheidet Das Entity Relationship Modell Das Entity Relationship Modell kurz ER Modell ist eine einfache Methode die in einer Datenbank zu speichernden Gegenst nde Entities und ihre Beziehungen zueinander Relationships grafisch darzustellen Die einzelnen Entities werden in einem solchen Modell als Rechtecke dargestellt In der Regel ergibt sich aus jedem Entity eine Tabelle in der jedes Element dieses Typs einen Datensatz bildet Die Attribute Eigenschaften der Entities die sp ter die Felder der Tabelle bilden wer 1 Sie brauchen dieses Beispiel nicht selbst einzugeben Weiter unten im Abschnitt Die Beispieldaten bank wird die gesamte Datenbank einschlie lich dieser Tabelle importiert Der Datenbankentwurf 129 den durch Ovale gekennzei
256. en Webanwendungen die sich so fl ssig bedienen lassen wie Desktop Programme Sie laden n mlich nicht mehr bei jeder nderung die gesamte Webseite nach sondern tauschen nur den jeweils relevanten Bereich aus Das Kon zept und einige Anwendungsbeispiele werden ebenfalls in Kapitel 8 vorgestellt Grundlegendes zu MySQL Der Vorl ufer der Datenbank MySQL wurde ab 1994 von dem Schweden Michael Monty Widenius f r die Firma TcX entwickelt basierend auf seinem Tool UNI REG von 1979 Urspr nglich ging es nur darum schnellere Routinen f r den Zugriff auf mSQL Datenbanken zu schreiben erst allm hlich wurde ein eigenst n diges DBMS Projekt daraus 1995 stie David Axmark zu dem Projekt Er setzte sich daf r ein dass MySQL frei im Internet zur Verf gung gestellt wurde Dies geschieht seit 1996 zun chst in Form von Bin rdistributionen und bald auch als Open Source Software unter der GNU General Public License GPL unter der zum Beispiel auch das Betriebssystem Linux verbreitet und weiterentwickelt wird Die MySQL Entwickler gr ndeten die Firma MySQL AB http www mysql com die sich um die Weiterentwicklung Verbreitung und Dokumentation des Daten banksystems k mmert Ihr Geld verdient die Firma mit Support f r gr ere Fir menkunden Daneben wird eine kommerzielle MySQL Lizenz angeboten wer den MySQL Server selbst in eine eigene kommerzielle Anwendung integrieren m chte muss diese Lizenz erwerben MySQL erlangte sehr sc
257. en der Ruby on Rails Anwendung zur Verf gung Probieren Sie zuerst scripts runner aus Das folgende Beispiel liest den Namen und das Land der ersten Band aus der Tabelle bands gt ruby script runner b1 Band find 1 puts b1 name b1 country Metallica USA Die Klasse Band wurde automatisch aus der Tabelle bands generiert Ihre Klassenme thode find sucht nach einer konkreten Instanz oder einem Datensatz mit der angegebenen ID die in der Datenbanktabelle wie bereits erw hnt id heif en muss Die verschiedenen Felder schlie lich stehen einfach als Methoden der gefundenen Instanz zur Verf gung Starten Sie f r den n chsten Versuch scripts console gt ruby script console Loading development environment Geben Sie folgenden Code ein um eine Liste aller Bands mit ihren IDs Namen und L ndern zu erhalten gt gt Band find all each b gt puts b id b name b country gt gt Metallica USA Iron Maiden United Kingdom Die rzte Germany Led Zeppelin United Kingdom Die Toten Hosen Germany Extreme USA au pwnen Das Symbol all kann statt einer konkreten ID verwendet werden um alle Daten s tze auszulesen Zum Schluss sollten Sie einige Alben anlegen Auch f r die Neuerstellung von Datens tzen gibt es eine einfache Vorgehensweise Klasse create attr1 gt Wert attr2 gt Wert Das Einf gen von Datens tzen ist mit anderen Worten nur noch ein Ruby Metho
258. en diese durch das Pr fix this gekennzeichnet Das folgende Beispiel erstellt eine Formular Instanz mit der Action URL test php und der HTTP Methode GET form new Form test php GET Neben dem Konstruktor verf gt die Klasse ber f nf Methoden die jeweils durch instanz gt methode aufgerufen werden Hier ein Beispiel f r mehrere Formular inhalte lt form gt ausgeben form gt start echo Ihr Name Textfeld form gt textfield user echo Wohin m amp ouml chten Sie reisen lt br gt n 1 In PHP 4 ist der Konstruktor eine Funktion die den Namen der Klasse selbst tr gt 226 Kapitel8 Webanwendungen mit PHP und MySQL Parameter f r die Radio Buttons werte array CGN FCO IST namen array K amp ouml In Rom Istanbul Radio Button Gruppe form gt radiogroup ziel werte namen Absendeknopf form gt submit Abschicken lt form gt ausgeben form gt end Im Browser eines Besuchers entsteht durch die Formular Methoden der folgende HTML Code lt form action test php method GET gt Ihr Name lt input type text name user width 40 gt lt br gt Wohin m amp ouml chten Sie reisen lt br gt lt input type radio name ziel value CGN gt K ouml In lt br gt lt input type radio name ziel value FCO Rom lt br gt lt input type radio name ziel value IST Istanbul lt br gt
259. en stammt ist der Standardwert latin _swedish_ci language Sprache Sprache f r Fehlermeldungen und Warnungen Beispiele english Standard german french sql mode Modus SQL Modus des Servers der eine gewisse Kompatibilit t zu verschiedenen MySQL Versionen beziehungsweise anderen Datenbanken erm glicht Stan dard ist mysql Ein anderer wichtiger Wert ist ansi er n hert die Syntax dem ANSI SQL Standard an Dies erfordert zum Beispiel zwingend einfache Anf h rungszeichen f r Strings und doppelte f r Tabellen und Spaltennamen die mit SQL Schl sselw rtern verwechselt werden k nnten Weitere wichtige Eintr ge in den Konfigurationsdateien betreffen das Logging MySQL bietet diverse Logdateien an die der Wiederherstellung nach Datenverlus ten der Suche nach Fehlern oder der Replikation siehe unten dienen Normalerweise wird nur die Error Logdatei gef hrt Sie befindet sich im MySQL Datenverzeichnis Ihr Name ist der Hostname mit der Endung log etwa dbhost log Im Abschnitt mysqld der Hauptkonfigurationsdatei kann ihr Speicherort ge ndert werden log error Pfad Konfigurationsdateien 299 Optional aber recht h ufig genutzt ist die bin re Update Logdatei die s mtliche nderungsabfragen protokolliert Sie wird unter anderem f r die Replikation ben tigt kann aber auch zur Wiederherstellung nach einem Datenverlust verwendet werden Tragen Sie eine Zeile wie diese in die Konfigurationsdatei ein wenn S
260. en verwendet werden das unter Linux und einigen anderen Unix Varian ten zum Einsatz kommt siehe den Hinweis zum automatischen Start weiter unten mysqld_multi Startskript zur Steuerung mehrerer MySQL Serverinstanzen auf demselben Host mysql_install_db Skript zur Einrichtung der GRANT Tabellen bei der Installation von MySQL wurde bereits in Kapitel 2 beschrieben mysql_fix_privilege_tables Skript zur Aktualisierung der GRANT Tabellen nach einem MySQL Update mysqlmanager Der MySQL Instance Manager ein in MySQL 5 0 neu eingef hrtes Tool zur Steuerung von Serverinstanzen auch auf entfernten Hosts Die Beschreibung finden Sie online unter http dev mysql com doc mysql en instance manager html Neben diesen Serverprogrammen gibt es einige weitere Tools und Skripten die mit MySQL installiert werden mysqladmin Dieses wichtige weiter unten noch genauer besprochene Tool erm glicht die Steuerung des laufenden MySQL Servers beispielsweise k nnen Sie ihn auf diese Weise beenden oder neu starten myisamchk Tool zur berpr fung und Reparatur von MyISAM Tabellen make_binary_distribution Programm zur Erstellung einer MySQL Bin rdistribution aus dem selbst kom pilierten Quellcode Praktisch zur bertragung auf weitere Rechner mit dem gleichen System Wenn Sie eine seltenere Plattform verwenden k nnten sich andere Benutzer ber einen FTP Upload Ihrer Distribution in das Verzeichnis pub mysql upload auf dem Server ftp mysql
261. en von Reisenden in den Sprachen der beliebtesten Reise l nder enth lt CREATE TABLE rb_sprachfuehrer sp _nr INT AUTO INCREMENT PRIMARY KEY sp deutsch VARCHAR 40 COLLATE latin germani_ci sp englisch VARCHAR 40 COLLATE latin general ci sp italienisch VARCHAR 40 COLLATE latin1_general ci sp_spanisch VARCHAR 40 COLLATE latin spanish_ci sp tuerkisch VARCHAR 40 CHARSET latin5 COLLATE latins turkish_ci sp griechisch VARCHAR 40 CHARSET greek COLLATE greek general _ci CHARSET latin1 Eine spezielle Form der Tabellenerstellungsabfrage bietet die LIKE Klausel Sie kopiert die Struktur einer vorhandenen Tabelle Die allgemeine Syntax sieht folgenderma en aus CREATE TABLE Tabellenname LIKE Datenbankname Tabellenname Hier ein Beispiel das die Struktur von rb_hotels bernimmt CREATE TABLE rb pensionen LIKE rb_hotels Wenn Sie anschlie end auch die Daten aus der urspr nglichen Tabelle berneh men m chten funktioniert dies so INSERT INTO rb_pensionen SELECT FROM rb_hotels Noch einen Schritt weiter geht eine Kombination aus CREATE TABLE und SELECT Diese SQL Anweisung erstellt eine neue Tabelle mit der Struktur der Auswahlab frage und kopiert s mtliche gelesenen Datens tze hinein Das folgende Beispiel erzeugt eine vollst ndige Kopie von rb_kunden CREATE TABLE rb kunden kopie SELECT FROM rb kunden 146 Kapitel 5 Datenbanken entwerfen und erstellen A Bei einer auf diese Weise erzeugten Kopie werden
262. ents geht noch einen Schritt weiter als Views Es handelt sich dabei um benannte SQL Abfragen die jederzeit mittels EXECUTE ausge f hrt werden k nnen Manche Programmierschnittstellen f r Datenbanken imple mentieren diese Funktionalit t selbst unabh ngig davon ob die zugrunde liegende Datenbank sie beherrscht Im n chsten Kapitel lernen Sie beispielsweise die Prepa red Statement Funktionen der PHP Datenbankschnittstelle PDO kennen MySQL selbst unterst tzt Prepared Statements seit Version 4 1 Die grundlegende Syntax zum Erstellen eines Prepared Statements sieht folgenderma en aus PREPARE StatementName FROM Abfrage Das folgende kurze Beispiel definiert eine Abfrage die f nf zuf llig ausgew hlte Hotels die zugeh rigen St dte sowie den jeweiligen Einzel und Doppelzimmer preis ausgibt mysql gt PREPARE random hotels FROM gt SELECT ht_name AS Hotel ht_ezpreis AS Einzel gt ht_dzpreis AS Doppel st_name AS Stadt gt FROM rb_hotels INNER JOIN rb_staedte ON ht_stadt st_nr gt ORDER BY RAND LIMIT 0 5 Query OK O rows affected 0 08 sec Statement prepared Wie Sie sehen ist es notwendig die gesamte im Prepared Statement zu speichernde Abfrage in Anf hrungszeichen zu setzen Sollte die Abfrage selbst Anf hrungszei chen ben tigen k nnen Sie den jeweils anderen Typ doppelte beziehungsweise einfache Anf hrungszeichen verwenden Zwei EXECUTE Aufrufe zeigen dass die zuf llige Auswahl funktioniert 206
263. er Windows Eingabeaufforderung gibt es zwei M glichkeiten e W hlen Sie Start gt Alle Programme gt Zubeh r gt Eingabeaufforderung Beachten Sie dass es in lteren Windows Versionen vor XP Programme statt Alle Programme hei t e Alternativ k nnen Sie Start gt Ausf hren w hlen cmd eingeben und OK ankli cken beziehungsweise Enter dr cken 1 Zurzeit l uft XAMPP noch nicht ohne Anpassungen unter Vista Suchen Sie auf der Website des Anbie ters nach entsprechenden Hinweisen Zu Unrecht gef rchtet das Arbeiten mit der Konsole 17 Wie Sie in Ihrem Unix artigen System ein Terminalfenster ffnen ist je nach Distri bution Version und grafischer Oberfl che verschieden Hier nur einige Beispiele e Der beliebte Desktop KDE f r Linux und einige andere Unix Varianten enthal ten ein komfortables Terminalprogramm namens Konsole das Sie in der Regel ber ein Bildschirmsymbol im Panel die Leiste am unteren Bildschirmrand ffnen k nnen e Der andere verbreitete Desktop GNOME besitzt ebenfalls eine eigene Termi nalemulation die einfach GNOME Terminal hei t Sie ffnen es am einfachs ten indem Sie mit der rechten Maustaste eine leere Stelle auf dem Desktop anklicken und Terminal ffnen aus dem Kontextmen w hlen e Unter Mac OS X befindet sich das Terminal im Systemordner Applications Wenn Sie ernsthaft mit dem Programmieren beginnen werden Sie es fter ben tigen und sollten es daher ins Dock ziehen s
264. er der richtigen Antwort erstellt mysql gt CREATE TABLE gw_fragen gt fr_id INT AUTO_INCREMENT PRIMARY KEY gt fr_frage VARCHAR 80 gt fr_korrekt INT gt Die Fragenummer fr_id soll per AUTO_INCREMENT automatisch durchnummeriert wer den Die Angabe PRIMARY KEY macht dieses Feld zum Prim rschl ssel der den jewei ligen Datensatz eindeutig kennzeichnet Der Prim rschl ssel wird vor allem verwendet wenn in anderen Tabellen Bezug auf Datens tze der aktuellen Tabelle genommen werden soll genau dies macht das Wesen relationaler Datenbanken aus Die Tabelle gw_antworten soll f r jede Frage drei Antwortm glichkeiten enthalten Dazu wird Folgendes eingegeben mysql gt CREATE TABLE gw_antworten gt an_frage INT gt an_antwort INT gt an_text VARCHAR 50 gt Da sich keine andere Tabelle direkt auf die Inhalte dieser Tabelle beziehen wird erh lt sie keinen Prim rschl ssel Wenn Sie dennoch einen haben m chten m ssen Sie eine zus tzliche Spalte definieren weil f r keine der vorhandenen Spalten ein deutige Werte garantiert werden k nnen Das Feld an_frage verweist auf die Frage nummer an_antwort ist die Nummer der jeweiligen Antwort 1 3 und an_text enth lt den eigentlichen Antworttext Jedes Paar aus diesen beiden Feldern ist in der Tabelle eindeutig gem der Anleitung in Kapitel 5 k nnten Sie daher auch die Kombination aus ihnen zum Prim rschl ssel machen Als N chstes werden die
265. erative Zugriff wird in diesem Buch nicht behandelt Die MySQL SchnittstelleninpHP 229 Tabelle 8 1 Vergleich der wichtigsten Elemente der Schnittstellen mysql und mysgli Funktionalit t mysql mysqli Verbindungsaufbau id mysql_connect conn news mysqli host user pass host user pass db Datenbankauswahl mysql_select_db db conn gt select_db db Abfrage query mysql_query sql query conn gt query sql Datensatz lesen arr mysql_fetch_ arr query gt fetch_row numerisches Array row query Datensatz lesen arr mysql_fetch_ arr query gt fetch_array benanntes Array Anzahl Ergebnisdaten array query lines mysq 3 num_ lines query gt num_rows s tze Auswahlabfrage rows query lines mysql_affected_ rows Anzahl ge nderter Zei lines conn gt affected_rows len nderungsabfragen id mysql_insert_id Zuletzt eingef gte auto_ id conn gt insert_id increment ID Verbindung schlie en mysql_close conn gt close Der erste Schritt besteht jeweils darin eine Verbindung zum Datenbankserver her zustellen Die Parameter sind Hostname Benutzername und Passwort Bei mysqli kommt zus tzlich die Standarddatenbank hinzu Wenn Sie dem Buch bis hier gefolgt sind besitzen Sie noch keinen separaten Benutzer f r die Datenbank reise buero Starten Sie deshalb den Kommandozeilenclient mysql und
266. erden um den Relationstyp zu kennzeichnen Zwischen St dten und Hotels besteht eine 1 n Relation In einer Stadt k nnen beliebig viele Hotels liegen aber ein einzelnes Hotel kann sich gewiss nicht in mehreren St dten befinden Weitere Relationstypen wurden bereits in Kapitel 1 erw hnt Neben der 1 n Rela tion gibt es auch 1 1 und m n Relationen Eine 1 1 Relation besteht wenn einem Element genau ein anderes Element zugeordnet ist Im Grunde sind Beziehungen zwischen den Attributen eines Entity nichts anderes als 1 1 Relationen Daher las 2 Sollte eine Stadtgrenze genau durch ein Hotel verlaufen wird man sich einigen m ssen allein schon aus steuerlichen Gr nden 130 Kapitel 5 Datenbanken entwerfen und erstellen sen sich Informationen die eigentlich dasselbe Entity beschreiben optional auf mehrere Tabellen verteilen In der Datenbank reisebuero siehe Abschnitt Die Bei spieldatenbank existiert ein solcher Fall Die Kundendaten wurden auf die beiden Tabellen rb_kunden und rb_kundenkontakte verteilt da die Kontaktdetails nicht f r jede Operation von Bedeutung sind Eine m n Relation ordnet beliebig vielen Elementen einer Menge beliebig viele Ele mente einer anderen Menge zu Daraus ergibt sich keine einfache Schl sselbezie hung sondern eine neue Tabelle Abbildung 5 2 zeigt ein vereinfachtes Beispiel Das Entity Kunde kann Reisen buchen bestehend aus Flug und Hotel Jeder ein zelne Kunde kann beliebig oft hi
267. ern also 0 9A F Hier einige konkrete Beispiele f r die Arbeit mit regul ren Ausdr cken e M ae iy e r passt auf alle Schreibweisen von Namen die Meier ausgespro chen werden ein M ein a oder e ein i oder y ein e oder auch nicht und zum Schluss ein r e o 1 9 0 9 1 3 0 genau eine Ziffer zwischen 1 und 9 eine bis drei weitere beliebige Ziffern findet deutsche Telefonvorwahlen e 0 9 0 9 5 0 9 3 0 9X trifft auf das klassische zehnstellige For mat der ISBN internationale Buchbestellnummern zu eine Ziffer Strich f nf Ziffern Strich drei Ziffern Strich Ziffer oder X Da manche Buchh ndler zum Beispiel Amazon die Striche weglassen k nnte es n tzlich sein sie opti onal zu machen 0 9 0 9 5 0 9 3 0 9X Die seit 2007 bevorzugt verwendeten 13 stelligen ISBN haben dagegen das For mat 0 9 3 0 9 0 9 5 o 9 3 o 9 die Pr fziffer X kann bei ihnen nicht vorkommen regul ren Ausdr cken eine besondere Bedeutung haben m ssen so gekennzeichnet werden falls Sie das Zeichen als solches meinen Dazu geh ren vor allem folgende Zeichen J 1 Der Backslash vor jedem der Striche ist wichtig Zeichen die in u e AM ist die RegExp Version einer Suche nach allen Feldern die mit M begin nen Hier als Beispiel die Namen der St dte mysql gt SELECT st_name FROM rb_staedte gt WHERE st_name REGEXP M Auswahlabfragen 175
268. ernen Befehle des Kommandozei lenclients sowohl die bereits besprochenen als auch einige weniger h ufig genutzte Die mit einem Sternchen gekennzeichneten sind nur auf Unix Rech nern verf gbar Wenn die Langfassung in Klammern steht kann sie nur nach einem Start mit named commands verwendet werden Tabelle 4 2 Die internen Kommandos des Kommandozeilenclients mysql im berblick Kommando Langfassung Bedeutung h help Liste aller internen Befehle anzeigen c clear Aktuelle Eingabe ignorieren bei Fehlern r reconnect Neue Verbindung zum MySQL Server mit denselben Anmeldedaten herstellen d delimiter Abschlusszeichen f r Befehlseingabe ndern Standard e edit Befehl mit dem Editor aus der Umgebungsvariablen EDITOR meist vi bearbei ten Durch Beenden des Editors mit Speichern bei vi durch Eingabe von wq wird die Eingabe bernommen G ego Abfrageergebnis zeilen statt spaltenweise anzeigen q exit quit Client beenden g go Befehl abschicken funktioniert unabh ngig vom eingestellten Delimiter immer t notee Protokollierung in Textdatei beenden Sp pager Lange Ergebnisse mittels PAGER meist less seitenweise ausgeben p print Aktuellen Befehl ausgeben praktisch f r Feedback in SQL Dateien R prompt Eingabeaufforderung ndern Standard mysql gt H rehash Tabellen und Spaltennamen f r die Eingabevervollst ndigung nach nderungen neu einlesen source Kommandos
269. ero air1 hotel_orte rb airlines rb _ airports rb_buchungen rb_fluege rb_flugstrecken rb_hotels rb_kunden rb_kundenkontakte rb_laender rb_sehensw rb staedte Mit einem einfachen DESC k nnen Sie auch nicht ermitteln ob es sich bei einem Ein trag um eine Tabelle oder um eine View handelt Beispiel mysql gt DESC hotel_orte 4 Field Type Null Key Default Extra Herten Fess cHege Henn Hase paisdean priae Hotel varchar 60 NO Stadt varchar 40 NO Erst eine SHOW CREATE TABLE Abfrage enth llt die wahre Natur einer View abgese hen davon k nnten Sie hier auch SHOW CREATE VIEW schreiben was bei einer Tabelle zu einer Fehlermeldung f hrt Auch daf r sehen Sie hier ein Beispiel Views 205 mysql gt SHOW CREATE TABLE hotel_orte G EEk Joy RR EEK ER View hotel_orte Create View CREATE ALGORITHM UNDEFINED DEFINER root localhost SOL SECURITY DEFINER VIEW hotel orte AS select rb_ hotels ht_ name AS Hotel rb_staedte st_name AS Stadt from rb hotels join rb_staedte on rb_hotels ht_stadt rb staedte st_nr Sie k nnen Views mithilfe der Anweisung DROP VIEW ViewName l schen was Sie nun auch tun sollten um in der Datenbank reisebuero wieder aufzur umen DROP VIEW hotel_orte DROP VIEW air1 Prepared Statements Der Einsatz von Prepared Statem
270. erver Software Bei Apache wird ihre Ausf hrlichkeit durch die Direktive ServerTokens gesteuert Die Extreme reichen von ProductOnly also Apache bis Full zum Beispiel Apache 2 2 4 Unix PHP 5 2 2 e Last Modified enth lt Datum und Uhrzeit der letzten nderung Browser und Proxy Caches nutzen diese Angabe um zu entscheiden ob die zwischengespei cherte Version noch g ltig ist F r solche Pr fungen existiert brigens die spe zielle HTTP Anfragemethode HEAD die nur die Header aber nicht die eigentliche Ressource anfordert e ETag Entity Tag ist ein aus verschiedenen Angaben berechneter Hash Wert der die Identit t eines Dokuments ber die URL oder den Dateinamen hinaus berpr ft Auch dies ist f r Caching Zwecke wichtig DiePHP Skripten 71 e Accept Ranges bytes gibt an dass der Server Anfragen nach Teilbereichen einer Ressource akzeptiert Das macht sich beispielsweise der Adobe Acrobat Reader zunutze um umfangreiche PDF Dokumente st ckweise anzufordern e Content length ist die Gr e des Bodys also der gelieferten Datei in Byte e Connection entspricht dem gleichnamigen Anfrage Header Der Server gibt an ob er das Offenhalten der Verbindung best tigt Keep Alive oder ablehnt close Content Type ist der wichtigste Antwort Header Er gibt den Datentyp MIME Typ der gelieferten Ressource an damit der Client wei wie er die empfange nen Daten behandeln soll Nach einer Leerzeile folgt der Body
271. erwenden das sogenannte System V Init mit verschiede nen Runlevels w hrend BSD basierte Versionen ein eigenes Verfah ren einsetzen Mit anderen Worten Wenn Sie den MySQL Server automatisch starten m chten m ssen Sie herausfinden welches Verfahren Ihr System verwendet und ein geeignetes Skript beispielsweise das oben erw hnte mysqld server in ein f r Startskripten geeignetes Verzeichnis zum Beispiel etc rc d kopieren Viele Distributionen verf gen brigens jeweils ber ein eigenes bequemes Verfahren um Autostarts einzurichten SUSE Linux ent h lt beispielsweise den sogenannten Runlevel Editor N heres ent nehmen Sie bitte der Dokumentation Ihres Systems MySQL Serverprogramme und skripten 293 Das Hilfsprogramm mysqladmin Mithilfe des Programms mysqladmin k nnen Sie den MySQL Server steuern Um dieses Programm auszuf hren m ssen Sie wie beim Kommandozeilenclient mysql die Optionen u Benutzername und p Passworteingabe verwenden Die Aufrufsyn tax lautet also mysqladmin Befehl u Benutzername p Daraufhin wird das Passwort abgefragt falls es korrekt ist und der angegebene Benutzer Administratorrechte besitzt wird der gew nschte Befehl ausgef hrt Hier die wichtigsten Administrationsbefehle im berblick create Datenbank Erstellt die angegebene Datenbank neu wie eine CREATE DATABASE Abfrage drop Datenbank L scht die angegebene Datenbank wie DROP DATABASE extended status Statusinf
272. ery conn gt query SELECT FROM rb_ hotel catch PDOException e echo Fehler e gt getMessage Wenn Sie dieses Skript ausf hren erhalten Sie folgende Fehlermeldung Fehler SQLSTATE 42S02 Base table or view not found 1146 Table reisebuero rb_hotel doesn t exist sehr n tzlich Den Endanwender sollten Sie allerdings nicht damit behelligen Falls Sie in einer ffentlich verf gbaren Webanwendung Exceptions abfangen ist es deshalb ratsam benutzerfreundlichere Fehlermeldungen zu schreiben Dabei k nnen Sie sich aber durchaus an den Fehlernummern oder SQLSTATE Codes orientieren in Anhang D finden Sie die URL einer entsprechenden Liste u W hrend der Entwicklungsphase ist diese Art von Fehlermeldung brigens gibt es auch eine M glichkeit PDO Attribute nach dem Verbindungsauf bau zu setzen oder zu ndern Daf r ist die Methode setAttribute attribut wert zust ndig Das folgende Beispiel stellt nachtr glich den Fehlermodus PDO ERRMODE_EXCEPTION ein conn gt setAttribute PDO ATTR_ERRMODE PDO ERRMODE EXCEPTION 238 Kapitel8 Webanwendungen mit PHP und MySQL Wenn Sie alle Datenbankoperationen in Ihrem Skript abgeschlossen haben sollten Sie die Datenbankverbindung schlie en PDO kennt keine close Methode oder dergleichen es gen gt der bisherigen Instanz den Wert null zuzuweisen conn null Abfragen mit PDO durchf hren Um eine SQL Abfrage zu senden wird die
273. es phpMyAdmin Fenster Abbildung 4 11 Eingabe neuer Datens tze in phpMyAdmin Tabelle 4 5 Datens tze f r die Tabelle pr_angebote an_name an_preis Besuch eines Kulturevents Theater o 100 Abendessen im 5 Sterne Restaurant 150 Kostenlose Stadtrundfahrt 200 PNV Ticket f r Aufenthaltsdauer 250 Kostenloser Mietwagen 2 Tage 300 W Die angesprochenen Funktionen zur nachtr glichen nderung von Tabellenstrukturen und inhalten sind brigens weitgehend mit den u hier vorgestellten Neueingabeseiten identisch nat rlich mit dem einen Unterschied dass die Eingabefelder bereits Werte enthalten die Sie ndern k nnen phpMyAdmin 125 In diesem Kapitel KAPITEL 5 e Der Datenbankentwurf Datenbanken und Tabellen Date n ba n ke n erstellen u entwerfen und erstellen Daten einf gen Wo Inhalt ist f gen sich die Formen von selbst Leo Tolstoi In diesem Kapitel erfahren Sie wie MySQL Datenbanken und Tabellen konzipiert und erstellt werden Im ersten Abschnitt geht es um die Planung und den Entwurf von Datenbanken anschlie end wird die praktische Erzeugung von Datenbanken und Tabellen mithilfe von SQL Abfragen vorgestellt m u Alle SQL Abfragen in diesem und den n chsten beiden Kapiteln wer den anhand des Kommandozeilenclients mysql vorgestellt Daher enden sie alle mit einem Semikolon das in anderen Umgebungen wie etwa phpMyAdmin nicht n tig ist auch
274. esondere die dynamische nderung des Dokumentinhalts Wie Sie sehen wird zun chst Knoten removeChild verwendet um den bisherigen Text des lt div gt Elements anzeige zu l schen Die Methode document createTextNode Text erzeugt daraufhin einen neuen Textknoten der mittels Knoten appendChild in das lt div gt eingef gt wird Das Beispiel zeigt auch dass Sie die eindeutige ID eines Elements zur CSS Forma tierung hier rot und kursiv verwenden k nnen Ajax Der Begriff Ajax wird manchmal als Abk rzung f r Asynchronous JavaScript And XML betrachtet der Erfinder des Worts Jesse James Garrett ist allerdings anderer Meinung F r ihn ist Ajax nur ein Wort und kein Akronym Jedenfalls sind asyn chrone Anfragen JavaScript und XML wichtige Komponenten dieser Technologie 250 Kapitel8 Webanwendungen mit PHP und MySQL Wie Sie wissen und bisher in diesem Buch gesehen haben l dt eine herk mmli che Webanwendung bei jedem Arbeitsschritt eine vollst ndige HTML Seite vom Server nach JavaScript und DOM k nnen zwar f r clientseitige Dynamik sorgen erm glichen aber selbst zun chst kein Nachladen von Serverdaten Hier kommt das XMLHttpRequest Objekt die Grundlage von Ajax ins Spiel Ein sol ches Objekt kann eine HTTP Anfrage an einen Webserver senden und braucht dabei noch nicht einmal unt tig auf dessen Antwort zu warten Stattdessen wird nach dem Eintreffen der Antwort automatisch eine Funktion aufgerufen deshalb
275. esteht nat rlich ein wenig Erkl rungsbedarf Die programmiertechnischen Aspekte von SQL werden in diesem Buch ansonsten nicht behandelt wenn Sie sich einigerma en mit PHP auskennen d rfte es aber keine Verst ndnisschwierigkeiten geben Zun chst wird ermittelt ob der eingegebene Hersteller h bereits existiert Dazu wird eine SELECT Abfrage mit der Aggregatfunktion COUNT ausgef hrt Ihr Ergebnis wird der Variablen anzahl zugewiesen die Syntax der Variablendefinition mit SET wurde bereits im Abschnitt ber Prepared Statements vorgestellt Es folgt eine ebenfalls eher aus Programmiersprachen bekannte IF Anweisung mit folgender Syntax IF Ausdruck THEN Anweisung en END IF 210 Kapitel 7 Fortgeschrittene Datenbankfunktionen Die verschachtelten Anweisungen werden nur ausgef hrt wenn die Anweisung wahr ist in diesem Fall also falls der Hersteller noch nicht bekannt ist Die ver schachtelte INSERT Anweisung dient dazu einen erwiesenermal en neuen Hersteller in die Tabelle hersteller einzuf gen Hinter dem IF Block folgt eine weitere Variablendefinition In hnr wird die anhand des Herstellernamens ermittelte ID gespeichert damit sie zusammen mit dem neuen Flugzeugtyp in die Tabelle flugzeuge eingef gt werden kann Das geschieht in der letzten Zeile vor dem END Nun ist es an der Zeit die neue Prozedur auszuprobieren Die beiden folgenden Aufrufe verwenden einen vorhandenen und einen neuen Hersteller CALL
276. et als Intranet Anwendungen bezeichnet In einer gemischten IT Landschaft mit verschiedensten Computer und Betriebssys temen ist diese Methode einfach praktischer als die st ndige Anpassung plattform abh ngiger Programme 3 Altmodische Webanwendungen werden von Interpretern au erhalb des Webservers ausgef hrt soge nannte CGI Programme dies f hrt letztlich sogar zu einer Four Tier Anwendung wenngleich der Begriff nicht gebr uchlich ist Datenbankgest tzte Anwendungen 9 Das schwierigste Problem einer Webanwendung geht aus dem Beispiel und der Abbildung brigens nicht hervor Webserver und browser kommunizieren ber das Protokoll HTTP N heres siehe Kapitel 3 Die erste Webanwendung das eine grund s tzliche Schw che aufweist Es ist zustandslos englisch stateless das hei t jede Anfrage des Browsers mit anschlie ender Antwort des Servers ist ein einzelner in sich geschlossener Vorgang Oftmals m ssen aber l ngere Transaktionen ber das Web stattfinden zum Beispiel bei Bestell Sites mit Warenkorbsystem Hier muss ein Weg gefunden werden den nicht vorhandenen Zusammenhang zwischen den einzelnen Seitenabrufen anderweitig herzustellen In Kapitel 8 Webanwendungen mit PHP und MySQL lernen Sie zu diesem Zweck Sessions und Cookies kennen Eine interessante Neuentwicklung sind brigens Ajax Anwendungen Sie kombinie ren einige bekannte Techniken JavaScript DOM und asynchrone HTTP Anfra gen zu neuartig
277. et werden Sie sind f r die Entwicklung die Unit Tests beziehungs weise die Produktion die tats chliche Ver ffentlichung der Site zust ndig Zu Beginn ben tigen Sie nur die Entwicklungs und gegebenenfalls die Testdatenbank Es schadet aber nichts gleich alle drei zu erstellen Da die neue Anwendung rock_ n_roll hei t k nnen Sie dazu die folgenden drei Zeilen eingeben mysql gt CREATE DATABASE rock_n_roll_development mysql gt CREATE DATABASE rock_n_roll_test mysql gt CREATE DATABASE rock_n_roll_production Als N chstes sollten Sie einen separaten MySQL User erstellen der Zugriff auf diese Datenbanken hat Benutzername und Passwort dieses Benutzerkontos m ssen Sie in die Konfiguration der Anwendung schreiben In der Praxis verwenden Sie aus Sicherheitsgr nden besser einen separaten User f r die Produktionsdatenbank aber zum Ausprobieren soll erst einmal ein gemeinsames Konto gen gen Die folgenden Zeilen legen einen User namens rock_user mit dem Passwort rockonrails an der vol len Zugriff auf alle drei Datenbanken besitzt mysql gt CREATE USER rock_user localhost IDENTIFIED BY rockonrails mysql gt GRANT ALL ON rock_n roll _development TO rock_user localhost mysql gt GRANT ALL ON rock_n_ roll_test TO rock_user localhost mysql gt GRANT ALL ON rock_n_ roll_production TO rock_user localhost Anschlie end sollten Sie die MySQL Benutzerdaten aktualisieren damit diese nderungen wirksam werden mysql gt FLUSH
278. f r den jeweiligen Typ ben tigten Bestandteile aus Daten und Uhrzeiten k nnen bis zu einem gewissen Grad unvollst ndig eingegeben werden Wenn Sie bei einem DATETIME Feld die Uhrzeit weglassen wird sie automa tisch auf 00 00 00 gesetzt Werden die Sekunden oder gar Minuten und Sekunden einer Uhrzeit ausgelassen erhalten sie ebenfalls den Wert 0 Zum Beispiel wird 2007 03 14 in einer DATETIME Spalte als 2007 03 14 00 00 00 abgelegt Eine Besonderheit ergibt sich bei der Eingabe zweistelliger Jahreszahlen 00 bis 69 werden automatisch zu 2000 bis 2069 w hrend 70 bis 99 in 1970 bis 1999 konver tiert werden 07 03 14 steht also f r 2007 03 14 95 03 15 ist dagegen 1995 03 15 brigens m ssen Datums und Uhrzeitwerte in MySQL zum Beispiel bei der Ein gabe per INSERT Abfrage in einfache oder doppelte Anf hrungszeichen gesetzt wer den Beispiele 2007 03 18 oder 2007 03 21 17 56 32 Die Alternative besteht darin sie numerisch aber ohne jegliche Trennzeichen im Format JJJJMMTThhmmss anzugeben also beispielsweise 20070317132148 f r den 17 03 2007 13 21 48 Uhr Zeichenketten Textinformationen kommen in einer Datenbank sehr h ufig vor In der Reiseb ro Datenbank m ssen beispielsweise die Namen von Personen Stra en St dten und Hotels verwaltet werden MySQL stellt zwei verschiedene Grundtypen zur Speiche 150 Kapitel 5 Datenbanken entwerfen und erstellen rung k rzerer Textdaten Zeichenketten oder Strings zur Ve
279. f rb_laender la_nr kk_tel VARCHAR 30 Telefonnummer Tabelle rb_buchungen bu_nr INT Prim rschl ssel AUTO_INCREMENT bu_datum DATE Buchungsdatum bu_kunde INT Bezug auf rb_kunden kd_nr bu_perszahl INT Anzahl Personen Der Datenbankentwurf 141 Tabelle 5 3 Bedeutung der Spalten aller Tabellen der Datenbank reisebuero Fortsetzung Spalte Datentyp Optionen Bedeutung bu_startdat DATE Hinreisedatum bu_enddat DATE R ckreisedatum bu_hinflug INT Bezug auf rb_fluege fl_nr bu_rueckflug INT Bezug auf rb_fluege fl_nr bu_hotel INT Bezug auf rb_hotels ht_nr bu_ezanz INT Anzahl Einzelzimmer bu_dzanz INT Anzahl Doppelzimmer bu_status ENUM in arbeit aktiv Buchungsstatus storniert Tabelle rb_sehensw sw_nr INT Prim rschl ssel AUTO_INCREMENT sw_stadt INT Bezug auf rb_staedte st_nr sw_name VARCHAR 50 Index deutscher Name der Sehens w rdigkeit sw_eigen VARCHAR 50 Index Eigenname der Sehensw rdigkeit sw_bild_url VARCHAR 40 URL Dateiname einer Abbildung sw_anschrift VARCHAR 100 Adresse der Sehensw rdigkeit sw_beschr TEXT Kurzbeschreibung der Sehens w rdigkeit Datenbanken und Tabellen erstellen Bereits in Kapitel 3 wurde kurz besprochen welche SQL Abfragen beim Erzeugen neuer Datenbanken und Tabellen zum Einsatz kommen In diesem Abschnitt wer den alle wichtigen Optionen f r diese Abfragen vorgestellt Erstellungsabfragen Zur Erzeugung von Datenbanken und Tabellen werden spezielle SQL Abfragen ver
280. falls erforderlich sind Grundkenntnisse in HTML darauf wird in diesem Buch nicht eingegangen PHP Vorkenntnisse sind keine absolute Notwendigkeit weil die ben tigten Bestandteile der Sprache hier erl utert werden aber den maximalen Nutzen d rfte dieses Buch einigerma en erfahrenen PHP Programmierern bieten die ihre Kenntnisse und ihre Websites um eine Datenbank erweitern m chten VII Vorwort zur 2 Auflage Aufbau des Buchs Dieses Buch umfasst neun Kapitel und vier Anh nge In den Kapiteln werden fol gende Themen behandelt In Kapitel 1 Einf hrung wird zun chst kurz auf die Entwicklungsgeschichte der Datenbanken eingegangen Auch die grundlegende Funktionsweise von insbesondere relationalen Datenbanken sowie datenbankbasierten Weban wendungen wird angesprochen Als Letztes werden die zentralen Konzepte und F higkeiten von MySQL selbst besprochen Kapitel 2 Installation und Inbetriebnahme beschreibt die Einrichtung und Basiskonfiguration eines kompletten LAMP oder WAMP Systems das hei t Apache Webserver MySQL Datenbank und PHP unter Linux beziehungs weise Windows In Kapitel 3 Die erste Webanwendung wird Schritt f r Schritt die Entwicklung einer kleinen datenbankbasierten PHP Anwendung von der Datenbankpla nung bis zur Ver ffentlichung im Webserver Verzeichnis behandelt Kapitel 4 Mit MySQL arbeiten stellt zwei verschiedene Tools zum Bearbeiten von MySQL Datenbanken vor den mitgelieferten Komm
281. fork betreiben u Die Entwickler von PHP empfehlen PHP in einer Produktivumge e enable so ist eine der wichtigsten Optionen Sie schaltet die Unterst tzung f r Dynamic Shared Objects DSOs ein so dass Module dynamisch hinzuge f gt werden k nnen Da Apache fast alle seine Aufgaben durch einzelne Module l st ist dies praktisch unabdingbar gl cklicherweise ist diese Option inzwischen Standard e enable modules moduli modul2 kompiliert die angegebenen Module fest ein In der Liste m ssen Sie das K rzel mod_ vor dem Modulnamen weglassen also zum Beispiel autoindex log_config statt mod_autoindex mod_log_config F r manche h ufig genutzten Module steht brigens auch die Kurzfassung enable modulname zur Verf gung zum Beispiel enable rewrite f r mod_rewrite e enable mods shared modul1 modul2 kompiliert die angegebenen Module als DSOs was den praktischen Vorteil hat dass sie jederzeit auch vor berge hend wieder entfernt werden k nnen Auch hier gibt es f r prominente Module die Schreibweise enable modulname shared e enable modules most beziehungsweise enable mods shared most kompiliert fast alle Module Je nach Auswahl werden sie statisch einkompiliert oder als DSOs erstellt most ist gegen ber all vorzuziehen weil unter anderem alle Module weggelassen werden die beim Kompilieren Probleme bereiten w r den e disable modules moduli modul2 l sst die angegebenen Module aus dr ck
282. ft nacheinander alle Elemente eines Arrays und speichert den Wert des jeweiligen Array Elements in der hinter as angegebenen Variablen Im vorliegenden Fall werden die Elemente aus der Teilnehmerliste nacheinander in tn_id bereitgestellt Auch die for Schleife mag auf den ersten Blick etwas unge w hnlich aussehen Die Bedingung berpr ft nicht die Z hlervariable i sondern liest jeweils den n chsten Datensatz der Abfrage t1_query Das ist praktisch weil das Auslesen der Daten und die Erh hung von i als bei 0 beginnender Frage nummer auf diese Weise automatisch gleichzeitig stattfinden Wenn Ihnen diese Konstruktion seltsam vorkommt k nnen Sie auch folgendes Synonym verwenden i 0 while list tl_frag tl_antw mysql_fetch_row tl_query Falsche Antwort if tl_antw korrekt i Also nicht alles richtig richtig 0 Index erh hen i Nach der berpr fung aller Antworten wird der entsprechende Benutzer in korr_ teilnehmer gespeichert falls richtig den Wert 1 behalten hat Alles richtig if richtig array_push korr_teilnehmer tn_id Der PHP Block wird nun kurz geschlossen um auf bequeme Weise den Kopf der HTML Tabelle anzuzeigen Danach folgt eine weitere PHP Sequenz in der zun chst eine Liste der Lieblingsst dte erstellt wird die der sp teren Ausgabe dient staedte array Paris London Istanbul Rom Dann werden die Datens tze der korrekt a
283. g f r den Benutzer rbuser mysql gt CREATE DATABASE forum mysql gt USE forum mysql gt CREATE TABLE fo_eintraege gt f id INT AUTO_INCREMENT PRIMARY KEY gt f pid INT gt f_datum DATETIME gt f_nick VARCHAR 40 gt f mail VARCHAR 40 gt f titel VARCHAR 100 gt f_inhalt TEXT gt INDEX f_titel gt mysql gt GRANT ALL PRIVILEGES ON forum TO rbuser localhost mysql gt FLUSH PRIVILEGES Nach den Erl uterungen zum G stebuch und durch die vielen Kommentare d rfte der Code des Skripts forum php eigentlich ohne Weiteres verst ndlich sein Beachten Sie dass verschiedene Aufrufe dieses Skripts neben dem bereits bespro chenen Modus noch andere Daten als CGI Parameter miteinander austauschen beispielsweise Beitrags IDs oder die Information ob die Threads in der Liste auf oder zugeklappt erscheinen sollen Au erdem sollte die Funktion zeige _thread noch erw hnt werden Sie gibt eine Liste s mtlicher Antworten aus die auf den Beitrag mit der angegebenen ID folgen Dazu benutzt sie den Trick der Rekursion Sie bearbeitet eine Hierarchiestufe von Antworten in einer Schleife und ruft sich f r jeden einzelnen Beitrag selbst auf um wiederum die darauf folgenden Antworten anzuzeigen Der zweite Parameter neben der ID ist die Stufe die jeweils um 1 erh ht wird um die Threads treppenf rmig einzur cken Die erste Anweisung dieser Funktion lautet brigens folgenderma en global conn Glo
284. g von MyISAM Tabellen erfolgt schneller als die anderer permanent gespeicherter Tabellentypen au er dem bieten sie die meisten Indexoptionen siehe unten sowie Unterst tzung f r Geodaten Der Nachteil MyISAM ist nicht transaktionsf hig Wenn Sie keine Engine angeben ist MyISAM der Standardtyp au er unter Windows e InnoDB Die Storage Engine InnoDB wird von der Firma Innobase Oy in Finn land http www innobase com entwickelt Diese Firma wurde pikanterweise von MySQLs kommerziellem Konkurrenten Oracle aufgekauft aber bisher bleibt die Engine in MySQL integriert Genau wie MySQL selbst ist sie unter zwei verschiedenen Lizenzen verf gbar unter der GNU GPL f r die einfache Datenbankanbindung und die Einbettung in Open Source Projekte sowie unter einer kommerziellen Lizenz f r die Einbindung in kommerzielle Produkte InnoDB ist f r Transaktionen optimiert unterst tzt aber nicht alle Indexarten insbesondere keine Volltextindizes InnoDB ist seit MySQL 4 1 5 der Stan dardtyp auf Windows Systemen e BDB oder Berkeley DB Berkeley DB ist seit Jahren auch unabh ngig von MySQL ein beliebtes Open Source Datenformat f r datenbank hnliche Struk turen Die Storage Engine wird von Sleepycat Software http www sleepycat com gepflegt MySQL verwendet eine spezielle angepasste Version die g ngi gen Berkeley DB Pakete in Linux Distributionen oder anderen Unix Systemen arbeiten nicht mit MySQL zusammen Genau wie InnoDB unterst
285. g wird durch Konfigurationsdateien geregelt Als Trennzeichen zwi schen Unterverzeichnissen sowie zwischen Verzeichnis und Datei dient dabei der Slash Die Unix Entsprechung des oben gezeigten Windows Pfads w re daher home sascha mydata hello txt W Beachten Sie dass Unix bei Datei und Verzeichnisnamen zwischen Gro und Kleinschreibung unterscheidet Windows aber nicht dar u aus leiten sich wie unten gezeigt dieselben Regeln f r MySQL Datenbanken und Tabellen ab Tun Sie sich zur Sicherheit selbst einen Gefallen und schreiben Sie konsequent alles klein Ebenso soll ten Sie in allen selbst gew hlten Namen Leerzeichen und Sonderzei chen au er dem Unterstrich _ vermeiden Sp testens wenn Sie Ihre Dateien im Web publizieren kann es sonst zu Problemen kommen Manche Konsolenbefehle k nnen mit Platzhaltern umgehen die auf mehrere Dateien zutreffen Dabei steht ein f r eine unbestimmte Anzahl beliebiger Zeichen und ein f r genau ein beliebiges Zeichen Auch hier gibt es einen kleinen Plattfor munterschied In Unix Systemen steht f r alle Dateien in einem Verzeichnis bei Windows dagegen weil die Dateiendung gesondert betrachtet wird Zu Unrecht gef rchtet das Arbeiten mit der Konsole 19 Um das aktuelle Arbeitsverzeichnis zu wechseln verwenden sowohl Unix als auch Windows das Kommando cd kurz f r change directory Unter Windows ist die ser Befehl nicht daf r zust ndig das Laufwerk zu wechse
286. gang von Goethe In diesem Kapitel werden die wichtigsten Informationen zur Administration des MySQL Servers zusammengefasst Einiges wurde bereits in fr heren Kapiteln ange sprochen hier erhalten Sie vor allem eine systematische Ubersicht Benutzerverwaltung Einer der wichtigsten Aspekte f r die Sicherheit eines Serversystems ist eine funktio nierende Benutzerverwaltung mit unterschiedlichen Berechtigungen MySQL kennt zahlreiche unterschiedliche Benutzerrechte die den jeweiligen Benutzern f r Daten banken Tabellen oder sogar einzelne Spalten erteilt werden k nnen In diesem Abschnitt werden die MySQL Anweisungen zur Verwaltung dieser Benutzerrechte vorgestellt zudem wird kurz gezeigt wie Sie sie ber phpMyAdmin bearbeiten k nnen MySQL Anweisungen zur Benutzerverwaltung MySQL verwendet drei Informationen zur berpr fung eines Benutzers User name Passwort und den Host von dem der User zugreift MySQL Benutzer und ihre Rechte haben grunds tzlich nichts mit der Benutzerverwaltung des Betriebssys tems zu tun Stattdessen werden sie insbesondere in folgenden Tabellen der Verwal tungsdatenbank mysql gespeichert e user die Benutzer ihre verschl sselten Passw rter und ihre globalen Rechte an allen Tabellen aller Datenbanken e db Rechte der Benutzer an ganzen Datenbanken e tables priv Rechte der Benutzer an einzelnen Tabellen e columns_priv Rechte der Benutzer an einzelnen Tabellen 283 Wenn sich
287. ge an Server senden conn gt query querytext Hat es funktioniert if conn gt affected_ rows 1 echo amp Auml nderung erfolgt lt br gt n else echo amp Auml nderung nicht m ouml glich lt br gt n PHP Data Objects PDO Die beiden oben vorgestellten Schnittstellen mysql und mysqli dienen exklusiv dem Zugriff auf MySQL Datenbanken Mit PHP Data Objects kurz PDO wurde dage gen eine neue M glichkeit eingef hrt die auch in anderen Programmiersprachen immer h ufiger vorkommt eine sogenannte Abstraktion der Datenbankverbindun gen PDO erm glicht also ber jeweils angepasste Treiber die Nutzung verschiede ner konkreter Datenbanken mithilfe einer gemeinsamen Syntax Dies macht es f r Entwickler leichter die einer Anwendung zugrunde liegende Datenbanksoftware nachtr glich auszutauschen oder die Entscheidung ber die einzusetzende Daten bank dem Endanwender zu berlassen Beachten Sie dass es andere Datenbank Abstraktionsschichten gibt die auch die Abfragen selbst abstrahieren also keine SQL Strings mehr an die Datenbank sen den sondern eigene Methoden daf r anbieten So weit geht PDO nicht wenn Sie die Datenbank wechseln und ihr SQL Dialekt sich von der vorherigen unterschei det m ssen Sie den SQL Code selbst anpassen zur Unterst tzung mehrerer Daten banken sind eventuell if elseif else Konstrukte erforderlich In Tabelle 8 2 sehen Sie zun chst eine Schnell bersicht ber die w
288. gemeine Sprachmerkmale Wie Sie wahrscheinlich bereits wissen oder in den Einf hrungsbeispielen in den Kapiteln 2 und 3 erfahren haben ist eine PHP Datei formal ein gew hnliches HTML Dokument in dem bestimmte Bl cke wie folgt als ausf hrbare PHP Anwei sungen gekennzeichnet werden lt php gt Bevor der Webserver das Dokument an den Browser eines Besuchers ausliefert werden diese Bl cke vom PHP Interpreter ausgef hrt Dabei werden die Ausgabe texte von echo Anweisungen an den entsprechenden Stellen in den HTML Code eingef gt Auf diese Weise macht PHP es Ihnen leicht statische und dynamische Bereiche in einem Dokument beliebig zu mischen Innerhalb der PHP Bereiche stehen PHP Anweisungen deren Syntax an klassische Sprachen wie C oder auch Perl erinnert Die beiden neuesten Versionen PHP 4 und 5 wurden allerdings stark um objektorientierte F higkeiten erweitert ihre Funk tionsweise wurde weitgehend von Java inspiriert Variablen Variablen sind in PHP leicht an dem f hrenden Dollarzeichen zu erkennen Das erste Zeichen hinter diesem Pr fix muss ein Buchstabe oder Unterstrich sein danach k nnen Buchstaben Ziffern oder Unterstriche folgen Gro und Kleinschreibung werden unterschieden Wie die meisten Skriptsprachen ist PHP untypisiert eine Variable kann nacheinander Werte verschiedener Datentypen annehmen Hier ein Beispiel f r unterschiedliche Wertzuweisungen var Hallo var 7 legal
289. gen Beachten Sie dass Atomarit t eine Frage der Perspektive ist sie h ngt davon ab inwiefern Finzelinformationen in der Praxis ben tigt werden Beispielsweise wer den in der Hotel Tabelle der Reiseb ro Datenbank die Adressen der einzelnen Hotels gespeichert Sie sollen allerdings nicht dazu verwendet werden Briefe an diese Hotels zu schreiben sondern nur als Information auf der Website Daher gen gt es in diesem Fall die gesamte Anschrift in einer einzelnen Spalte zu spei chern Die Adressen der Kunden sollen dagegen automatisch in Buchungen Tickets oder Rechnungen eingetragen werden so dass das Reiseb ro hier jeden Bestandteil einzeln braucht damit die Daten in flexibler Reihenfolge zur Verf gung stehen Zweite Normalform Eine Tabelle ist in der zweiten Normalform 2NF wenn sie in der ersten Normal form ist und wenn zus tzlich jedes Feld vom gesamten Prim rschl ssel dieser Tabelle abh ngt Datens tze d rfen also nur direkte Informationen ber einen ein zelnen Sachverhalt Entity enthalten da es andernfalls zu Redundanzen kommen k nnte Betrachten Sie als Beispiel die folgende Tabelle die Informationen ber St dte und in ihnen befindliche Hotels enth lt stadt_id stadt_name land hotel_id hotel_name 1 K ln 1 1 Bergerhof 1 K ln 1 2 Hotel Coloni
290. gen date Formate finden Sie im Verzeichnis docs auf der beilie genden CD ROM blicherweise sollten Funktionen in einem PHP Block zu Beginn des Dokuments gespeichert werden Ein Aufruf von gruss sieht beispielsweise so aus gruss Klaus PHP Grundlagen 223 Um 13 23 Uhr erhalten Sie folgendes Ergebnis Guten Tag Klaus Da f r name der Standardwert Anonymous angegeben wurde kann die Funktion alternativ auch ohne Argument aufgerufen werden gruss Dies liefert um 9 53 Uhr beispielsweise diese Ausgabe Guten Morgen Anonymous Funktionen die einen Wert zur ckgeben k nnen innerhalb von Ausdr cken auf gerufen werden Das n chste kleine Beispiel zeigt die Funktion ist_gerade die berpr ft ob die bergebene Zahl gerade oder ungerade ist und dementsprechend 1 beziehungsweise O0 zur ckgibt function ist gerade zahl Keine Zahl Nat rlich nicht gerade if is_numeric zahl return 0 Gerade falls durch 2 teilbar if zahl 2 0 return 1 Noch hier Dann ungerade return 0 Wie Sie sehen besitzt ist_gerade insgesamt drei return Anweisungen von denen zwei von Fallentscheidungen abh ngen Auff llig ist dass keiner der beiden if Bl cke ein else besitzt Das ist m glich weil jedes return die Funktion sofort verl sst und mit dem angegebenen Wert zur aufrufenden Stelle zur ckkehrt Die PHP Funktion is_numeric berpr ft ob das Argument eine Zahl i
291. ges tar gz Anschlie end sollten Sie das neue Verzeichnis phpMyAdmin 2 10 0 all languages mithilfe einer Alias Direktive in den Webspace Ihres Apache Servers einbinden F gen Sie eine der beiden folgenden Zeilen die nat rlich noch an Ihr konkretes Verzeichnis angepasst werden muss in Ihre httpd conf ein Linux Alias phpmyadmin usr local phpMyAdmin 2 10 1 all languages Windows Alias phpmyadmin C phpMyAdmin 2 10 1 all languages Die passende Stelle f r diese Direktive ist der bereits vorhandene Block lt IfModule alias_module gt lt IfModule gt Es ist wichtig die phpMyAdmin URL vor unberechtigten Zugriffen zu sch tzen Um die Benutzeranmeldung kann sich phpMyAdmin auf Wunsch selbst k mmern siehe unten Zus tzlich sollten Sie aber auch den URL Pfad auf den einzelnen Rechner oder das lokale Netzwerk beschr nken F gen Sie dazu die passenden Zei len aus der nachstehenden Direktivenabfolge in Ihre Konfigurationsdatei ein lt Location phpmyadmin gt Order Deny Allow Deny from all Nur lokaler Rechner Allow from 127 0 0 1 Alternative Nur lokales Netz Allow from 192 168 0 Falls vorhanden Adressbeschr nkung UND Anmeldung beachten Satisfy All lt Location gt phpMyAdmin einrichten 57 Starten Sie Apache neu damit die Konfigurations nderungen wirksam werden Wenn Sie nun einen Browser ffnen und die phpMyAdmin URL eingeben zum Beispiel http localhost phpmyadmin wird die Fehlermeldung
292. gesichts der Leistungsf higkeit neuerer MySQL Versionen nicht der Rede wert aber doch zu gro f r einen vollst ndigen Abdruck mitsamt Inhalten Deshalb wird im Folgenden zwar die Struktur aber nicht der komplette Inhalt der Tabellen erl utert Um mit diesem Kapitel und dem Rest dieses Buchs arbeiten zu k nnen muss diese Datenbank zun chst auf Ihrem System eingerichtet werden Dazu dient die Datei reisebuero sql im Verzeichnis database auf der beiliegenden CD ROM ffnen Sie zum Import ein Terminal Linux beziehungsweise die Eingabeaufforderung Win dows Wechseln Sie per cd Kommando in das Verzeichnis database der CD ROM Starten Sie anschlie end den Kommandozeilenclient mysql als root und geben Sie folgendes Kommando ein mysql gt reisebuero sql Nun laufen eine Weile lang Meldungen an Ihnen vorbei anschlie end steht die Datenbank auf Ihrem System zur Verf gung Sollte Ihr MySQL Server bereits eine Datenbank mit dem Namen reisebuero enthalten wird diese automatisch berschrieben damit die anf ngliche CREATE DATABASE Abfrage nicht fehlschl gt Eine vor handene Datenbank dieses Namens m ssten Sie also zun chst umbenennen Struktur der Datenbank In der Datenbank des Reiseb ros m ssen zahlreiche verschiedene Daten gespei chert werden Insgesamt geht es um die angebotenen Reisen bestehend aus Flug und Hotelinformationen um die bereisten St dte und L nder sowie nat rlich 138 Kapitel 5 Datenban
293. gew hlt haben werden Sie nun nach Benutzer name und Passwort gefragt Im linken Frame der phpMyAdmin Oberfl che k nnen Sie als N chstes eine Daten bank ausw hlen oder im rechten Hauptbereich einige allgemeine Informationen ber den MySQL Server abrufen Wenn Sie die weiter oben erstellte Datenbank geotest ausw hlen und die Schaltfl che Anzeigen neben dem Tabellentitel laender phpMyAdmin einrichten 61 anklicken wird der Inhalt der Tabelle wie in Abbildung 2 5 zu sehen angezeigt Im brigen funktioniert phpMyAdmin beraus intuitiv dennoch erfahren Sie in Kapi tel 4 weitere Einzelheiten ber seine Bedienung localhost localhost geotest laender phpMyAdmin 2 10 0 rc1 Mozilla Firefox Datei Bearbeiten Ansicht Lesezeichen Yahoo Extras Hilfe gt lt gt CO Eo amp Erste Schritte amp Aktuelle Nachrichten 8 Server localhost Datenbank geotest Tabelle laender innoDB free 8192 kB 4 g Anzeigen SStruktur RSQL Suche Einf gen Exportieren flmportieren 2Operationen Leeren schen Datenbank geotest 1 geotest 1 Zeige Datens tze 0 6 7 insgesamt die Abfrage dauerte 0 0004 sek B laender rSQL Befehl SELECT FROM laender LIMITO 30 Bearbeiten SQL erkl ren PHP Code erzeugen Aktualisieren r Operationen f r das Abfrageergebnis amp Druckansicht
294. gistrieren Damit haben Sie Zugriff auf ein gut besuchtes Benutzerforum in dem Sie sich mit anderen MySQL Benutzern austauschen und vielleicht Hilfe bei Problemen erhalten k nnen Nach der eigentlichen Installation werden Sie gefragt ob Sie den MySQL Server sofort konfigurieren m chten Falls auf Ihrem Rechner garantiert keine alte MySQL Version installiert war k nnen Sie dies bedenkenlos best tigen Andern falls sollten Sie die Option zun chst abw hlen um eventuell vorhandene alte Ser verdienste zu entfernen teln des Betriebssystems nur schwer entfernen man muss dazu die u Windows Registry manipulieren Gl cklicherweise ist das MySQL Serverprogramm selbst mit dieser F higkeit ausgestattet Falls Sie einen alten Serverdienst deinstallieren m chten m ssen Sie zuerst in das bin Verzeichnis der neuen MySQL Installation wechseln hier die Eingabe f r das Beispiel C MySQL bin C gt cd mysql bin u Windows Dienste wie der MySQL Server lassen sich mit Bordmit Anschlie end k nnen Sie Folgendes eingeben um den Dienst zu entfernen C MySOL bin gt mysqld remove Falls der Dienst nicht MySQL hei t m ssen Sie seinen Namen expli zit angeben zum Beispiel C MySOL bin gt mysqld remove MySOL5 5 Das Konfigurationsprogramm enth lt zwar eine Funktion die das automatisch erledigen soll aber sie funktioniert nicht mit jeder alten Installation MySQL installieren 37 Falls Sie die automatische Konfig
295. gro e Datenbanken Wenn Sie m chten k nnen Sie eine dieser Dateien an Ihren Server anpassen Auf einem Unix Rechner wird sie dann nach ete my cnf kopiert unter Windows dagegen einfach an Ort und Stelle in my ini umbenannt 300 Kapitel 9 MySQL Administration Replikation Replikation ist das automatische Kopieren aller nderungen von einem MySQL Server Master auf einen oder mehrere andere Slaves Damit erhalten Sie automa tische Backups zudem k nnen Sie Auswahlabfragen bei leselastigen Anwendungen auf mehrere Slaves verteilen Load Balancing Wenn Sie die Replikation erst einmal in Betrieb genommen haben wird sie automa tisch ausgef hrt Nach einem Ausfall aktualisiert sich ein Slave selbstst ndig Auf dem Master muss zuerst ein Benutzer f r den Replikationsslave erzeugt wer den mysql gt CREATE USER replicant Slave gt IDENTIFIED BY ReplPasswort Dieser User ben tigt die globale Berechtigung REPLICATION SLAVE mysql gt GRANT REPLICATION SLAVE ON gt TO replicant Slave Falls noch keine Update Logdatei besteht m ssen Sie diese nun einrichten Anschlie end m ssen Sie sich den Namen der aktuellen Logdatei und ihre Position merken Diese ermitteln Sie wie folgt mysql gt FLUSH TABLES WITH READ LOCK mysql gt SHOW MASTER STATUS Die ben tigten Werte sind File etwa binlog 000006 und Position zum Beispiel 951 Als N chstes wird der MySQL Server auf dem Master gestoppt gt mysqladm
296. gruppen durch Kom mata trennen erst das bliche Semikolon schlie t die Eingabe ab Folgenderma en k nnen Sie sich die gesamte Tabelle alphabetisch nach L ndern geordnet anzeigen lassen mysql gt SELECT FROM laender ORDER BY land ASC land hauptstadt kontinent Argentinien Buenos Aires S damerika Australien Canberra Australien Frankreich Paris Europa Italien Rom Europa Japan Tokio Asien Kanada Ottawa Nordamerika Marokko Rabat Afrika 7 rows in set 0 00 sec Typischer sind SELECT Abfragen in denen eine WHERE Option Klausel nur be stimmte Datens tze ausw hlt Das folgende Beispiel zeigt nur die Datens tze mit dem Kontinent Europa an mysql gt SELECT FROM laender WHERE kontinent Europa land hauptstadt kontinent Frankreich Paris Europa Italien Rom Europa 2 rows in set 0 05 sec Nach diesen einfachen Tests k nnen Sie davon ausgehen dass Ihr MySQL Server ordnungsgem funktioniert Deshalb k nnen Sie sich nun abmelden mysql gt exit PHP installieren Der letzte Bestandteil eines LAMP oder WAMP Systems ist die Programmierspra che PHP ein rekursives Akronym f r PHP Hypertext Preprocesso
297. gt ALTER TABLE staedte gt DROP FOREIGN KEY staedte_ibfk_1 Als N chstes wird er mithilfe einer weiteren ALTER TABLE Abfrage neu erstellt dies mal mit festgelegtem Namen mysql gt ALTER TABLE staedte gt ADD CONSTRAINT land gt FOREIGN KEY st_land REFERENCES laender la_id gt ON DELETE CASCADE ON UPDATE CASCADE Die hinzugef gten Optionen ON DELETE CASCADE und ON UPDATE CASCADE bedeuten dass L sch beziehungsweise nderungsabfragen an die abh ngige Tabelle weiter gegeben werden Nun kann Frankreich aus der Tabelle laender entfernt werden mysql gt DELETE FROM laender WHERE la_id 2 Query OK 1 row affected 0 06 sec Damit sind auch alle franz sischen St dte automatisch verschwunden wie die Wie derholung der SELECT Abfrage zeigt mysql gt SELECT la_name st_name gt FROM staedte INNER JOIN laender ON la_id st_land la_name st_name Deutschland K ln Deutschland Bonn Italien Rom Italien Neapel Auch nderungen in der Spalte la_id werden auf st_land bertragen Hier als Bei spiel die relativ sinnlose nderung der ID von Italien auf den nun frei gewordenen Wert 2 mysql gt UPDATE laender SET la_id 2 WHERE la_id 3 Ein SELECT der gew nschten Spalten in staedte zeigt dass die Nummer auch hier angepasst wurde mysql gt SELECT st_name st_land FROM staedte
298. gt FROM rb_staedte gt WHERE st_name st_eigen Rom Roma Athen Athina Br ssel Bruxelles Warschau Warszawa Prag Praha Venedig Venezia Lissabon Lisboa Datums und Uhrzeitfunktionen Es gibt zwei wichtige Arten von Funktionen zur Datums und Uhrzeitverarbeitung Extrahierungsfunktionen die einzelne Bestandteile von Zeitpunkten ermitteln und Rechenfunktionen die zum Berechnen von Zeitintervallen eingesetzt werden Da MySQL unz hlige Funktionen f r Datum und Uhrzeit kennt wird hier pro Katego rie nur je eine besonders n tzliche vorgestellt DATE_ADD und DATE_FORMAT Dar 188 Kapitel 6 SQL Abfragen ber hinaus haben Sie bereits die argumentlose Funktion NOW kennengelernt die die aktuelle Systemzeit im Format JJJJ MM TT hh mm ss zum Beispiel 2007 04 02 17 32 51 ausgibt DATE_ADD Datum INTERVAL Anzahl Typ addiert eine Zeitspanne zum angegebenen Datum Das folgende Beispiel rechnet vom 02 04 2007 an drei Tage weiter mysql gt SELECT DATE_ADD 2007 04 02 INTERVAL 3 DAY DATE_ADD 2007 04 02 INTERVAL 3 DAY 2007 04 05 Um eine Zeitspanne abzuziehen k nnen Sie der Anzahl ein Minuszeichen voran stellen oder die Variante DATE_SUB verwenden Die beiden folgenden Beispiele sind quivalent sie ziehen vom 02 04 zwei Monate ab mysql gt SELECT D
299. h beraus unterhaltsam pr sentiert Wenn Sie ausreichend Englisch k nnen hilft auch die eingebaute Hilfe der Programmiersprache Perl weiter Geben Sie dazu an der Konsole Folgendes ein perldoc perlre Beachten Sie aber dass zahlreiche fortgeschrittene Features der Perl RegExp in MySQL nicht zur Verf gung stehen Kriterien verkn pfen Viele Abfragen m ssen nicht nur einem sondern mehreren Auswahlkriterien gen gen Zu diesem Zweck existieren logische Operatoren zur Verkn pfung Wenn Sie Ausdr cke mithilfe von AND oder amp amp verbinden m ssen beide wahr sein damit ein Datensatz ausgew hlt wird OR oder w hlt dagegen alle Datens tze aus bei denen mindestens ein Kriterium zutrifft Hier ein erstes OR Beispiel es w hlt alle St dte aus deren Namen mit A oder K beginnen mysql gt SELECT st_name st_eigen FROM rb_staedte gt WHERE st_name LIKE A OR st_name LIKE K st name st_eigen Amsterdam Amsterdam Athen Athina K ln K ln Es folgt ein AND Beispiel alle Hotels in denen ein Doppelzimmer unter 130 kos tet und zu deren Zimmern ein komplettes Bad geh rt mysql gt SELECT ht_name ht_dzpreis FROM rb_hotels gt WHERE ht_dzpreis lt 130 AND ht_bad Bad ht_name ht_dzpreis Hotel Apollon 120 H
300. halb einer Schleife hier also f r alle Antworten zur jeweiligen Frage nicht dieselbe Datenbankverbindung verwendet werden darf Innerhalb der Fragenschleife wird daher die zus tzliche Verbindung conn2 zum Auslesen der Antworten ge ffnet Ein Vorteil von PDO ist dagegen dass die Methode query selbst als Schleifenbedin gung einer foreach Schleife dienen kann ein zus tzliches fetch ist nicht n tig Zudem werden PDO Bl cke blicherweise komplett in einen try Block gesetzt um mittels catch eventuelle Fehler vom Typ PDOException abzufangen Ersetzen Sie den gesamten PHP Block f r die PDO L sung durch folgenden Inhalt das kom plette Skript finden Sie wieder auf der CD ROM lt php Nerbindungsparameter host localhost user winuser pass G3winn3n db gewinnspiel try Verbindung herstellen und Datenbank ausw hlen conn new PDO mysql host host dbname db user pass Abfrage f r Fragen formulieren fr_query SELECT fr_id fr_frage FROM gw fragen ORDER BY fr_id ASC foreach conn gt query fr_query as fr_row Frageteile auslesen fr_ id fr_row fr _id fr_frage fr_row fr_frage DiePHP Skripten 79 Frage ausgeben echo lt b gt fr_id fr_frage lt s b gt lt br gt lt br gt Neues Verbindungsobjekt f r verschachtelte Abfrage conn2 new PDO mysql host host dbname db user pass Abfrage f r Antworten zur
301. hen Deshalb muss auf diese Weise sichergestellt werden dass die unvollst ndigen Daten nicht versehentlich in der Datenbank gespeichert werden Als Erstes werden die drei Benutzerinformationen in die Tabelle gw_teilnehmer geschrieben mysql_query INSERT INTO gw teilnehmer tn _uname tn_email tn_interest VALUES uname email interest Bei mysqli und PDO hei t es wie blich conn gt query statt mysql_query Als N chstes wird mithilfe von mysql_affected_rows sichergestellt dass die Eintra gung in die Datenbank tats chlich stattgefunden hat die Funktion z hlt die ge n derten Zeilen von nderungsabfragen Andernfalls wird die Fehlerseite error html geladen if mysql _affected_rows 0 header Location error html Die PHP Skripten 81 Beachten Sie dass affected_rows in mysqli Syntax keine Methode sondern eine Eigenschaft des Verbindungsobjekts ist Sie d rfen keine Parameterklammern dahinter setzen Konkret lauten die Zeilen in der mysqli Fassung folgenderma en if conn gt affected_ rows 0 header Location error html Aus den oben erw hnten Gr nden wird der Rest des Codes wiederum in einen ver schachtelten else Block gesetzt Zun chst wird die ID des soeben eingef gten Teil nehmers ermittelt um dessen Antworten registrieren zu k nnen query mysql_query SELECT tn_id from gw teilnehmer WHERE tn_email email list id mysql_fetch r
302. hensatz anpassen 102 mysqld Server Programm 289 Optionen 291 mysqld_multi MySQL Startskript 290 mysqld_safe MySQL Startskript 289 Optionen 292 mysqld max Server Programm 289 mysqldump Hilfsprogramm 108 295 mysqli siehe affected_rows PHP Eigenschaft 82 mysqli siehe query PHP Methode 51 mysqli PHP Schnittstelle 50 affected_rows Eigenschaft 235 close Methode 233 einrichten 44 fetch_array Methode 232 fetch_row Methode 232 Instanz erzeugen 51 new Konstruktor 230 query Methode 231 Verbindung 51 MySQL Konfigurationsdateien 40 mysqlmanager Hilfsprogramm 290 N new mysqli Konstruktor 230 nodeName DOM 248 nodeType DOM 248 nodeValue DOM 248 Normalform Boyce Codd 135 dritte 134 erste 132 f nfte 136 vierte 135 zweite 133 NOT MySQL Operator 177 NOT LIKE MySQL Klausel 172 NOTEE mysgl Client Anweisung 108 NOW MySQL Funktion 150 null PHP 224 NUMERIC MySQL Datentyp 149 0 Objektorientierte Datenbank 137 Objektorientierung 225 in PHP 225 Objekt relationale Mapper ORM 7 Objektrelationaler Mapper 315 OLD_PASSWORD MySQL Funktion 287 ON DELETE CASCADE MySQL Klausel 159 ON UPDATE CASCADE MySQL Klausel 159 nblur JS Event Handler 246 nchange JS Event Handler 246 nclick JS Event Handler 246 nfocus JS Event Handler 246 nkeyup JS Event Handler 246 nload JS Event Handler 245 nreadystatechange Ajax 252 onunload JS Event Handler 245 OOP siehe Objektorientierung
303. hes ste hen Hinter dem zweiten Slash k nnen Modifikatoren folgen Beispielsweise sorgt i daf r dass nicht zwischen Gro und Kleinschreibung unterschieden wird Sie k n nen zum Beispiel folgenderma en nach allen Varianten von mysql suchen if preg match mysql i text echo Gl amp uuml ckwunsch MySQL vorhanden lt br gt Mit preg_replace regexp ersatz string limit wird der regul re Ausdruck regexp in string durch den Ersatztext ersatz ersetzt Standardm ig ersetzt die Funktion jedes Vorkommen von regexp mithilfe des optionalen Parameters limit k nnen Sie die Anzahl der Ersetzungen allerdings beschr nken Das folgende Bei spiel ersetzt in text alle Vorkommen von Lufthansa durch Germanwings text preg_replace Lufthansa i Germanwings text Im Ersatztext k nnen geklammerte Teilausdr cke aus dem regul ren Ausdruck wieder eingef gt werden sie werden dabei als 1 bis 99 durchnummeriert Das fol gende Beispiel kehrt einen Namen nach dem Schema Vorname Nachname zum Beispiel David Axmark in Nachname Vorname Axmark David um name preg_replace a z s a z 2 1 name 222 Kapitel8 Webanwendungen mit PHP und MySQL Funktionen In Computerprogrammen kommt es oft vor dass dieselbe Abfolge von Anweisun gen mehrmals ben tigt wird In solchen F llen lohnt es sich diese Anweisungen in eine Funktion auszulagern Dabe
304. hinzuzuf gen Diese berpr fen beim Einf gen oder ndern von Daten automatisch ob sie beispielsweise existieren oder ein bestimmtes Format besitzen Eine besonders beeindruckende F higkeit von Ruby on Rails ist das Scaffolding englisch f r Ger stbau Mit einer einzigen Kommandozeilenanweisung erstellt es Ihnen eine Webschnittstelle zum Erstellen Lesen ndern und L schen von Daten s tzen einer Tabelle kurz CRUD f r Create Read Update Delete Im vorliegenden Beispiel k nnen Sie das Scaffolding nur f r die Tabelle bands benutzen weil das Verfahren noch nicht intelligent genug ist Tabellenrelationen automatisch zu ber cksichtigen Geben Sie also Folgendes ein gt ruby script generate scaffold band Starten Sie nun den WEBrick Server der Anwendung und geben Sie die URL http localhost 3000 bands in Ihren Browser ein Zun chst sehen Sie eine leere Liste Kli Ruby on Rails Active Record 319 cken Sie auf New band geben Sie eine Band Ihrer Wahl sowie deren Herkunftsland ein und klicken Sie auf dann auf Create Wiederholen Sie das ein paarmal bis Sie eine Liste erhalten Im Verzeichnis script Ihrer Rails Anwendung finden Sie noch zwei weitere prakti sche Helfer scripts runner f hrt einzelne Ruby Anweisungen in der Rails Umge bung aus scripts console ruft dagegen die interaktive Ruby Shell irb auf in der Sie beliebig viele Ruby Anweisungen direkt ausf hren k nnen und stellt darin s mtli che Klass
305. hnell eine immense Verbreitung Der Schwerpunkt lag von Anfang an auf Webanwendungen In diesem Bereich ist MySQL so popul r dass die verbreitetste Plattform f r Webanwendungen als LAMP bezeichnet wird Betriebssystem Linux Webserver Apache Datenbank MySQL und Programmier sprache PHP manchmal auch Perl oder Python Die entsprechende Windows 10 Kapitel 1 Einf hrung Variante hei t WAMP unter Windows 2000 XP oder Windows Server 2003 sind solche Systeme durchaus praxistauglich Im n chsten Kapitel erfahren Sie Schritt f r Schritt wie Sie ein LAMP beziehungsweise WAMP System installieren und konfigurieren k nnen Was f r den Schwerpunkt Web und Netzwerkanwendungen spricht ist die Tatsa che dass MySQL von Anfang an ein Client Server System war Der Datenbankser ver k mmert sich um die eigentliche Datenbankverwaltung w hrend f r die Steuerung durch den Benutzer verschiedene Clients von der Kommandozeile ber grafische Oberfl chen bis hin zur Webanwendung eingesetzt werden Server und Client k nnen sowohl auf demselben Rechner laufen als auch an beliebigen Punk ten im Netzwerk oder Internet Neben der kostenlosen Verf gbarkeit war einer der gro en Pluspunkte von MySQL stets die Geschwindigkeit gerade durch das Weglassen verschiedener Features gelang es den Entwicklern den Datenbankserver zu beschleunigen Dies impliziert gleichzeitig den gr ten Nachteil von MySQL Wichtige Features die eine ausgewachsene
306. ht Ein hnlicher Fall tr te ein falls der Kunde Klaus Schmitz umziehen w rde In jeder seiner beiden Buchungen m sste der Wohnort separat ge ndert werden Das vorliegende Beispiel ist noch halbwegs bersichtlich In der Praxis enthalten Tabellen aber oft Dutzende von Attributen und einige Hundert bis mehrere Mil lionen Datens tze Einem Menschen w re es unm glich solche unn tigen nde rungen an mehreren Stellen durchzuf hren und selbst f r ein Computerprogramm w re ein solches Vorgehen u erst un konomisch 4 Kapitel 1 Einf hrung Die L sung im Sinne des relationalen Modells besteht darin die Informationen auf zwei Tabellen zu verteilen Die Daten ber die Kunden geh ren in eine andere Tabelle als die Informationen ber die Reisenden Wie oben bereits erw hnt wird jeder Datensatz durch ein eindeutiges Attribut den Prim rschl ssel gekennzeich net um Verkn pfungen m glich zu machen Da weder Reisende noch Pauschalrei sen ber ein nat rliches Schl sselmerkmal verf gen wie zum Beispiel die ISBN bei B chern oder das amtliche Kennzeichen bei Autos wurde einfach eine Num merierung hinzugef gt In den Tabellen 1 2 und 1 3 sehen Sie die beiden entstande nen Datenbanktabellen Tabelle 1 2 Tabelle Kunden KundeNr Name Vorname Wohnort K001 Schmitz Klaus K ln K002 M ller Andrea Mannheim K003 Huber Ludwig M nchen K004 Jansen Jutta Hamburg K005 Becker Peter Bonn Tabelle 1 3 Tabelle
307. http 127 0 0 1 contest admin auswert php in die Adresszeile des Browsers ein Zun chst werden Sie aufgefordert den Benutzernamen und das Passwort einzuge ben Abbildung 3 4 zeigt wie das im Browser Firefox aussieht In Abbildung 3 5 sehen Sie schlie lich die Beispielausgabe von auswert php Wenn Sie die Seite einige Male neu laden werden Sie feststellen dass die beiden Benutzer die richtig geantwortet haben auf lange Sicht etwa gleich oft gewinnen Ver ffentlichung und Test 99 Gewinnspiel Mozilla Firefox Datei Bearbeiten Ansicht Chronik Lesezeichen Yahoo Extras Hilfe gt RE ER kkto itocamostimysal_bocktgewinnspielfmysalteinahme ohe Erste Schritte K Aktuelle Nachrichten Vielen Dank Hans Wir freuen uns dass Sie an unserem Gewinnspiel teilgenommen haben Unter allen richtigen Einsendungen verlosen wir am 01 08 2007 die Reise Der Gewinner wird per E Mail benachrichtigt Abbildung 3 3 Die Dankesch n Seite der Webanwendung Aufforderung x i Geben Sie Benutzernamen und Passwort f r Gewinnspiel Admin auf http 77127 0 0 1 ein Benutzername admin Passwort a I Den Passwort Manager benutzen um dieses Passwort zu speichem Abbrechen Abbildung 3 4 Benutzeranmeldung f r das Auswertungsskript Gewinnspiel Auswertung Mozilla Firefox ioj xj Datei Bearbeiten Ansicht Gehe Lesezeichen Extras Hilfe a r r
308. i einem Hoster betreiben m chten Manche Hosting Provider bieten Ihnen die bequeme M glichkeit den Passwortschutz f r ein bestimmtes Verzeichnis ber ihre Admi nistrations Website einzurichten Sollte dies bei Ihrem Hoster nicht der Fall sein k nnen Sie wie folgt vorgehen 1 Erstellen Sie die Datei htadmin mit den Benutzerdaten unmittelbar im Ver zeichnis contest admin Bei billigeren Hosting Tarifen haben Sie keinen Shell Zugriff auf den Serverrechner und selbst wenn Sie per SSH zugreifen k nnen steht htpasswd vielleicht nicht zur Verf gung In solchen F llen m ssen Sie die Datei auf einem anderen Rechner am besten mit identischer Apache Version erstellen und in das genannte Verzeichnis kopieren 2 Zus tzlich wird im Verzeichnis admin eine lokale Konfigurationsdatei namens htaccess ben tigt Sie enth lt die oben erl uterten Authentifizierungseinstel lungen und sperrt den ffentlichen Zugriff auf Dateien die mit ht beginnen Insgesamt ben tigt die Datei folgenden Inhalt AuthType Basic AuthBasicProvider file AuthName Gewinnspiel Admin AuthUserFile htadmin Require user admin lt Files ht gt Order deny allow Deny from all lt Files gt 5 Bei Apache Versionen bis 2 0 x m ssen Sie diese Zeile weglassen weil die Authentifizierung fr her anders organisiert war Ver ffentlichung und Test 97 Die Anwendung testen Nun befinden sich die Skripten an der richtigen Stelle um im Webbrowser auspr
309. i handelt es sich um einen benannten Anweisungs block mit folgender Syntax function FunktionsName Param Standard Param2 Standard Anweisung en return Ausdruck Der Aufruf einer solchen Funktion f hrt die enthaltenen Anweisungen aus eine eventuell vorhandene return Anweisung gibt einen Wert an die aufrufende Stelle zur ck In den Klammern k nnen die Namen von Parametervariablen stehen Beim Aufruf m ssen diese als konkrete Werte angegeben werden innerhalb der Funktion stehen sie dann unter dem entsprechenden Variablennamen zur Verf gung Das fol gende Beispiel definiert eine Funktion namens gruss die die angegebene Person je nach Tageszeit unterschiedlich begr t function gruss name Anonymous Stunde ermitteln jetzt time stunde date G jetzt Gru wort je nach Stunde if stunde lt 12 echo Guten Morgen elseif stunde lt 18 echo Guten Tag else echo Guten Abend den Namen ausgeben echo name lt br gt Die PHP Funktion time gibt die Sekunden seit EPOCH zur ck date format time formatiert eine solche Angabe hnlich wie die in Kapitel 6 vorgestellte MySQL Funktion DATE_FORMAT allerdings steht das Format hier vor der Zeit und die Platzhalter beginnen nicht mit einem Prozentzeichen G steht f r die Stundenan gabe im 24 Stunden Modus ohne f hrende Null bei einstelligen Angaben Eine Liste aller zul ssi
310. i_nr lt 4 ai_name ai_kuerzel Air France AF Austrian Airlines os British Airways BA Germanwings 4U Statt ai_nr lt 4 h tten Sie in diesem Fall auch ai_nr lt 5 schreiben k nnen bei ganz zahligen Werten macht das keinen Unterschied Nat rlich gilt das nicht f r Flie kommawerte neswegs mit ausgew hlt werden Im vorliegenden Beispiel verwendet der Vergleich den Prim rschl ssel ai_nr es werden aber nur ai_name und ai_kuerzel angezeigt W Wie Sie sehen muss die Spalte auf der die WHERE Klausel basiert kei Ld Die Vergleichsoperationen k nnen auch f r String Werte aller Art eingesetzt wer den Dabei wird die Position der einzelnen Zeichen im jeweiligen Zeichensatz als Vergleichskriterium eingesetzt Anders als die meisten Programmiersprachen unter Auswahlabfragen 167 scheidet SQL standardm ig nicht zwischen Gro und Kleinschreibung was in den meisten F llen sehr praktisch ist Allgemein l sst sich sagen dass ein String kleiner als ein anderer ist wenn er im Alphabet vor diesem an der Reihe ist Zur Unterscheidung wird das erste unterschiedliche Zeichen verwendet Zum Beispiel gilt London lt Paris und Barcelona lt Berlin In Einzelf llen bestimmt die Kollation also die festgelegte Sortierreihenfolge die Ergebnisse solcher Opera
311. icht nur sthetische Bedeutung sondern erm glicht je nach Umgebungslicht und Monitortyp eventuell eine bessere Kontrastwir kung Im Internet sind weitere Themen erh ltlich Die Schriftgr e l sst sich prozentual verkleinern oder vergr ern e Die ber den gleichnamigen Link erreichbare lokale phpMyAdmin Dokumenta tion wird automatisch mit phpMyAdmin geliefert e phpMyAdmin Wiki ffnet ein neues Browserfenster in dem das vor Kurzem gegr ndete Wiki der phpMyAdmin Entwickler angezeigt wird Das Wiki Kon zept kennen Sie wahrscheinlich von der Online Enzyklop die Wikipedia Die Inhalte k nnen direkt online von jedem beliebigen Besucher ge ndert oder erg nzt werden Die restlichen Links verweisen auf die Websites des phpMyAdmin Projekts selbst Neben der offiziellen Homepage sind auch das ChangeLog Liste der nderungen pro Version das Subversion Repository Quellcode Archiv mit Versionsverwaltung sowie Lists die phpMyAdmin Mailinglisten zu errei chen Unter den beiden Spalten werden eventuell Konfigurations oder Sicherheitsprob leme von phpMyAdmin oder der zugrunde liegenden PHP Installation angezeigt Besonders kritische Fehler zum Beispiel Zugriff mit einem leeren Passwort werden in Rot dargestellt und sollten unverz glich behoben werden Sobald Sie links eine Datenbank ausw hlen werden die Namen aller ihrer Tabellen als Hyperlinks angezeigt Auch im rechten Frame erscheint eine bersicht ber s mtliche Tabel
312. ichtigsten PDO Konstrukte analog zu der weiter oben gezeigten Tabelle f r mysql und mysqli Tabelle 8 2 bersicht der wichtigsten PDO Elemente Funktionalit t PDO Code Verbindungsaufbau conn new PDO mysql host host dbname db user pass option_array Datenbankauswahl nicht vorgesehen bei Bedarf neue Verbindung herstellen Abfrage query conn gt query sql Datensatz lesen arr query gt fetch PDO FETCH NUM numerisches Array Datensatz lesen arr query gt fetch PDO FETCH_ASSOC benanntes Array 236 Kapitel8 Webanwendungen mit PHP und MySQL Tabelle 8 2 bersicht der wichtigsten PDO Elemente Fortsetzung Funktionalit t PDO Code Anzahl Ergebnisdatens tze nicht verf gbar wenn Sie die Anzahl vorab ben tigen ist eine Auswahlabfrage separate SELECT COUNT Abfrage erforderlich Anzahl ge nderter Zeilen lines query gt rowCount Anderungsabfragen Zuletzt eingef gte auto_increment ID id conn lastInsertId Verbindung schlie en conn null Die PDO Verbindung und ihre Optionen Zum Aufbau einer PDO Verbindung wird eine neue PDO Instanz erzeugt Der Konstruktoraufruf hat folgende allgemeine Syntax conn new PDO datenbank_ url user passwort option_array Das erste Argument ein String mit der Datenbank URL sieht je nach verwendetem Datenbanktreiber unterschiedlich aus hat aber im Allgemeinen folgendes Format Treiber Schl
313. ie diese Datei ben tigen mysqld log bin binlog Daraufhin werden im Datenverzeichnis Ihres MySQL Servers die Dateien binlog 000001 und binlog index erzeugt Von Zeit zu Zeit beginnt MySQL eine neue Log datei die dann die n chste laufende Nummer erh lt zum Beispiel binlog 000002 Wenn Sie manuell neue Logdateien beginnen m chten k nnen Sie Folgendes ein geben mysql gt FLUSH LOGS Dasselbe l sst sich auch mittels mysqladmin bewerkstelligen gt mysqladmin flush logs u root p Da die Update Logdatei bin r ist k nnen Sie sie brigens nicht per Texteditor lesen sondern nur mithilfe des Tools mysqlbinlog Dies geht sehr einfach folgender ma en gt mysqlbinlog Logdatei Eine weitere interessante Logdatei die vor allem der Optimierung Ihrer Abfragen dienen kann protokolliert zu langsame Abfragen unter Hostname slow log Tragen Sie dazu Folgendes unter den Abschnitt mysqld der Konfigurationsdatei ein log slow queries long_query_time Sekunden Auch alle Abfragen die keine Indizes verwenden k nnen in derselben Datei proto kolliert werden wenn Sie folgende Zeile hinzuf gen log queries not using indexes MySQL enth lt ab Werk einige Konfigurationsdateivorlagen Sie befinden sich unter Unix im Verzeichnis support files auf Windows Rechnern direkt im MySQL Verzeichnis Sie reichen von my small cnf beziehungsweise my small ini f r kleine Datenbanken bis zu my huge cnf beziehungsweise my huge ini f r sehr
314. ie Installation einer kompletten Serverumgebung f r Webanwendungen beschrie ben Im weiteren Verlauf des Buchs erfahren Sie das Wichtigste ber die Daten bankabfragesprache SQL und lernen am Rande einige Grundlagen der PHP Programmierung kennen Wenn Sie alle Kapitel durchgearbeitet haben werden Sie in der Lage sein mit dem MySQL Datenbankserver umzugehen sowie MySQL basierte PHP Webanwendungen vom Datenbankentwurf bis zur Bereitstellung auf dem Webserver selbst zu schreiben Der vorliegende Band ist die zweite Auflage er wurde an einige Neuerungen der nunmehr als stabil geltenden MySQL Version 5 0 sowie der Betaversion 5 1 ange passt Fortgeschrittene Datenbankfunktionen werden in dieser Ausgabe in einem eigenen Kapitel behandelt die vorhandenen Ausf hrungen wurden leicht erweitert und das neue Thema Trigger kam hinzu Im Bereich der Webanwendungen werden nun auch JavaScript DOM und Ajax behandelt Schlie lich wurden im Administra tionskapitel die Themen Konfigurationsdateien und Replikation hinzugef gt Zielgruppe dieses Buchs Um erfolgreich mit diesem Buch arbeiten zu k nnen sollten Sie einige Vorausset zungen erf llen Die wichtigste ist dass Ihnen ein Computer mit einem der Linux Betriebssysteme oder einer anderen Unix Variante oder Windows zur Verf gung steht Sie sollten mit Dateien und Verzeichnissen vertraut sein sowie die Arbeit mit mindestens einem Texteditor und nat rlich mit einem Webbrowser beherrschen Eben
315. ie das Datum deutsch formatiert und die Eintr ge absteigend nach Datum das hei t den neuesten zuerst sortiert SELECT DATE_FORMAT e datum d m Y H i e nick e mail e titel e inhalt FROM gb _eintraege ORDER BY e datum DESC Sobald diese Abfrage wie blich mittels mysql gt query abgesetzt ist wird die Eigen schaft query gt num_rows ausgelesen die die Anzahl der gefundenen Zeilen enth lt Falls sie den Wert 0 hat wird die Meldung Noch keine Eintr ge vorhanden aus gegeben Andernfalls werden die Datens tze per fetch_row Schleife ausgelesen und formatiert angezeigt 260 Kapitel8 Webanwendungen mit PHP und MySQL Im Modus e Neueintrag wird der PHP Block per gt geschlossen da das Formu lar statisches HTML ist Die Versand URL des Formulars ist wieder das Skript gast php selbst Der neue Modus s Speichern wird als hidden Feld mit dem Formular versandt lt form action gast php method post gt lt input type hidden name mode value s gt lt form gt Zum Speichern werden die Formulareintr ge zun chst mithilfe der Funktion cgi_ param ausgelesen Anschlie end dient die folgende Abfrage dazu sie in die Daten bank zu schreiben INSERT INTO gb eintraege e datum e nick e mail e titel e inhalt VALUES NOW nick mail titel eintr Die Escape Sequenzen durch Backslash gesch tzte Anf hrungszeichen sind hier nur n tig weil die Abfrage
316. ie mittels zur ck zur vorigen Ansicht wechseln oder anschlie end einen weiteren Datensatz einf gen m chten Geben Sie die in Tabelle 4 5 gezeigten Datens tze ein indem Sie vor dem Klick auf OK w hlen dass Sie einen weiteren Datensatz eingeben m ch ten Nach der ersten Auswahl dieser Option sollte sie automatisch bestehen blei ben Das nicht angegebene Feld an_id k nnen und sollten Sie jeweils leer lassen da es per auto_increment automatisch ausgef llt wird 124 Kapitel 4 Mit MySQL arbeiten localhost localhost promo pr_angebote phpMyAdmin 2 10 0 rc1 Mozilla Firefox T AA http localhost phpmyadmin gt Erste Schritte G Aktuelle Nachrichten ali Anzeigen Struktur ASAL Suche 8 Server localhost amp Datenbank promo Tabelle pr_angebote InnoDB free 8192 kB Einf gen Exportieren fjlmportieren Operationen fiileeren L schen Datenbank LEOL Feld Typ Funktion Wert anid int 11 promo an_name varchar 40 B pr_angebote Besuch eines Kulturevents Theater o an_preis int 11 1100 Dlgnorieren Feld Typ Wert an_id int 11 an_name varchar 40 Abendessen im 5 Sterne Restaurant an_preis int 11 Als neuen Datensatz speichem 9 und dann 9 1150 zur ck OK Zur cksetzen Neu
317. ien Neapel Nun wird versucht Frankreich aus der L nderliste zu l schen mysql gt DELETE FROM laender WHERE la_id 2 ERROR 1217 23000 Cannot delete or update a parent row a foreign key constraint fails Wie Sie sehen weigert sich der MySQL Server mit einer Fehlermeldung weil St dte vorhanden sind die in Frankreich liegen so dass dieser Datensatz ben tigt wird Es gibt Constraint Optionen die das L schen oder ndern automatisch auf die abh ngigen Datens tze bertragen Deshalb erfahren Sie hier zun chst wie ein Constraint gel scht wird anschlie end wird er mit diesen Optionen wieder hinzu gef gt Erstes Problem Wenn Sie keine CONSTRAINT Name Klausel gesetzt haben besitzt der Constraint einen automatisch von MySQL vergebenen Namen Dieser l sst sich aber ber eine SHOW CREATE TABLE Abfrage ermitteln mysql gt SHOW CREATE TABLE staedte G KARA To FREE EEE KK K K Table staedte Create Table CREATE TABLE staedte st id int 11 NOT NULL auto_increment st_name varchar 40 default NULL st land int 11 default NULL PRIMARY KEY st_ id KEY st land st_land CONSTRAINT staedte ibfk_1 FOREIGN KEY st land REFERENCES laender Cla_id ENGINE InnoDB DEFAULT CHARSET latin1 158 Kapitel 5 Datenbanken entwerfen und erstellen Der Constraint hei t also staedte_ibf _1 Nachdem der Name bekannt ist kann er gel scht werden mysql
318. iesen Abschnitt berspringen Sie sollten ledig Apache 2 installieren und konfigurieren 23 lich sicherstellen dass Apache 2 2 oder zumindest 2 0 installiert ist und keine 1 3 Version Im Kasten Distributionsware LAMP unter openSUSE 10 2 auf Seite 55 wird beispielhaft die Aktivierung des mitgelieferten Apache Webservers unter openSUSE 10 2 erl utert Zu Ihrer eigenen Sicherheit sollten Sie au erdem berpr fen ob die installierte Version aktuell ist ltere Releases enthalten oft bekannte Sicherheitsl cken die sich Cracker zunutze machen Auf Unix Systemen wird Apache fast immer aus dem Quellcode kompiliert diese Installationsmethode wird von der Apache Software Foundation selbst empfohlen Der erste Schritt besteht darin dass Sie das Quellcode Paket durch folgende Anwei sung entpacken tar xzvf httpd 2 2 4 tar gz Wechseln Sie anschlie end in das neu entstandene Verzeichnis in das die Archiv dateien entpackt wurden cd httpd 2 2 4 Nun muss das Skript configure im aktuellen Verzeichnis aufgerufen werden um die Quelldateien vor der eigentlichen Kompilierung an Ihre Bed rfnisse anzupassen Das Skript kennt unz hlige Optionen geben Sie Folgendes ein wenn Sie sie alle studieren m chten configure help less Hier nur die allerwichtigsten Optionen im berblick e prefix Verzeichnispfad gibt das bergeordnete Verzeichnis f r die Apache Installation an Standard ist usr local apache2
319. iff k nnen je nach Sprache und Schnittstelle unterschiedlich sein Dennoch berwiegen die Gemeinsamkeiten Ist die Verbindung erst einmal hergestellt geht es darum der Datenbank SQL Abfragen zu bermitteln ihre Antworten entgegen zunehmen und diese zu verarbeiten Trotz geringf giger Unterschiede in der SQL Syntax und Vollst ndigkeit der verschiedenen Datenbanksysteme funktioniert die ser Teil einer datenbankbasierten Anwendung fast immer gleich stellen etablieren sich allm hlich verschiedene Arten der Abstrak s tion W hrend PDO nur den Verbindungsaufbau verallgemeinert und danach wie blich SQL Strings an die Datenbank sendet abs trahieren einige neuere L sungen auch die Kommunikation zwi schen Programmiersprache und Datenbank durch standardisierte Funktionsaufrufe u Neben den hier angesprochenen SQL basierten Datenbankschnitt Noch einen Schritt weiter gehen sogenannte Objekt relationale Map per ORM die eine Datenbankstruktur automatisch einer Klassen und Objekthierarchie zuordnen Zwei bekannte Beispiele sind Active Record aus dem Web Framework Ruby on Rails sowie Microsoft ADO NET Ersteres wird im Zusammenhang mit MySQL kurz in Anhang B vorgestellt Abbildung 1 2 zeigt das Funktionsprinzip einer datenbankgest tzten Anwendung Da zwei Programme beteiligt sind wird diese Konstellation als Two Tier L sung bezeichnet Eine solche Anwendung w rde beispielsweise auf einem PC in den Gesch ftsr umen des Reiseb
320. igurationsdatei dieses Users nur f r Clients und Dienstpro gramme anlegen Auf einem Windows Rechner gibt es dagegen eine Datei namens my iniim MySQL Verzeichnis In MySQL Konfigurationsdateien gibt es verschiedene Abschnitte deren Namen die jeweiligen Einzelprogramme repr sentieren Sie werden in eckige Klammern 298 Kapitel 9 MySQL Administration gesetzt Jede Konfigurationsanweisung steht darunter in einer eigenen Zeile und hat das Format Parameter Wert Zeilen die mit einer Raute beginnen leiten einen Kommentar ein F r den MySQL Server wird der Abschnitt mysqld verwendet Andere wichtige Abschnitte sind mysql f r den Kommandozeilenclient mysqladmin f r das gleichnamige Administrationsprogramm und mysqldump f r das Exporttool F r den Server selbst k nnen Sie unter anderem folgende Parameter konfigurieren port Port Nummer TCP Port an dem der Server auf Verbindungen wartet Wenn Sie mehrere MySQL Server auf einem Host verwenden m chten m ssen Sie jedem von ihnen eine andere Portnummer zuweisen der Standardwert ist 3306 socket Dateipfad Unix Domain Socket f r die Kommunikation zwischen Server und Clients auf dem lokalen Rechner nur auf Unix Systemen verf gbar Standard ist tmp mysgql sock character set server Zeichensatz Standard Zeichensatz f r den Server wenn Sie nichts anderes angeben latin1 collation server Kollation Standard Sortierreihenfolge des Servers Da MySQL aus Schwed
321. in hnliches Problem wie Sessions allerdings k nnen sie Daten auch f r eine sp tere Sitzung aufbewahren Sie werden n mlich nicht auf dem Server gespeichert sondern durch den Browser auf dem Clientrechner abgelegt f r die konkrete Implementierung haben die Browserhersteller verschiedene Methoden gew hlt Greift der Browser sp ter wieder auf denselben Server zu sendet er dessen Cookies automatisch mit jeder Anfrage Das Problem ist dass Sie sich nicht bei allen Besuchern auf die Verf gbarkeit von Cookies verlassen k nnen Viele Benutzer deaktivieren sie komplett weil sie nicht damit einverstanden sind dass viele Onlinewerber Cookies dazu missbrauchen ihr Surfverhalten auszuspionieren 228 Kapitel8 Webanwendungen mit PHP und MySQL In PHP werden Cookies ber die Funktion setcookie gesetzt die folgende Syntax besitzt setcookie name wert verfallsdatum pfad domain secure Die verschiedenen Parameter bedeuten Folgendes e name Name des Cookies ber den Sie es beim sp teren Abruf identifizieren k nnen e wert Die konkrete Information die in dem Cookie gespeichert werden soll e verfallsdatum Ende der G ltigkeit des Cookies in Sekunden seit EPOCH Addieren Sie einfach time und die gew nschte Sekundenzahl zum Beispiel 86 400 f r einen ganzen Tag Cookies ohne Verfallsdatum sind Session Cookies die nur innerhalb der aktuellen Clientsitzung gelten pfad bergeordneter URL
322. in der GRANT Anweisung auch eine SET PASSWORD Anweisung verwen den Diese hat folgende Syntax SET PASSWORD FOR Benutzername Hostname PASSWORD OLD PASSWORD Passwort Das folgende Beispiel weist dem Benutzer newuser ein etwas besseres Passwort als geheim zu SET PASSWORD FOR newuser localhost PASSWORD 53cr3t Die Funktionen PASSWORD beziehungsweise OLD _PASSWORD verschl sseln den angegebenen Passwort String er wird nicht im Klartext in den GRANT Tabellen gespeichert IDENTIFIED BY erledigt diese Verschl sselung dagegen automatisch Das Verschl sselungsverfahren wurde ab MySQL 4 1 ge ndert ltere Client APls wie sie etwa in PHP bis Version 4 3 x enthalten sind was dann nat rlich auch php MyAdmin betrifft k nnen mit dem neuen Algorithmus nicht umgehen F r Benut zer die ber diese APIs zugreifen muss die Funktion OLD_PASSWORD eingesetzt werden Das folgende Beispiel erzeugt einen Benutzer namens olduser und weist ihm anschlie end ein mithilfe der alten Methode verschl sseltes Passwort zu CREATE USER olduser localhost SET PASSWORD FOR olduser localhost 0LD PASSWORD Tops3cr3t Alternativ k nnen Sie den MySQL Server mysqld auch mit der Option old pass words starten siehe den Abschnitt mysqld Optionen weiter unten Auf diese Weise l sst sich auch IDENTIFIED BY zur Rechtevergabe f r ltere Clients einsetzen Empfehlenswert ist das aber nicht da Sie aus Sicherheitsgr nden das neue Verfah ren ve
323. in shutdown u root p Nun muss das gesamte Datenverzeichnis auf den Slave Host kopiert werden Dies funktioniert je nach Betriebssystem und Netzwerkkonfiguration unterschiedlich Auf dem Slave m ssen Sie dazu ebenfalls den MySQL Server beenden und den Inhalt seines Datenverzeichnisses l schen Wenn Sie seine eigenen Datenbanken sp ter noch brauchen m ssen Sie sie zuerst in ein anderes Verzeichnis kopieren Tragen Sie nun folgende Zeile in die Hauptkonfigurationsdatei des Master Servers ein mysqld server id 1 Welche konkrete Nummer Sie w hlen ist egal sie muss sich nur von den IDs der Slaves unterscheiden 1 ist allerdings Standard f r den Master Nach diesen Schritten k nnen Sie den Master MySQL Server wieder starten Replikation 301 Wenn Ihr Slave ein Unix Rechner ist m ssen Sie die Berechtigungen f r das kopierte Datenverzeichnis ndern chown R mysql mysql MySOL Daten Auch der Slave braucht nun eine eindeutige Server ID Beispiel mysqld server id 2 Starten Sie den Slave MySQL Server nun wieder ffnen Sie den MySQL Komman dozeilenclient und geben Sie Folgendes ein selbstverst ndlich m ssen Sie statt der hier gezeigten Platzhalter konkrete Werte einf gen mysql gt CHANGE MASTER TO gt MASTER_HOST Master gt MASTER_USER replicant gt MASTER_PASSWORD ReplPasswort gt MASTER_LOG_FILE Master Logdatei gt MASTER_LOG_POS Position mysql gt START SLAVE F hre
324. indows Falls es gravierende nderungen gibt u werden diese auf der Website zum Buch http buecher lingoworld de mysql erl utert u Von Zeit zu Zeit ndern sich einige Details der MySQL Installation Installation unter Linux Beachten Sie dass Sie den Installationsprozess als root durchf hren m ssen weil Sie Schreibrechte in systemrelevanten Verzeichnissen ben tigen und mit Benutzer und Gruppen IDs umgehen m ssen F r Linux und einige andere Unix Systeme werden fertig kompilierte Bin rpakete von MySQL angeboten Die zum Zeitpunkt der Drucklegung neuesten Versionen sind auf der CD zum Buch enthalten sehen Sie aber besser auf der MySQL Website nach ob nicht eine neuere Version verf gbar ist Die entsprechende Archivdatei m ssen Sie zun chst entpacken hier als Beispiel die max Variante tar xzvf mysql max 5 0 41 linux i686 glibc23 tar gz MySQL installieren 33 gen Dateinamen wahrscheinlich nicht auszuschreiben sondern k n nen zum Beispiel mysql eintippen und dann Tab dr cken um von der Eingabevervollst ndigung Ihres Terminalfensters Gebrauch zu machen u Hier und in den nachfolgenden Schritten brauchen Sie den elend lan kd Das ausgepackte Verzeichnis sollten Sie nach usr local verschieben falls Sie es nicht bereits dort entpackt haben mv mysql max 5 0 41 linux i686 glibc23 usr local Wechseln Sie nun nach usr local cd usr local Als N chstes sollten Sie einen symbolischen L
325. indows Rechnern kommt dagegen MDS5 Verschl sselung zum Einsatz hier sieht der Eintrag folgenderma en aus admin apr1 jX1 aN g7ECZAZcy7Im3tRy4N Anschlie end m ssen Sie in der Apache Konfigurationsdatei httpd conf einen Ein trag wie den folgenden hinzuf gen um das Verzeichnis admin mit diesen Anmelde daten zu sch tzen lt Location contest admin gt AuthType Basic AuthBasicProvider file AuthName Gewinnspiel Admin AuthUserFile userdata htadmin Require user admin lt Location gt 96 Kapitel 3 Die erste Webanwendung AuthType gibt die Form der Anmeldung an hier Basic klartextbasiert im Gegen satz zur verschl sselten Variante Digest AuthBasicProvider legt fest dass Apache die Vergleichsdaten aus einer htpasswd Textdatei lesen soll AuthName bezeichnet den Anmeldebereich Realm den der Browser in der Anmeldeaufforderung anzeigt Mittels AuthUserFile wird die soeben erstellte Datei mit den Anmeldedaten eingebunden Bei einer Apache Standardinstallation k nnen Sie den Pfad wie hier relativ zur ServerRoot angeben sollte dies nicht funktionieren m ssen Sie den vollst ndigen absoluten Pfad angeben etwa usr local apache2 userdata htadmin Nachdem Sie diese nderungen durchgef hrt haben m ssen Sie Apache neu star ten siehe voriges Kapitel Nun folgt wie oben versprochen noch eine kurze Information ber die n tigen nderungen wenn Sie die passwortgesch tzte Seite in Ihrem Webspace be
326. ine Benutzereingabe zustande sondern wird automatisch durch das n chste Skript hervorgerufen falls dieses eine vergessene Eingabe im Formular bemerkt Falls fehler nicht den Vorgabewert 0 hat konkret wird bei einem Fehler der Wert 1 gesetzt zeigt das Skript eine zus tzliche Meldung an lt php Wurde die Seite nach einem Eingabefehler erneut aufgerufen fehler cgi_ param fehler 0 if fehler gt lt p gt lt font color FF0000 gt Bitte alles vollst amp auml ndig ausf amp uuml llen lt font gt lt p gt lt php gt Wie Sie sehen l sst sich das Schlie en und Wieder ffnen von lt php gt Bl cken innerhalb der if Verschachtelung verwenden Dadurch kann man oft auf l stige echo Anweisungen verzichten Sie k nnen optionalen HTML Code einfach als sol chen hinschreiben Nachdem wie blich die Verbindung zum Datenbankserver hergestellt und die Datenbank ausgew hlt wurde erfolgt die Ausgabe der Daten in das Formular Die erste Datenbankabfrage w hlt die ben tigten Bestandteile der Frage aus Fragenum mer fr_id und Fragetext fr_frage Der SQL Code sieht folgenderma en aus SELECT fr_id fr_frage FROM gw fragen ORDER BY fr_id ASC DiePHP Skripten 75 Wenn Sie diese Abfrage im Kommandozeilenclient ausf hren erhalten Sie folgende Ausgabe 44 22 2222 2222222222222222222422 4022000020 fr_id fr_frage 44 22 2222 2222222222222 222224422 4022000 000 1
327. inistrator ihn sofort benachrichtigen kann wird die E Mail Adresse als Link dargestellt u In der nachfolgenden Beschreibung wird aus Platz und bersichts gr nden ausschlie lich die mysql Syntax verwendet daf r werden die Listings in Beispiel 3 4 und 3 5 zur Abwechslung in mysqli und PDO Schreibweise abgedruckt Damit berhaupt berpr ft werden kann ob die jeweiligen Antworten der Teilneh mer richtig sind werden in einem ersten Schritt die Nummern der korrekten Ant worten aus der Tabelle gw_fragen ermittelt und in einem neuen Array namens 86 Kapitel3 Die erste Webanwendung korrekt abgelegt Die Funktion array_push array wert dient dazu den angege benen Wert am Ende des Arrays anzuh ngen Nummern der richtigen Antworten speichern fr_query mysql query SELECT fr_korrekt FROM gw fragen ORDER BY fr_id ASC korrekt array while list fr_korrekt mysql_fetch row fr_query array push korrekt fr_korrekt An dieser Stelle wird was ziemlich fahrl ssig ist auf jegliche Fehlerkontrolle ver zichtet Da es sich nicht um die Verarbeitung von Benutzereingaben sondern um das Auslesen von Daten aus einer selbst erstellten Tabelle handelt ist das Risiko kalkulierbar In einer echten Praxisanwendung sollten Sie allerdings auch solche vermeintlich sicheren Stellen berpr fen um eventuelle eigene Fehler abzufangen insbesondere w hrend der Entwicklungs und Testphase Als N chste
328. ink erstellen der den umst ndlichen Verzeichnisnamen mit der vollst ndigen Versionsbezeichnung unter dem prakti scheren Namen mysql bereitstellt ln s mysql max 5 0 41 linux i686 glibc23 mysql Alternativ zu den bisherigen Schritten k nnen Sie auch das Quellcode Paket kompi lieren das manchmal in einem aktuelleren Release vorliegt als die Bin rvariante Entpacken Sie es zun chst tar xzvf mysql 5 0 41 tar gz Mittels cd k nnen Sie in das neu erstellte Verzeichnis wechseln cd mysql 5 0 41 Geben Sie Folgendes ein um Auskunft ber alle verf gbaren Konfigurationsop tionen zu erhalten configure help less Die Standardauswahl der Optionen ist in vielen F llen in Ordnung es gen gt also meistens dieses einzugeben um den Quellcode zur Installation unter usr local mysql vorzubereiten configure prefix usr local mysql Nachdem configure seine Arbeit beendet hat werden die blichen Befehle zur Kompilierung und Installation aufgerufen make make install Wenn Sie den bisherigen Anweisungen gefolgt sind und entweder die Bin rdistribu tion entpackt oder das Quellcode Paket kompiliert haben befindet sich MySQL unter usr local mysql Wechseln Sie als N chstes in dieses Verzeichnis cd usr local mysql 34 Kapitel 2 Installation und Inbetriebnahme Erstellen Sie eine Gruppe und einen zu dieser Gruppe geh rigen Benutzer unter deren ID MySQL ausgef hrt werden soll groupadd mysq
329. is nderung mit query conn gt prepare UPDATE rb_hotels SET ht_ezpreis WHERE ht_nr 1 query gt bindParam 1 preis Die MySQL SchnittstelleninpHP 243 preis 10 query execute affected query gt rowCount echo affected Zeile n gedauml ndert lt br gt preis 10 query gt execute affected query gt rowCount echo affected Zeile n gedauml ndert lt br gt Mit einem benannten Parameter sieht derselbe Codeteil so aus query conn gt prepare UPDATE rb_hotels SET ht_ezpreis preis WHERE ht_nr 1 query bindParam preis preis preis 10 query execute affected query gt rowCount echo affected Zeile n gedauml ndert lt br gt preis 10 query gt execute affected query gt rowCount echo affected Zeile n gedauml ndert lt br gt Clientseitiges Scripting mit JavaScript und Ajax PHP ist eine serverseitige Skriptsprache PHP Skripten werden also bereits auf dem Webserver verarbeitet das Ergebnis sind statische HTML Dokumente manchmal auch andere Formate wie Bilder oder PDF Dateien die an den Browser geliefert und von diesem angezeigt werden Um mehr Dynamik in Ihre Webanwendungen zu bringen k nnen Sie zus tzlich clientseitiges Scripting verwenden Die von allen wichtigen Browsern in leicht unterschiedlichen Dialekten verstan dene Sprache f r diesen Einsatzzweck hei t JavaScript
330. it Sie f r alle erdenkli chen Aufgaben ger stet sind Nachdem Sie die Datei von der CD kopiert oder aus dem Web heruntergeladen haben k nnen Sie sie beispielsweise mit WinZip entpacken Sie enth lt aus schlie lich die Datei Setup exe Diese wird unter Windows 2000 XP Server 2003 und so weiter per Doppelklick ausgef hrt Auf Vista Systemen m ssen Sie sie dage gen mit der rechten Maustaste anklicken und Als Administrator ausf hren w hlen Danach m ssen Sie gegebenenfalls noch eine Sicherheitsabfrage best tigen Der Installer stellt Ihnen auf mehreren Registerkarten einige Fragen mithilfe der Schaltfl che Next kommen Sie jeweils weiter 1 Welcome kurze Information dar ber dass MySQL installiert wird 2 Setup Type w hlen Sie am besten Custom um selbst die Komponenten auszu w hlen die Sie installieren m chten Typical installiert eine Standardauswahl mit Complete wird dagegen ohne weitere Nachfrage alles installiert 3 Falls Sie im vorigen Schritt Custom gew hlt haben erscheint nun die Register karte Custom Setup In einer Baumstruktur k nnen Sie die Komponenten oder Unterkomponenten ausw hlen die Sie installieren beziehungsweise weglassen m chten Den MySQL Server ben tigen Sie dabei auf jeden Fall es sei denn Sie m chten nur die Client Tools installieren um ber das Netzwerk den MySQL Server auf einem anderen Server zu administrieren Die Client Pro grams besitzen drei Unterpunkte Die
331. it einer neuen kleinen Datenbank Erstellen Sie eine neue Datenbank namens foreign_test und legen Sie sie als Stan darddatenbank fest mysql gt CREATE DATABASE foreign test mysql gt USE foreign_test Erstellen Sie eine zweispaltige Tabelle namens laender mysql gt CREATE TABLE laender gt la_id INT AUTO_INCREMENT PRIMARY KEY gt la_name VARCHAR 40 gt gt ENGINE InnoDB F gen Sie folgende Datens tze ein mysql gt INSERT INTO laender la_name VALUES gt Deutschland gt Frankreich gt Italien Erstellen Sie eine weitere Tabelle namens staedte sie enth lt den Constraint auf die Nummer des entsprechenden Landes mysql gt CREATE TABLE staedte gt st_id INT AUTO_INCREMENT PRIMARY KEY gt st_name VARCHAR 40 gt st_land INT gt INDEX st_land gt FOREIGN KEY st_land REFERENCES laender la_id gt gt ENGINE InnoDB Schl ssel und Indizes 157 Auch in diese Tabelle werden nun Werte eingef gt mysql gt INSERT INTO staedte st_name st_land VALUES gt K ln 1 gt Bonn 1 gt Paris 2 gt Lyon 2 gt Rom 3 gt Neapel 3 Lassen Sie sich zur Kontrolle eine JOIN Ansicht der St dte und L ndernamen anzei gen mysql gt SELECT la_nr st_nr gt FROM staedte INNER JOIN laender ON la_id st_land Deutschland K ln Deutschland Bonn Frankreich Paris Frankreich Lyon Italien Rom Ital
332. its in fr heren Kapiteln erw hnt wurde werden auch MySQL Datens tze als Arrays ausgelesen Sie k nnen sich sogar aussuchen ob sie durchnummeriert werden oder ob die Feldnamen die Indizes bilden sollen Um alle Elemente eines numerischen Arrays auszugeben k nnen Sie ein Schleifen konstrukt wie dieses verwenden anzahl sizeof laender for i 0 i lt anzahl i echo laender i lt br gt Die Ausgabe dieses Beispiels im Browser sieht folgenderma en aus Deutschland Frankreich T rkei Mithilfe der Funktion sizeof array wird die Anzahl der Elemente im Array ermit telt F r die Ausgabe aller Elemente eines Arrays mit String Indizes bietet sich dagegen die Funktion each array an die bei jedem Aufruf das n chste Paar aus Schl ssel und Wert zur ckgibt Mithilfe der bereits in fr heren Kapiteln erw hnten Funktion list k nnen Sie dieses Paar einer Liste aus zwei Variablen zuweisen Der Code zur Ausgabe der Fluggesellschaften und ihrer K rzel sieht also wie folgt aus Array Z hler auf das Anfangselement setzen reset airlines while list index wert each airlines echo wert index lt br gt Wenn Sie dieses Beispiel ausf hren zeigt der Browser Folgendes an K ln Bonn CGN Istanbul IST Roma Fiumicino FCO Mithilfe einfacher Funktionen k nnen Sie Arrays brigens zu Strings zusammenfas sen und umgekehrt Strings zerlegen explode muster string
333. k nnen Sie also in jedem Fall fehler und gefahrenfrei ausf hren CREATE DATABASE IF NOT EXISTS reisebuero CREATE TABLE Abfragen zur Erzeugung von Tabellen sind dagegen komplexer Die allgemeine Grundform dieser SQL Anweisung sieht folgenderma en aus CREATE TABLE Tabellenname Feldname1 Datentyp Optionen Feldname2 Datentyp Optionen Hier sehen Sie als kurzes Beispiel die Erstellungsabfrage f r die Tabelle rb_kunden CREATE TABLE rb kunden kd_nr INT AUTO INCREMENT PRIMARY KEY kd name VARCHAR 40 kd vorname VARCHAR 40 kd_gdatum DATE kd_bemerk VARCHAR 100 Der f r den Nachnamen geplante Index wurde hier noch nicht hinzugef gt Schl s sel und Indizes werden weiter unten in einem eigenen Abschnitt behandelt Auch die Erzeugung einer Tabelle k nnen Sie mittels IF NOT EXISTS davon abh ngig machen ob sie bereits existiert oder nicht Ein verk rztes Beispiel CREATE TABLE IF NOT EXISTS rb kunden Eine wichtige Option ist der Tabellentyp Storage Engine Seit Version 3 23 k nnen MySQL Datenbanken Tabellen enthalten die auf unterschiedliche Art und Weise gespeichert werden und verschiedene Features unterst tzen Der Typ wird durch die Option ENGINE Typname oder TYPE Typname angegeben Die wichtigsten Typen sind folgende Datenbanken und Tabellen erstellen 143 e MyISAM Eine Weiterentwicklung des klassischen MySQL Tabellentyps ISAM Indexed Sequential Access Method Die Verarbeitun
334. ken entwerfen und erstellen um die Kunden die sich f r eine Reise interessieren oder gar eine buchen m chten Diese oft aus mehreren Tabellen bestehenden Datensammlungen stehen zun chst relativ beziehungslos nebeneinander Erst die Tabelle rb_buchungen nimmt auf viele von ihnen Bezug Nicht unmittelbar zum Kern der Buchungsangelegenheiten geh rt zuletzt eine Tabelle ber Sehensw rdigkeiten die den potenziellen Kunden den Besuch der einzelnen St dte schmackhaft machen sollen Tabelle 5 2 zeigt zun chst eine bersicht ber s mtliche Tabellen der Datenbank und ihre Aufgaben Tabelle 5 2 Die Tabellen der Datenbank reisebuero Tabelle Funktion rb_laender L nder in die Reisen angeboten werden rb_staedte St dte in die Reisen angeboten werden rb_airlines Fluggesellschaften rb_airports Flugh fen rb_flugstrecken Flugangebote der Fluggesellschaften rb_fluege konkrete Fl ge mit Datum rb_hotels die verf gbaren Hotels rb_kunden Basisdaten der Kunden rb_kundenkontakte Kontaktdaten der Kunden rb_buchungen konkrete Reisebuchungen rb_sehensw Hauptsehensw rdigkeiten der einzelnen St dte In der recht umfangreichen Tabelle 5 3 werden die verschiedenen Spalten der ein zelnen Datenbanktabellen vorgestellt Tabelle 5 3 Bedeutung der Spalten aller Tabellen der Datenbank reisebuero Spalte Datentyp Optionen Bedeutung Tabelle rb_laender la_nr INT Prim rschl ssel AUTO_INCREMENT la_name VARCHAR 40 Index deutscher Nam
335. l if titel titel Ohne Titel echo lt a href forum php modesrd id id gt titel lt a gt von nick lt br gt Die Reiseb ro Anwendung 267 Beispiel 8 7 forum php ein Diskussionsforum Fortsetzung Rekursiver Aufruf f r die Nachfolger von id zeige thread id stufe 1 gt lt html gt lt head gt lt title gt Reiseb uuml ro Forum lt title gt lt link rel stylesheet type text css href main css gt lt script language JavaScript type text javascript src utils js gt lt script gt lt head gt lt body gt lt table border 0 width 750 align center gt lt tr gt lt td gt amp nbsp lt br gt lt div align center gt lt img src logo gif width 480 height 80 alt EuroCityTravel gt lt div gt lt br gt lt Einfache Navigationsleiste gt lt hier aus Platzgr nden weggelassen gt lt Ende der Navigationsleiste gt gt lt php if mode 1 Listenmodus Eintragsliste anzeigen echo lt h2 gt Diskussionsforum lt h2 gt Threads auf oder zugeklappt offen cgi param o 1 Links zum Schreiben sowie Auf und Zuklappen echo lt a href forum php mode e p 0 gt Neuer Beitrag lt a gt if offen echo Aufklappen lt a href forum php mode 1 amp 0 0 gt Zuklappen lt a gt else echo lt a href forum php mode 1 amp 0 1 gt Aufklappen
336. l useradd g mysql mysql Der n chste Schritt besteht darin das Installer Skript ausf hren Es erstellt vor allem die Grunddatenbanken und tabellen beispielsweise die Grant Tabellen mit den MySQL Benutzern und Berechtigungen Geben Sie Folgendes ein scripts mysql_install_db user mysql Damit der Datenbankserver funktioniert m ssen Sie nun einige Besitzrechte setzen Grunds tzlich m ssen alle Dateien im mysql Verzeichnis und in allen Unterver zeichnissen root geh ren die Option R steht f r rekursiv das hei t sie durchl uft den gesamten Verzeichnisbaum chown R root Das Verzeichnis data muss dagegen dem mysql Benutzerkonto geh ren weil es hier Schreibrechte ben tigt chown R mysql data F r allgemeine Leserechte wird der gesamte Inhalt des Verzeichnisses schlie lich der Gruppe mysql berschrieben chgrp R mysql Nachdem nun alle Installations und Grundkonfigurationsarbeiten abgeschlossen sind k nnen Sie den Datenbankserver starten bin mysqld_safe user mysql amp Das angeh ngte amp sorgt daf r dass die Anweisung im Hintergrund ausgef hrt wird Auf diese Weise k nnen Sie das entsprechende Terminalfenster weiterverwenden w hrend der MySQL Server ausgef hrt wird Als N chstes sollten Sie zur k nftigen Arbeitserleichterung wieder einige symboli sche Links erstellen um wichtige MySQL Dienstprogramme von jedem Verzeichnis aus zur Hand zu haben Insbesondere der Kommandozeilen
337. l Colonia K ln 195 Queen Victoria London 190 La Barca Barcelona 185 F r Strings gelten auch beim Sortieren die weiter oben beschriebenen Hinweise ber Zeichens tze und Kollationen Falls Sie sich bei einzelnen Sortiervorg ngen allein auf den Zeichensatz verlassen m chten k nnen Sie wiederum die Funktion BINARY verwenden SQL Ausdr cke und Funktionen Manchmal ist es erforderlich aus den Inhalten von Datenbanktabellen andere Werte abzuleiten F r solche F lle k nnen SELECT Abfragen nicht nur Felder ausle sen sondern beliebige Ausdr cke enthalten die berechnet beziehungsweise ausge wertet werden Beispielsweise k nnte sich ein Unternehmen f r die Nettopreise der K lner Hotels ausgewiesener Endpreis abz glich Mehrwertsteuer interessieren Eine entsprechende Abfrage s he so aus mysql gt SELECT ht_name AS Hotel ht_ezpreis 1 19 AS EZ Netto gt ht_dzpreis 1 19 AS DZ Netto FROM rb_hotels gt WHERE ht_stadt 1 Hotel EZ Netto DZ Netto Bergerhof 58 8235 100 8403 Hotel Colonia 88 2353 163 8655 Wie Sie sehen ist die Umbenennung von Ergebnisspalten mittels AS hier noch n tz licher als beim Ermitteln normaler Feldinhalte Etwas komplexer ist die entsprechende Berechnung f r alle deutschen
338. land lt br gt Optional k nnen Sie einen else Block hinzuf gen dessen Inhalt ausgef hrt wird falls die Bedingung nicht zutrifft zum Beispiel if stadt K ln echo Die Stadt ist K ouml In lt br gt else echo Die Stadt ist nicht K amp ouml In lt br gt 218 Kapitel8 Webanwendungen mit PHP und MySQL Schlie lich existiert mit elseif noch eine Anweisung f r verschachtelte Bedingun gen die nur berpr ft werden falls die vorherige if Bedingung nicht zutraf Auch daf r sehen Sie hier ein Beispiel if stadt K ln echo Die Stadt ist K amp ouml 1n lt br gt elseif stadt Paris echo Die Stadt ist Paris lt br gt else echo Die Stadt ist weder K amp ouml ln noch Paris lt br gt Eine weitere Form von Kontrollstrukturen sind die Schleifen Sie f hren eine Folge von Anweisungen mehrmals aus wobei auch sie in der Regel eine Bedingung pr fen Die einfachste Form ist die while Schleife ihre Syntax lautet folgenderma en while Ausdruck Anweisung en Solange der Ausdruck wahr ist werden die Anweisungen immer wieder ausgef hrt Das folgende Beispiel gibt die Quadrate der Zahlen 1 bis 10 aus Startwert i 1 i 1 Hat i h chstens den Wert 10 while i lt 10 quadrat i i echo i lt sup gt 2 lt sup gt quadrat lt br gt i um 1 erh hen i Da die Bedingung bereits vor der ers
339. lback im zweiten Fenster auf einfache Weise wieder entfernen ROLLBACK Eine letzte SELECT Anweisung zeigt dann dass der Zustand in beiden Fenstern iden tisch ist mysql gt SELECT FROM stationen s_id s_name s_dauer 1 K ln o 2 Bonn 30 3 Frankfurt 80 Views Views Ansichten sind gespeicherte Tabellenansichten die eine einfache M glich keit bieten auf h ufig genutzte Auswahlabfragen mit oder ohne Verkn pfungen zuzugreifen Eine View hnelt in vielerlei Hinsicht einer Tabelle man kann daraus ausw hlen und unter bestimmten Umst nden auch Daten darin ndern Allerdings bezieht die View ihre Daten ausschlie lich aus vorhandenen Tabellen und ndert sich automatisch mit diesen In MySQL werden Views seit Version 5 0 in Bin r Releases seit 5 0 1 unterst tzt Eine View wird mithilfe der Abfrage CREATE VIEN erstellt die folgende Grundsyntax besitzt CREATE VIEW ViewName AS SELECT Die SELECT Abfrage die in der View abgespeichert wird kann im Grunde aus allen im vorigen Kapitel gezeigten Komponenten bestehen Das folgende Beispiel defi niert eine View f r die Datenbank reisebuero die die Hotels den benannten St d ten zuordnet Views 203 CREATE VIEW hotel_orte AS SELECT ht_name AS Hotel st_name AS Stadt FROM rb hotels INNER JOIN rb_staedte ON ht_stadt st
340. lbe gilt brigens f r die Verminderung um 1 mittels die entsprechend als Pr beziehungsweise Post Dekrement bezeichnet wird e Als Vergleichsoperatoren sind gleich ungleich lt gt lt und gt verf g bar Anders als in vielen anderen Programmiersprachen k nnen sie sowohl f r Zahlen als auch f r Strings verwendet werden Letzteres richtet sich streng nach der Zeichensatzabfolge Sie k nnen die Regeln nachvollziehen wenn Sie die Informationen ber Binary Kollationen im vorigen Kapitel lesen e Die logischen Operatoren amp amp logisches Und logisches Oder und logi sches Nicht funktionieren ebenfalls genau wie in MySQL e Der im Beispiel weiter oben verwendete Punkt dient der Verkettung von Strings Allerdings ist er aufgrund der Variablensubstitution oft berfl ssig Kontrollstrukturen Mit zu den wichtigsten Bestandteilen von Programmiersprachen z hlen die soge nannten Kontrollstrukturen Sie erm glichen die bedingte und gegebenenfalls auch wiederholte Ausf hrung von Anweisungen Die h ufigste Kontrollstruktur ist die einfache Fallentscheidung mit if die folgende grundlegende Syntax besitzt if Ausdruck Anweisung en Der Anweisungsblock wird dabei nur ausgef hrt wenn der zu pr fende Ausdruck wahr ist Das folgende Beispiel gibt K ln liegt in Deutschland lt br gt aus wenn stadt den Wert K ln hat if stadt K ln echo stadt liegt in Deutsch
341. le gen zu der phpMyAdmin automatisch wechselt wenn ein User den Logout Link bet tigt berpr fen Sie zum Schluss noch einmal alle Ihre Eingaben und klicken Sie dann auf die Schaltfl che Add in der Zeile Actions Wenn Sie alles richtig gemacht haben erscheint wieder der Startbildschirm des Setup Skripts mit der Informationszeile New Server added Klicken Sie die Schaltfl che Save unter Configuration an um die neue Konfigurationsdatei zu speichern Daraufhin erscheint die Information File saved Einige weitere Konfigurationsoptionen werden in Kapitel 4 kurz erw hnt Zum Abschluss m ssen Sie die neu erzeugte Datei config inc php aus dem Unterver zeichnis config in das phpMyAdmin Hauptverzeichnis verschieben Das global beschreibbare Verzeichnis config sollten Sie danach aus Sicherheitsgr nden l schen Diese beiden Schritte lassen sich entweder in der grafischen Oberfl che Ihres Systems ausf hren oder aber Sie verwenden die Konsole Wenn das Arbeitsverzeichnis Ihr phpMyAdmin Ordner ist funktioniert Letzteres unter Unix so mv config config inc php rmdir config Auf Windows Rechnern lauten diese Zeilen wie folgt move config config inc php rmdir config Anschlie end k nnen Sie phpMyAdmin unter der URL http lt Domainname gt phpmyadmin im Browser aufrufen auf dem lokalen Rechner zum Beispiel unter http localhost phpmyadmin beziehungsweise http 127 0 0 1 phpmyadmin Falls Sie den Anmeldetyp http oder cookie
342. le 180 8 K php5 zlib PHPS Extension Module 26 6K Internet Gateway au yast2 http server YaST2 HTTP Server Konfiguration 692 3 K DHCP und DNS Server Verzeichnisserver LDAP Ki T Hostserver f r Xen Virtual Machine Entwicklung Beschreibung Technische Daten Abh ngigkeiten Versionen Dateiliste ni I Grundlegende Entwicklung Duuuuuuuurtwwunvnfle GNOME Entwicklung apache2 The Apache Web Server Version 2 0 A Name Plattenplatz Belegt Frei Gesamt Apache 2 the successor to Apache 1 1 ME 5l 5 668 5 2GB 10 8GB Aahe sth RA i ki home E 3 139 7 MB 4 3GB 4 4 GB pache is the most used Web server software worldwide Pr fen C Automatische berpr fung Abbrechen bernehmen Abbildung 2 2 Installation der LAMP Komponenten unter openSUSE 10 2 W hlen Sie zum Schluss die Option bernehmen Gegebenenfalls wird ange zeigt dass weitere Pakete ben tigt werden um Abh ngigkeiten aufzul sen diese Pakete werden automatisch ausgew hlt Nach der Installation steht Ihr LAMP System sofort zur Verf gung und Sie k nnen die in den vorigen Abschnitten beschriebenen Apache MySQL und PHP Tests durchf hren phpMyAdmin einrichten Es gibt verschiedene Clientprogramme zum Durchsuchen Editieren und Modifizieren von MySQL Datenbanken Mit dem MySQL Server wird lediglich der Kommando zeilenclient mysql geliefert Die
343. le L sung besteht darin die gew nschten festen Werte in einer separaten Tabelle zu speichern und in der entsprechenden Spalte nur auf den jeweili gen Prim rschl ssel zu verweisen Hier ein Beispiel f r die Bad Ausstattung der Hotels bd_nr bd_beschreibung 1 ohne 2 wc 3 Dusche 4 Bad Die folgende Ansicht zeigt nur zwei Zeilen und nicht alle Spalten der Hotel Tabelle um zu demonstrieren wie die Bad Informationen durch einen Bezug auf die zus tz liche Tabelle gespeichert w rden ht_nr ht_name ht_stadt ht_bad 2 Hotel Colonia 1 4 23 The New Maitland Hotel 20 3 Eine Auswahlabfrage m sste eine komplexe Verkn pfung herstellen um die Bad Daten als Text auszulesen Die obige Auswahl lie e sich wie folgt mit ausgeschrie benem Badezimmertyp darstellen falls die Bad Tabelle rb_bad und die Hotel Tabelle rb_hotels hei t SELECT ht_nr ht_name ht_stadt bd beschreibung AS bad FROM rb hotels rb_ bad WHERE ht_bad bd_ nr AND ht_nr 2 OR ht_nr 23 Genauere Erl uterungen zur Erstellung von Auswahlabfragen dem wichtigsten Bestandteil von SQL erhalten Sie im n chsten Kapitel Das Ergebnis s he jedenfalls so aus
344. le von reisebuero sql sie l scht diese Datenbank falls sie bereits vorhanden sein sollte mysql gt DROP DATABASE IF EXISTS reisebuero p SQL Dateien als Futter f r source k nnen Sie mithilfe des Kommandozeilentools mysqldump erstellen Auf diese Weise lassen sich existierende Datenbanken leicht exportieren Dies wird in Kapitel 9 ausf hrlicher erl utert status oder s liefert Statusinformationen ber MySQL Server und Client Ein Bei spiel mysql gt s mysql Ver 14 13 Distrib 5 1 18 beta for Win32 ia32 Connection id 2 Current database gewinnspiel Current user root localhost SSL Not in use Using delimiter 5 108 Kapitel 4 Mit MySQL arbeiten Server version 5 1 18 beta community nt MySQL Community Server GPL Protocol version 10 Connection localhost via TCP IP Server characterset latin1 Db characterset latini Client characterset latin1 Conn characterset latin1 TCP port 3306 Uptime 7 hours 11 min 24 sec Threads 1 Questions 28 Slow queries O Opens 19 Flush tables 1 Open tables 0 Queries per second avg Unter Unix unterst tzt der mysql Client die Eingabevervollst ndigung genau so wie die Shell Wenn Sie nach einigen Zeichen eines Datenbank Tabellen oder Spalten namens Tab dr cken wird dieser Name erg nzt soweit dies eindeutig m glich ist Angenommen Sie arbeiten mit der Datenbank gewinnspiel aus dem vorigen Kapitel Geben Sie zum Beispiel mysql gt SELECT F
345. legen Sie diesen Benutzer wie folgt an mysql gt GRANT ALL PRIVILEGES ON reisebuero TO rbuser localhost gt IDENTIFIED BY R3153n mysql gt FLUSH PRIVILEGES Denken Sie wieder daran dass Sie ein anderes Passwort verwenden sollten als das hier im Beispiel gezeigte Nun kann dieser neue Benutzer in einer PHP Testanwendung eine Verbindung zum Datenbankserver herstellen In der mysql Version sieht das so aus connID mysql_connect localhost rbuser R3153n Die Verbindungsnummer connID brauchen Sie nur zu benutzen wenn mehrere parallele Datenbankverbindungen bestehen f r diesen Fall gibt es alternative Fas sungen der mysql Funktionen die als zus tzlichen letzten Parameter eine solche ID entgegennehmen Bei mysql muss als N chstes reisebuero als Standarddatenbank ausgew hlt werden mysql_select_db reisebuero Die modernere Schnittstelle erledigt beide Schritte gleichzeitig im new Aufruf der mysgli Instanz conn new mysqli localhost rbuser R3153n reisebuero 230 Kapitel8 Webanwendungen mit PHP und MySQL Dennoch verf gt auch mysqli ber eine Methode zur Auswahl der Standarddaten bank damit Sie diese nachtr glich wechseln k nnen Das folgende Beispiel w hlt die Datenbank gewinnspiel aus Kapitel 3 als Standard aus conn gt select_db gewinnspiel An die bestehende Verbindung k nnen nun beliebige SQL Abfragen bermittelt werden Als Beispiel soll die folgende Abfrage diene
346. len In Abbildung 4 4 wird dies f r die Datenbank gewinnspiel aus dem vorigen Kapitel dargestellt In der Spalte Aktion finden Sie Schaltfl chen f r den schnellen Zugriff auf sechs wichtige Tabellenoperationen Anzeigen stellt die Inhalte der Tabelle dar Struktur erm glicht nderungen an der Tabellenstruktur selbst Namen Datentypen Reihenfolge der Spalten usw mittels Suche k nnen Sie die Tabelle nach diversen Kriterien durchsuchen Einf gen dient dem Hinzuf gen neuer Datens tze Leeren l scht s mtliche Inhalte der Tabelle und L schen sogar die Tabelle selbst F r die beiden letzteren Operationen wird allerdings zuvor eine JavaScript basierte Sicherheitsabfrage durchgef hrt Unter der Tabellen bersicht finden Sie ein Formular zum Erstellen einer neuen Tabelle innerhalb der aktuellen Datenbank Dazu m ssen Sie einen Namen und die gew nschte Anzahl der Felder pro Datensatz eingeben Sobald Sie auf OK klicken gelangen Sie auf eine neue Seite die weiter unten beschrieben wird 114 Kapitel 4 Mit MySQL arbeiten localhost localhost gewinnspiel phpMyAdmin 2 10 0 rc1 Mozilla Firefox Datei Bearbeiten Ansicht Chronik Lesezeichen Yahoo Extras Hilfe e E L Hto tHocaost phemyadminindex ohp Ele El amp Erste Schritte EN Aktuelle Nachrichten PhpMyAdmin Server localhost Datenbank gewinnspiel 7 Q amp Struktur SAL Suche Abfrageeditor amp Exportieren lmportieren Operationen Rechte
347. lich weg Das ist besonders beim Einsatz von enable modules most sehr n tzlich Das folgende Beispiel bereitet Apache f r die Kompilierung und Installation im Ver zeichnis usr local apache2 und zur Installation der meisten Module als DSOs vor configure enable layout Apache enable so enable mods shared most Nachdem configure seine Arbeit beendet hat die viele Minuten dauern kann wer den die beiden Befehle zur Kompilierung und Installation aufgerufen zumindest f r Letzteren ben tigen Sie root Rechte make make install Nach der Installation k nnen Sie Apache starten Daf r ist das Skript apachect im bin Verzeichnis Ihrer Installation Standard usr local apache2 bin zust ndig Zun chst sollten Sie einen Symlink erzeugen der dieses Skript in einem Verzeichnis Apache 2 installieren und konfigurieren 25 innerhalb Ihres PATH verf gbar macht damit Sie sich die Pfadangabe in Zukunft sparen k nnen Eine gute Wahl ist beispielsweise In s usr local apache2 bin apachectl usr bin apachectl Danach k nnen Sie dieses Skript aus jedem beliebigen Verzeichnis heraus wie folgt benutzen um Apache zu starten apachectl start Dieses Skript dient auch dazu Apache nach einer Konfigurations nderung neu zu starten Geben Sie dazu Folgendes ein apachectl restart Bei Servern im Praxiseinsatz sollten Sie laufende Clientverbindungen nicht durch einen Neustart abbrechen sondern zun chst abwarten bis si
348. linerland de 2 9 Heinrich meier aol lokal de 2 10 Klaus schmitz kajs com 2 Daten einf gen 161 In diesem Kapitel KAPITEL 6 ie Funktionen SQL A bfra g e n Weitere Abfragetypen Denn dies wird ja als der erste Schl ssel zur Weisheit bestimmt das best ndige und h ufige Fragen Pierre Abelard In den bisherigen Kapiteln haben Sie bereits einzelne SQL Abfragen kennengelernt Nun wird es Zeit dieses Thema zu vertiefen und systematisch zu behandeln Im vorliegenden Kapitel werden vor allem die grundlegenden SQL Techniken f r den Datenbankalltag vorgestellt sie gen gen um im bern chsten Kapitel die unter schiedlichsten Webanwendungen zu erstellen Das n chste Kapitel stellt dagegen etwas knapper einige weiterf hrende SQL Features vor die in Webanwendungen in der Regel nicht ben tigt werden Auswahlabfragen Die wichtigste Form der SQL Abfrage ist die Auswahlabfrage Sie verwendet die SQL Anweisung SELECT um Informationen aus Datenbanktabellen oder auch vom Datenbankserver selbst zu erhalten und auszugeben Die einfachste Form einer SELECT Abfrage w hlt alle Datens tze einer Tabelle aus SELECT FROM Tabellenname Das folgende Beispiel zeigt alle Datens tze der Tabelle rb_kunden an mysql gt SELECT FROM rb_kunden kd_nr kd_name kd_vorname kd_gda
349. lle selbst umbenennen Das folgende Beispiel gibt rb_ hotels2 den neuen Namen rb_hotels_neu ALTER TABLE rb_hotels2 RENAME rb hotels _neu L schabfragen Oft m ssen Datens tze aus Tabellen entfernt werden Dazu werden DELETE Abfra gen mit folgender Grundsyntax verwendet DELETE FROM Tabelle WHERE Kriterium Auch hier ist die Angabe eines Kriteriums mithilfe der blichen WHERE Syntax wich tig da sonst alle Datens tze aus der Tabelle gel scht werden Das folgende Beispiel l scht alle Hotels aus rb_hotels_neu in denen ein Einzelzimmer ber 100 kostet mysql gt DELETE FROM rb_hotels_neu gt WHERE ht_ezpreis gt 100 Query OK 1 row affected 0 10 sec Das Ergebnis zeigt dass nur eine Zeile gel scht wurde Wenn Sie explizit alle Datens tze l schen m chten k nnen Sie entweder DELETE FROM Tabelle schreiben oder Sie verwenden die schnellere Variante TRUNCATE Tabelle Sie k nnen brigens auch die kopierte Tabelle selbst l schen nicht mehr ben tigte Tabellen sollten stets entfernt werden da sie Speicher vergeuden und Datenbanken un bersichtlich machen F hren Sie dazu folgende Abfrage durch mysql gt DROP TABLE rb_hotels_neu Query OK O rows affected 0 04 sec Zu guter Letzt kann sogar eine ganze Datenbank gel scht werden Dazu dient eine DROP DATABASE Abfrage Beispiel mysql gt DROP DATABASE alte_datenbank 198 Kapitel 6 SQL Abfragen In diesem Kapitel KAPITEL 7 Transaktione
350. llst ndige Operationen inkonsistent werden Die Ziele der Transaktionsverarbeitung werden blicherweise mit dem Akronym ACID bezeichnet Die vier Buchstaben stehen f r folgende Aspekte Atomicity Atomarit t Jede Transaktion ist atomar alle beteiligten SQL Anweisungen werden zu einer einzigen zusammengefasst die ausgef hrt wird oder auch nicht Consistency Konsistenz Nach dem Abschluss einer Transaktion sei es durch Commit oder Rollback muss die Datenbank in einem konsistenten Zustand verbleiben Constraints d rfen nicht verletzt werden Isolation Wenn gleichzeitig mehrere Transaktionen auf derselben Tabelle durchgef hrt werden laufen sie vollkommen gesch tzt voreinander sowie vor nicht transak tionsorientierten Abfragen ab Durability Dauerhaftigkeit Das Ergebnis einer abgeschlossenen Transaktion bleibt dauerhaft in der Daten bank gespeichert Einf hrung In MySQL werden Transaktionen nur in InnoDB Tabellen unterst tzt Hinter den Kulissen werden Abfragen bei diesem Tabellentyp sogar stets als Transaktionen ausgef hrt Allerdings befinden sie sich standardm ig im sogenannten Autocom mit Modus in dem jede einzelne Abfrage eine eigene Transaktion ist die durch automatisches Commit abgeschlossen wird Die SQL Anweisungen zur gesteuerten Durchf hrung von Transaktionen sind sehr einfach Vor der ersten Abfrage die zu einer Transaktion geh ren soll wird fol gende Anweisung ben tigt START TRAN
351. ln Dies geschieht durch die einfache Eingabe des Laufwerkbuchstabens mit nachfolgendem Doppelpunkt Das folgende Beispiel vollzieht einen Wechsel auf die Festplatte C gt C Mit cd k nnen Sie unter Windows innerhalb eines Laufwerks einen absoluten das hei t vollst ndigen Pfad angeben um in das entsprechende Verzeichnis zu wech seln Wenn Verzeichnis oder Dateinamen Leerzeichen enthalten m ssen Sie diese oder wahlweise den gesamten Pfad in Anf hrungszeichen setzen Das folgende Beispiel wechselt aus einem beliebigen Verzeichnis auf der Festplatte C in das Verzeichnis Eigene Dateien des Benutzers Sascha gt cd Dokumente und Einstellungen Sascha Eigene Dateien Bei Unix Systemen funktioniert der Verzeichniswechsel per absolutem Pfad im Prinzip genauso zum Beispiel cd home sascha Wenn Sie vom aktuellen Verzeichnis aus in ein untergeordnetes Verzeichnis wech seln m chten m ssen Sie den Namen dieses Unterverzeichnisses ohne f hrenden Backslash beziehungsweise Slash angeben Hier ein Windows Beispiel C Dokumente und Einstellungen Sascha Eigene Dateien gt cd mydata C Dokumente und Einstellungen Sascha Eigene Dateien mydata gt Auf diese Weise lassen sich auch mehrere Hierarchiestufen berwinden Dazu sehen Sie hier ein Unix Beispiel sascha linuxbox gt cd mydata briefe sascha linuxbox mydata briefe gt Um in das bergeordnete Verzeichnis zu wechseln wird auf beiden Plattformen der spezielle Ver
352. lne Spalten einer Tabelle auslesen m chten m ssen Sie statt eines die durch Kommata getrennten Feldnamen angeben SELECT Feld Feld2 FROM Tabellenname Hier ein Beispiel das nur die Namen und K rzel der Fluggesellschaften anzeigt mysql gt SELECT ai_name ai_kuerzel FROM rb_airlines a ai_name ai_kuerzel a Air France AF Austrian Airlines os British Airways BA Germanwings 4U Lufthansa LH KLM KM Iberia IB Alitalia AZ 164 Kapitel6 SQL Abfragen HLX 1 Olympic Airways 0A Turkish Airlines THY TK ausser lu oe Beesstrenn Wenn Ihnen die Spaltenbeschriftungen durch die Spaltennamen nicht gefallen k nnen Sie die Klausel AS verwenden um Ihre Ergebnisse beliebig umzubenennen Dabei muss der Aliasname in Anf hrungszeichen stehen falls er Leerzeichen ent h lt Das folgende Beispiel zeigt die Namen Einzel und Doppelzimmerpreise der ersten f nf Hotels mit lesefreundlicheren Spaltentiteln an mysql gt SELECT ht_name AS Hotel ht_ezpreis AS Einzelzimmerpreis gt ht_dzpreis AS Doppelzimmerpreis FROM rb_hotels LIMIT 0 5 Hotel Einzelzimmerpreis Doppelzimmerpreis Bergerhof 70 120 Hotel Colonia 105 195 Hotel de la Gare 85 150 Hotel au Jardin 110 200 Otel Bahar 50 80
353. lprogramm f r Kinder oder ein Sonderrabatt Auch diese beziehen sich auf eine separate Tabelle und jede Buchung kann mehrere Extras ent halten Das kann zu einer doppelten Nennung einzelner Flugbuchungen f hren buch_nr person flug extra 1 Schmitz K ln Paris Kinderpr 1 Schmitz K ln Paris Rabatt 2 ller K ln Paris Mietwagen 2 ller K ln Paris Rabatt 3 Schmitz K ln London Kinderpr 4 Huber Frankfurt Madrid Rabatt 4 Huber Frankfurt Madrid Kulturpr Der Datenbankentwurf 135 Auch in diesem Fall schafft eine Aufteilung auf mehrere Tabellen Abhilfe hier wie der mit der expliziten Nennung der Informationen statt der Verwendung numeri scher Schl ssel eigentlich beziehen sich die Felder flug beziehungsweise extra auf separate Tabellen buch_nr person flug 1 Schmitz K ln Paris 2 M ller K ln Paris 3 Schmitz K ln London 4 Huber Frankfurt Madrid buch nr extra 1 Kinderprogramm 1 Rabatt 2 Mietwagen 2 Rabatt 3 Kinderprogramm 4 Rabatt 4 Kulturprogramm
354. lung 143 Zend Engine II 44 ZEROFILL MySQL Typoption 148 Zufallsgenerator MySQL 186 PHP 89 Zweite Normalform 133 Index 349 ber den Autor Sascha Kersken kam 1983 zum ersten Mal mit einem Computer in Ber hrung und hatte sp ter das Gl ck dieses langj hrige Hobby zu seinem Beruf machen zu k n nen Er arbeitet als PHP Entwickler bei der papaya Software GmbH in K ln an dem gleichnamigen Open Source CMS Au erdem ist er Fachbuchautor Dozent und IT Berater mit den Schwerpunkten Unix Serveranwendungen und Webentwick lung Er ist Autor vieler B cher darunter Praxiswissen Ruby Praxiswissen Flash 8 O Reilly Verlag Handbuch f r Fachinformatiker und Apache 2 Galileo Press F r den O Reilly Verlag hat er unter anderem die Titel Praxiswissen Dreamweaver 8 Ajax von Kopf bis Fu DNS amp BIND Kochbuch und Active Directory bersetzt bzw mit bersetzt sowie das Buch Apache kurz amp gut aktualisiert und erweitert Seine Freizeit verbringt er am liebsten mit seiner Frau und seinem Sohn oder mit guten B chern Kolophon Das Design der Reihe O Reillys Basics wurde von Hanna Dyer und Michael Oreal entworfen das Coverlayout dieses Buchs hat Michael Oreal gestaltet Als Text schrift verwenden wir die Linotype Birka die berschriftenschrift ist die Adobe Myriad Condensed und die Nichtproportionalschrift f r Codes ist LucasFont s TheSansMono Condensed
355. m eine sogenannte Auswahlabfrage Sie liefert Datens tze aus der Datenbank die bestimmten Kriterien entsprechen Auch die Benutzerein gabe wird wieder in die Datenbank geschrieben was ebenfalls durch eine SQL Abfrage bewerkstelligt wird Dies erledigt entweder eine nderungsabfrage oder eine Einf geabfrage je nach konkreter Organisation der Datenbank muss f r die Flugbuchung ein Datensatz modifiziert oder hinzugef gt werden Eine datenbankgest tzte Webanwendung ist etwas komplizierter Das Problem besteht darin dass die Benutzer von internetbasierten Anwendungen in der Regel kein spezialisiertes Anwendungsprogramm besitzen um auf die Dienste eines bestimmten Anbieters zuzugreifen sondern lediglich einen allgemeinen Webbrow ser Dieser ist weder in der Lage mit dem Datenbankserver zu kommunizieren noch kann er selbst spezialisierte Bearbeitungsschritte bereitstellen Er kann lediglich durch HTML formatierte Textinformationen anzeigen Diese HTML Dokumente k nnen Formulare mit Eingabefeldern und anderen Auswahlelementen enthalten die Benutzereingaben werden auf Knopfdruck an den Server zur ckgesendet 8 Kapitel 1 Einf hrung Aus diesen Gr nden ist jede datenbankbasierte Webanwendung eine Three Tier L sung Beteiligt sind der Datenbankserver der Webserver und der Browser des Benutzers Die eigentliche Anwendung wird hier auf dem Webserver ausgef hrt Sie liest wieder mithilfe einer SQL Auswahlabfrage di
356. me VARCHAR 40 kd_gdatum DATE kd_bemerk VARCHAR 100 INDEX name key kd_name INDEX full_name key kd_vorname kd_name 5 Die zweite Variante das nachtr gliche Hinzuf gen eines Index geschieht entwe der mithilfe einer Tabellenmanipulationsabfrage ALTER TABLE oder einer speziellen CREATE INDEX Abfrage ALTER TABLE Tabellenname ADD FULLTEXT UNIOUE INDEX Indexname Feldnamei beziehungsweise CREATE INDEX Indexname ON Tabellenname Feldname1 Hier als Beispiel die CREATE INDEX Variante f r die Definition des zuletzt gezeigten full_name_key CREATE INDEX full name key ON rb kunden kd_vorname kd nachname Schl ssel und Indizes 155 Mithilfe von ALTER TABLE lie e sich dieselbe Abfrage wie folgt formulieren ALTER TABLE rb_kunden ADD INDEX full name key kd vorname kd_nachname Intern wird brigens auch beim Aufruf von CREATE INDEX die zweite Variante aufge rufen Und schlie lich erm glicht ALTER TABLE es einen Index wieder zu entfernen ALTER TABLE Tabellenname DROP INDEX Indexname Eine Abfrage zum L schen des Index full_name_key s he zum Beispiel so aus ALTER TABLE rb kunden DROP INDEX full_name_key Falls kein separater Indexname definiert wurde ist er mit dem Namen der ersten indizierten Spalte in unserem Beispiel kd_vorname identisch Im Zusammenhang mit Indizes insbesondere mit Prim rschl sseln wird h ufig die Option AUTO_INCREMENT eingesetzt Die Werte im entspr
357. mehreren Registerkarten Hier eine kurze bersicht ber die Kategorien e Server Information liefert die wichtigsten Statusinformationen auf einen Blick Hier erfahren Sie ob der Server grunds tzlich arbeitet und erhalten einen berblick ber seine Netzwerk und Clientanbindung e Service Control nur Windows erm glicht die Steuerung des MySQL System diensts Hier k nnen Sie also festlegen ob und mit welchen Optionen der MySQL Server beim Booten automatisch gestartet werden soll Zudem k nnen Sie ihn hier direkt starten und stoppen 325 MySQL Administrator root localhost 3306 Jofx Eile Edit View Tools Help JP Server Infomation 7 Networking Security Advanced Ga Service Control General Parameters MyISAM Parameters InnoDB Parameters Perfomance Logfies Replication Startup Variables General Parameters User Administration Configure the startup variables Note that changes will have no effect until you restart the server EE Server Connections J Heath JB Server Logs J Replication Status r Networking I Disable networking Don t allow connections via TCP IP Q TCP Port 3306 Port number to use for connections f 5 Backup Diectoies Q Base directory E MyS0L Server 4 17 Path to installation directory All paths are usually resolved relative to this Q Data directory E MySQL Server 4 1 Data Path to the database root 8 Temp directory Path to the t
358. n MySQL Cookbook 2 Auflage von Paul DuBois Sebastopol 2006 O Reilly Media In diesem Buch finden Sie unz hlige praktische Anleitungen zur Arbeit mit MySQL Datenbanken im bew hrten O Reilly Kochbuch Stil Jedes Rezept setzt sich aus einer praxisorientierten Problemstellung einem L sungsansatz und erg nzenden Erl uterungen zusammen phpMyAdmin von Marc Delisl M nchen 2005 Addison Wesley Das offizielle phpMyAdmin Handbuch in deutscher bersetzung Webdatenbank Applikationen mit PHP und MySQL 2 Auflage von Hugh E Willi ams David Lane K ln 2004 O Reilly Verlag Dieses Buch behandelt denselben Themenkreis wie das vorliegende Buch ist allerdings eher ein Handbuch als eine Einf hrung Daher eignet es sich gut als Erg nzung f r Fortgeschrittene Apache 2 2 Auflage von Sascha Kersken Bonn 2005 Galileo Computing Umfas sendes Handbuch zum Apache Webserver in den Versionen 2 0 und 2 2 Alle Installationsoptionen Konfigurationsanweisungen Module und Programmier schnittstellen werden umfassend beschrieben 329 PHP 5 Ein praktischer Einstieg von Ulrich G nther K ln 2004 O Reilly Verlag Dieses Buch bietet eine gr ndliche Einf hrung in die Webprogrammierung mit PHP Es erscheint in derselben Reihe wie der vorliegende Band Programmieren mit PHP 2 Auflage von Rasmus Lerdorf Kevin Tatroe Peter Maclntyre K ln 2006 O Reilly Verlag Der PHP Erfinder Lerdorf und seine Koautoren stellen hier au
359. n kn Fortgeschrittene e Prepared Statements Stored Procedures Datenbankfunktionen Trigger Den Fortschritt verdanken wir Menschen die Dinge versucht haben von denen sie gelernt haben dass sie nicht gehen Robert Lembke F r das Schreiben MySQL basierter PHP Webanwendungen gen gen normaler weise die im vorigen Kapitel besprochenen SQL Aspekte In diesem Kapitel werden einige Features vorgestellt die in anderen Datenbanksystemen schon l nger existie ren in MySQL aber erst in neueren Versionen eingef hrt wurden Da sie f r durch schnittliche Webanwendungen keine gro e Rolle spielen werden sie nur relativ kurz besprochen Transaktionen In gr eren verteilten Anwendungen m ssen oft sehr komplexe Vorg nge in Daten banken abgebildet werden F r jeden solchen Vorgang wird in der Regel eine l n gere Abfolge von SQL Abfragen eingesetzt Ein Problem ergibt sich wenn der Vorgang sp ter im Ganzen r ckg ngig gemacht werden muss denn dann gilt es zahlreiche voneinander abh ngige Abfragen zu entwirren Aus diesem Grund wurde in SQL das Konzept der Transaktion eingef hrt Beliebig viele Abfragen lassen sich zu einer Einheit b ndeln Diese kann zum Schluss insge samt durch ein Commit best tigt oder durch ein Rollback zur ckgesetzt werden Ereignisse wie der Verlust einer Datenbankverbindung oder ein Absturz des Servers f hren au erdem zu einem automatischen Rollback so dass die Daten nicht durch unvo
360. n auch auf dem entfernten Host die entsprechende Verzeichnisstruktur zu erstellen Nun geht es darum Zugriffe auf das Verzeichnis admin nur nach Eingabe der kor rekten Kombination aus Benutzername und Passwort zuzulassen Apache stellt eine Reihe von Modulen bereit die Authentifizierung Benutzeranmeldung in unter schiedlichen Formen und Sicherheitsstufen erm glichen Hier wird die einfachste Variante gezeigt Die Benutzerdaten werden in einfachen Textdateien auf dem Ser verrechner gespeichert Browser werden aufgefordert die Eingaben der Benutzer im Klartext zu senden Basic Authentifizierung Als N chstes muss eine Textdatei mit den Anmeldedaten erstellt werden Solche Dateien geh ren aus Sicherheitsgr nden nicht in das Website Verzeichnis weil ein Angreifer sie dort ber den Webserver auslesen k nnte Falls sich die Site innerhalb von gemietetem Webspace bei einem Hosting Provider befindet sind Sie m gli cherweise gezwungen diesen Rat zu missachten Dieses Szenario wird weiter unten mitsamt geeigneten Sicherheitsma nahmen behandelt F r die Erzeugung von Authentifizierungstextdateien ist das mit Apache gelieferte Kommandozeilentool htpasswd zust ndig Es befindet sich im bin Verzeichnis Ihrer Apache Installation unter Linux standardm ig usr local apache2 bin auf Win Ver ffentlichung und Test 95 dows Systemen C Programme Apache Software Foundation Apache2 2 bin Die Datei soll f r dieses Beispiel htadmi
361. n die alle Hotels mitsamt Ein zel und Doppelzimmerpreisen und den Namen der St dte ausgibt sortiert nach St dten und sekund r nach Hotelnamen SELECT ht_name ht_ezpreis ht_dzpreis st_name FROM rb hotels INNER JOIN rb staedte ON ht _stadt st_nr ORDER BY st_name ASC ht_name ASC In mysql Syntax wird die Abfrage wie folgt an den Server bermittelt Abfrageinhalt querytext SELECT ht_name ht_ezpreis ht_dzpreis st_name FROM rb hotels INNER JOIN rb staedte ON ht_stadt st_nr ORDER BY st_name ASC ht_name ASC Abfrage an Server senden query mysql_query querytext mysqli verlangt dagegen diese Schreibweise Abfrage an Server senden query conn gt query querytext Nach dem Absenden einer Auswahlabfrage sollten Sie in der Regel zun chst ber pr fen ob es berhaupt Ergebnisdatens tze gibt Daf r ist bei der klassischen Schnittstelle die Funktion mysql_num _rows zust ndig if mysql_num_rows query gt 0 Ergebnisdatens tze verarbeiten else Z B Ausgabe dass keine Daten vorhanden sind Bei mysqli ist die Eigenschaft num _rows des jeweiligen Query Objekts daf r zust n dig Da es sich um eine Eigenschaft und nicht um eine Methode handelt d rfen auch keine Parameterklammern dahinter gesetzt werden if query gt num rows gt 0 nie Sobald bekannt ist dass ein Abfrageergebnis vorhanden ist k nnen dessen Daten s tze nacheinander ausgelesen werden Frfreulicherwei
362. n mysqli 2 Server localhost via TCPAP ee Deutsch German Benutzer root localhost ams u Bitte Datenbank ausw hlen F MySaL Zeichensatz UTF 8 Unicode utfB amp Oberfl chendesign Original x 2 Zeichensatz Kollation der MySQL Verbindung Schriftgr e 100 M utf8_unicode_ci go phpMyAdmin Dokumentation Neue Datenbank anlegen _ phpMyAdmin Wiki Koltation M L Anlegen f Offizielle phpMyAdmin Homepage MySQL Laufzeit Informationen anzeigen ChangeLog Subversion Lists MySQL System Variablen anzeigen Prozesse H Zeichens tze und Kollationen Tabellenformate IP Die Rechte neu laden amp Rechte amp Datenbanken Exportieren Importieren E Neu einloggen phpM Zi Neues phpMyAdmin Fenster Abbildung 4 3 Die Startseite von phpMyAdmin Der Bildschirm ist in zwei Frames unterteilt Im schmalen linken Frame k nnen Sie eine Datenbank aus dem Pull down Men ausw hlen Rechts finden Sie auf der Startseite die beiden Rubriken MySQL mit grundlegenden Operationen und Informationen zum Datenbankserver sowie phpMyAdmin mit einigen Grundein stellungen f r den phpMyAdmin Client selbst Tabelle 4 3 zeigt zun chst eine bersicht ber die einzelnen Punkte der Spalte MySQL Falls verf gbar wird zus tzlich der entsprechende Befehl aufgelistet den Sie f r dasselbe Ergebnis im mysql Kommandozeilenclient eingeben m ssten Einige dieser O
363. n um direkt auf bestimmte Elemente zuzugreifen e document getElementById Bezeichner w hlt ein Element aus dem Sie mit hilfe des HTML Attributs id eine eindeutige Bezeichnung zugewiesen haben Wenn Sie beispielsweise ein Element als lt div id hauptmenue gt lt div gt kennzeichnen erfolgt der Zugriff auf diesen Bereich mittels document getElementById hauptmenue e document getElementsByTagName TagName liefert ein Array aller Elemente die denselben Tag Namen besitzen Das folgende Konstrukt greift also auf den ers ten Absatz lt p gt lt p gt des Dokuments zu document getElementsByTagName p 0 Die so ermittelten Elemente speichern Sie am einfachsten in Variablen Anschlie Bend k nnen Sie nach Bedarf wieder auf ihre Kindknoten zugreifen Die folgende Beispieldatei enth lt vier Abs tze Wenn Sie in das Textfeld eine Absatznummer eingeben und auf Anzeigen klicken wird der Text des entsprechen den Absatzes oder eine Fehlermeldung bei einem nicht existierenden Absatz in einem separaten Bereich angezeigt lt html gt lt head gt lt title gt DOM Beispiel Absatz Auswahl lt title gt lt style type text css gt anzeige color FF0000 font style italic lt style gt lt script language JavaScript type text javascript gt function absatzWahl Nummer auslesen und Wertebereich anpassen nr parseInt document f zahl value if nr lt 0 nr 0 Array aller Absat
364. n username_ r Globale Rechte Alle ausw hlen Auswahl entfernen Anmerkung MySQL Rechte werden auf Englisch angegeben Daten Struktur Administration O SELECT CI CREATE CO srant C INSERT C ALTER CO super C UPDATE CO mpex O process DELETE CO DROP O RELOAD O FILE C CREATE TEMPORARY TABLES CO SHUTDOWN CREATE VIEW SHOW DATABASES DO SHOW v ew C LOCK TABLES C CREATE ROUTINE C REFERENCES Abbildung 9 2 In phpMyAdmin einen neuen Benutzer erstellen MySQL Serverprogramme und skripten Wie im Lauf dieses Buchs bereits mehrfach erw hnt wurde besteht der MySQL Server nicht aus einem einzigen gro en Programm sondern aus zahlreichen einzel nen Programmen Tools und Skripten Einige von ihnen werden in diesem Abschnitt mit ihren wichtigsten Kommandozeilenoptionen vorgestellt Hier zun chst eine bersicht ber die einzelnen Serverprogramme und skripten mysqld Standardversion des MySQL Server Daemons mysqld max Erweiterte Version des MySQL Servers zum Beispiel mit BerkeleyDB und NDB Cluster Unterst tzung mysqld_safe Standard Startskript f r den MySQL Server auf Unix Systemen Startet mysqld max falls vorhanden ansonsten mysqld MySQL Serverprogramme und skripten 289 mysgl server Ein weiteres Startskript das seinerseits mysqld_safe aufruft Dieses Skript kann als MySQL Steuerskript f r die verschiedenen Runlevel im System V Init Ver fahr
365. n Felder also zum Beispiel folgenderma en auslesen und ihren Inhalt ausgeben lt php ziel GET ziel mail _GET mail echo Zur Kontrolle Sie m amp ouml chten nach ziel fahren lt br gt echo Das Gesamtergebnis der Umfrage werden wir an Ihre E Mail Adresse mail senden 2 gt Die oben gezeigte Eingabe hat die folgende Ausgabe zur Folge Zur Kontrolle Sie m chten nach Paris fahren Das Gesamtergebnis der Umfrage werden wir an Ihre E Mail Adresse klaus example com senden Normalerweise muss f r jedes Formularfeld berpr ft werden ob der Benutzer berhaupt etwas eingegeben oder ausgew hlt hat Das ist relativ l stig vor allem weil sich leere Elemente von _GET und _POST je nach PHP Version unterschied lich verhalten Aus diesem Grund bietet sich die Definition der folgenden Funktion an die das Problem grunds tzlich l st function cgi param feld default Variable zun chst auf Default Wert setzen var default if isset _GET feld 88 GET feld GET Feld gefunden var GET feld elseif isset _POST feld amp amp _PoST feld POST Feld gefunden var POST feld Ermittelten Wert zur ckgeben return var Der Name cgi_param wurde gew hlt weil die Funktion von der Perl CGI Funk tion param inspiriert wurde Aufgerufen wird sie mit dem Namen des Felds des sen Inhalt Sie auslesen m chten und mit ei
366. n Informationen ber das MySQL Projekt selbst Datenbanken Eine Datenbank englisch database ist eine computergest tzte Sammlung gleichar tiger Informationen die sich auf optimierte Art und Weise durchsuchen sortieren und manipulieren l sst Der Begriff bezeichnet genau genommen nur die gespei cherten Daten selbst Mittlerweile hat es sich aber eingeb rgert dass auch die Soft ware zur Verwaltung dieser Daten das Datenbankverwaltungssystem DataBase Management System kurz DBMS einfach als Datenbank bezeichnet wird Motivation der Datenbankentwicklung Eine der gr ten Herausforderungen moderner Computeranwendungen ist die rati onelle Speicherung und Verwaltung der ben tigten Daten Selbstverst ndlich k nn ten alle Informationen in einzelnen Dateien beliebiger Formate abgelegt werden jede Programmiersprache enth lt Funktionen zum ffnen Lesen Schreiben und sogar Durchsuchen von Dateien auf einem Datentr ger Allerdings bringt der Ein satz normaler Dateien eine Reihe gravierender Nachteile mit sich e Die in einfachen Dateien gespeicherten Informationen stehen zun chst in kei nerlei Bezug zueinander Schwierigkeiten bei der Suche und Inkonsistenzen durch die mehrfache Speicherung bestimmter Daten sind die Folge e Das st ndige ffnen ndern und Schlie en vieler Dateien ben tigt ziemlich viel Rechenzeit und belastet den Arbeitsspeicher Zwar k nnte man die ben tigten Daten auch beim Programmstart in den Ar
367. n PHP Operatoren e Die arithmetischen Operatoren sind mit denjenigen von MySQL identisch die im vorigen Kapitel vorgestellt wurden Ausnahme Der Modulo Operator Rest der ganzzahligen Division wird ausschlie lich als Prozentzeichen geschrieben e Der Zuweisungsoperator wurde bereits erw hnt Er dient dazu einer Variab len oder Eigenschaft einen beliebigen Ausdruck als Wert zuzuweisen zum Bei spiel text So long and thanks for all the fish e Eine weitere Gruppe von Operatoren erleichtert die Modifikation vorhandener Variablen durch eine abk rzende Schreibweise Beispielsweise k nnen Sie statt a a 2 Folgendes schreiben a 2 Dasselbe gilt f r alle arithmetischen und noch einige weitere Operatoren e F r das Erh hen Inkrement oder Vermindern Dekrement um 1 gibt es sogar noch eine kompaktere Form Die folgenden Anweisungen weisen a den Wert 4 zu und erh hen den Wert der Variablen dann um 1 a 4 a Es gibt einen kleinen aber wichtigen Unterschied zwischen einem vorangestell ten dem sogenannten Pr Inkrement und der nachgestellten Version dem Post Inkrement Innerhalb eines komplexeren Ausdrucks wird beim Pr Inkre ment der neue beim Post Inkrement dagegen der alte Wert der betreffenden Variablen verwendet Beispiele PHP Grundlagen 217 a 3 Post Inkrement b a a ist nun 4 b ist 3 Pr Inkrement c a a und c haben nun den Wert 5 Dasse
368. n Sie auf dem Master nun eine beliebige nderungsabfrage durch berpr fen Sie anschlieRend per Auswahlabfrage auf dem Slave ob die nderung korrekt repliziert wurde Hier zum Schluss ein kleines PHP Beispiel f r Load Balancing Es geht davon aus dass es einen Master und zwei Slaves gibt und stellt eine mysqli Verbindung f r nderungsabfragen mit dem Master her w hrend zum Lesen eine Zufallsauswahl zwischen den beiden Slaves stattfindet lt php Host f r Schreibzugriffe schreib_host 192 168 0 2 verf gbare Hosts f r Lesezugriffe lese_hosts array 192 168 0 3 192 168 0 4 einen Lese Host zuf llig ausw hlen lese_host lese_hosts rand 0 1 weitere Verbindungsparameter user rbuser pass R3153n db reisebuero Schreibverbindung herstellen schreib_conn new mysqli schreib_ host user pass db Leseverbindung herstellen lese_conn new mysqli lese_host user pass db Nun k nnen beliebige Datenbankoperationen folgen Wichtig Schreibvorg nge NUR ber schreib_conn Leseoperationen ber lese_conn 7 gt 302 Kapitel 9 MySQL Administration In diesem Anhang AN HANG A MySQL Abfragen MySQL Funktionen in PHP Ku rz refe re n Z Die Seele jeder Ordnung ist ein gro er Papierkorb Kurt Tucholsky Im Folgenden finden Sie eine kurze bersicht ber wichtige MySQL Abfragen und PHP Anweisungen zur Kommunik
369. n hei en und in einem neuen Verzeichnis namens userdata im Apache Verzeichnis liegen Sie soll den Benutzer admin und das Passwort Pr1v4t enthalten Gehen Sie auf einem Linux System beispielsweise folgenderma en vor cd usr local apache2 mkdir userdata bin htpasswd c userdata htadmin admin New password Re type new password Adding password for user admin Auf Windows Rechnern gilt dagegen folgendes Schema gt C gt cd Programme Apache Software Foundation Apache2 2 gt md userdata gt bin htpasswd c userdata htadmin admin New password Re type new password r Adding password for user admin Wie Sie sehen zeigt Linux bei der Passworteingabe gar kein Feedback an unter Windows werden dagegen Sternchen angezeigt Beachten Sie unter Windows zudem die Pfadtrennzeichen f r das Betriebssystem und f r Apache Konfigura tion und Dienstprogramme Die htpasswd Option c sorgt daf r dass die angege bene Datei neu erstellt wird Wenn Sie mehrere Benutzerdaten in ein und derselben Datei unterbringen m chten m ssen Sie die Option beim ersten Mal verwenden und danach weglassen andernfalls wird die Datei immer wieder neu angelegt und enth lt nur den jeweils letzten Benutzer Das Passwort wird verschl sselt in der Datei gespeichert auf Unix Systemen wie die Systempassw rter im crypt Format Das sieht f r den hier angelegten Benutzer admin beispielsweise so aus admin Rm7B3Ft6SmuDo Auf W
370. n k nnen die sich bei jedem Aufruf von execute ersetzen lassen Diese Parameter k nnen entweder als oder als Parametername geschrieben werden Anschlie end wird beim execute Aufruf ein Array mit ihren konkreten Werten bergeben oder aber Sie binden mittels bindParam eine Variable und nicht etwa ihren Wert an einen der Parameter Hier zun chst ein Beispiel mit einer Version der obigen Abfrage in der ein einzelnes Land als Parameter angegeben werden kann query conn gt prepare SELECT st _name la_ name FROM rb staedte INNER JOIN rb_laender ON st_land la_nr WHERE la_nr ORDER BY la_name st_name nur die St dte aus Deutschland ausw hlen query gt execute array 1 Ergebnisse auslesen wie bisher Wenn Sie statt der Fragezeichen benannte Parameter w hlen wird f r execute ein assoziatives Array benutzt in dem die Parameternamen die Schl ssel bilden query conn gt prepare SELECT st name la_ name FROM rb staedte INNER JOIN rb_laender ON st_land la_nr WHERE la_nr land ORDER BY la_name st_name Nur die St dte aus Deutschland ausw hlen query gt execute array land gt 1 Ergebnisse auslesen wie bisher Die Methode bindParam besitzt folgende Syntax query bindParam Parameter Variable Fragezeichenparameter werden dabei ab 1 durchnummeriert w hrend benannte Parameter als Strings geschrieben werden Hier der relevante Teil der weiter oben gezeigten Hotelpre
371. n und erstellen k nnen Sie b Bin rwert angeben also beispielsweise b 1011101 entspricht dem Dezimalwert 93 Der Datentyp BIT ist n tzlich wenn Sie platzsparend mehrere Ja Nein Eigenschaften speichern m chten in der Programmierung werden solche bin ren Eigenschaftsfelder oft als Flags bezeichnet Flie kommatypen Viele numerische Daten sind keine ganzen Zahlen beispielsweise Messwerte Geld betr ge oder Umrechnungsfaktoren In der Mathematik muss man sich keine Gedan ken dar ber machen es gibt abbrechende Dezimalbr che wie 0 25 periodische wie 0 33333333 das Ergebnis der Berechnung 1 3 und schlie lich nicht abbrechende nicht periodische wie die Kreiszahl n oder die Eulersche Zahl e Im Gegensatz dazu k nnen Computer nur abbrechende Dezimalbr che speichern da sie Speicherpl tze mit festgelegter Bitbreite daf r verwenden Alle nicht abbrechenden Dezimalbr che werden deshalb nur mit endlicher Genauigkeit gespeichert das hei t an irgendeiner Stelle gerundet Dazu wird das wissenschaftliche Format also x 10 verwendet so dass die Anzahl der Nachkommastellen variabel ist Daher werden diese Zahlen als Flie kommazahlen englisch Floating Point Numbers weil das Dezimaltrennzeichen in der blichen englischen Schreibweise ein Punkt ist bezeichnet MySQL kennt f r Flie kommazahlen zwei Typen unterschiedlicher Genauigkeit FLOAT und DOUBLE auch REAL genannt FLOAT Werte belegen 32 Bit DOUBLE Werte 64 Auf
372. na men gefolgt von einem Doppelpunkt sowie treiberspezifischen durch Semikola getrennten Name wWert Paaren Als zweites und drittes Argument werden Username und Passwort angegeben F r das aktuelle Beispiel sieht das Ganze so aus conn new PDO mysql host localhost dbname geotest phpuser PHP4ever Die SQL Abfrage zur Ausgabe aller L nderinformationen die an den Datenbank server bergeben werden soll lautet in jedem Fall SELECT FROM laender ORDER BY land ASC Eine Datenbankabfrage wird bei mysql mithilfe der Funktion mysql_query durch gef hrt mysqli und PDO verwenden dagegen die Methode query des jeweiligen Verbindungsobjekts Der entsprechende Code sieht so aus mysql result mysql_query SELECT FROM laender ORDER BY land ASC mysqli PDO result conn gt query SELECT FROM laender ORDER BY land ASC Anschlie end m ssen die Ergebniszeilen aus der Datenbank gelesen werden Dazu dient bei mysql die Funktion mysql_fetch_row die jeweils den n chsten Datensatz des Abfrageergebnisses liest Das Ergebnis ist ein Array eine mehrgliedrige Variable mit nummeriertem Index mit den einzelnen Feldern des Datensatzes In PHP exis tiert die u erst praktische M glichkeit dieses Array ber die Funktion list einer selbst gew hlten Gruppe von Variablen zuzuordnen brigens k nnen Sie den Auf ruf mysql_fetch_row zur Bedingung einer Schleife machen Die u ere Struktur sieht demnach folgende
373. nbank ausw hlen ARESE PE Re ee Er OES Ae anzeigen Benutzer Host Passwort Globale Rechte 9 Grant allhoster Ja ALL PRIVILEGES Nein autorenleser localhost Ja USAGE Nein backupoperator localhost SELECT RELOAD LOCK TABLES Nein dbuser localhost USAGE Nein movieuser localhost USAGE Nein nix localhost USAGE Nein nn localhost USAGE Nein pdo_user localhost USAGE Nein phpeti localhost USAGE Nein phpuser localhost USAGE Nein rbuser localhost USAGE Nein rock_user localhost USAGE Nein rockuser localhost USAGE Nein root localhost ALL PRIVILEGES Ja winuser localhost USAGE Nein t_ Alle ausw hlen Auswahl entfernen o a o o o o o o o o o o o DO o ba Ad hd hd hd bhd hd hd 8 Neuen Benutzer hinzuf gen r Die ausgew hlten Benutzer l schen Den Benutzern alle Rechte entziehen und sie anschlie end aus den Benutzertabellen l schen oO Die gleichnamigen Datenbanken l schen aaa Abbildung 9 1 Startseite der Benutzerverwaltung in phpMyAdmin Wenn Sie Neuen Benutzer hinzuf gen w hlen wird der in Abbildung 9 2 darge stellte Dialog angezeigt Oben werden die grundlegenden Informationen ber den neuen Benutzer eingegeben Benutzername Host und Kennwort Darunter k nnen Sie detailliert die gew nschten Rechte des Benutzers ausw hlen ihre Bedeutung wurde weiter oben bereits erl utert Die Seite zum ndern der Rechte eines Benutzers sieht derjenigen zur Neuanlage sehr hnlich au
374. nbanksystemen noch heute weitgehend zugrunde liegt Ein wesentlicher Bestandteil von Codds Entwurf war eine auf englischer Umgangssprache basierende Abfragesprache namens SEQUEL Structured English Query Language die sp ter aus rechtlichen Gr nden in SQL Structured Query Language umbenannt wurde IBM selbst implementierte zun chst ein SQL kompatibles relationales Datenbank system namens System R Nach und nach entstanden zahlreiche weitere DBMS die ebenfalls dem relationalen Modell gen gten Relational Database Management Sys tems oder RDBMS Dazu geh rten auf der einen Seite High End Systeme wie Oracle Informix oder IBM DB2 auf der anderen Seite aber auch Finzelplatz oder Desktop Datenbanken wie dBase Microsoft Access oder FileMaker Die heute dominierenden Systeme sind die Open Source Projekte MySQL und PostgreSQL sowie die kommerziellen Produkte Microsoft SQL Server Oracle und DB2 Seit den 80er Jahren wurden auch verschiedene nicht relationale Datenbanksys teme entwickelt Dazu geh ren insbesondere folgende Arten Objektorientierte Datenbanken Die Daten werden in einer komplexen Objekthierarchie gespeichert Dies erlaubt flexiblere Verkn pfungen als bei den relationalen Tabellen Objektrelationale Datenbanken Einige Datenbanken mischen relationale und objektorientierte Ans tze auf unterschiedliche Weise XML Datenbanken Da das XML Format in vielen Bereichen der Computertechnik sehr wichtig geworden ist liegt es
375. nd wird von den meisten Clientprogrammen und Programmierschnittstellen als Standard vorausgesetzt Da Verbindungen auf lokalen Ports zwischen 0 und 1023 auf Unix Systemen nur durch root ge ffnet werden d rfen hat dies den Sicherheitsvorteil dass MySQL unter einer weniger privilegierten Benutzer ID ausgef hrt werden kann Unter Windows spielt dieser Aspekt allerdings keine Rolle Enable Strict Mode auf derselben Registerkarte sollte blicherweise aktiviert bleiben Durch diese Option werden einige MySQL Eigenheiten zugunsten des ANSI SQL Standards aufgegeben 9 Default Character Set Hier wird der Standardzeichensatz ausgew hlt Alle in Ihren Datenbanken gespeicherten Textdaten verwenden automatisch den hier gew hlten Zeichensatz solange Sie nicht ausdr cklich einen anderen angeben F r Deutsch und andere mitteleurop ische Sprachen die die lateinische Schrift verwenden ist Standard Character Set iso latin 1 die beste Wahl W hlen Sie dagegen Best Support For Multilingualism UTF 8 wenn Sie Daten in vielen ver schiedenen Sprachen mit unterschiedlichen Zeichens tzen verwenden Sollten Sie dagegen vornehmlich eine bestimmte nicht europ ische beziehungsweise nicht lateinisch geschriebene Sprache einsetzen k nnen Sie den entsprechenden Zeichensatz unter Manual Selected Default Character Set Collation ausw hlen Die Collation ist brigens die sprachabh ngige Sortierreihenfolge die auch Umlaute oder andere diakritische Zeichen ber
376. nd noch mehr Informationen ber datenbankbasierte Ruby Anwendungen am Beispiel MySQL enth lt F r Windows kann die MySQL Schnittstelle wie folgt ber den Ruby Erweiterungs manager rubygens installiert werden gt gem update gt gem install mysql include dependencies 312 Anhang B Sonstige APIs Um die Erweiterung unter Unix zu installieren m ssen Sie sie dagegen aus dem Quellcode Paket installieren Laden Sie sie dazu von http tmtm org downloads mysql ruby herunter die aktuelle Version ist derzeit 2 7 Entpacken Sie das Archiv wie folgt tar xzvf mysql ruby 2 7 tar gz Wechseln Sie danach in das neue Unterverzeichnis cd mysql ruby 2 7 Nun wird das Skript extconf rb unter Angabe Ihres MySQL Verzeichnisses aufgeru fen zum Beispiel ruby extconf rb usr local mysql Zum Schluss werden make und make install aufgerufen make make install Der MySQL Zugriff ber die Bibliothek mysql erfordert zun chst die passenden require Anweisungen require rubygems require mysql Anschlie end k nnen Sie den Konstruktor der Klasse Mysql aufrufen um eine Ver bindung zum Datenbankserver herzustellen Die notwendigen Parameter sind Host Benutzername und Passwort Das folgende Beispiel stellt eine Verbindung mit den Rechten des Benutzers rbuser her conn Mysql new localhost rbuser R3153n Anschlie end sollten Sie wie blich die Standarddatenbank w hlen mit der gear beitet werden soll Dies ges
377. ndelt sich vielmehr um die umbenannte SAP DB die Datenbank des Warenwirtschaftssystems SAP die vor einigen Jahren an die MySQL AB bergeben wurde und von dieser als Open Source Datenbank weiterentwickelt wird F higkeiten von MySQL Die folgende Liste enth lt einen kurzen berblick ber die wichtigsten Funktionen des MySQL Datenbankservers Bei einigen von ihnen wird angegeben seit welcher Version sie verf gbar sind alle anderen wurden bereits in einer der fr hesten Ver sionen eingef hrt e Weitgehende Unterst tzung von ANSI SQL 99 e Optimierte Bin rdistributionen f r Windows und zahlreiche Unix Varianten wie Linux MacOS X Solaris oder FreeBSD e Freie Wahl des Tabellentyps geschwindigkeitsoptimierte MyISAM Tabellen transaktionsf hige InnoDB Tabellen und weitere spezialisierte Typen e Sehr detailliert einstellbare Benutzerrechte und Berechtigungen 12 Kapitel 1 Einf hrung Eingebettete Datenbankbibliothek libmysqld f r den Einbau der Serverkom ponente in eigene Anwendungsprogramme Bitte beachten Sie Wenn Sie mit diesem Feature kommerzielle Software entwickeln ben tigen Sie eine kom merzielle MySQL Lizenz Replikation automatische Spiegelung von Datenbanken auf mehrere Server seit Version 4 0 Query Caching Zwischenspeicherung h ufiger Abfragen seit Version 4 0 Volltextsuche schnelle Suche nach einzelnen W rtern und Textbestandteilen in Version 4 0 erweitert Unterst tzung f r Unicod
378. ne Logdatei protokollieren old passwords Passw rter generell im alten Verschl sselungsformat MySQL bis 4 0 generie ren Wenn Sie auf alte Passw rter angewiesen sind ist das praktischer als die Verwendung der Funktion OLD_PASSWORD Allerdings sollten Sie wann immer m glich das neue Verschl sselungsverfahren einsetzen da es sicherer ist MySQL Serverprogramme und skripten 291 open files limit Anzahl Die maximale Anzahl von Dateien die mysqld gleichzeitig offen halten darf pid file Pfad Die Prozess ID Datei f r den MySQL Server port Portnummer Der TCP Port an dem der MySQL Server lauscht Standard 3306 remove Dienstname Den MySQL Dienst entfernen nur Windows socket Pfad Unix Domain Socket f r lokale Clientverbindungen standalone mysqld als Programm aber nicht als Dienst ausf hren nur Windows user Benutzername Die Unix Benutzerkennung unter der mysqld ausgef hrt werden soll in der Regel mysql siehe Installationsanleitung in Kapitel 2 version Nur Versionsinformation anzeigen und beenden mysqld_safe Optionen Wie bereits erw hnt wird der MySQL Server unter Unix in der Regel ber das Skript mysqld_safe gestartet Es aktiviert je nach Verf gbarkeit mysgld max oder mysqld Es besitzt diverse eigene Optionen dies sind die wichtigsten help Nur Hilfe anzeigen und beenden verf gbar seit MySQL 5 0 3 basedir Pfad Das Stammverzeichnis des MySQL Servers core file size Byt
379. nem Vorgabewert f r den Fall dass das Feld nicht ausgef llt wurde oder nicht existiert Das folgende Beispiel speichert in der Variablen ziel den Inhalt des Felds ziel oder notfalls einen leeren String ziel cgi param ziel Da default in der Funktionsdefinition ohnehin den automatischen Vorgabewert erh lt k nnen Sie diesen Aufruf auch noch k rzer schreiben ziel cgi param ziel 74 Kapitel 3 Die erste Webanwendung Innerhalb der Funktion wird die sp tere Ergebnisvariable var zun chst auf den Standardwert default gesetzt Anschlie end wird berpr ft ob der gew nschte Datenname als GET oder aber als POST Feld existiert isset und einen anderen Wert als besitzt Nur in diesem Fall wird der Inhalt des Felds in var gespeichert Zum Schluss wird auf jeden Fall var zur ckgegeben so dass Sie entweder den gew nschten Feldwert oder Ihren erwarteten Vorgabewert erhalten Diese Funktion wird in vielen Skripten in diesem Buch verwendet In Kapitel 8 erfahren Sie auch wie Sie solche Hilfsmittel in externe Dateien auslagern und bei Bedarf importieren k nnen Das Gewinnspielformular Die erste Datei der Gewinnspielanwendung spiel php stellt das Webformular mit den Quizfragen zur Verf gung Dazu werden die Fragen und die zugeh rigen Ant worttexte aus der Datenbank gelesen und als Formular angezeigt Zun chst einmal wird berpr ft ob das GET Feld fehler gesetzt ist Dies kommt nicht durch e
380. nen databases Datenbank Datenbank2 Die letzte schlie lich exportiert alle Tabellen aus allen Datenbanken mysqldump Optionen all databases brigens wird auch mysqldump normalerweise mit der bekannten Parameterkombi nation u Benutzername p aufgerufen Das folgende Beispiel exportiert die Datenbank reisebuero mit den Standard optionen gt mysqldump u root p reisebuero Enter password Diese Anweisung schreibt die SQL Anweisungen zur Erstellung der Datenbank auf die Konsole In der Regel ist das nat rlich nicht erw nscht deshalb wird die Aus gabe blicherweise in eine Datei umgeleitet zum Beispiel gt mysqldump u root p reisebuero gt reisebuero sql Hier die wichtigsten Optionen von mysqldump neben u und p im berblick help Hilfe ausgeben und beenden add drop table Vor jeder CREATE TABLE Anweisung vorsichtshalber DROP TABLE einf gen um eventuell vorhandene Tabellen zun chst zu l schen compact M glichst kurze Ausgabe zum Beispiel ohne Kommentare compatible Version Kompatibilit t mit anderen SQL Versionen oder Datenbanken herstellen Ver sion kann zum Beispiel die Werte ansi ANSI SQL mysql1323 MySQL 3 23 mysql40 MySQL 4 0 postgresql PostgreSQL oracle Oracle mssql Micro soft SQL Server oder db2 IBM DB2 annehmen where Kriterium Nur diejenigen Datens tze einf gen die dem angegebenen Kriterium entspre chen Import und Export von Tabellendaten 295 Inte
381. nillepudding In einem solchen eher ungew hnlichen Fall ist der Cross Join sinnvoll weil sich auf diese Weise jedes m gliche Men kombinieren l sst mysql gt SELECT FROM suppe hauptgericht nachtisch suppe hauptgericht nachtisch Tomatensuppe Schnitzel ousse au Chocolat Spargelcremesuppe Schnitzel ousse au Chocolat Zwiebelsuppe Schnitzel ousse au Chocolat Tomatensuppe Bauernomelett ousse au Chocolat Spargelcremesuppe Bauernomelett ousse au Chocolat Zwiebelsuppe Bauernomelett ousse au Chocolat Tomatensuppe Pizza Spinaci ousse au Chocolat Spargelcremesuppe Pizza Spinaci ousse au Chocolat Zwiebelsuppe Pizza Spinaci ousse au Chocolat Tomatensuppe Schnitzel Vanillepudding Spargelcremesuppe Schnitzel Vanillepudding Zwiebelsuppe Schnitzel Vanillepudding Tomatensuppe Bauernomelette Vanillepudding Spargelcremesuppe Bauernomelette Vanillepudding Zwiebelsuppe Bauernomelette Vanillepudding Tomatensuppe Pizza Spinaci Vanillepudding Spargelcremesuppe Pizza Spinaci Vanillepudding Zwiebelsuppe Pizza Spinaci Vanillepudding Statt die Tabellen durch Kommata zu trennen k nnen Sie CROSS JOIN auch expli zit hinschreiben die beiden folgenden Abfragen sind mit de
382. nix Prompt beliebiger Benutzer einschlie lich root wobei Sie normale Aufgaben aus Sicherheitsgr nden nicht als root erledigen sollten Unix Prompt f r root Pa Der weiter unten vorgestellte Kommandozeilenclient mysql zur manuellen Eingabe von SQL Anweisungen verwendet den speziellen Prompt mysql gt dieser wird zur Unterscheidung stets mit abgedruckt Wenn Sie zum ersten Mal in einer Konsole arbeiten werden Sie einige grundle gende Befehle ben tigen Diese betreffen vor allem den Umgang mit Verzeichnis sen wie etwa den Wechsel des Arbeitsverzeichnisses oder das Anlegen neuer Unterverzeichnisse Hierbei spielt die unterschiedliche Organisation des Dateisys tems also die Verzeichnishierarchien eine wichtige Rolle e Auf Windows Rechnern beginnen Dateipfade mit einem Laufwerkbuchsta ben darauf folgen die ineinander verschachtelten Verzeichnisnamen und zum Schluss der Dateiname Das Trennzeichen ist ein Backslash der auf einer deutschen Windows Tastatur mit Alt Gr erzeugt wird Das folgende Bei spiel ist der Pfad der Textdatei hello txt im Ordner mydata unter dem Privat verzeichnis des Users Sascha C Dokumente und Einstellungen Sascha Eigene Dateien mydata hello txt e Unix Systeme kennen keine Laufwerkbuchstaben Das Dateisystem besitzt eine gemeinsame Wurzel namens wobei sich die diversen Standardverzeichnisse auf verschiedenen Laufwerken oder Partitionen befinden k nnen die genaue Anordnun
383. noch weitere optionale PDO Verbindungsparameter kennen Beispiel 3 3 zeigt den gesamten PHP Block des Beispiels in der PDO Variante Beispiel 3 3 teilnahme php Benutzereingabe in die Datenbank schreiben PDO Version lt php function cgi_param feld default Nariable zun chst auf Default Wert setzen var default if isset _GET feld 8 amp GET feld GET Feld gefunden var GET feld 84 Kapitel 3 Die erste Webanwendung Beispiel 3 3 teilnahme php Benutzereingabe in die Datenbank schreiben PDO Version Fortsetzung elseif isset _POST feld amp amp _POST feld POST Feld gefunden var _POST feld Ermittelten Wert zur ckgeben return var function pdo_conn Verbindungsparameter host localhost user winuser pass G3winn3n db gewinnspiel try conn new PDO mysql host host dbname db user pass array PDO ATTR_ERRMODE gt PDO ERRMODE EXCEPTION PDO ATTR_PERSISTENT gt 1 catch PDOException e echo FEHLER e gt getMessage return null return conn try Erste Verbindung zum MySQL Server conn pdo_conn Vermutung Alles korrekt ausgef llt korrekt 1 Formulardaten lesen for i 1 i lt 4 i antwort i cgi_param f i 0 if antwort i 0 korrekt 0 uname cgi_param uname email cgi_param
384. nter st tzten Storage Engines oder Tabellentypen siehe n chstes Kapitel Benutzer und ihre Berechtigungen nach einer Anderung neu laden Komfortable Oberfl che zur Anzeige und nderung der MySQL Benutzerrechte Liste aller Datenbanken des MySQL Servers Datenbanken in verschiedenen Formaten exportieren siehe Kapitel 9 Tabellenstrukturen und daten aus SQL Dateien oder formatierten Textdateien importieren siehe Kapitel 9 Neue Verbindung zum MySQL Server herstellen 3 Der Internet Explorer hat einen Bug der die erneute Anmeldung desselben MySQL Users verhindert In der Spalte phpMyAdmin k nnen Sie dagegen Einstellungen f r den Client selbst vornehmen und einige Informationen erhalten e Unter Sprache Language wird die Sprache von phpMyAdmin selbst eingestellt f r alle Beispiele in diesem Buch wurde nat rlich Deutsch German gew hlt aber wie Sie sehen unterst tzt das Tool noch zahlreiche weitere Sprachen e MySQL Zeichensatz zeigt den hier nicht nderbaren Zeichensatz an den der Server selbst standardm ig verwendet phpMyAdmin 113 Zeichensatz Kollation der MySQL Verbindung erm glicht Ihnen die Auswahl welchen Zeichensatz und welche Kollation phpMyAdmin bei der Kommunika tion mit dem Server verwenden soll e Unter Oberfl chendesign k nnen Sie ein Farbschema f r phpMyAdmin aus w hlen mitgeliefert werden die beiden Einstellungen Original und Darkblue orange Die Auswahl hat n
385. ntereinander verreisen selbstverst ndlich wird auch jeder Flug und jedes Hotel meist von mehreren Kunden gebucht Das ergibt m n Relationen zwischen Kunde und Flug beziehungsweise zwischen Kunde und Hotel Anders als 1 1 oder 1 n Relationen sind m n Relationen nicht direkt dar stellbar Die Buchungen als solche geh ren zu keinem der drei beteiligten Entities sondern stellen einen separaten Sachverhalt dar Abbildung 5 3 korrigiert daher das ER Modell durch die Einf hrung des neuen Entity Buchung Damit werden die m n Relationen in mehrere 1 n Relationen aufgesplittet Solche Verfeinerungsprozesse bilden den Hauptnutzen des Entity Relationship Modells An der grafischen Dar stellung sind derartige Probleme leichter zu erkennen als in einer Text oder Tabel lenform Startort Zimmer Abbildung 5 2 Entity Relationship Modell einer Reisebuchung mit Relationsproblem DerDatenbankentwurf 131 Startort Abbildung 5 3 Entity Relationship Modell der Reisebuchung mit aufgel stem Relationsproblem Normalisierung Bereits im ersten Kapitel wurde die Redundanzfreiheit und die daraus resultierende Konsistenz als wichtiges Ziel bei der Modellierung relationaler Datenbanken erw hnt In einer relationalen Datenbank d rfen Daten nicht mehrfach gespeichert werden da dies neben Speichervergeudung vor allem zu einem Problem f hren kann Verschiedene Exemplare einer gespeicherten Information k nnen du
386. nterst t zen verwenden daf r meist jeweils eine eigene inkompatible Syntax da es fr her keinen SQL Standard daf r gab MySQL benutzt dagegen die SQL 2003 Syntax f r Stored Procedures Genau wie Prepared Statements sind auch Stored Procedures benannte Abfolgen von SQL Abfragen Allerdings sind sie erheblich leistungsf higer beispielsweise k nnen sie eine beliebige Anzahl benannter Ein und oder Ausgabeparameter besitzen Zum Testen von Stored Procedures soll wieder einmal eine separate Datenbank zum Einsatz kommen sie enth lt nur zwei kleine Tabellen in denen Flugzeugtypen und ihre Hersteller gespeichert werden Erstellen Sie mithilfe der folgenden Anwei sungen zun chst die Datenbank und die Tabellenstruktur CREATE DATABASE flieger USE flieger CREATE TABLE hersteller h_id INT AUTO INCREMENT PRIMARY KEY h_name VARCHAR 40 CREATE TABLE flugzeuge f id INT AUTO INCREMENT PRIMARY KEY f_typ VARCHAR 40 f herst INT Um mit dem Experimentieren zu beginnen wird zun chst einmal je ein Datensatz eingef gt INSERT INTO hersteller h_name VALUES Boeing INSERT INTO flugzeuge f_typ f_herst VALUES 737 800 1 208 Kapitel7 Fortgeschrittene Datenbankfunktionen Die erste Stored Procedure soll einfach jeden Flugzeugtyp mit dem zugeh rigen Hersteller ausgeben Dazu wird eine CREATE PROCEDURE Anweisung verwendet deren allgemeines Syntaxschema wie folgt aussieht CREATE PROCEDURE ProzedurName
387. ntwortenden Benutzer als Tabellenzeilen ausgegeben Dazu wird wieder eine foreach Schleife verwendet diesmal ber alle Elemente von korr_teilnehmer Ausgabe aller korrekten Einsendungen foreach korr_teilnehmer as kt kt_query mysql_query SELECT tn uname tn email tn_interest FROM gw teilnehmer WHERE tn_id kt list tn_uname tn email tn interest mysql fetch row kt_query echo lt tr gt n echo lt td gt tn_uname lt td gt n echo lt td gt tn_email lt td gt n echo lt td gt staedte tn interest 1 lt td gt n echo lt tr gt n 88 Kapitel 3 Die erste Webanwendung Beachten Sie den Ausdruck tn_interest 1 der als Index auf das Array staedte angewendet wird Da in der Datenbank die Werte 1 bis 4 f r die St dte gespeichert werden muss 1 abgezogen werden damit der Wertebereich zu dem Array mit den Indizes 0 bis 3 passt Zum Schluss muss noch der Gewinner gezogen werden Wie Sie sich vorstellen k nnen gibt es in einer programmgesteuerten Maschine wie dem Computer keinen echten Zufall Deshalb werden komplexe mathematische Verfahren zur Berech nung unvorhersagbarer Zahlenfolgen eingesetzt die sogenannten Zufallsgenera toren In der Regel basieren sie auf der fortgesetzten Division sehr gro er Zahlen Wie beinahe jede Programmiersprache enth lt auch PHP eine solche Komponente Die betreffende Funktion hei t rand Als Parameter erh lt sie optional den Min dest
388. ntypen mit festgelegter L nge einsetzen d rfen beispielsweise nur CHAR aber keinen VARCHAR e FEDERATED Der Tabellentyp FEDERATED speichert Tabellendaten nicht im lokalen MySQL Server sondern dient dem Zugriff auf Tabellen mit identi schem Format auf einem anderen Server Auf diese Weise k nnen Sie ohne Programmierschnittstelle auf entfernte Datenbanken zugreifen Angenommen auf Server 1 mit der IP Adresse 192 168 0 2 befindet sich die Tabellendefini tion von rb_sehensw in der Datenbank reisebuero CREATE TABLE rb_sehensw sw nr INT AUTO INCREMENT PRIMARY KEY sw stadt INT DEFAULT 0 sw_name VARCHAR 50 sw eigen VARCHAR 50 sw bild url VARCHAR 40 sw _anschrift VARCHAR 100 sw beschr TEXT ENGINE MyISAM DEFAULT CHARSET latini COLLATE latin1 germani_ci Wenn Server 2 diese Tabelle per Federated Verbindung nutzen soll m ssen Sie dort folgende Tabellendefinition erzeugen CREATE TABLE rb_sehensw sw nr INT AUTO INCREMENT PRIMARY KEY sw stadt INT DEFAULT 0 sw_name VARCHAR 50 sw eigen VARCHAR 50 sw bild url VARCHAR 40 sw anschrift VARCHAR 100 sw beschr TEXT ENGINE FEDERATED CONNECTION mysql root 192 168 0 2 reisebuero rb_sehensw Das Schl sselwort CONNECTION gibt es erst seit MySQL 5 0 13 in lteren Versio nen m ssen Sie die Daten in den COMMENT schreiben Vor dem Hostnamen oder der IP Adresse des entfernten Datenbankhosts muss ein Username eingetragen werden der auf die betreffende Tabelle
389. o biert zu werden Starten Sie also den Browser Ihrer Wahl und geben Sie die Adresse des Skripts spiel php ein Sollten Sie der Konfigurationsanleitung bis hierher gefolgt sein lautet die URL http www test local contest spiel php oder auf dem Server rechner selbst http 127 0 0 1 contest spiel php Wenn Sie alles richtig gemacht haben m sste das Spielformular so aussehen wie in Abbildung 3 2 Kreuzen Sie nun die Antworten an und geben Sie beliebige Benutzerdaten ein Die nachfolgende Gewinnspiel Mozilla Firefox Loix Datei Bearbeiten Ansicht Gehe Lesezeichen Extras Hilfe e r o gt X a amp A kttp ocalhost contest spiel php O Go IGL Gewinnspiel Beantworten Sie die folgenden Fragen und gewinnen Sie eine All Inclusive YYochenendreise in eine europ ische Gro stadt aus unserem Angebot 1 Wie hei t die Hauptstadt von Italien Ram Rom Bios 2 Welche dieser Hauptst dte hie einst Lutetia Br ssel London Paris 3 Bratislava ist die Hauptstadt von Slowakei Slowenien Tschechien 4 Welche dieser St dte ist keine Hauptstadt Ljubljana Istanbul Oslo Pers nliche Angaben Benutzername E Mail Welche dieser St dte w rden Sie bald am liebsten besuchen Paris London Istanbul Rom Abschicken Fertig Abbildung 3 2 Das Spielformular der Webanwendung 98 Kapitel 3 Die erste Webanwendung Beschreibung geht
390. o Anwendung 275 Beispiel 8 8 auskunft php Auswahl der Reisedaten Fortsetzung lt select gt lt td gt lt tr gt lt tr gt lt td gt Abreisedatum lt td gt lt td gt Datum lt php datumswahl start gt lt td gt lt tr gt lt tr gt lt td gt R uuml ckreisedatum lt td gt lt td gt Datum lt php datumswahl ende gt lt td gt lt td gt Mit Hotelangebot lt td gt lt input type radio name hotel value 1 checked checked gt ja lt input type radio name hotel value 0 gt nein lt td gt lt tr gt lt tr gt lt td gt nbsp lt td gt lt td gt lt input type submit value Anfrage senden gt lt tr gt lt table gt lt form gt lt td gt lt tr gt lt table gt lt body gt lt html gt Anzeige der Reiseangebote Das Skript ergebnis php ist umfangreicher und etwas komplexer Zuerst liest es die von auskunft php bergebenen Formulardaten aus und f hrt eine Reihe von Plausi bilit tskontrollen durch e Wurde der Start oder Zielort vergessen e Sind Start und Zielort identisch e Liegt das gew hlte Abreisedatum vor dem heutigen Datum e Liegt das gew hlte R ckreisedatum vor dem Abreisedatum Wenn eine dieser Fragen mit Ja beantwortet werden muss sendet das Skript eine entsprechende Fehlermeldung an auskunft php zur ck Da der erste PHP Block vor Beginn des HTML Dokuments liegt kann der entsprechende R cksprung per Location Header
391. ocalhost IDENTIFIED BY G3winn3n Nachdem der berechtigte Benutzer existiert muss die Datenbank erstellt werden mysql gt CREATE DATABASE gewinnspiel Damit Sie bequem weiterarbeiten k nnen und nicht jedes Mal gewinnspiel Tabel lenname schreiben m ssen sollten Sie die neue Datenbank als Standard ausw hlen mysql gt USE gewinnspiel Nun k nnen die einzelnen Tabellen erstellt werden Dabei werden zwei empfeh lenswerte Konventionen eingehalten die Sie sich auch f r eigene datenbankbasierte Anwendungen angew hnen sollten 1 Alle Tabellen erhalten das gleiche Namenspr fix hier gw f r gewinnspiel Das ist beispielsweise n tzlich falls Sie sp ter gezwungen sein sollten die Tabellen zusammen mit anderen in einer gemeinsamen Datenbank zu spei chern in billigen Webhosting Angeboten steht manchmal nur eine einzelne MySQL Datenbank zur Verf gung 1 In bestimmten Kombinationen lterer PHP und MySQL Versionen ist auch IDENTIFIED BY Pass wort ein Problem da sich die Passwortverschl sselung in MySQL 4 1 ge ndert hat Lesen Sie den Abschnitt Benutzerverwaltung in Kapitel 9 f r weitere Hinweise 66 Kapitel 3 Die erste Webanwendung 2 Auch die Feldbezeichnungen jeder Tabelle erhalten je ein gemeinsames Pr fix um zu kennzeichnen dass sie zur selben Tabelle geh ren und um Doppelbe nennungen auszuschlie en Im ersten Arbeitsschritt wird die Tabelle gw_fragen mit den Fragetexten und der jeweiligen Numm
392. okumentarten an die der Client akzeptiert MIME Typen haben das Format Haupttyp Untertyp etwa text html f r HTML Dokumente oder image jpeg f r JPEG Bilder bedeutet dass der Client alle Arten von Dokumenten annimmt Accept Language listet die ISO K rzel der bevorzugten Sprachen des Clients auf Webserver wie Apache beherrschen eine Technik namens Content Nego tiation die die Accept Header auswertet und Dokumente in der bevorzugten Sprache dem bevorzugten Dateityp oder dem gew nschten Zeichensatz an Clients ausliefern kann In unserem Beispiel werden Deutsch und US Englisch gew nscht Accept Encoding gibt an dass der Browser komprimierte Ressourcen verarbei ten kann und listet die einzelnen Komprimierungsformate auf Der Browser im Beispiel versteht GNU Zip gzip und ZIP deflate User Agent ist die Selbstidentifikation des Clients hier handelt es sich um den Browser Firefox unter Windows NT Host ist der wichtigste Anfrage Header in HTTP 1 1 ist er vorgeschrieben Auf einem Serverrechner k nnen mehrere Websites mit eigenen Domainnamen lie gen die als virtuelle Hosts bezeichnet werden Damit der Server wei welche Site angefordert wird ben tigt er diesen Header Connection gibt an ob die Verbindung zwischen Client und Server bestehen bleiben soll keep alive oder geschlossen wird close Das Offenhalten der Verbindung erm glicht das schnellere Nachladen verkn pfter Dateien wie beispielsweise Bilder die in
393. olche Felder in bin rer Reihenfolge sortiert Text und Bin rbl cke F r umfangreichere Text und Bin rdaten stehen mehrere TEXT beziehungsweise BLOB Typen BLOB steht f r Binary Large OBject mit unterschiedlicher Kapazit t zur Verf gung Tabelle 5 5 zeigt eine bersicht ber diese Spaltentypen mit der jeweils zul ssigen H chstl nge Bei den BLOB Typen handelt es sich um die maxi male Anzahl von Bytes bei den TEXT Typen um Zeichen Tabelle 5 5 Vergleich der verschiedenen Text und Bin rblock Datentypen TEXT Typ BLOB Typ maximale L nge TINYTEXT TINYBLOB 255 TEXT BLOB 65 535 MEDIUMTEXT MEDIUMBLOB 16 777 215 LONGTEXT LONGBLOB 4 294 967 295 BLOB Spalten sind durchaus zur Speicherung von Multimediadaten wie Bildern oder Audiomaterial geeignet In den Beispielen in diesem Buch wird kein Gebrauch davon gemacht da es relativ umst ndlich ist Bilder die in Webseiten eingebettet werden sollen aus einer Datenbank auszulesen Wann immer Bilddateien zum Ein MySQL Datentypen 151 satz kommen wird in den Datenbanktabellen lediglich deren URL beziehungsweise Dateiname gespeichert Aufz hlungstypen Manche Tabellenspalten k nnen nur wenige festgelegte Werte annehmen In sol chen F llen wird unn tig Speicherplatz vergeudet wenn immer wieder die gleichen Textinformationen gespeichert werden Zudem k nnen so leicht Inkonsistenzen entstehen etwa wenn Sie sich bei der Eingabe vertippen Die klassische relationa
394. ompensieren k nnen kon zentrieren sich die Installationsanleitungen auf die Windows NT Familie das hei t Windows 2000 Windows XP Windows Vista und Windows Server 2003 F r ein Produktivsystem sollten Sie ohnehin nur diese Systeme in Betracht ziehen au er an Diensten mangelt es den alten Consumer Systemen n mlich auch an Sicher heitsoptionen Eine interessante Alternative f r Rechner die noch keine der LAMP WAMP Kom ponenten enthalten ist das Komplettpaket XAMPP von http www apachefriends org das Sie ebenfalls auf der beiliegenden CD ROM finden Es enth lt die f r die Arbeit mit diesem Buch ben tigten Komponenten Apache MySQL PHP und phpMyAdmin sowie weitere n tzliche Serversoftware Sie brauchen die Archivdatei f r Ihr Betriebssystem Windows Linux oder Mac OS X nur zu entpacken und k nnen anschlie end jeden Server manuell starten oder beenden Beachten Sie aber dass XAMPP ab Werk nicht sonderlich sicher konfiguriert ist und daher nur f r Entwicklerrechner aber nicht f r Server im Interneteinsatz geeignet ist Zu Unrecht gef rchtet das Arbeiten mit der Konsole Zahlreiche Arbeitsschritte im Zusammenhang mit der Konfiguration Ihrer LAMP oder WAMP Umgebung aber auch bei der sp teren Administration von MySQL ben tigen eine Konsole also ein Programm zur manuellen Befehlseingabe Dies ist unter Windows die bereits erw hnte Eingabeaufforderung und auf Unix Systemen ein beliebiges Terminalfenster Zum ffnen d
395. on Fortsetzung Datenbank Verbindungsparameter host localhost user winuser pass G3winn3n db gewinnspiel Vermutung Alles korrekt ausgef llt korrekt 1 Formulardaten lesen for i 1 i lt 4 i antwort i cgi_param f i 0 if antwort i 0 korrekt 0 uname cgi_param uname email cgi_param email interest cgi _param wish 0 if uname email interest 0 korrekt 0 Etwas nicht ausgef llt if korrekt header Location spiel php fehler 1 else erbindung zum MySQL Server herstellen conn mysql connect host user pass Datenbank ausw hlen mysql _select_db db Infos in die Datenbank schreiben mysql_query INSERT INTO gw teilnehmer tn _uname tn_email tn_interest VALUES uname email interest if mysql_affected rows 0 mysql_close header Location error html else Teilnehmer ID ermitteln query mysql query SELECT tn_id from gw teilnehmer WHERE tn_email email list id mysql_fetch row query for i 1 i lt 4 i mysql_query INSERT INTO gw teilnahme VALUES id i antwort i if mysql_affected_rows 0 mysql_close header Location error html Die PHP Skripten 83 Beispiel 3 2 teilnahme php Benutzereingaben in die Datenbank schreiben mysql Versi
396. on Fortsetzung mysql_close gt lt html gt lt head gt lt title gt Gewinnspiel lt title gt lt meta http equiv Content type content text html charset iso 8859 1 gt lt head gt lt body gt lt h1 gt Vielen Dank lt php echo uname gt lt h1 gt lt p gt Wir freuen uns dass Sie an unserem Gewinnspiel teilgenommen haben lt br gt Unter allen richtigen Einsendungen verlosen wir am 01 08 2007 die Reise lt br gt lt br gt Der Gewinner wird per E Mail benachrichtigt lt p gt lt body gt lt html gt Die PDO Version funktioniert erneut ein wenig anders Unter anderem wird an einer bestimmten Stelle wieder ein zweites PDO Objekt ben tigt Um diesen Vorgang zu erleichtern wurde hier eine Funktion namens pdo_conn geschrieben die ein fertiges Verbindungsobjekt mit den gew nschten Parametern zur ckliefert Wie Sie sehen enth lt der new PDO Aufruf diesmal ein Array mit zus tzlichen Parametern Diese bedeuten kurz gesagt Folgendes e PDO ATTR_ERRMODE gt PDO ERRMODE_EXCEPTION sorgt daf r dass SQL Fehler nicht kommentarlos bergangen werden sondern eine PDOException ausl sen die dann mittels try catch abgefangen wird e PDO ATTR_PERSISTENT gt 1 macht die Datenbankverbindung persistent das hei t sie bleibt ge ffnet und kann wiederverwendet werden Dies verbessert die Performance gr erer datenbankbasierter Webanwendungen erheblich In Kapitel 8 lernen Sie
397. on 192 Operator 177 Operator 167 amp amp Operator 177 lt Operator 167 lt Operator 167 lt gt Operator 167 lt gt Operator 167 Operator 167 gt Operator 167 gt Operator 167 Operator 177 Administration 283 Aggregatfunktionen 192 ALTER PROCEDURE Anweisung 211 ALTER TABLE Anweisung 196 305 ALTER VIEW Anweisung 205 AND Operator 177 nderungsabfrage Daten 194 nderungsabfrage Struktur 196 ARCHIVE Tabellentyp 145 arithmetische Operationen 185 AS Klausel 165 Aufz hlungs Datentypen 152 Ausdr cke 184 Auswahlabfragen 75 163 AUTO_INCREMENT Eigenschaft 68 156 automatischer Start UNIX 293 AVG Funktion 192 Backup 296 Benutzervariablen 207 Benutzerverwaltung 50 283 Berkeley DB Tabellentyp 144 Bestandteile 11 Bin rblock Datentypen 151 BINARY Funktion 176 BINARY Datentyp 151 BIT Datentyp 148 BLACKHOLE Tabellentyp 145 BLOB Datentyp 151 CALL Anweisung 209 CHANGE MASTER Anweisung 302 CHAR Datentyp 151 Client 41 101 Client Server Architektur 11 COMMIT Anweisung 200 CONSTRAINT Klausel 157 CREATE DATABASE Anweisung 42 66 142 303 CREATE FUNCTION Anweisung 212 CREATE INDEX Anweisung 155 CREATE PROCEDURE Anweisung 209 CREATE TABLE Anweisung 42 67 143 304 CREATE TRIGGER Anweisung 213 CREATE USER Anweisung 284 CREATE VIEW Anweisung 203 CSV Tabellentyp 144 DATABASE Funktion 106 164 306 DATE Da
398. on LIKE ist der Operator NOT LIKE Er w hlt alle Datens tze aus auf die der Mustervergleich nicht zutrifft Das folgende Beispiel w hlt die Namen aller St dte aus die kein e enthalten mysql gt SELECT st_name FROM rb_staedte gt WHERE st_name NOT LIKE e st_name Dublin Frankfurt Main Istanbul 172 Kapitel6 SQL Abfragen K ln Lissabon London Lyon adrid Paris Prag Rom arschau Z rich sungen einsetzen um die Ergebnisse auf das angegebene Muster zu beschr nken Das folgende Beispiel zeigt nur diejenigen Tabellen der Datenbank reisebuero an deren Namen die Zeichenkombination flu enthalten mysql gt SHOW TABLES FROM reisebuero LIKE flu u Die Klausel LIKE k nnen Sie brigens auch bei allen SHOW Anwei kd rb_fluege rb_flugstrecken Regul re Ausdr cke mit REGEXP Erheblich mehr M glichkeiten bietet die Suche nach regul ren Ausdr cken engl regular expressions Das Konzept dieser m chtigen Suchmuster wurde von dem US Linguisten Noam Chomsky entworfen und diente urspr nglich der Beschrei bung nat rlicher Sprachen In der Informatik wurden die regul ren Ausdr cke vor allem im Unix Bereich popul r Dienstprogramme wie sed awk und grep machen ebenso regen Gebrauch von ihnen wie die Programmiersprache Perl PHP ist gleich mit mehreren RegExp Implementierungen ausgestattet Die leistungsf higste und in diesem Bu
399. on an die Entwickler weitergeben in Anhang D finden Sie die Adressen ent sprechender Websites und Mailinglisten Dar ber hinaus sollten auch Sie sich gegen Softwarepatente in der EU engagieren Es gibt keine gr ere Gefahr die der freien Software droht nicht umsonst wird die umstrittene Patentrichtlinie vor allem von der Konkurrenz der Open Source Pro jekte gef rdert einigen gro en Unternehmen die kommerzielle Software entwi ckeln und verkaufen Gute Ausgangspunkte f r konkrete Aktionen sind die Websites http www nosoftwarepatents com und http www ffii de Dort erhalten Sie beispielsweise die Anschriften der verschiedenen EU Abgeordneten sowie Informationen ber Online und Offline Protestaktionen Zu guter Letzt danke ich von ganzem Herzen meiner Frau T lay und meinem Sohn Leon die auch f r dieses Buch wieder viel zu oft und zu lange auf mich verzichten mussten XII Vorwort zur 2 Auflage In diesem Kapitel KAPITEL 1 e Datenbanken Datenbankgest tzte Ei nf h ru n g Anwendungen Grundlegendes zu MySQL Wo nichts am rechten Platz liegt da ist Unordnung Wo am rechten Platz nichts liegt ist Ordnung Bertolt Brecht In diesem Kapitel werden zun chst die historischen und theoretischen Hintergr nde der Datenbanktechnik erl utert Anschlie end wird auf den Aufbau datenbankba sierter Anwendungen und insbesondere Webanwendungen eingegangen Zum Schluss erhalten Sie die wichtigste
400. onsan leitung gefolgt sind befindet er sich in beiden Systemen bereits in Ihrem PATH Unter Windows wo Sie bereits bei der Installation ein root Passwort festgelegt haben k nnen Sie Folgendes eingeben gt mysql u root p Anschlie end werden Sie zur Passworteingabe aufgefordert Alternativ k nnen Sie auch Start gt Alle Programme gt MySQL gt MySQL Server 5 0 gt MySQL Command Line Client aufrufen und in dem dadurch neu ge ffneten Konsolenfenster sofort das root Passwort eingeben Auf einem Unix System gen gt zun chst folgende Eingabe mysql Hier sollten Sie umgehend ein Passwort f r den MySQL Benutzer root anlegen Dies funktioniert mit dem einfallslosen und recht unsicheren Passwort geheim01 folgenderma en mysql gt SET PASSWORD FOR root localhost PASSWORD geheimo1 Anschlie end m ssen Sie alle Eintr ge ohne Benutzernamen und oder ohne Pass wort aus der Verwaltungstabelle user l schen mysql gt DELETE FROM mysql user WHERE user OR PASSWORD Wenn nderungen an Benutzerrechten bereits w hrend der Clientsitzung aktiv werden sollen brauchen Sie anschlie end noch folgende Anweisung mysql gt FLUSH PRIVILEGES Beim n chsten Mal funktioniert der Start des Clients dann wie unter Windows inkompatibel zur MySQL Standardeinstellung iso latin 1 N heres s dazu erfahren Sie in Kapitel 4 aber im Moment sollten Sie den innerhalb des Clients verwendeten Zeichensatz anpassen bevor Sie
401. onsforum 265 each Funktion 221 echo Funktion 216 Einf hrung 215 Eingabefehler abfangen 94 explode Funktion 221 Fehlerpr fung bei Datenbank abfragen 87 for Anweisung 219 Formularbeispiel 75 Formulardaten auslesen 73 Funktionen 223 G stebuch 259 ge nderte Datens tze ermitteln 81 Geschichte 43 _GET Variable 74 if Anweisung 218 implode Funktion 222 include Funktion 257 Include Dateien 257 Installation Linux 44 Installation Windows 46 is_float Funktion 224 is_int Funktion 224 is_null Funktion 224 is_numeric Funktion 224 is_string Funktion 224 isset Funktion 75 Kommentare 51 Konstruktoren 226 Kontrollstrukturen 218 list Funktion 221 Load Balancing Beispiel 302 mysql Schnittstelle 50 mysql_affected_rows Funktion 81 235 mysql_close Funktion 233 mysql_connect Funktion 50 230 mysql_fetch_array Funktion 232 mysql_fetch_row Funktion 82 232 mysql_query Funktion 81 231 mysql_select_db Anweisung 230 mysqli Schnittstelle 50 mysqli siehe affected_rows Eigenschaft 82 235 mysqli siehe close Methode 233 mysqli siehe fetch_array Methode 232 mysqli siehe fetch_row Methode 232 mysqli siehe new Konstruktor 230 mysqli siehe query Methode 231 MySQL Schnittstellen 229 MySQL Zugriff testen 49 344 Index null Argument 224 Operatoren 217 php ini Konfigurationsdatei 48 _POST V
402. onsware LAMP unter openSUSE 10 2 Die Chancen dass Ihre einigerma en aktuelle Linux Distribution bereits alle LAMP Komponenten enth lt oder zur Installation anbietet stehen sehr gut Dasselbe gilt f r die wichtigsten BSD Unix Varianten wie zum Beispiel FreeBSD sowie f r Mac OS X dessen Unterbau Darwin ebenfalls ein BSD Unix ist nat rlich m sste es in diesen F llen korrekt BAMP beziehungsweise MAMP statt LAMP hei en Jedes System und jede Distribution verwendet ihren eigenen Paketmanager mit jeweils anderen Konsolenbefehlen und oder grafischen Hilfsprogrammen Insofern ist es vollkommen ausgeschlossen hier auf alle einzugehen Als typisches Beispiel wird jedoch im Folgenden erl utert wie Sie die LAMP Komponenten in der recht weit verbreiteten Linux Distribution openSUSE 10 2 aktivieren Starten Sie dazu als Erstes das zentrale Verwaltungstool YaST entweder ber das Men der grafischen Oberfl che oder durch Eingabe von yast als root in einer Kon sole Beim grafischen Aufruf werden Sie aufgefordert das root Passwort einzugeben W hlen Sie in YaST die Hauptkategorie Software und deren Unterpunkt Software installieren oder l schen aus Daraufhin erscheint die Paketmanager Oberfl che die auch w hrend der Neuinstallation von openSUSE zum Einsatz kommt _ PHP installieren 55 W hlen Sie unter Filter den Eintrag Schemata um die Paketlisten thematisch zu sor tieren Alle LAMP Elemente befin
403. or i 1 i lt 31 i echo lt option value i gt i lt option gt n echo lt select gt n Monatsw hler echo lt select name feldname monat size 1 gt n echo lt option value 0 gt Monat lt option gt n for i 1 i lt 12 i 278 Kapitel 8 Webanwendungen mit PHP und MySQL Beispiel 8 9 ergebnis php Ausgabe der Reiseangebote Fortsetzung echo lt option value i gt i lt option gt n echo lt select gt n aktuelles Jahr ermitteln jahr date Y time W hler f r aktuelles und nachfolgendes Jahr echo lt select name feldname jahr size 1 gt n echo lt option value jahr selected selected gt jahr lt option gt n jahr echo lt option value jahr gt jahr lt option gt n lt select gt n Bereits eingeloggt session start user nummer session _param user 0 Liste aller St dte auslesen stnr array staedte array querytext SELECT st_nr st_name la_name FROM rb staedte INNER JOIN rb_ laender ON st_land la_nr ORDER BY la_name ASC st_name ASC query conn gt query querytext while list nr stadt land array push stnr nr array push staedte stadt land query gt fetch_row gt lt html gt lt head gt lt title gt Reiseb amp uuml ro Auswahl lt title gt lt link rel stylesheet type tex
404. ormationen ausgeben Sie sollten diesen Befehl zum Durchbl ttern mit less unter Windows more aufrufen da die Ausgabe viele Bildschirme lang ist ping berpr ft ob der Server aktiv ist reload L dt die GRANT Tabellen neu nach der nderung von Benutzerrechten shutdown Beendet den MySQL Server status Gibt eine kurze Statusmeldung aus version Gibt die Serverversion aus Das folgende Beispiel beendet den MySQL Server mysqladmin shutdown u root p Enter password Import und Export von Tabellendaten Eine wichtige F higkeit von MySQL wurde in diesem Buch bisher noch nicht erw hnt der Austausch von Daten mit anderen Anwendungen und Formaten also der Import und Export von Tabellendaten Hier werden einige grundlegende M g lichkeiten besprochen 294 Kapitel 9 MySQL Administration Das mit MySQL gelieferte Hilfsprogramm mysqldump erm glicht die Speicherung von Datenbank und Tabellendaten als Textdateien mit SQL Anweisungen Diese k nnen Sie sp ter in denselben oder einen anderen MySQL Server bedingt auch in andere SQL Datenbankserver laden Beispielsweise wurde die Datei reisebuero sql zur Erstellung der Datenbank reisebuero mithilfe von mysqldump erzeugt Es gibt drei grundlegende Aufrufvarianten f r mysqldump Die erste exportiert eine mehrere oder alle Tabellen einer Datenbank mysqldump Optionen Datenbank Tabelle Die n chste Methode exportiert eine oder mehrere Datenbanken mysqldump Optio
405. otel Solidarnosc 70 Finnegan s 120 Der vorangestellte logische Operator NOT oder bedeutet dass das Gegenteil des entsprechenden Ausdrucks gelten soll Das folgende Beispiel w hlt alle Hotels aus in denen die Verpflegung nicht Fr hst ck ist Auswahlabfragen 177 mysql gt SELECT ht_name ht_mahlzeit FROM rb_hotels gt WHERE NOT ht_mahlzeit LIKE Fr ht_name ht_mahlzeit Hotel Colosseo ohne Old Palace Hotel HP Hotel Konigin Juliana HP Die Klammern sind hier notwendig weil NOT eine hohe Priorit t besitzt und daher meist nur den unmittelbar dahinter stehenden Operanden betrifft in diesem Fall w rde also ht_mahlzeit negiert was keinen Sinn ergibt brigens k nnen Sie berall dort Klammern verwenden wo die Rangfolge von Operatoren ver ndert werden muss Ein kleines Beispiel aus der Arithmetik Punkt vor Strichrechnung mysql gt SELECT 3 5 9 3 5 9 3 5 9 3 5 9 48 72 Seit MySQL 4 0 steht der besondere Operator XOR Exklusiv Oder zur Verf gung Der verkn pfte Ausdruck ist hier nur dann wahr wenn genau ein Teilausdruck stimmt Hier also alle Hotels die entweder nur eine Dusche oder nur Fr hst ck abe
406. ow query Die vier Antworten werden nun in einer Schleife in die Datenbank geschrieben Falls dabei etwas schiefgeht wird erneut zur Fehlermeldungsseite gesprungen mysql_query INSERT INTO gw teilnahme VALUES id i antwort i if mysql_affected_rows 0 header Location error html Unter dem PHP Block befindet sich noch ein wenig HTML Code Hier wird ledig lich eine kurze Teilnahmebest tigung angezeigt PHP wird nur zur Anzeige des Benutzernamen in der berschrift verwendet lt h1 gt Vielen Dank lt php echo uname gt lt h1 gt In Beispiel 3 2 sehen Sie den vollst ndigen Code des Listings wiederum in klassi scher mysql Schreibweise Alle f r mysqli notwendigen nderungen wurden im Prinzip bereits f r das vorige beschrieben auf der CD finden Sie nat rlich trotzdem beide Versionen Beispiel 3 2 teilnahme php Benutzereingaben in die Datenbank schreiben mysql Version lt php function cgi _param feld default Variable zun chst auf Default Wert setzen var default if isset _GET feld amp amp _GET feld GET Feld gefunden var GET feld elseif isset _POST feld amp amp _PoST feld POST Feld gefunden var POST feld Ermittelten Wert zur ckgeben return var 82 Kapitel 3 Die erste Webanwendung Beispiel 3 2 teilnahme php Benutzereingaben in die Datenbank schreiben mysql Versi
407. p type help contents Abbildung 4 2 Der Kommandogeilenclient mysql und seine Hilfe unter Windows 104 Kapitel 4 Mit MySQL arbeiten Mit Ausnahme der Kurzbefehle muss jede Eingabe ob interner Befehl oder SQL Abfrage durch ein Semikolon abgeschlossen werden Dies erlaubt mehrere Anwei sungen in einer einzelnen Zeile Das folgende Beispiel w hlt zun chst die Daten bank gewinnspiel als Standard aus und zeigt anschlie end die Datens tze der Tabelle gw_fragen an mysql gt use gewinnspiel SELECT FROM gw fragen Auch die Verteilung langer Eingaben auf beliebig viele Zeilen wird unterst tzt Das nachfolgende Beispiel w hlt die Fragetexte und die jeweils richtige Antwort f r das Gewinnspiel aus mysql gt SELECT fr_frage an_text gt FROM gw_fragen gw_antworten gt WHERE fr_id an_frage AND fr_korrekt an_antwort 4442 22 24 2222242222242 fr_frage an text 4422 22 22 22 242 42 4444444444444 444 Wie hei t die Hauptstadt von Italien Rom Welche dieser Hauptst dte hie einst Lutetia Paris Bratislava ist die Hauptstadt von Slowakei Welche dieser St dte ist keine Hauptstadt Istanbul 4422 22 22 4244444444444 4 rows in set 0 00 sec Statt des abschlie enden Semikolons k nnen Sie auch die Zeichenfolge g den Befehl go verwenden Die spezielle Variante G ego sorgt dagegen f r eine andere Ausgabe Jedes Feld wird
408. p mysql com List of all MySQL commands Note that all text commands must be first on line and end with 5 N Synonym for help clear sc Clear command connect r Reconnect to the server Optional arguments are db and host delimiter d Set statement delimiter NOTE Takes the rest of the line as new ke Edit command with EDITOR NG Send command to mysql server display result vertically 5q Exit mysql Same as quit Ng Send command to mysql server ih Display this help in Disable pager print to stdout t Don t write into outfile SP Set PAGER to_pager Print the query results via PAGER kp Print current command SR Change your mysql prompt sg Quit mysql Rebuild completion hash Execute an SAL script file Takes a file name as an argument s Get status information from the server N Execute a system shell command T Set outfile to_outfile Append everything into given outfile ku Use another database Takes database name as argument SC Switch to another charset Might be needed for processing binlog with multi byte charsets Warnings WW Show warnings after every statement Inowarning w Don t show warnings after every statement For server side help type help contents Commands end with or g erver version 5 1 15 beta community nt MySQL Community Server GPL ype help or h for help Type c to clear the buffer ysql gt h
409. p nbsp lt br gt lt div align center gt lt img src logo gif width 480 height 80 alt EuroCityTravel lt div gt lt br gt lt Einfache Navigationsleiste gt len ae lt Ende der Navigationsleiste gt gt lt h2 gt Reiseauswahl lt h2 gt lt php Fehler bei der vorherigen Auswahl fehler cgi param f if fehler echo lt i gt Ein Fehler ist aufgetreten fehler lt i gt lt br gt gt lt form action ergebnis php method post gt lt table border 0 cellpadding 4 gt lt tr gt lt td valign top gt Abreiseort lt td gt lt td gt lt select name start size 1 gt lt option value 1 gt Bitte w amp auml hlen lt option gt lt php for i 0 i lt sizeof staedte i nr stnr i stadt staedte i echo lt option value nr gt stadt lt option gt n gt lt select gt lt br gt lt span style font size 10px gt Die meisten Flugangebote gehen von nach K amp ouml ln Bonn einige auch von nach Frankfurt oder D amp uuml sseldorf lt span gt lt td gt lt tr gt lt tr gt lt td gt Zielort lt td gt lt td gt lt select name ziel size 1 gt lt option value 1 gt Bitte w amp auml hlen lt option gt lt php for i 0 i lt sizeof staedte i nr stnr i stadt staedte i echo lt option value nr gt stadt lt option gt n gt Die Reiseb r
410. pe radio name wish value 2 London lt td gt lt td gt lt input type radio name wish value 3 Istanbul lt td gt lt td gt lt input type radio name wish value 4 Rom lt td gt lt tr gt lt table gt lt input type submit value Abschicken gt lt form gt lt body lt html gt v Um die objektorientierte mysqli Syntax anzuwenden m ssen Sie folgende Stellen des Listings ndern auf der beiliegenden CD ROM finden Sie auch diese Fassung sowie die PDO Variante e Verbindungsaufnahme und Datenbankauswahl Verbindungsparameter host localhost user winuser pass G3winn3n db gewinnspiel Verbindung herstellen und Datenbank ausw hlen conn new mysqli host user pass db 78 Kapitel 3 Die erste Webanwendung e Fragen aus der Datenbank lesen fr_query conn gt query SELECT fr_id fr_frage FROM gw fragen ORDER BY fr_id ASC while list fr_id fr_frage fr_query gt fetch_row e Antworten aus der Datenbank lesen an query conn gt query SELECT an antwort an text FROM gw antworten WHERE an_frage fr_id ORDER BY an antwort ASC while list an_antwort an_text an_query gt fetch_row e Datenbankverbindung schlie en conn gt close F r PHP Data Objects muss der gesamte datenbankrelevante Block modifiziert wer den Das Hauptproblem besteht darin dass f r verschachtelte Abfragen inner
411. peicherte Wert verweist Der spezielle interne Wert 0 ist F llen vorbehalten in denen kein g ltiger Inhalt ausgew hlt wurde Der Spaltentyp SET geht einen Schritt weiter Er erlaubt die Auswahl mehrerer Ele mente der Menge Intern werden die Werte als Bitfelder gespeichert Dem ersten m glichen Eintrag wird das niedrigstwertige Bit numerischer Wert 1 zugeordnet dem n chsten das zweite Bit von rechts Wert 2 dem nachfolgenden das dritte Bit 4 dem vierten 8 und so weiter Hier ein Beispiel f r m gliche Extras einer Hotel buchung wird im Praxisbeispiel dieses Buchs nicht verwendet ht_extras SET Nichtraucher Meerblick Pool Benutzung Begr ungscocktail Vegetarier Der Eintrag Nichtraucher Begr ungscocktail besitzt den internen Wert 5 bin r 01001 Meerblick Pool Benutzung Vegetarier w re dem Wert 14 10110 zuge ordnet Auch bei SET Feldern wird in der Praxis stets der Textinhalt angezeigt und zwar in Form einer durch Kommata getrennten Liste Schl ssel und Indizes In Datenbanken muss oft nach einzelnen Informationen gesucht werden Besonders in umfangreicheren Datensammlungen k nnen solche Suchl ufe allerdings ziem lich langwierig werden Die L sung besteht darin wichtige Tabellenspalten mit einem Index zu versehen Die Funktionsweise hnelt dem alphabetischen Index am Ende dieses Buchs Die in der Spalte vorkommenden Werte werden in sortierter Reihenfolge gespeichert und mit einer Referenz auf
412. piel lt php function cgi_param feld default Variable zun chst auf Default Wert setzen var default if isset _GET feld amp amp _GET feld GET Feld gefunden var GET feld elseif isset _POST feld amp amp _POST feld POST Feld gefunden var POST feld Ermittelten Wert zur ckgeben return var gt 76 Kapitel3 Die erste Webanwendung Beispiel 3 1 spiel php das Formular zur Teilnahme am Gewinnspiel Fortsetzung lt html gt lt head gt lt title gt Gewinnspiel lt title gt lt meta http equiv Content type content text html charset iso 8859 1 gt lt head gt lt body gt lt h1 gt Gewinnspiel lt h1 gt lt p gt Beantworten Sie die folgenden Fragen und gewinnen Sie eine All inclusive Wochenendreise in eine europ amp auml ische Gro szlig stadt aus unserem Angebot lt p gt lt php Wurde die Seite nach einem Eingabefehler erneut aufgerufen fehler cgi param fehler 0 if fehler gt lt p gt lt font color FF0000 gt Bitte alles vollst amp auml ndig ausf amp uuml llen lt font gt lt p gt lt php gt lt form action teilnahme php method post gt lt php Nerbindungsparameter host localhost user winuser pass G3winn3n db gewinnspiel Nerbindung zum MySOL Server herstellen conn mysql connect host user pass Daten
413. piel 3 5 auswert php Antworten berpr fen und Gewinner ziehen PDO Version Fortsetzung lt php Den Gewinner ziehen gnummer rand 0 sizeof korr teilnehmer 1 gewinner korr_teilnehmer gnummer und ausgeben gw query conn gt query SELECT tn_uname tn_ email FROM gw_teilnehmer WHERE tn_id gewinner list tn_uname tn_email gw_query gt fetch echo Gewonnen hat lt b gt tn_uname lt b gt lt a href mailto tn_email gt tn_email lt a gt Datenbankverbindung schlie en conn null catch PDOException e echo FEHLER e gt getMessage 2 gt lt body gt lt html gt Die Fehlerseite Um m gliche Fehler bei den Datenbankoperationen abzufangen wird die Fehler seite error html angezeigt Es handelt sich um ein einfaches statisches HTML Dokument dessen Code Sie in Beispiel 3 6 sehen k nnen Beispiel 3 6 error html Ausgabe bei Datenbankfehlern lt html gt lt head gt lt title gt Gewinnspiel Verarbeitungsfehler lt title gt lt head gt lt body gt lt h1 gt Gewinnspiel lt h1 gt Leider ist bei der Verarbeitung Ihrer Antworten ein unerwarteter Fehler aufgetreten lt br gt Wenn Sie m amp ouml chten k amp ouml nnen Sie es lt a href spiel php gt erneut versuchen lt a gt lt br gt lt br gt Bei einem permanenten Fehler bitten wir um eine kurze lt a href mailto webmaster test local gt Mitteilung
414. ptionen werden in Kapitel 9 MySQL Administration genauer behandelt 112 Kapitel 4 Mit MySQL arbeiten Tabelle 4 3 MySQL Optionen auf der phpMyAdmin Startseite Funktion Zeichensatz Kollation der MySQL Verbindung Neue Datenbank anlegen MySQL Laufzeit Informa tionen anzeigen MySQL System Variablen anzeigen Prozesse Zeichens tze und Kollationen Tabellenformate Die Rechte neu laden Rechte Datenbanken Exportieren Importieren Neu einloggen Kommandozeilenvariante SET NAMES CREATE DATABASE SHOW STATUS SHOW VARIABLES SHOW PROCESSLIST SHOW CHARSET SHOW COLLATION SHOW ENGINES FLUSH PRIVILEGES SHOW PRIVILEGES CREATE USER GRANT USW SHOW DATABASES Dienstprogramm mysqldump u a source mysql lt Quelldatei SELECT FROM INFILE USW CONNECT Beschreibung Stellt den Zeichensatz ein den der Client zur Kommunikation mit dem MySQL Server ver wendet Sollte mit dem meist durch die Website selbst im Browser eingestellten Zeichensatz bereinstimmen Eine neue Datenbank mit der angegebenen Kollation Sprach Sortierreihenfolge erstellen Ausf hrliche Variante der Statusanzeige In Systemvariablen gespeicherte MySQL Einstellungen und Eigenschaften anzeigen Alle aktiven Verbindungen des MySQL Servers anzeigen bersicht aller Zeichens tze und Sprach Sortierreihenfolgen Kollationen Liste aller vom aktuellen MySQL Server u
415. query conn gt query UPDATE rb_hotels SET ht_ezpreis ht_ezpreis 10 WHERE ht_nr 1 affected query gt rowCount echo affected Zeile n gedauml ndert lt br gt nderungsabfrage mit exec senden affected conn gt exec UPDATE rb hotels SET ht_ezpreis preis WHERE ht_nr 1 echo affected Zeile n gedauml ndert lt br gt Prepared Statements Wie bereits in Kapitel 7 erw hnt bietet PHP Data Objects eine eigene Schreibweise f r Prepared Statements Ihr Einsatz ist empfehlenswert wenn eine Abfrage mehr mals eingesetzt werden soll Um ein Prepared Statement zu erzeugen wird die Methode prepare verwendet Das folgende Beispiel speichert eine Auswahlab frage nach den St dten und ihren L ndern in einem Prepared Statement 242 Kapitel 8 Webanwendungen mit PHP und MySQL query conn gt prepare SELECT st name la_ name FROM rb staedte INNER JOIN rb_laender ON st_land la_nr ORDER BY la_name st_name Ein Prepared Statement wird mithilfe seiner Methode execute ausgef hrt Wenn es sich um eine Auswahlabfrage handelt k nnen die Ergebnisdatens tze anschlie Rend wie gehabt mittels fetch oder fetchAll ausgelesen werden f r das obige Beispiel etwa so query execute while row query gt fetch PDO FETCH_LAZY echo row gt st_name row gt la_name lt br gt n Noch interessanter werden Prepared Statements dadurch dass Sie Parameter einf ge
416. r Die Sprache wurde seit 1995 von Rasmus Lerdorf entwickelt Anfangs handelte es sich um eine einfache Sammlung von Makros f r automatisierte Websites Personal Homepage Tools sie wurde aber schnell zu einer vollwertigen Programmiersprache mit dem Schwerpunkt Webanwendungen ausgebaut In der aktuellen Version 5 wurde vor PHP installieren 43 allem die Objektorientierung verbessert au erdem konnte die Performance durch den neuen Interpreter Kern Zend Engine II gesteigert werden PHP ist f r allerlei Unix Varianten f r Windows sowie f r einige andere Systeme verf gbar In diesem Abschnitt wird auf die Installation unter Linux und Windows eingegangen Sie k nnen PHP entweder ber die klassische CGI Schnittstelle des Webservers betreiben oder als integriertes Webserver Modul Im Folgenden wer den beide M glichkeiten beschrieben die Modulvariante am Beispiel Apache 2 F r eine Website im praktischen Einsatz ist der Betrieb als Modul dringend zu emp fehlen da CGI umst ndlich und langsam ist Installation unter Linux Es gibt keine offiziellen PHP Binaries f r Linux und andere Unix Systeme Sofern PHP nicht Bestandteil Ihrer Systemdistribution ist oder nur in einer veralteten Ver sion mitgeliefert wurde m ssen Sie das Quellcode Paket installieren Entpacken Sie es zun chst in ein beliebiges Verzeichnis tar xzvf php 5 2 2 tar gz Die restlichen Schritte sollten Sie wie blich als root ausf hren Genau wie bei Ap
417. r NEW verf gbar bei DELETE nur OLD bei UPDATE schlie lich k nnen Sie beide Varianten einsetzen Als Beispiel sehen Sie hier einen Trigger der bei der nderung des Doppelzimmer preises eines Hotels berpr ft ob dieser immer noch h her als der eines Einzelzim mers ist Falls dies nicht mehr der Fall ist wird er automatisch auf den Einzelzimmerpreis plus 10 Euro gesetzt d CREATE TRIGGER ht _dzpreis test BEFORE UPDATE ON rb_hotels FOR EACH ROW BEGIN IF new ht_dzpreis lt new ht_ezpreis THEN SET new ht_dzpreis new ht_ezpreis 10 END IF END d Speichern Sie die Preise eines beliebigen Hotels zun chst in Variablen bevor Sie ein nderungsexperiment durchf hren Hier als Beispiel das Hotel Nummer 10 mysql gt SET ezpreis gt SELECT ht_ezpreis FROM rb_hotels WHERE ht_nr 10 mysql gt SET dzpreis gt SELECT ht_dzpreis FROM rb_hotels WHERE ht_nr 10 Trigger 213 Schauen Sie sich die bisherigen Preise an mysql gt SELECT ezpreis dzpreis ezpreis dzpreis 100 185 ndern Sie nun einfach den Einzelzimmpreis dieses Hotels mysql gt UPDATE rb_hotels SET ht_ezpreis 190 WHERE ht_nr 10 Das Auslesen der Daten zeigt dass der Trigger funktioniert hat mysql gt SELECT ht_name ht_ezpreis ht_dzpreis FROM rb_hotels gt WHERE ht_nr 10 ht_nam
418. r ap_stadt gt LIMIT 5 5 Stadt Flughafen Madrid Madrid Barajas Barcelona Barcelona El Prat Athen Athen International Amsterdam Amsterdam Schiphol Br ssel Br ssel Zaventem Wie Sie sehen wird statt des Kommas INNER JOIN zwischen die Tabellennamen in der FROM Klausel gesetzt das Join Kriterium ON ist mit dem Inhalt einer entsprechen den WHERE Klausel identisch Die Besonderheit des Inner Join ist brigens dass nur diejenigen Ergebnisse ausge w hlt werden die Daten aus beiden Tabellen enthalten Bei anderen Join Typen die seltener zum Einsatz kommen ist dies nicht der Fall Ein Left Join w hlt auf jeden Fall alle relevanten Datens tze aus derjenigen Tabelle aus die in der Abfrage links das hei t vor LEFT JOIN steht egal ob die rechte Tabelle korrespondierende Daten enth lt oder nicht Vergleichen Sie den folgenden Left Join mit einem Inner Join von rb_staedte und rb_hotels nicht f r jede Stadt sind Hotels verf gbar mysql gt SELECT st_name ht_name FROM rb_staedte LEFT JOIN rb_hotels gt ON st_nr ht_stadt ORDER BY st_name LIMIT 0 10 st_name ht_name Amsterdam Hotel Konigin Beatrix Athen Hotel Apollon Barcelona La Barca Berlin Hotel Eichenhof Br ssel Hotel Royal D
419. r die weiter oben vorgestellten Session Variablen Die Funktion db_connect ist dagegen neu Sie nimmt den Namen der gew nschten Datenbank einen Benutzernamen und ein Passwort ent gegen und liefert ein mysqli Verbindungsobjekt zur ck Der Hostname ist dagegen auf localhost festgelegt Wenn Sie m chten k nnen Sie nat rlich auch Versionen schreiben in denen mehr oder weniger dieser Parameter feststehen Ein Aufruf der vorliegenden Version sieht f r die Datenbank reisebuero und den im vorigen Abschnitt erstellten Benutzer rbuser so aus Include Datei einbinden include util inc php Verbindung zur Datenbank reisebuero herstellen conn db_ connect reisebuero rbuser R3153n Die PDO Version der Funktion wurde im Wesentlichen bereits weiter oben gezeigt wenn auch ohne variable Parameter Deshalb sehen Sie hier die passende Fassung f r die Beispielanwendung function db_connect database user pass host 127 0 0 1 try conn new PDO mysql host host dbname db user pass array PDO ATTR_PERSISTENT gt 1 PDO ATTR_ERRMODE gt PDO ERRMODE EXCEPTION catch PDOException e echo Leider ist ein Datenbank Verbindungsfehler aufgetreten lt br gt echo Fehlermeldung e gt getMessage lt br gt keine Verbindung zur ckgeben return null Nerbindung zur ckgeben return conn Die prozedurale mysql Variante gibt statt des Objekts die numerische Ver
420. r eben nicht beides anbieten mysql gt SELECT ht_name ht_bad ht_mahlzeit FROM rb_hotels gt WHERE ht_bad Dusche XOR ht_mahlzeit LIKE Fr ht_name ht_bad ht_mahlzeit Hotel Colonia Bad Fr hst c Hotel au Jardin Bad Fr hst c Hotel Colosseo Dusche ohne Queen Victoria Bad Fr hst c Hotel Cervantes Bad Fr hst c La Barca Bad Fr hst c Hotel Apollon Bad Fr hst c Hotel Royal Bad Fr hst c Hotel Solidarnosc Bad Fr hst c Haus Alpenhof Bad Fr hst c Hotel San Marco Bad Fr hst c Finnegan s Bad Fr hst c Die Verwendung des gew hnlichen OR bringt dagegen ein anderes Ergebnis da diese Abfrage auch Datens tze einschlie t in denen beides zutrifft hier auf die ers ten sechs Ergebnisse beschr nkt 178 Kapitel6 SQL Abfragen mysql gt SELECT ht_name ht_bad ht_mahlzeit FROM rb_hotels gt WHERE ht_bad Dusche OR ht_mahlzeit LIKE Fr gt LIMIT 0 6 ht_name ht_bad ht_mahlzeit Bergerhof Dusche Fr hst ck Hotel Colonia Bad Fr hst ck Hotel de la Gare Dusche Fr hst ck Hotel au Jardin Bad Fr hst ck Otel Bahar Dusche Fr hst ck Hotel Colosseo Dusche ohne Wie
421. r for config auth beziehungsweise Password for config auth Diese Option ist bequem aber verh ltnism ig unsicher Wenn Sie sie w hlen ist es besonders wichtig den phpMyAdmin Zugriff wie oben gezeigt auf Ihren Rechner oder auf das lokale Netzwerk zu beschr nken Zudem sollten Sie root auch dann nicht anmelden wenn Sie Vollzugriff auf den MySQL Server ben tigen Erzeugen Sie stattdessen gem der Anleitung in Kapitel 9 einen neuen MySQL Benutzer mit den gew nschten Rechten und tra gen Sie seinen Usernamen und sein Passwort ein http Diese Option zeigt beim ersten ffnen von phpMyAdmin innerhalb einer Sit zung den Authentifizierungsdialog des Browsers an Hier k nnen Sie jedes Mal einen anderen MySQL User und sein Passwort eingeben Diese Variante ben tigt ein separates MySQL Benutzerkonto das Usernamen und Passw rter nach schlagen darf siehe unten cookie Funktioniert im Prinzip wie der Modus http Intern werden die Anmeldedaten allerdings in einem Cookie siehe Kapitel 8 gespeichert was unter anderem ein echtes Abmelden erm glicht signon Dieser in Version 2 10 neu eingef hrte Modus verl sst sich darauf dass sich eine andere Webanwendung um die Anmeldung k mmert Sie m ssen einen Sessionnamen angeben den sich phpMyAdmin mit dieser Anwendung teilt Wenn Sie den Typ config gew hlt haben m ssen Sie unter User for config auth den Benutzernamen und unter Password for config auth das Passwort des MySQL Benut
422. r obigen identisch so dass das Ergebnis hier nicht noch einmal dargestellt zu werden braucht SELECT FROM suppe JOIN hauptgericht JOIN nachtisch SELECT FROM suppe CROSS JOIN hauptgericht CROSS JOIN nachtisch Normalerweise ist dieses Verhalten aber nicht w nschenswert beispielsweise m chten Sie sicher nicht jede Stadt mit jedem Flughafen kombinieren sondern lediglich wissen in welchen St dten sich die einzelnen Flugh fen befinden Zu die sem Zweck wird ein sogenannter Inner Join der gew nschten Spalten durchgef hrt f r das genannte Beispiel wird die Stadtnummer in rb_airports mit dem Prim r schl ssel von rb_staedte verkn pft Das l sst sich entweder mithilfe einer WHERE Klausel oder durch ein explizites INNER JOIN ausdr cken Hier zun chst die WHERE Schreibweise 180 Kapitel 6 SQL Abfragen mysql gt SELECT st_name AS Stadt ap_name AS Flughafen gt FROM rb_staedte rb_airports gt WHERE st_nr ap_stadt gt LIMIT 0 5 Stadt Flughafen K ln K ln Bonn Airport Paris Paris Charles de Gaulle Istanbul Istanbul Atat rk Rom Roma Fiumicino London London Heathrow Airport Und das sind die n chsten f nf Flugh fen in INNER JOIN Syntax mysql gt SELECT st_name AS Stadt ap_name AS Flughafen gt FROM rb_staedte INNER JOIN rb_airports gt ON st_n
423. r wichtigsten Status und Systemvariablen in einer bersichtlichen Baumstruktur angezeigt Server Logs erm glicht eine grafisch unterst tzte Untersuchung der MySQL Logdateien Replication Status zeigt s mtliche Replikationseinstellungen in einer tabellari schen bersicht an 326 Anhang C Weitere Clients e Backup dient der Datensicherung Ihrer MySQL Datenbanken Auf der Register karte Backup Project k nnen Sie zun chst beliebige Sicherungseinstellungen zu Projekten zusammenfassen und gegebenenfalls manuell ausf hren Advanced Options dient der Auswahl der genauen Backup Methode Unter Schedule kann schlie lich ein Zeitplan f r die automatische Ausf hrung der Backup Projekte festgelegt werden e Restore erm glicht die Wiederherstellung eines Backups im Fall eines Fehlers oder Datenverlusts e Catalogs zeigt zun chst s mtliche Datenbanken an Sobald Sie eine ausw hlen werden ihre Tabellen gezeigt Anschlie end k nnen Sie die Datenstruktur und die Optionen der jeweiligen Tabelle modifizieren MySQL Query Browser Der MySQL Query Browser stammt ebenfalls von den MySQL Entwicklern Seine Hauptaufgabe ist das komfortable Erstellen und Ausf hren beliebiger SQL Abfra gen hier geht es also um die Verwaltung der Datenbanken selbst Auch der Query Browser verlangt beim Start eine Anmeldung Anschlie end wird das Hauptfenster des Programms angezeigt Das Feld im oberen Bereich dient der Eingabe einer SQL Abfrage die
424. ra ht_nr int 11 PRI o ht_name varchar 70 YES NULL ht_stadt int 11 0 ht_ezpreis int 11 0 ht_dzpreis int 11 0 ht_bad enum ohne ohne ht_mahlzeit enum ohne ohne ht_lang set de en YES NULL ht_anschrift varchar 100 ht_url varchar 50 196 Kapitel6 SQL Abfragen Zum L schen von Spalten wird DROP COLUMN eingesetzt Sie brauchen lediglich den Spaltennamen anzugeben Das folgende Beispiel l scht die soeben erstellte Spalte ht_lang wieder ALTER TABLE rb_hotels2 DROP COLUMN ht_lang AN DROP COLUMN l scht eine Spalte auch dann gnadenlos wenn sie Daten enth lt Um die diversen Eigenschaften einer Spalte zu modifizieren wird CHANGE COLUMN ver wendet Sie k nnen den Namen den Datentyp und die Optionen sowie die Position in der Tabelle ndern Dabei wird stets die gesamte Definition samt neuem Namen angegeben optional ist nur die Positionsangabe FIRST beziehungsweise AFTER Spal tenname Das folgende Beispiel benennt ht_anschrift in ht_adresse um ALTER TABLE rb_hotels2 CHANGE COLUMN ht_anschrift ht_adresse VARCHAR 100 Hier ein Beispiel f r eine Typ nderung ht_name soll von 60 auf 70 zul ssige Zei chen verl ngert werden ALTER TABLE rb_hotels2 CHANGE COLUMN ht_name ht_name VARCHAR 70 Passen Sie bei Typ nderungen auf Wenn der neu
425. rch fal sche Eingaben oder unvollst ndige Aktualisierungen unterschiedliche Werte annehmen das ist die gef rchtete Inkonsistenz Deshalb wird in korrekt entworfe nen relationalen Datenbanken daf r gesorgt dass alle Informationen nur je einmal gespeichert und gegebenenfalls durch Schl ssel miteinander verkn pft werden Die Normalisierung ist eine Art Modellierungsanleitung f r relationale Datenbanken deren strenge Regeln das Auftreten von Inkonsistenzen jeglicher Art verhindern Es gibt insgesamt sechs sogenannte Normalformen NF denen Datenbanktabellen ent sprechen sollten Jede dieser Regeln ist strenger als die vorherige wenn Sie sie der Reihe nach einhalten erhalten Sie eine korrekt modellierte relationale Datenbank Erste Normalform Die erste Normalform 1NF fordert dass jedes Feld einer Tabelle atomar ist also eine nicht mehr weiter zerlegbare Einzelinformation enth lt Soll eine Tabelle bei spielsweise die Namen von Kunden enthalten kommt es zu Problemen wenn Sie Vor und Nachnamen in einer gemeinsamen Spalte speichern Wird die nat rliche Namensreihenfolge verwendet also beispielsweise Peter Schmitz kann die Spalte nicht mehr nach dem Nachnamen sortiert werden die umgekehrte Reihenfolge 132 Kapitel 5 Datenbanken entwerfen und erstellen Schmitz Peter verhindert dagegen die normale Verwendung der Namen Die L sung liegt nat rlich darin die Namen in zwei verschiedenen Spalten f r Vor und Nachnamen abzule
426. ressant ist zudem die Option xml Sie gibt die Datenbank und ihre Tabellen nicht im SQL Format sondern als wohlgeformtes XML Dokument aus Das er ff net v llig neue Weiterverarbeitungsm glichkeiten durch die zahlreichen XML APIs moderner Programmiersprachen N heres ber das XML Format und seine Anwendung erfahren Sie beispielsweise in der Onlinefassung des XML Kapitels meines Buchs Kompendium der Informationstechnik unter http www galileocompu ting de openbook kit itkomp15000 htm Daten die mittels mysqldump als SQL exportiert wurden lassen sich mithilfe der Anweisung SOURCE im Kommandozeilenclient mysql einlesen zum Beispiel mysql gt reisebuero sql des sp teren Imports mithilfe der MySQL Anweisung SOURCE geh ren Datensicherung und wiederherstellung Backup und Restore Sie sollten Ihre Datenbanken und Tabellen regelm ig auf externe Datentr ger sichern um Datenverlusten etwa durch Hardware sch den Virenbefall oder Crackerangriffe vorzubeugen Dabei k nnen Sie im Prinzip genau so vorgehen wie beschrieben In der Praxis ben tigen Sie vor der Datensicherung allerdings zus tzliche LOCK und FLUSH Anweisungen um die Tabellen vor bergehend zu sperren beziehungsweise im Arbeitsspeicher befindliche Daten auf die Datentr ger zu schreiben N heres zu diesem Thema finden Sie in Abschnitt 5 8 1 Database Backups in der MySQL Onlinedoku mentation http dev mysql com doc mysql en backup htm u Mit z
427. rf gung CHAR und VAR CHAR Der Hauptunterschied CHAR Felder besitzen eine festgelegte L nge die gegebenenfalls durch Leerzeichen aufgef llt wird w hrend VARCHAR Spalten eine variable Gr e bis zur festgelegten Maximall nge besitzen je nach festgelegter H chstl nge werden ein bis zwei zus tzliche Zeichen zur Speicherung der aktuellen L nge ben tigt Aufgrund dieser Tatsache werden CHAR Felder etwas schneller ver arbeitet VARCHAR verbraucht dagegen effektiv weniger Speicher Bei der Definition beider Typen wird die Angabe einer L nge in Zeichen erwartet Beispiele CHAR 10 oder VARCHAR 50 CHAR 10 besitzt eine feste L nge von zehn Zeichen w hrend in VARCHAR 50 maximal 50 Zeichen hineinpassen CHAR Felder k nnen eine L nge zwischen 0 und 255 besitzen Wenn Sie die L ngenangabe weg lassen wird automatisch CHAR 1 eingestellt Die maximale L nge von VARCHAR Fel dern konnte bisher ebenfalls 255 Zeichen betragen seit MySQL 5 0 3 sind dagegen 65 535 Zeichen m glich N Wenn statt Textdaten kurze Bin rinformationen nicht unbedingt Zahlen sondern allgemeine bin re Datenbl cke gespeichert werden sollen stellt MySQL seit Version 4 1 die speziellen Datentypen BINARY und VARBINARY zur Verf gung Die Eigenschaften entsprechen CHAR beziehungsweise VARCHAR Die Ma einheit f r L ngenangaben ist hier allerdings Bytes statt Zeichen die je nach Zeichensatz mitun ter aus mehreren Bytes bestehen zudem werden s
428. richtigen Antwort 64 Kapitel 3 Die erste Webanwendung ber die Spielteilnehmer selbst werden folgende Informationen gespeichert e Benutzername e E Mail Adresse e bevorzugte Stadt Die Antworten der einzelnen Benutzer lassen sich mithilfe der folgenden Daten abspeichern e Benutzernummer e Fragenummer e Nummer der gew hlten Antwort Die Teilnehmerinformationen sowie die gegebenen Antworten bilden nat rlicher weise je eine Tabelle Die Fragen und Antworten selbst lassen sich dagegen nicht redundanzfrei in einer gemeinsamen Tabelle speichern weil eine Frage je drei m g liche Antworten besitzt Nat rlich k nnte man drei Spalten f r die drei Antworten jeder Frage anlegen zum Beispiel antwortl antwort2 und antwort3 Gem dem strengen Standard f r relationale Datenbanken den in Kapitel 5 besprochenen Normalisierungsregeln geh ren mehrere gleichartige Informationen aber nicht in einen Datensatz F r ein sauberes Datenbankdesign geh ren die Antworten also in eine separate Tabelle mit folgenden Spalten e Fragenummer e Antwortnummer e Antworttext Diese Tabelle enth lt demnach pro Frage drei Datens tze mit den verschiedenen Antwortm glichkeiten Die Tabelle mit den Fragen selbst wird dagegen folgende Daten enthalten e Fragenummer e Fragetext e Antwortnummer der korrekten Antwort Abbildung 3 1 stellt die Abh ngigkeiten zwischen den geplanten Tabellen ber sichtlich dar
429. rma en aus while list land hauptstadt kontinent mysql _fetch row result Werte anzeigen mysqli tut sinngem dasselbe verwendet allerdings die Methode fetch_row des query Objekts while list land hauptstadt kontinent result gt fetch_row Werte anzeigen PHP installieren 51 Bei PDO hei t die zust ndige Methode einfach fetch sie hat zus tzliche F hig keiten erledigt die hier geforderte Aufgabe aber genauso while list land hauptstadt kontinent result gt fetch Werte anzeigen An einem Punkt Ihres Skripts an dem Sie die Datenbankverbindung nicht mehr brauchen sollten Sie sie schlie en Auch dies funktioniert je nach Schnittstelle unterschiedlich mysql mysql_close mysqli conn gt close PDO conn null Beispiel 2 1 enth lt das gesamte Skript in mysql Syntax in Beispiel 2 2 sehen Sie dasselbe Programm in objektorientierter mysqli Syntax und in Beispiel 2 3 noch einmal mit PDO Abbildung 2 1 zeigt wie das Ergebnis im Browser aussieht Mehr Einzelheiten ber PHP erfahren Sie in den nachfolgenden Kapiteln Beispiel 2 1 laender_mysql php eine SQL Abfrage auslesen und als HTML Tabelle anzeigen lt html gt lt head gt lt title gt Einfache MySQL Abfrage mit PHP mysqli Version lt title gt lt head gt lt body gt lt h1 gt Einige L amp auml nder ihre Hauptst amp auml dte und Kontinente lt h1 gt lt t
430. rmitteln Bei der Installation in usr local apache2 mit dem Standardlayout Apache handelt es sich um das Verzeichnis usr local apache2 conf Unter Windows befindet sich die Datei im Verzeichnis lt Apache Basisverzeichnis gt conf bei einer Standardinstallation also unter C Programme Apache Software Foundation Apache2 2 conf Die Konfigurationsdatei besteht aus zahlreichen Konfigurationseinstellungen den Direktiven Die meisten von ihnen werden in der Datei selbst durch Kommentare beschrieben ein Kommentar ist jede Zeile die mit anf ngt Eine deutschspra chige Referenz aller Direktiven finden Sie im offiziellen Apache Manual http httpd apache org docs 2 2 de das normalerweise mit Apache auf Ihrem Rechner installiert wird Im Folgenden werden nur einige der wichtigsten Direktiven im berblick vorge stellt und zwar in der Reihenfolge in der sie in der Standardkonfigurationsdatei einer Apache Neuinstallation auftreten Beachten Sie dass es noch weitere wichtige Einstellungen gibt diese betreffen allerdings die Sicherheit und Stabilit t des Ser vers so dass Sie die Voreinstellungen beibehalten sollten falls Sie nicht ganz genau wissen was Sie tun 28 Kapitel 2 Installation und Inbetriebnahme unter Windows den Unix Slash als Trennzeichen benutzen m s u sen Zudem m ssen Pfade und andere Werte in Anf hrungszeichen stehen sofern sie Leerzeichen enthalten u Die Werte vieler Direktiven sind Pfade Beacht
431. rs zum Beispiel www test local Die Adminis trator s E Mail Address wird angegeben damit Benutzer Ihnen bei Fehlern eine entsprechende Mitteilung senden k nnen normalerweise wird daf r die Adresse webmaster lt Ihre Domain gt verwendet Als Letztes m ssen Sie aus w hlen ob Apache als automatisch startender Produktionsserver For All Users on Port 80 as a Service oder als manuell zu startendes Testprogramm only for the Current User on Port 8080 when started Manually installiert werden soll Selbst f r lokale Testzwecke lohnt sich Ersteres der Dienst verbraucht kaum Ressourcen und kann leicht gegen Zugriffe von au en gesch tzt werden siehe unten 5 Nun m ssen Sie die Vollst ndigkeit der Installation ausw hlen Typical instal liert die wichtigsten Komponenten mit Custom k nnen Sie weitere Elemente ausw hlen Sie sollten auf jeden Fall Custom einstellen da Sie nur so den Instal lationsort bestimmen k nnen 6 Diese Dialogseite wird nur angezeigt wenn Sie im vorigen Schritt Custom gew hlt haben Oben sehen Sie in einer Baumansicht die Bestandteile der Installation Wenn gen gend Festplattenspeicher zur Verf gung steht etwa 100 MByte sollten Sie einfach den obersten Eintrag anklicken und This Fea ture and all subfeatures will be installed on local hard drive w hlen andernfalls k nnen Sie beispielsweise die Dokumentation weglassen Unten k nnen Sie das Installationsverzeichnis w hlen voreingestellt ist Apa
432. rwenden sollten sooft dies m glich ist Nach jeder nderung an den Benutzerrechten sollten Sie noch folgende Anweisung ausf hren damit diese Rechte auch sofort wirksam werden FLUSH PRIVILEGES Benutzerverwaltung in phpMyAdmin Der webbasierte Client phpMyAdmin erm glicht ebenfalls die Verwaltung von Benutzerrechten nat rlich muss auch Ihr phpMyAdmin Benutzerkonto dazu ber die GRANT Berechtigung verf gen Klicken Sie zur Benutzerverwaltung auf den Link Rechte auf der Startseite Zun chst gelangen Sie zu einer bersicht ber alle existie renden Benutzer und ihre bestehenden Rechte siehe Abbildung 9 1 Um die Rechte eines Benutzers zu ndern m ssen Sie den jeweiligen Link zum Bearbeiten ganz rechts anklicken Benutzerverwaltung 287 Unter der Liste finden Sie einen Link um einen neuen Benutzer anzulegen Darun ter befinden sich mehrere verschieden gr ndliche L schoptionen die sich auf die zuvor angekreuzten Benutzer beziehen localhost localhost phpMyAdmin 2 10 0 rc1 Mozilla Firefox Datei Bearbeiten Ansicht Chronik Lesezeichen Yahoo Extras Hilfe zi E an E gt E 0 Me Erste Schritte E Aktuelle Nachrichten PhpyAd nin Server localhost A gQ Datenbanken SAL Status Variablen Zeichens tze Formate Rechte Prozesse Exportieren Blmportieren Datenbank Datenbanken y amp Benutzer bersicht Bitte Date
433. rzeu gen und die Seite im Browser neu zu laden Wenn die Fehlermeldung weg ist haben Sie es geschafft Andernfalls m ssen Sie auch hier die Berechtigung ndern Rufen Sie dazu als Erstes den Task Manager auf Rechtsklick auf eine leere Stelle in der Taskleiste und Task Manager w hlen Wechseln Sie auf die Registerkarte und ermitteln Sie unter welchem Benutzernamen der Webserver httpd exe l uft meist SYSTEM Wechseln Sie ins phpMyAdmin Verzeichnis und geben Sie folgende Anweisung ein SYSTEM gegebenenfalls durch den gefundenen Usernamen ersetzen gt cacls config e t g SYSTEM F 58 Kapitel 2 Installation und Inbetriebnahme Ein anschlie ender Reload m sste die Fehlermeldung auf beiden Systemplattfor men verschwinden lassen so dass Sie bereit sind die Konfiguration zu ndern Kli cken Sie dazu unter Servers zun chst auf Add Das Formular aus Abbildung 2 4 wird angezeigt phpMyAdmin 2 10 0 rc1 setup Mozilla Firefox Datei Bearbeiten Ansicht Chronik Lesezeichen Yahoo Extras Hilfe RR hetpiilocahost phpmyadminfsriptsfsetup php phpMyAdmin 2 10 0 rcl setup Autodetected MySQL extension to use mysqli Confgure server Enter new server connection parameters Server hostname localhost Server port Server socket Connectiontype tp E PHP extensiontouse mysqli W C Compress connection Authentication type config User for config auth root Password for config auth
434. s allgemeines Stylesheet e logo gif das Logo des Reiseb ros Bevor die Beispiele selbst behandelt werden sollen drei wichtige Funktionen verall gemeinert und ausgelagert werden das Auslesen von Formular und Sessiondaten sowie das Herstellen einer Datenbankverbindung Mithilfe der PHP Funktion include k nnen Sie n mlich zus tzliche PHP Dateien einbetten Diese werden blicherweise durch die doppelte Dateiendung inc php gekennzeichnet Auch innerhalb solcher Include Dateien m ssen PHP Anweisungen in lt php gt Bl cken stehen Die vollst ndige Datei util inc php auf die sich alle hier abgedruckten Skripten beziehen hat in der mysqli Version folgenden Inhalt lt php function cgi_param feld default var default if isset _GET feld amp amp _GET feld var GET feld elseif isset _POST feld amp amp _PoST feld var POST feld return var function session param feld default var default F isset _SESSION feld 84 SESSION feld var SESSION feld return var function db_connect database user pass host 127 0 0 1 conn new mysqli host user pass database return conn TS Die Reiseb ro Anwendung 257 Der n tzliche Formulardatenleser cgi_param wurde bereits in Kapitel 3 vorge stellt session_param erledigt die gleiche Aufgabe f
435. s 4U 166 Kapitel6 SQL Abfragen Vergleichsoperatoren Tabelle 6 1 zeigt eine bersicht der SQL Vergleichsoperatoren In der Spalte Bedeutung stehen Op1 und Op2 f r die beiden Operanden zu vergleichenden Werte und zwar von links nach rechts gelesen Tabelle 6 1 Die MySQL Vergleichsoperatoren Operator Name Bedeutung gleich wahr wenn 0p7 und 0p2 identisch sind oder lt gt ungleich wahr wenn 0p7 und 0p2 verschieden sind lt kleiner als wahr wenn 0p1 einen niedrigeren Wert als 0p2 hat gt gr er als wahr wenn 0p7 einen h heren Wert als 0p2 hat lt kleiner oder gleich wahr wenn 0p7 einen niedrigeren oder denselben Wert wie 0p2 hat gt gr er oder gleich wahr wenn 0p7 einen h heren oder denselben Wert wie 0p2 hat lt gt NULL sicheres Gleich wie behandelt aber auch NUL L Werte korrekt F r numerische Werte d rfte die Funktionsweise der Vergleichsoperatoren offen sichtlich sein Wie Sie aus der Mathematik wissen gelten die Ausdr cke 1 4 1 lt 1 und 2 gt 2 als wahr Dagegen sind 3 4 4 lt 4 oder 3 gt 7 falsche Aussagen Wenn Sie Vergleichsoperationen in einer WHERE Klausel einsetzen w hlt MySQL nur diejenigen Datens tze aus f r die der Vergleich eine wahre Aussage ergibt Das folgende Beispiel w hlt die Namen und K rzel der ersten vier Fluggesellschaften aus mysql gt SELECT ai_name ai_kuerzel FROM rb_airlines gt WHERE a
436. s Tabellenformat k nnen Sie auf Standard stehen lassen ergibt unter Unix MyISAM und unter Windows InnoDB Wenn Sie m chten k nnen Sie aber auch explizit MyISAM w hlen da f r diese Tabelle keine Transaktionen vorgesehen sind Zus tzlich k nnen Sie einen beliebigen Kommentar f r die Tabelle eingeben sowie eine Kollation ausw hlen Letzteres ist hier nicht erforderlich da die Kolla tion der Datenbank automatisch f r alle Tabellen gilt die keine eigene Einstellung besitzen Klicken Sie zum Schluss auf Speichern um die Einstellungen zu akzeptie ren Es erscheint die Strukturseite der Tabelle zus tzlich wird die soeben ausge f hrte SQL Abfrage zur Tabellenerstellung angezeigt Sie sieht wie folgt aus im n chsten Kapitel werden Tabellenerstellungsabfragen erl utert CREATE TABLE pr_angebote an id INT NOT NULL AUTO INCREMENT PRIMARY KEY an name VARCHAR 40 NOT NULL an preis INT NOT NULL INDEX an name ENGINE innodb Der letzte Schritt besteht nat rlich darin Datens tze in die Tabelle einzuf gen Die klassische Methode ist die manuelle Eingabe Klicken Sie dazu auf den Link Einf gen am oberen Fensterrand Es erscheint eine Eingabeseite wie in Abbildung 4 11 Hier k nnen Sie jeweils einen Datensatz eingeben nach Entfernen der Auswahl Ignorieren geschieht automatisch sobald Sie im unteren Bereich etwas eingeben auch zwei Wenn die Eingabe beendet ist k nnen Sie sich aussuchen ob S
437. s der Zugriff jedoch ber das Internet erfolgen soll und die beteiligten Rechner dynamisch vom Provider vergebene IP Adressen besit zen geht es mitunter nicht anders Wann immer m glich sollten Sie den Userna men f r jeden konkreten Host von dem er zugreifen kann separat anlegen Das folgende Beispiel erstellt einen neuen Benutzer namens rbadmin mit dem Pass wort v3rr3153n der vom lokalen Rechner aus zugreifen darf CREATE USER rbadmin localhost IDENTIFIED BY v3rr3153n Um einen Benutzer umzubenennen wird RENAME USER verwendet Die folgende Anweisung benennt den soeben erstellten Benutzer rbadmin in rbverwalter um RENAME USER rbadmin TO rbverwalter localhost Zu guter Letzt k nnen Sie DROP USER verwenden um einen Benutzer vollst ndig zu l schen zum Beispiel DROP USER rbverwalter localhost MySQL Versionen vor 5 0 kennen die CREATE USER Syntax nicht Um hier einen neuen Benutzer anzulegen wird stattdessen folgende Anweisung verwendet GRANT USAGE ON TO Benutzer Host IDENTIFIED BY Passwort 284 Kapitel 9 MySQL Administration Das Benutzerrecht USAGE bedeutet dass der betreffende User sich berhaupt am MySQL Server anmelden darf konkrete Berechtigungen an Datenbanken besitzt er damit noch nicht Um Benutzerrechte zu verwalten wird die Anweisung GRANT verwendet Sie erteilt dem angegebenen Benutzer eine bestimmte Berechtigung an der angegebenen Datenbank beziehungsweise Tabelle Ihre grundlegende S
438. s werden die Nummern s mtlicher Teilnehmer in einem weiteren Array namens teilnehmer gespeichert um ihre Antworten danach in einer Schleife ber pr fen zu k nnen tn_query mysql query SELECT tn_id FROM gw teilnehmer teilnehmer array while list tn_id mysql_fetch row tn_query array push teilnehmer tn_id Mithilfe der soeben erstellten Liste werden die Antworten s mtlicher Teilnehmer berpr ft Die Nummern derjenigen die korrekt geantwortet haben werden in einem weiteren Array mit der Bezeichnung korr_teilnehmer gespeichert Die berpr fung erfolgt nach dem weiter oben beim Einlesen der Formulardaten demonstrierten Schema Die Variable richtig wird zun chst auf 1 gesetzt womit angenommen wird dass alles richtig sei Sobald eine falsche Antwort gefunden wird erh lt die Variable den Wert 0 Hier der entsprechende Codeblock korr_teilnehmer array foreach teilnehmer as tn_id Nermutung Alles richtig richtig 1 Alle Antworten des Teilnehmers durchlaufen tl_query mysql_query SELECT tl_frag tl_antw FROM gw teilnahme WHERE tl tln tn_id ORDER BY tl_frag ASC for i 0 list tl_frag tl_antw mysql_fetch_row tl_query i Falsche Antwort if tl_antw korrekt i Also nicht alles richtig richtig 0 DiePHP Skripten 87 Die beiden Schleifenkonstrukte sollten Sie sich etwas n her anschauen Eine for each Schleife durchl u
439. schlie end wird die DBI Methode connect aufgerufen um ein Verbindungsob jekt zu erstellen Sie ben tigt drei Argumente gem dem folgenden Schema my conn DBI connect dbi mysql Datenbank Host username passwort Hier ein Beispiel das mit den aus Kapitel 8 bekannten Anmeldedaten eine Verbin dung zur Datenbank reisebuero herstellt my conn DBI gt connect dbi mysql reisebuero localhost rbuser R3153n Abfragen werden zun chst mithilfe der Methode prepare vorbereitet und anschlie end mit execute ausgef hrt Die Syntax sieht wie folgt aus my query conn gt prepare querytext query gt execute 309 Das folgende Beispiel w hlt alle Felder aller Hotels aus my query conn gt prepare SELECT FROM rb_hotels query gt execute Mithilfe der Methode query gt fetchrow array k nnen Sie die Daten dann in einer while Schleife auslesen Zu guter Letzt k nnen Sie die Methode disconnect aufru fen um die Verbindung zu beenden Hier ein kleines vollst ndiges Beispiel das die Hotels sowie die St dte in denen sie sich befinden sortiert auf der Konsole ausgibt usr bin perl w use strict use DBI my conn DBI gt connect dbi mysql reisebuero localhost rbuser R3153n my querytext lt lt ENDSOL SELECT ht_name st_name FROM rb hotels INNER JOIN rb_staedte ON ht_stadt st_nr ORDER BY st_name ASC ht_name ASC ENDSOL my query conn
440. se lassen sich die Funk tionen mysql i _fetch row beziehungsweise mysql i _fetch array einfach in der Bedingung einer while Schleife verwenden so dass die Schleife automatisch f r jede Ergebniszeile ausgef hrt wird Die MySQL SchnittstelleninpHP 231 Hier zun chst die mysql Fassung mit mysql_fetch_row diese Funktion liefert den Datensatz als durchnummeriertes Array zur ck Die beraus praktische PHP Funk tion list b ndelt eine Gruppe von Variablen um ihnen nacheinander die Ele mente eines Arrays als Werte zuzuweisen while list hotel ezpreis dzpreis stadt mysql fetch_row query echo lt tr gt n echo lt td gt hotel lt td gt n echo lt td align right gt ezpreis amp euro lt td gt n echo lt td align right gt dzpreis amp euro lt td gt n echo lt td stadt lt td gt n echo lt tr gt n Wie Sie sehen werden die einzelnen Feldinhalte als Zeile einer weiter oben im Dokument gestarteten HTML Tabelle ausgegeben Auch mysqli besitzt eine fetch_row Methode die entsprechende Zeile die while Bedingung sieht hier wie folgt aus while list hotel ezpreis dzpreis stadt query gt fetch_row Ausgabe siehe oben mysql_fetch_array liefert den Datensatz ebenfalls als Array allerdings sind die Indizes hier die Spaltennamen aus der Abfrage Damit k nnten Sie die Schleife auch folgenderma en schreiben while r
441. sel der aus mehreren Fel dern zusammengesetzt ist kann die BCNF verletzen wenn der Wert eines Felds nicht vom gesamten Prim rschl ssel sondern nur von einem seiner Felder abh ngt Die Boyce Codd Normalform l sst sich herstellen indem diese Tabelle in zwei ein zelne Tabellen aufgeteilt wird in denen jeweils eines der Felder den Prim rschl ssel bildet Vierte Normalform Die vierte Normalform 4NF k mmert sich um mehrwertige Abh ngigkeiten multi valued dependencies bei denen eine Beziehung zwischen verschiedenen Informa tionen nicht so in zwei Tabellen unterteilt werden kann dass eine 1 n oder die umgekehrte n 1 Relation entsteht Ein Beispiel In einer zweispaltigen Tabelle werden durch einen Fremdschl ssel Per sonen referenziert und in der zweiten Spalte durch einen weiteren Fremdschl ssel die von diesen Personen gebuchten Fl ge Da eine Person mehrere Fl ge buchen kann kann sowohl jede Person als auch jeder Flug mehrmals vorkommen Die fol gende Tabelle konkretisiert den Sachverhalt indem sie die Schl sselnummern durch Textwerte darstellt buch_nr person flug 1 Schmitz K ln Paris 2 M ller K ln Paris 3 Schmitz K ln London 4 Huber Frankfurt Madrid Angenommen es kommt eine weitere Spalte mit Extras einzelner Reisebuchungen hinzu etwa ein Spezia
442. servern folgende Eintr ge die allen Hosts den Zugriff gew hren Order Allow Deny Allow from all In einer reinen Testumgebung sollten Sie die Zugriffe allerdings auf den Rech ner selbst 127 0 0 1 beziehungsweise auf das lokale Netzwerk beschr nken DirectoryIndex Diese Direktive bestimmt welche Dateien als Indexdokumente oder Startsei ten gelten sollen Wenn ein Benutzer ein Verzeichnis aber keine bestimmte Datei anfordert sucht Apache automatisch nach Dateien mit den hier angege benen Namen die erste gefundene Datei wird ausgeliefert Die Voreinstellung ist index html auf einem PHP f higen Webserver empfiehlt sich dagegen DirectoryIndex index html index php Falls Sie die Dateiendung htm statt html bevorzugen k nnen Sie auch index htm hinzuf gen Gegebenenfalls sind andere Namen als index ebenfalls m g lich etwa start home oder default Was passiert wenn im angesprochenen Verzeichnis gar keine Indexseite gefun den wird h ngt von weiteren Einstellungen ab Sofern die Option Indexes siehe oben gesetzt ist generiert Apache selbst einen Verzeichnisindex Andernfalls wird die Statusmeldung 404 Seite nicht gefunden an den Client gesendet Alias Die Direktive Alias ordnet einem Verzeichnis au erhalb der DocumentRoot einen URL Pfad zu Auf diese Weise k nnen Sie ber den Webserver auch Dateien ver ffentlichen die aus organisatorischen Gr nden oder aus Sicherheitserw gungen nicht im eigentlichen W
443. setzen document formular q focus else Es wurde etwas eingegeben Formular abschicken document formular submit lt script gt lt head gt lt body gt lt form name formular action http www google de search method GET gt lt input type text name q gt lt input type button value Google Suche onclick testForm gt lt form gt lt body gt lt html gt Wenn Sie dieses Skript ausf hren und den Button Google Suche anklicken ohne etwas einzugeben erscheint ein alert Anschlie end wird der Cursor automa tisch in das Textfeld gesetzt was Sie aus Gr nden der Benutzerfreundlichkeit bei jeder Formular berpr fung veranlassen sollten Damit das Formular nicht in jedem Fall versandt wird ist die Schaltfl che kein Submit Button sondern ein einfacher Button Sofern das Textfeld doch einen Inhalt besitzt wird die Formular Methode submit aufgerufen um das Formular per JavaScript zu versenden Das Skript zeigt zus tzlich die einfachste M glichkeit auf Formulare und ihre Ele mente zuzugreifen Wenn Sie ihnen jeweils ein name Attribut zuweisen k nnen Sie sie in der Form document Formularname Elementname ansprechen Auf diese Weise stehen Ihnen ihre Eigenschaften zum Beispiel value f r den Inhalt eines Textfelds und Methoden wie etwa Textfeld focus oder Formular submit zur Verf gung Der Zugriff auf andere Bestandteile des Dokuments ist nicht ganz so einfach wie
444. sf hrlich alle wichtigen Aspekte der PHP Program mierung vor Webressourcen Die nachfolgende kleine Auswahl von Websites bietet weitere n tzliche Informa tionen und zus tzliche Tools zu den verschiedenen Themen dieses Buchs Da Web adressen oft schnell veralten wird diese Liste auf der Website zum Buch jeweils aktualisiert und erweitert die Adresse der Linkseite lautet http buecher lingo world de mysgql links php MySQL PHP und Apache http www mysql com Website der MySQL AB der Firma der MySQL Entwickler Hier k nnen Sie jeweils die neueste MySQL Version herunterladen und erhalten weitere Informationen http www mysql de Die deutschsprachige Website der MySQL AB http dev mysql com doc mysql de Die deutschsprachige Onlinedokumentation des MySQL Datenbankservers http dev mysql com doc mysql en Die englische Version der Dokumentation F r alle die dieser Sprache m chtig sind ist sie zu bevorzugen da sie jeweils aktueller ist als die bersetzungen http www phpmyadmin net Homepage des phpMyAdmin Projekts mit verschiedenen Informationen der Onlinedokumentation und anderen Ressourcen http www php net Website des PHP Projekts Hier k nnen Sie die verschiedenen PHP Versionen herunterladen die Dokumentation lesen oder herunterladen und finden zudem Kontakt zu PHP Usergruppen in aller Welt http httpd apache org Die Site des Apache HTTP Servers Wie blich werden auch hier Downloads Dok
445. sischen Windows INI Dateien angepasst daraus resultieren folgende Regeln e Abschnitte werden durch Schl sselw rter in eckigen Klammern eingeleitet zum Beispiel PHP e Die Direktiven haben das Format Name Wert zum Beispiel doc_root usr local apache2 htdocs Beachten Sie in diesem Zusammenhang dass Windows anders als in der Apa che Konfiguration den plattformtypischen Backslash und nicht den Unix Slash als Pfadtrennzeichen verwendet e Der Rest einer Zeile hinter einem Semikolon ist ein Kommentar Beispiele doc_root Die DocumentRoot der Website doc_root C Programme Apache Software Foundation Apache2 2 htdocs Win32 In Tabelle 2 3 sehen Sie die wichtigsten Direktiven auf einen Blick Tabelle 2 3 Wichtige Einstellungen f r die PHP Konfigurationsdatei php ini Direktive Vorgabewert Aufgabe short_open_tag On Off on Onerlaubt lt gt als Abk rzung f r lt php gt asp tags On Off off On erlaubt lt gt ASP Syntax statt lt php gt max_execution time 30 maximale Ausf hrungsdauer von PHP Skripten Sekunden precision n 14 Flie kommazahlen mit n Stellen Genauigkeit expose_php On Off on On f gt die PHP Version zur Serveridentifikation hinzu memory limit M K B 8M 8 Megabyte maximaler Arbeitsspeicher f r PHP Skripten verf gbar wenn PHP mit enable memory limit kompiliert wurde track vars On Off On Spezialvariablen _ENV _GET _POST
446. snamen E Mail Adressen und URLs f r Schalt fl chenbeschriftungen Men befehle und optionen sowie bei der Definition neuer Fachbegriffe und f r Hervorhebungen verwendet Nichtproportionalschrift Wird f r Codebeispiele und Variablen Funktionen Befehlsoptionen Para meter Klassennamen und HTML Tags verwendet Nichtproportionalschrift fett Bezeichnet Benutzereingaben auf der Kommandozeile Nichtproportionalschrift kursiv Kennzeichnet innerhalb von Codebeispielen Platzhalter die Sie durch Ihre eige nen spezifischen Angaben ersetzen m ssen er Die Gl hbirne kennzeichnet einen Tipp oder einen generellen Hin weis mit n tzlichen Zusatzinformationen zum Thema kd AS Der Regenschirm kennzeichnet eine Warnung oder ein Thema bei ON dem man Vorsicht walten lassen sollte a In K sten mit einem Mikroskop wird ein Thema genauer unter die Lupe genommen pr Vorwort zur 2 Auflage XI Danksagungen Da dies eine Neuauflage ist danke ich zun chst vor allem den Lesern der ersten Auflage Ihr Interesse und ihre Kaufentscheidung hat die zweite Auflage erst m g lich gemacht Zudem erhielt ich hier und da Anregungen und Fehlermitteilungen per E Mail die geholfen haben diese Auflage noch besser zu machen Auch den Teilnehmern meiner regelm igen MySQL Kurse im Linuxhotel http www linux hotel de bin ich sehr dankbar denn sie haben nicht nur gern mit dem Buch gearbei tet sondern auch flei ig Fehler gef
447. spiel 4 Druckansicht 8 Beziehungs bersicht amp amp Tabellenstruktur analysieren Z 1 Felder hinzuf gen An das Ende der Tabelle An den Anfang der Tabelle ONach t_d M LOK Indizes Speicherplatzverbrauch Name Typ Kardinalit t Aktion Feld Typ Verbrauch PRIMARY PRIMARY 4 X frid Daten 16 384 Bytes index ber Spaltenanlegen oX Index 0 Bytes Insgesamt 15 384 Bytes Zeilenstatistik Angaben Wert Format Compact Kollation latini_svedish_ci N chste Autoindex 5 Erzeugt am 26 Februar 2007 um 12 35 E Neues phplMyAdmin Fenster Abbildung 4 5 Startseite einer Datenbanktabelle in phpMyAdmin e Suche Ein Formular mit verschiedenen Optionen zur Suche in der Datenbank e Einf gen Neue Datens tze in die aktuelle Tabelle eingeben e Exportieren Exportiert die Struktur und oder die Daten der Tabelle in ver schiedenen Formaten mit diversen Optionen e Importieren Importiert Daten aus SQL Dateien oder formatierten Textdateien e Operationen nderung von Tabelleneigenschaften wie Name Typ oder Kolla tion e Leeren Entfernen aller Inhalte der Tabelle mit Sicherheitsabfrage e L schen Entfernen der gesamten Tabelle und ihrer Inhalte ebenfalls mit Nachfrage zur Absicherung Einige der genannten Optionen werden im Folgenden n her erl utert andere erst in sp teren Kapiteln zu deren Thematik sie besser passen Tabellenstruktur Wie bereits erw hnt stellt die erste Tabellenbear
448. spiel 3 4 auswert php Antworten berpr fen und Gewinner ziehen mysqli Version Fortsetzung lt html gt lt head gt lt title gt Gewinnspiel Auswertung lt title gt lt head gt lt body gt lt h1 gt Gewinnspiel Auswertung lt h1 gt lt php Nummern der richtigen Antworten speichern fr_query conn query SELECT fr_korrekt FROM gw fragen ORDER BY fr_id ASC korrekt array while list fr_korrekt fr_query gt fetch_row array push korrekt fr_korrekt Alle Teilnehmer ermitteln tn_query conn gt query SELECT tn_id FROM gw teilnehmer teilnehmer array while list tn_id tn_query gt fetch_row array push teilnehmer tn_ id F r jeden Teilnehmer herausfinden ob er alles richtig beantwortet hat korr_teilnehmer array foreach teilnehmer as tn_id Nermutung Alles richtig richtig 1 Alle Antworten des Teilnehmers durchlaufen tl_query conn gt query SELECT tl_frag tl_antw FROM gw _teilnahme WHERE tl tln tn_id ORDER BY tl_frag ASC for i 0 list tl_frag tl_antw tl_query gt fetch_row i Falsche Antwort if tl_antw korrekt i Also nicht alles richtig richtig 0 Alles richtig if richtig array push korr teilnehmer tn_ id gt Folgende Teilnehmer haben alle Fragen richtig beantwortet lt br gt lt br gt lt table border 2 cellpadding 4 gt l
449. st PHP kennt mehrere solcher Testfunktionen Hier nur einige Beispiele is_int testet auf Ganzzahlen is float auf Flie kommazahlen und is_string auf Zeichenketten und is_null berpr ft ob das Argument null eine leere Referenz ist Der eigent liche Test ob die Zahl gerade ist wird mithilfe des Modulo Operators durchge f hrt Wenn die Division durch 2 den Rest 0 ergibt ist die Zahl durch 2 teilbar und damit gerade Die selbst definierte Funktion ist_gerade kann nun beispielsweise in einer if Fall entscheidung verwendet werden if ist_gerade zahl echo zahl ist eine gerade Zahl lt br gt else echo zahl ist keine gerade Zahl lt br gt 224 Kapitel 8 Webanwendungen mit PHP und MySQL Objektorientierung Die objektorientierte Programmierung OOP ist eine in den 1970er Jahren einge f hrte Programmiertechnik Es geht im Wesentlichen darum Datenstrukturen fest mit den zu ihrer Verarbeitung vorgesehenen Funktionen zu verkn pfen dieses Kon zept wird Kapselung genannt In der traditionellen imperativen Programmierung greift eine Funktion von au en auf die Datenstruktur zu w hrend die objektorien tierte Datenstruktur selbst wei was sie tun kann sie enth lt neben den Daten gekapselte Funktionen die Methoden genannt werden Das hat mehrere Vorteile e Das Verhalten von Objekten aus der realen Welt l sst sich auf diese Weise rea listischer in Software modellieren Beispiel
450. strator root ein und wiederholen Sie es bei der Option Confirm Die Option Enable root access from remote machines sollten Sie wenn m glich deaktivieren Auf diese Weise kann root nicht ber das Netzwerk zugreifen das verhindert automatisierte Internetangriffe die von Zeit zu Zeit stattfinden In aller Regel sollten Sie aus Sicherheitsgr nden auch Create Anonymous Account deaktivieren das verhindert Zugriffe ohne Benutzername und Passwort Schlie lich k nnen Sie die gew hlten Einstellungen mittels Execute annehmen Wenn dabei einer der Punkte scheitert m ssen Sie zur ckbl ttern und entspre chende nderungen vornehmen Am h ufigsten scheitert die Konfiguration daran dass bereits ein MySQL Dienst installiert ist siehe oben Anders als viele andere Open Source Programme aus dem Unix Umfeld funktio niert MySQL auch ohne die Existenz einer Konfigurationsdatei Dennoch besteht nat rlich die M glichkeit eine solche Datei einzurichten Zum Lieferumfang von MySQL geh ren mehrere Vorlagen mit typischen Einstellungen f r kleine mittlere und gro e Datenbanken Sie befinden sich im Verzeichnis support files Ihrer MySQL Installation Unix beziehungsweise direkt im MySQL Verzeichnis Win dows Die Dateiendung ist unter Unix cnf und unter Windows ini Der jeweilige Dateiname my small cnf my small ini bis my innodb heavy 4G cnf my innodb heavy 4G ini weist auf die Datenbankgr e hin f r die sie zu empfehlen sind Kommen
451. sweise best nde die imperative Abbildung eines Flugzeugs aus einer Ansammlung von Zustandsdaten wie Tankf llung Kilometerstand und aktuellem Standort die durch Funktionen von au en modifiziert w rden Das objektorientierte Flugzeug h tte dagegen Methoden wie fliegen oder tanken um diese Daten selbst zu ndern e Die Kapselung f hrt au erdem zu weniger Fehlern Da die Daten nur noch durch die Methoden der Objekte selbst manipuliert werden werden Pro gramme viel bersichtlicher der fehlertr chtige Einsatz globaler an vielerlei Stellen modifizierter Datenstrukturen entf llt e Hauptbestandteil objektorientierter Programme sind die sogenannten Klassen sie bilden die Vorlagen oder Bauanleitungen f r Objekte Die einzelnen Klas sen lassen sich viel leichter wiederverwenden als die Datenstrukturen und Funktionen imperativer Programme es ist einfach und praktisch sich nach und nach eigene Klassenbibliotheken zu erstellen e Ein weiterer Vorteil der Klassen ist die Vererbung Jede Klasse kann von einer anderen abgeleitet werden so dass jeweils nur die Besonderheiten und Unter schiede neu programmiert werden m ssen Das spart Schreibarbeit und verbes sert ebenfalls die Wiederverwendbarkeit Seit Version 4 verf gt auch PHP ber objektorientierte Merkmale die in PHP 5 noch einmal stark erweitert wurden Syntax und Funktionsweise wurden an Java angelehnt Um objektorientiert zu programmieren wird zun chst eine Klasse
452. t body gt lt html gt n In Abbildung 8 2 wird anhand einiger G stebucheintr ge der Modus r illustriert h C httpi focalhost imysal_oldjsite mysali_ngigast phprmode r ie7 responsexml Erste Schritte E Aktuelle Nachrichten EuroCityTravel Abbildung 8 2 Das G stebuch Eintr ge lesen Das Diskussionsforum Noch beliebter als G steb cher sind inzwischen Diskussionsforen die den direkten Austausch zwischen verschiedenen Besuchern einer Website erm glichen interes sante Foren sorgen daf r dass Besucher immer gern wiederkommen Die Reiseb ro Anwendung 265 Das Skript ist dem G stebuch recht hnlich Auch hier werden die Modi verwendet um zwischen den verschiedenen Aufgaben zu unterscheiden Das Forum besitzt einen zus tzlichen Modus n mlich eine nach Threads aufeinander bezogenen Bei tr gen sortierte Liste aller Beitr ge Um zu bestimmen zu welchem Thread ein Bei trag geh rt wird neben dem Prim rschl ssel der normalen ID eine Parent ID gespeichert es handelt sich dabei einfach um die ID des beantworteten Beitrags Neue Beitr ge die keine Antworten sind erhalten die Parent ID 0 Bis auf das neue Feld Parent ID ist die Struktur der Datenbanktabelle mit dem G s tebuch identisch Erstellen Sie mithilfe der folgenden Anweisungen die neue Daten bank forum die Tabelle fo_eintraege und eine vollst ndige Zugriffsberechtigun
453. t den Namen der aktuellen Standarddatenbank d und ein Gr er Zeichen ein mysql gt R h d gt localhost gewinnspiel gt In Tabelle 4 1 sehen Sie eine bersicht ber alle verf gbaren Platzhalter Tabelle 4 1 Platzhalter f r den Prompt des Kommandogeilenclients Platzhalter Bedeutung v Serverversion d aktuelle Standarddatenbank h Serverhost p TCP Port oder Unix Domain Socket u Benutzername U Benutzerkonto User Host Backslash als Zeichen n Zeilenumbruch t Tabulator Leerzeichen Space Nr Leerzeichen R Stunde der aktuellen Uhrzeit 0 23 r Stunde der aktuellen Uhrzeit 0 12 m Minuten der aktuellen Uhrzeit y aktuelles Jahr zweistellig Y aktuelles Jahr vierstellig D aktuelles Datum s Sekunden der aktuellen Uhrzeit w aktueller Wochentag 3 Buchstaben Mon Tue P am pm o aktueller Monat nummerisch 0 aktueller Monat 3 Buchstaben Jan Feb Z hler der bei jedem Befehl erh ht wird l aktueller Delimiter seit 5 0 25 S Semikolon einfaches Anf hrungszeichen doppeltes Anf hrungszeichen 110 Kapitel 4 Mit MySQL arbeiten Um Ihre Arbeit mit dem Client zu beenden k nnen Sie zu guter Letzt exit oder quit Kurzfassung jeweils q eingeben mysql gt q Bye Auf Unix Systemen funktioniert alternativ auch die Tastenkombination Strg D zum Beenden des Clients Befehls bersicht Tabelle 4 2 zeigt eine bersicht ber s mtliche int
454. t Anwendung 9 is_float PHP Funktion 224 is_int PHP Funktion 224 is_null PHP Funktion 224 is_numeric PHP Funktion 224 is_string PHP Funktion 224 isset PHP Funktion 75 J Java MySQL API in 310 JavaScript Ajax 250 alert Methode 246 document Objekt 245 DOM 247 Einf hrung 245 Event Handler 245 Funktionen 246 im HTML Dokument 245 onblur 246 onclick 246 onfocus 246 onkeyup 246 onload 245 onunload 245 submit Methode 247 JDBC Java Datenbank API 310 JOIN MySQL Klausel 180 Joins 179 Cross Joins 179 Inner Joins 180 Left Joins 181 Right Joins 182 338 Index K KDE Konsole 18 Kennwort MySQL 287 KEY MySQL 154 Klausel MySQL 76 Knoten DOM 248 Kollation Sortierreihenfolge 168 bei Datenbankerstellung 143 in phpMyAdmin 122 verf gbare anzeigen 168 Kommentar phpMyAdmin 121 Kommentare PHP 51 kommerzielle MySQL Lizenz 10 Konfiguration MySQL 283 Konfigurationsdateien 40 298 Konsole 17 Konsolenbefehle bersicht 21 Konstruktor PHP 226 Kontrollstrukturen PHP 218 L LAMP Distributions Pakete 55 LAMP System 10 Installation 15 LCASE MySQL Funktion 188 Left Joins 181 LENGTH MySQL Funktion 188 Lerdorf Rasmus VII 43 LIKE MySQL Klausel 171 CREATE TABLE 146 in SHOW Anweisungen 173 LIMIT MySQL Klausel 166 Linux Apache Installation 23 Dateisystem 19 Konsolenbefehle 21 MySQL Installation 33 PHP Installation 44 Prompt 18 Shell 18 Termin
455. t auf abh ngige Datens tze einer anderen Tabelle bertragen wird In MySQL Datenbanken konnte man solche Sicherheitsvorkehrungen bis vor Kur zem nur durch eine entsprechende Absicherung der externen Datenbankanwen dungen treffen Beispielsweise sind ltere Versionen von phpMyAdmin damit 156 Kapitel 5 Datenbanken entwerfen und erstellen ausgestattet Standard SQL kennt dagegen schon l nger sogenannte Foreign Key Constraints die eine Spalte ausdr cklich als Fremdschl ssel kennzeichnen und so darauf achten dass keine Anomalien aufreten k nnen Seit MySQL 3 23 44 stehen diese Constraints f r InnoDB Tabellen zur Verf gung Die Spalten die miteinander verkn pft werden m ssen in beiden Tabellen einen Index besitzen Bei mehrspaltigen Verkn pfungen m ssen sie in beiden Tabellen hintereinander in derselben Reihenfolge vorliegen Die grundlegende Syntax zum Erstellen eines Constraints sieht folgenderma en aus CONSTRAINT Name FOREIGN KEY Spaltei Spalte2 REFERENCES AndereTabelle Spalte1 Spalte2 Genau wie die diversen Indexklauseln kann auch dieses Konstrukt sowohl in eine CREATE TABLE Anweisung als auch mit vorangestelltem ADD in eine ALTER TABLE Anweisung eingesetzt werden In einer Webanwendung n tzen FOREIGN KEY Definitionen nicht besonders viel weil jegliche Art von fehlerhaften Eingaben sowieso mit benutzerfreundlichen Meldun gen abgefangen werden m ssen Deshalb hier ein separates Beispiel m
456. t css href main css gt lt script language JavaScript type text javascript src utils js gt lt script gt lt head gt lt body gt lt table border 0 width 750 align center gt lt tr gt lt td gt amp nbsp lt br gt lt div align center gt lt img src logo gif width 480 height 80 alt EuroCityTravel gt lt div gt lt br gt lt Einfache Navigationsleiste gt Kez daaa lt Ende der Navigationsleiste gt gt lt h2 gt Reiseauswahl lt h2 gt lt php Fehler bei der vorherigen Auswahl fehler cgi_param f if fehler Die Reiseb ro Anwendung 279 Beispiel 8 9 ergebnis php Ausgabe der Reiseangebote Fortsetzung echo lt i gt Ein Fehler ist aufgetreten fehler lt i gt lt br gt gt lt form action ergebnis php method post gt lt table border 0 cellpadding 4 gt lt tr gt lt td valign top gt Abreiseort lt td gt lt td gt lt select name start size 1 gt lt option value 1 gt Bitte w amp auml hlen lt option gt lt php for i 0 i lt sizeof staedte i nr stnr i stadt staedte i echo lt option value nr gt stadt lt option gt n gt lt select gt lt br gt lt span style font size 10px gt Die meisten Flugangebote gehen von nach K ouml 1n Bonn einige auch von nach Frankfurt oder D amp uuml sseldorf lt span gt lt td gt lt tr gt lt tr gt lt td
457. t tr gt 90 Kapitel3 Die erste Webanwendung Beispiel 3 4 auswert php Antworten berpr fen und Gewinner ziehen mysqli Version Fortsetzung lt th gt Teilnehmer lt th gt lt th gt E Mail lt th gt lt th gt Lieblingsstadt lt th gt lt tr gt lt php Die Lieblingsst dte staedte array Paris London Istanbul Rom Ausgabe aller korrekten Einsendungen foreach korr_teilnehmer as kt kt_query conn gt query SELECT tn_uname tn_email tn_interest FROM gw_teilnehmer WHERE tn_id kt list tn_uname tn_email tn_interest kt_query gt fetch_row echo lt tr gt n echo lt td tn_uname lt td gt n echo lt td tn_email lt td gt n echo lt td gt staedte tn interest 1 lt td gt n echo lt tr gt n gt lt table gt lt br gt lt php Den Gewinner ziehen gnummer rand 0 sizeof korr_teilnehmer 1 gewinner korr_teilnehmer gnummer und ausgeben gw query conn gt query SELECT tn_uname tn email FROM gw_teilnehmer WHERE tn_id gewinner list tn_uname tn_email gw_query gt fetch_row echo Gewonnen hat lt b gt tn_uname lt b gt lt a href mailto tn_email gt tn_email lt a gt Datenbankverbindung schlie en conn gt close gt lt body gt lt html gt In Beispiel 3 5 wird die PHP Data Objects Version gezeigt Die wesentlichen Schnittstellenunterschiede die zu den di
458. t werden bei spielsweise ber eine Datenbank PHP Grundlagen 227 PHP bietet ein sehr einfaches Session Verfahren Die Session ID wird automatisch im Hintergrund generiert und weitergereicht in dem globalen Array _SESSION k n nen Sie beliebig viele Werte ablegen die f r jeden einzelnen Besucher zwischen den PHP Skripten hin und hergereicht werden Technisch verwendet PHP zur Weiter gabe der Session Daten Cookies siehe unten wenn der Browser sie akzeptiert Andernfalls wird die Session ID automatisch an die URLs angeh ngt w hrend die Session Daten in einer tempor ren Datei auf dem Server abgelegt werden Jede Seite die Teil einer Session sein soll ben tigt als Erstes folgende PHP Anwei sung session start Diese muss in einem PHP Block ganz am Anfang der Datei stehen vor dem ffnen den lt php darf nicht einmal ein einziges Leerzeichen stehen Nach session_start k nnen Sie beliebige Elemente aus _SESSION auslesen und neue hineinschreiben Hier ein kurzes Gesamtbeispiel lt php Session Zugriff vorbereiten session start Alten Session Wert Reiseziel lesen reiseziel SESSION ziel Formulardaten auslesen z B Reisedatum Reisedatum in die Session schreiben SESSION datum reisedatum gt Die weiter unten ausf hrlich vorgestellte Reiseb ro Anwendung ver wendet Sessions um die Benutzeran und abmeldung zu verwalten Cookies Cookies l sen e
459. tabase optimiert MySQL f r die transaktionsf higen InnoDB Tabellen MyISAM bleibt allerdings m glich Non Transactional Database Only unter st tzt ausschlie lich MyISAM Tabellen bietet aber die beste Performance InnoDB Datafile Hier werden Datentr ger und Verzeichnis f r die Transakti onsdatenbanken gew hlt Tendenziell sollten Sie die Festplatte mit dem meis ten freien Platz w hlen Number of concurrent connections Stellen Sie ein wie viele Verbindungen Ihr Datenbankserver etwa gleichzeitig verarbeiten wird F r einfache Webanwen dungen gen gt in der Regel die Option Decision Support DSS OLAP die f r 20 gleichzeitige Verbindungen ausgelegt ist F r gut besuchte E Commerce Sites und andere transaktionsorientierte Anwendungen sollten Sie dagegen Online Transaction Processing OLTP mit Unterst tzung f r 500 Verbindun gen w hlen Unter Manual Setting k nnen Sie auch selbst einen Wert eingeben f r einen Entwicklungs und Testrechner gen gt sicherlich eine Vorgabe von f nf bis zehn Verbindungen Enable TCP IP Networking Bestimmt ob der MySQL Server ber das Netz werk beziehungsweise Internet kommunizieren kann oder nur mit lokalen Programmen In den meisten F llen wird die Netzwerkunterst tzung aktiviert 38 Kapitel 2 Installation und Inbetriebnahme selbst wenn Webserver Webanwendung und Datenbank auf demselben Rech ner betrieben werden Der TCP Port 3306 ist f r MySQL Server blich u
460. tare im Text der Dateien selbst verraten Genaueres Wenn Sie eine der Dateien als Grundlage Ihrer MySQL Installation einsetzen m ch ten m ssen Sie sie auf Unix Systemen in my cnf umbenennen und ins Verzeichnis etc kopieren Unter Windows muss die Datei dagegen my ini heien und ins Sys temverzeichnis zum Beispiel C Windows kopiert werden Danach m ssen Sie MySQL neu starten Dies geschieht auf Windows Rechnern mithilfe der Dienste verwaltung Start gt Systemsteuerung gt Verwaltung gt Dienste auf Unix Systemen kommt je nach Installationseinstellungen und verzeichnissen siehe oben zum Bei spiel folgende Eingabe daf r in Frage Diverse Beispiele f r Einstellungen die Sie manuell in Konfigurationsdateien einf gen oder ndern k nnen werden in Kapitel 9 gezeigt MySQL Konfigurationsdateien gt etc init d mysql5 restart Gute Passw rter bestehen aus einer Mischung aus Gro und Kleinbuchstaben sowie Ziffern und kom m en in keinem W rterbuch vor 40 Kapitel 2 Installation und Inbetriebnahme MySQL testen Ob der Datenbankserver korrekt funktioniert erfahren Sie am einfachsten indem Sie mit einem Client darauf zugreifen und SQL Operationen ausf hren Der mitge lieferte Kommandozeilenclient mysql gen gt zu diesem Zweck Er befindet sich im bin Verzeichnis Ihrer MySQL Installation zum Beispiel usr local mysql bin bezie hungsweise C MySQL MySQL Server 5 0 bin wenn Sie der obigen Installati
461. tarzeichen Im n chs ten Abschnitt erhalten Sie weitere Informationen ber die php ini Optionen 4 Kopieren Sie die Datei php5ts dll aus dem PHP Verzeichnis nach lt Windows Verzeichnis gt System32 46 Kapitel 2 Installation und Inbetriebnahme 5 F gen Sie das PHP Installationsverzeichnis zur Umgebungsvariablen PATH hinzu Klicken Sie dazu mit der rechten Maustaste auf das Desktop Symbol Arbeitsplatz und w hlen Sie Eigenschaften aus dem Kontextmen Klicken Sie unter Windows 2000 und XP auf der Registerkarte Erweitert die Schaltfl che Umgebungsvariablen an Windows NT 4 0 besitzt eine separate Registerkarte namens Umgebung Doppelklicken Sie im entsprechenden Dialog auf die Vari able PATH H ngen Sie an den bestehenden Wert ein Semikolon und den voll st ndigen Pfad Ihres PHP Verzeichnisses an zum Beispiel C php Beachten Sie dass die nderung nach einem Klick auf OK nur durch einen vollst ndigen Sys temneustart wirksam wird u Auf einigen Systemen werden die MySQL Erweiterungen auch nach diesem Schritt noch nicht ordnungsgem geladen Kopieren Sie in u diesem Fall auch die Datei libmysql dll aus dem PHP Verzeichnis nach lt Windows Verzeichnis gt System32 Manchmal entsteht das Problem gerade dadurch dass sich an dieser Stelle eine inkompatible Version dieser Datei aus einer fr heren PHP Installation befindet 6 F hren Sie je nach PHP Betriebsart die entsprechenden nderungen an der Apache Konfigurationsdat
462. tch besitzt PDO noch die Methode fetchAll die alle Ergebnisdaten s tze als Array ausliest Die einzelnen Elemente dieses Arrays sind auch wieder Arrays aus denen Sie gem dem eingestellten Fetch Modus die einzelnen Felder lesen k nnen Hier ein Beispiel das alle Flugh fen sowie ihre K rzel und St dte auf diese Weise auflistet zur Abwechslung im Modus PDO FETCH_ASSOC try conn new PDO mysql host localhost dbname reisebuero user pass array PDO ATTR_PERSISTENT gt 1 PDO ATTR_ERRMODE gt PDO ERRMODE_EXCEPTION sql SELECT ap_name ap_kuerzel st_name FROM rb airports INNER JOIN rb_staedte ON ap_stadt st_nr ORDER BY st_name ASC Abfrage senden query conn query sql Fetch Modus auf assoziative Arrays setzen query setFetchMode PDO FETCH_ASSOC alle Ergebnisdatens tze holen rows query gt fetchAll das Ergebnis Array in einer Schleife auslesen foreach rows as row echo row ap name row ap _kuerzel row st_name lt br gt n conn null catch PDOException e echo Fehler e gt getMessage Wenn Sie Auswahlabfragen in Schleifen ineinander verschachteln m chten m ssen Sie die u ere auf jeden Fall mittels fetchAll auslesen PDO ist nicht in der Lage mehrere Abfragen im Speicher zu puffern Das komplette Listing in Beispiel 8 3 illustriert dies indem es die St dte und ihre L nder als berschriften und die
463. te Entspre chungen jeweils mit Erl uterungen 332 Anhang D Ressourcen und Tools Symbole MySQL Operator 177 MySQL Operator 167 _GET PHP Variable 74 _POST PHP Variable 74 LIKE Platzhalter 171 lt MySQL Operator 167 lt MySQL Operator 167 lt gt MySQL Operator 167 lt gt MySQL Operator 167 MySQL Operator 167 gt MySQL Operator 167 gt MySQL Operator 167 Prepared Statement Platzhalter 207 _ LIKE Platzhalter 171 MySQL Operator 177 1 1 Relation 130 1 n Relation 130 INF 132 2NF 133 3NF 134 4NF 135 5NF 136 A Abfragen PDO 239 Abh ngigkeit mehrwertige 135 ABS MySQL Funktion 185 Abstraktion siehe Datenbankabstraktion ACID Transaktionen 199 ACOS MySQL Funktion 185 Index Active Record 315 ADD COLUMN MySQL Klausel 196 ADD CONSTRAINT MySQL Klausel 159 ADD FOREIGN KEY MySQL Klausel 159 Administration MySQL 283 Benutzerverwaltung 283 affected_rows mysqli Eigenschaft 235 Aggregatfunktionen 192 Ajax 10 250 Anfrage 251 Antwort 252 onreadystatechange 252 readyState 252 response Text 252 responseXML 252 status 252 XMLHttpRequest 251 alert JS Methode 246 Alias Apache Direktive 32 Allow Apache Direktive 31 AllowOverride Apache Direktive 31 ALTER PROCEDURE MySQL Anweisung 211 ALTER TABLE MySQL Anweisung 196 305 ADD COLUMN 196 ADD FOREIGN KEY 159 CHANGE COLUMN 197 DROP COLUMN 197 DROP FOREIGN KEY 159 zur Indexerstellung 1
464. ten Ausf hrung des Schleifenrumpfs das hei t der abh ngigen Anweisungen berpr ft wird wird dieser Schleifentyp als kopfge steuerte Schleife bezeichnet Dabei kann es vorkommen dass der Schleifenrumpf gar nicht ausgef hrt wird Ein anderer Typ die sogenannte fu gesteuerte Schleife berpr ft die Bedingung dagegen nach dem ersten Durchlauf Hier sehen Sie das obige Beispiel in dieser Schreibweise Startwert i 1 i 1 do quadrat i i echo i lt sup gt 2 lt sup gt quadrat lt br gt i um 1 erh hen i while i lt 10 Neben der while Schleife gibt es in PHP auch die for Schleife Sie hat folgende Syntax for Initialisierung Bedingung Wert nderung Anweisung en PHP Grundlagen 219 Die Initialisierung ist eine beliebige Anweisung die einmal vor dem ersten Schlei fendurchlauf ausgef hrt wird Die Bedingung ist ein beliebiger Ausdruck der Schlei fenrumpf wird nur erneut ausgef hrt wenn dieser wahr ist Die Wert nderung schlie lich wird nach jedem Durchlauf ausgef hrt Hier sehen Sie das Quadratzah len Beispiel zum dritten Mal diesmal als for Schleife for i 1 i lt 10 i quadrat i i echo i lt sup gt 2 lt sup gt quadrat lt br gt for ist also lediglich eine kompaktere Schreibweise f r kopfgesteuerte Schleifen ins besondere f r solche mit einer festgelegten determinierten Anzahl von Abl ufen Arrays Arrays sind speziell
465. ten oben genannten Software ebenfalls f r Linux und Windows e Alle f r die Anwendungen im Buch ben tigten Datenbanken als SQL Dateien zum Import in den MySQL Server e Die im Buch entwickelten PHP Anwendungen sowie weitere kommentierte PHP Skripten die die Praxisanwendung vervollst ndigen e Eine Linkliste zum Thema MySQL und PHP die elektronische Version von AnhangD Beispiele Die meisten Beispiele in diesem Buch stammen aus dem Umfeld eines fiktiven Online Reiseb ros das Flugreisen in europ ische Metropolen und die zugeh rigen Hotelaufenthalte anbietet Da es hier um die Technik zur Erstellung datenbankba sierter PHP Anwendungen geht wurden tief gehende Designaspekte absichtlich weggelassen X Vorwort zur 2 Auflage Beachten Sie bitte auch dass die Reiseb ro Datenbank nicht in allen Punkten rea listisch ist Aus Gr nden der bersichtlichkeit waren einige Vereinfachungen n tig Beispielsweise wird die Anzahl freier und belegter Pl tze f r die Flugzeuge und Hotels weder gespeichert noch berpr ft Ein echtes Reiseb ro greift f r so etwas aber ohnehin meist auf das Buchungssystem eines externen Reiseveranstalters zu Ein weiterer Abstrich gegen ber der Realit t ist etwa der identische Preis f r jedes Zimmer eines Hotels und das unabh ngig von der Saison Typografische Konventionen In diesem Buch werden folgende typografische Konventionen verwendet Kursivschrift Wird f r Datei und Verzeichni
466. tentyp 150 Daten einf gen 160 Datenbank erstellen 142 Datenbanken l schen 198 Datenbankentwurf 64 Datensicherung 296 Datentypen 147 DATETIME Datentyp 150 Datum Uhrzeit Datentypen 150 Datum Uhrzeit Funktionen 188 DEALLOCATE PREPARE Anweisung 208 DECIMAL Datentyp 149 DELETE Anweisung 198 306 DESCRIBE Anweisung 107 307 DISTINCT ROW Klausel 166 DOUBLE Datentyp 149 DROP DATABASE Anweisung 198 DROP PROCEDURE Anweisung 211 DROP TABLE Anweisung 198 305 DROP TRIGGER Anweisung 214 DROP USER Anweisung 284 DROP VIEW Anweisung 206 Einf geabfragen 68 160 ENGINE Klausel 143 ENUM Datentyp 42 153 erweiterte Funktionen 199 EXECUTE Anweisung 206 Export 294 Features 12 FEDERATED Tabellentyp 145 Festkomma Datentypen 149 Flie komma Datentypen 149 FLOAT Datentyp 149 FLUSH PRIVILEGES Anweisung 287 Index MySQL Fortsetzung FLUSH TABLES Anweisung 301 FOREIGN KEY Klausel 157 Fremdschl ssel festlegen 156 FROM_UNIXTIME Funktion 191 FULLTEXT Index 154 Funktionen 184 ganzzahlige Datentypen 147 Geschichte 10 GRANT Anweisung 50 66 285 Gro und Kleinschreibung 42 GROUP BY Klausel 192 HEAP Tabellentyp 144 Hilfsprogramme 289 IF Anweisung 210 Import 294 INDEX 154 ndex 153 NNER JOIN Klausel 180 nnoDB Tabellentyp 144 NSERT Anweisung 42 68 160 305 nstallation Linux 33 nstallation Windows 36 INT Datentyp 147 Java API f r 310 JOIN Klausel 180 Joins 179 KEY 1
467. ter s mtlichen Optionen k nnen Sie den Namen der Datenbank angeben die als Standard verwendet werden soll Diese kann innerhalb des Programms mittels use siehe unten ge ndert werden Das folgende Beispiel stellt eine Verbindung mit dem MySQL Server auf dem Host db test local her kopiert die Ein und Ausgaben in die Datei mysql log und w hlt die Datenbank gewinnspiel als Standard aus mysql u root p h db test local tee mysql log gewinnspiel Nach erfolgreichem Login erscheint der Prompt des Clients mysql gt Nach dem Start sollten Sie sich als Erstes um die bereits in Kapitel 2 angedeutete Zeichensatzproblematik k mmern Die meisten modernen Unix Terminals verwen den standardm ig utf 8 w hrend die Windows Eingabeaufforderung aus histori schen Gr nden den MS DOS Zeichensatz benutzt MySQL selbst setzt dagegen von Hause aus ISO Latin 1 auch als ISO 8859 1 bekannt ein Damit Umlaute Sonderzeichen und andere nicht lateinische Zeichen korrekt zwi schen dem MySQL Server und dem Client ausgetauscht werden m ssen Sie diese Pr ferenzen einander anpassen Grunds tzlich gibt es zwei M glichkeiten daf r 102 Kapitel 4 Mit MySQL arbeiten Entweder Sie ndern den Terminal Zeichensatz in ISO Latin 1 oder Sie passen den Zeichensatz ber den der Client selbst mit dem Server kommuniziert an Beachten Sie dass beides nichts mit dem konkreten Zeichensatz der jeweiligen Datenbank Tabelle oder gar einzelnen Spalte zu tun h
468. tionen Wie bereits erw hnt gibt es f r Deutsch zwei m gliche Kollationen latinl_germanl_ci sortiert nach W rterbuch so dass die Umlaute und mit den Buchstaben a o und u gleichgesetzt werden latin1_ german2_ci ist dagegen die Telefonbuch Kollation bei der und wie ae oe beziehungsweise ue behandelt werden MySQL enth lt weit ber 100 verschiedene Kollationen Ihr Name setzt sich aus mehreren durch Unterstriche getrennten Komponenten zusammen dem Zeichen satz zum Beispiel latinl oder utf8 der Sprache etwa swedish oder turkish mit eventueller Nummerierung von Variationen germanl und german2 und der Sortier methode ci cs oder bin W hrend ci case insensitive nicht zwischen Gro und Kleinschreibung unterscheidet kommt in cs case sensitive jeder Gro buchstabe vor dem entsprechenden Kleinbuchstaben an die Reihe bin richtet sich dagegen strikt nach der Reihenfolge der Zeichens tze selbst so dass alle Gro buchstaben vor allen Kleinbuchstaben eingeordnet werden Eine konkrete Liste der Kollationen erhalten Sie mithilfe der folgenden Anweisung SHOW COLLATION Da die Liste zu lang f r ein Terminal oder Eingabeaufforderungsfenster ist sollten Sie zuvor eine Logdatei aktivieren siehe Kapitel 4 oder gleich den Link Zeichen s tze und Kollationen auf der phpMyAdmin Startseite verwenden Dieser enth lt bequemerweise eine kurze Beschreibung jeder Kollation In der Datenbank reisebuero verwenden alle
469. tocommit Modus verwendet Weisen Sie diesem Schl ssel dagegen den Wert 0 zu wird er deaktiviert so dass die neue Verbindung eine Transaktion beginnt Die MySQL SchnittstelleninpHP 237 PDO ATTR_ERRMODE gt PDO ERRMODE SILENT PDO ERRMODE_WARNING PDO ERRMODE EXCEPTION Der Schl ssel PDO ATTR_ERRMODE bestimmt wie PDO auf Fehler in der SQL Syntax in Tabellen und Spaltennamen oder anderen Aspekten Ihrer Abfragen reagiert Der Standardwert PDO ERRMODE SILENT hat das bliche Verhalten bei Fehlern zur Folge Der Fehler wird beim Absenden der Abfrage nicht gemeldet sondern das resultierende Ergebnisobjekt hier PDOStatement ist ung ltig Wenn Sie den Wert PDO ERRMODE_WARNING w hlen wird bei Abfragefehlern eine E_WARNING Warnmeldung generiert Damit solche Meldungen ausgegeben wer den m ssen Sie zu Beginn Ihres Skripts folgende Zeile einf gen error reporting E ERROR E WARNING Der Wert PDO ERRMODE_EXCEPTION schlie lich sorgt daf r dass bei Abfragefeh lern eine PDOException ausgel st wird Diese k nnen Sie mittels catch abfangen wenn Sie alle Ihre PDO Operationen in einen try Block verschach teln Beispiel try Datenbankverbindung mit Persistenz und Exception Modus conn new PDO mysql host localhost dbname reisebuero user host array PDO ATTR_PERSISTENT gt 1 PDO ATTR_ERRMODE gt PDO ERRMODE_EXCEPTION fehlerhafte Abfrage falscher Tabellenname zum Testen qu
470. tributes title gt Metallica release_year gt 1991 id gt 5 band_id gt 1 gt Geben Sie einige weitere Alben Ihrer Wahl ein und verwenden Sie zum Schluss die sen Code um sich eine Liste der Alben mit dem Namen ihrer jeweiligen Band anzei gen zu lassen gt gt Album find all each a gt b Band find a band_id gt gt puts a title von b name a release_year gt Master of Puppets von Metallica 1986 Ride The Lightning von Metallica 1984 The Number Of The Beast von Iron Maiden 1982 Die Bestie in Menschengestalt von Die rzte 1993 Metallica von Metallica 1991 Als N chstes werden Controller und View der Rock and Roll Anwendung erstellt Die Bands und ihre Alben sollen als verschachtelte Liste angezeigt werden Erstellen Sie als Erstes das Grundger st des Album Controllers gt ruby script generate controller Album Zuerst soll die Ansicht erstellt werden gt ruby script generate controller Album list Ruby on Rails Active Record 321 Sie werden gefragt ob die bestehende Datei berschrieben werden soll Die Ant wortm glichkeiten sind y ja n nein a alle weiteren berschreiben oder q Erzeugung abbrechen Im vorliegenden Fall sollten Sie y w hlen Erstellen Sie nun die Controller Methode list f r die Listenansicht Wenn Sie die Datei app controllers album_controller rb ffnen finden Sie dort die Klassendefini tion mit dem Methoden Stu
471. ttstellen mysl und mysqli Funktionalit t Verbindungsaufbau Datenbankauswahl Abfrage Datensatz lesen numerisches Array Datensatz lesen benanntes Array Anzahl Ergebnisdaten s tze Auswahlabfrage Anzahl ge nderter Zeilen nderungsabfragen Zuletzt eingef gte auto_ increment ID mysql id mysql_connect host user pass mysql_select_db db query mysql_query sql arr mysql_fetch_ row query arr mysql_fetch_ array query lines mysql_num_ rows query lines mysql_affected_ rows id mysql_insert_id mysqli conn news mysqli host user pass db conn gt select_db db query conn gt query sql arr query gt fetch_row arr query gt fetch_array lines query gt num_rows lines conn gt affected_rons id conn insert_id In Tabelle A 2 sehen Sie die entsprechenden Funktionen der Abstraktionsschnitt stelle PHP Data Objects PDO Tabelle A 2 bersicht der wichtigsten PDO Elemente Funktionalit t Verbindungsaufbau Datenbankauswahl PDO Code conn new PDO mysql host host dbname db user pass option array nicht vorgesehen bei Bedarf neue Verbindung herstellen MySQL FunktioneninPHP 307 Tabelle A 2 bersicht der wichtigsten PDO Elemente Fortsetzung Funktionalit t Abfrage Datensatz lesen numerisches Array Datensatz lesen benanntes Arr
472. tum kd_bemerk 1 Schmitz Klaus 1967 08 03 2 Meier Heinrich 1976 09 24 3 Becker Ludwig 1955 11 27 4 Huber Michael 1965 08 11 5 J ger Siegfried 1952 01 17 163 6 Klein Klaus 1980 04 13 7 Becker Michaela 1963 09 19 8 Schmitz Susanne 1970 02 07 9 Vogel Martina 1975 06 14 10 Gruber Annette 1954 03 18 11 Berger Sven 1967 07 02 11 rows in set 0 06 sec er Neben der Hauptaufgabe Datens tze aus Tabellen auszuw hlen kann SELECT auch beliebige Ausdr cke auswerten und das Ergebnis anzeigen Das k nnen Sie beispielsweise f r Berechnungen nutzen mysql gt SELECT 7 6 7 6 al Auch die Werte globaler Funktionen k nnen Sie auf diese Weise abfragen hier beispielsweise mehrere Spalten mit Systemdatum und uhrzeit sowohl mit der MySQL Version als auch mit der aktu ellen Standarddatenbank mysql gt SELECT NOW VERSION DATABASE noW VERSION DATABASE 2007 05 01 19 46 48 5 1 18 beta gewinnspiel community nt Wenn Sie nur einze
473. tzt auch BDB Transaktionen Beachten Sie dass Berkeley DB nur in manchen Linux und Unix Versionen verf gbar ist nicht aber unter Windows und Mac OS X e MEMORY oder HEAP Die Tabelle wird im Arbeitsspeicher angelegt geht also beim Beenden des MySQL Servers verloren Dieser Typ bietet die beste Perfor mance ist aber naturgem nur f r tempor re Arbeitstabellen geeignet Indizes werden unterst tzt aber keine Transaktionen e CSV Die Daten werden in einer Textdatei als Comma Separated Values gespei chert also etwa in folgendem Format 1 Schmitz Klaus 1972 09 17 2 Becker Hans 1956 10 14 Der Vorteil dieses Tabellentyps besteht darin dass er sich leicht in Tabellenkal kulationen oder selbst geschriebene Programme importieren l sst In der Regel berwiegen allerdings die Nachteile In CSV Tabellen k nnen weder Indizes noch Transaktionen eingesetzt werden und besonders schnell ist diese Storage Engine auch nicht 3 Die MySQL Entwickler arbeiten zur zeit an einer eigenen transaktionsf higen Engine namens Falcon die in der kommenden MySQL Version 6 0 enthalten sein soll 144 Kapitel 5 Datenbanken entwerfen und erstellen e ARCHIVE Diese Engine speichert die Tabellendaten komprimiert Dies ver mindert den Speicherbedarf verschlechtert aber daf r die Performance ein wenig weil die Daten bei jedem Zugriff entpackt werden m ssen Die wich tigste Einschr nkung besteht darin dass Sie nur Date
474. u den wichtigsten Aufgaben des Exports mit mysqldump und MySQL kann aber nicht nur SQL Dateien einlesen sondern auch Dateien mit strukturierten Daten Dazu wird die SQL Anweisung LOAD DATA INFILE verwendet Ihre grundlegende Syntax sieht folgenderma en aus LOAD DATA INFILE Dateiname INTO TABLE Tabellenname FIELDS TERMINATED BY ENCLOSED BY LINES STARTING BY TERMINATED BY Die optionale FIELDS Klausel gibt an durch welches Zeichen die einzelnen Felder getrennt TERMINATED beziehungsweise eingeschlossen ENCLOSED werden Standard m ig dient der Tabulator t als Trennzeichen Mithilfe von LINES k nnen Sie angeben womit die Zeilen beginnen STARTING und wodurch sie abgeschlossen werden TERMINATED Die Vorgabe ist n Zeilenum bruch als Zeilenende Das folgende Beispiel importiert den Inhalt einer Datei data txt die das angegebene Standardformat besitzt in die Tabelle test mysql gt LOAD DATA INFILE data txt INTO TABLE test 296 Kapitel 9 MySQL Administration Hier ein weiteres Beispiel es l dt die Daten aus der Datei csv txt in die Tabelle test2 die Felder sind hier durch Kommata getrennt mysql gt LOAD DATA INFILE csv txt INTO TABLE test2 gt FIELDS TERMINATED BY Das Gegenst ck zu LOAD DATA INFILE ist SELECT INTO OUTFILE Die allgemeine Syn tax f r SELECT wurde bereits ausf hrlich behandelt die Optionen f r INTO OUTFILE entsprechen denjenigen von
475. ublin Finnegan s Auswahlabfragen 181 D sseldorf NULL Edinburgh The New Maitland Hotel Frankfurt Main NULL Istanbul Otel Bahar mysql gt SELECT st_name ht_name FROM rb_staedte INNER JOIN rb_hotels gt ON st_nr ht_stadt ORDER BY st_name LIMIT 0 10 st_name ht_name Amsterdam Hotel Konigin Beatrix Athen Hotel Apollon Barcelona La Barca Berlin Hotel Eichenhof Br ssel Hotel Royal Dublin Finnegan s Edinburgh The New Maitland Hotel Istanbul Otel Bahar K ln Hotel Colonia K ln Bergerhof a Wie Sie sehen kommen D sseldorf und Frankfurt am Main in der zweiten Abfrage nicht vor stattdessen r ckt K ln nach Ein Right Join enth lt entsprechend alle Ergebnisse aus der rechten Tabelle auch wenn diese keine Entsprechung in der linken haben Wenn Sie es testen m chten k nnen Sie die obige Abfrage wie folgt umkehren SELECT st_name ht_name FROM rb hotels RIGHT JOIN rb_staedte ON ht_stadt st_nr ORDER BY st_name LIMIT 0 10 Interessant ist im brigen dass Sie eine Tabelle auch mit sich selbst verkn pfen k nnen um innerhalb desselben Ergebnisses Daten aus zwei ihrer Datens tze aus zulesen Dazu m ssen Sie der Tabelle allerdings zwei verschiedene Aliasnamen zuweisen und dann stets Tabellenalias Feldname schreiben um die beiden Verwen dungen
476. uero Datenbank keine Transaktionen vorgesehen sind sollten Sie zuerst eine zus tzliche Testdatenbank erstellen und als Standard ausw hlen CREATE DATABASE trans_test USE trans_test Nun wird in der neuen Datenbank eine einzelne Tabelle erstellt CREATE TABLE stationen s_id INT AUTO INCREMENT PRIMARY KEY s_name VARCHAR 40 s_dauer INT ENGINE InnoDB Vor dem Einf gen des ersten Datensatzes wird eine Transaktion gestartet START TRANSACTION Nun werden einige Datens tze hinzugef gt INSERT INTO stationen s name s_dauer VALUES K ln 0 INSERT INTO stationen s name s_dauer VALUES Bonn 30 INSERT INTO stationen s name s_dauer VALUES Frankfurt 80 Transaktionen 201 Eine einfache Auswahlabfrage zeigt dass alle drei Datens tze tats chlich vorhanden sind mysql gt SELECT FROM stationen s_id s_name s_dauer 1 K ln 0 2 Bonn 30 3 Frankfurt 80 ffnen Sie nun ein zweites Terminal oder Eingabeaufforderungsfenster und starten auch darin den mysql Client als root oder als ein anderer User der vollen Zugriff auf die Datenbank trans_test besitzt Wenn Sie in diesem Fenster alle Datens tze aus der Tabelle stationen ausw hlen erleben Sie eine berraschung mysql gt SELECT FROM stationen Empty set 0 00 sec Die Daten werden nicht angezeigt
477. uf diesen Systemen Konsequenter weise sollten Sie sich immer an eine einheitliche Schreibweise halten in diesem Buch werden deshalb alle Bezeichner kleingeschrieben Nun wird die neu erstellte Datenbank als Standard ausgew hlt mysql gt USE geotest Database changed In der Datenbank soll eine einzelne Tabelle namens laender erstellt werden Sie ent h lt eine Liste von L ndern mit deren Hauptst dten und den ausw hlbaren Konti nenten Geben Sie dazu Folgendes ein mysql gt CREATE TABLE laender gt land VARCHAR 30 gt hauptstadt VARCHAR 30 gt kontinent ENUM Afrika Asien Australien Europa gt Nordamerika S damerika gt Query OK O rows affected 1 10 sec Der Feldtyp VARCHAR n speichert Text bis zur maximalen L nge von n Zeichen ENUM ist dagegen eine Auflistung fester Werte die relativ wenig Speicherplatz ben tigt Als N chstes sollten einige Werte hinzugef gt werden mysql gt INSERT INTO laender VALUES gt Frankreich Paris Europa gt Italien Rom Europa gt Japan Tokio Asien gt Marokko Rabat Afrika 42 Kapitel 2 Installation und Inbetriebnahme gt Australien Canberra Australien gt Kanada Ottawa Nordamerika gt Argentinien Buenos Aires S damerika Query OK 7 rows affected 0 04 sec Records 7 Duplicates O0 Warnings 0 Wie Sie sehen k nnen Sie beliebig viele geklammerte Werte
478. ug auf rb_airlines ai_nr fs_onr CHAR 10 offizielle Flugnummer fs_start T Bezug auf rb_airports ap_nr fs_ziel INT Bezug auf rb_airports ap_nr fs_dauer INT Flugdauer in Minuten Tabelle rb_fluege fl_nr T Prim rschl ssel AUTO _ INCREMENT fl_strecke I Bezug auf rb_flugstrecken fs_nr fl_preis Flugpreis 140 Kapitel 5 Datenbanken entwerfen und erstellen Tabelle 5 3 Bedeutung der Spalten aller Tabellen der Datenbank reisebuero Fortsetzung Spalte Datentyp Optionen Bedeutung fl_datum DATE Abflugdatum fl_zeit DATE Abfluguhrzeit Tabelle rb_hotels ht_nr INT Prim rschl ssel AUTO_INCREMENT ht_name VARCHAR 60 Index Name des Hotels ht_stadt INT Bezug auf rb_staedte st_nr ht_ezpreis I Preis Einzelzimmer ht_dzpreis I Preis Doppelzimmer ht_bad ENUM ohne WC Dusche WC Bad Varianten Bad ht_mahlzeit ENUM ohne Fr hst ck Inklusiv Mahlzeiten HP VP ht_anschrift VARCHAR 100 Adresse des Hotels ht_url VARCHAR 50 Website des Hotels Tabelle rb_kunden kd_nr INT Prim rschl ssel AUTO_INCREMENT kd_mail VARCHAR 50 E Mail Adresse kd_name VARCHAR 40 Index Nachname kd_vorname VARCHAR 40 Vorname kd_gdatum DATE Geburtsdatum kd_bemerk VARCHAR 100 Anmerkungen zum Kunden Tabelle rb_kundenkontakte kk_nr INT Bezug auf rb_kunden kd_nr kk_strasse VARCHAR 50 Stra e kk_hausnr VARCHAR 10 Hausnummer kk_plz VARCHAR 10 Postleitzahl kk_ort VARCHAR 50 Index Wohnort kk_land INT Bezug au
479. umentation und weitere Informationen angeboten 330 Anhang D Ressourcen und Tools http www apachefriends org Apache Friends bietet mit XAMPP ein leicht zu installierendes Open Source Paket in dem eine fast fertig konfigurierte LAMP beziehungsweise WAMP Umgebung und weitere Servertools enthalten sind Zus tzliche Tools Tutorials und Informationen http www thekompany com products rekall Rekall ist ein KDE basierter Universal Datenbankclient Die Bedienung hnelt Microsoft Access ist also recht komfortabel Rekall unterst tzt MySQL als eine von mehreren zugrunde liegenden Datenbanken http www typo3 net TYPO3 ist ein beliebtes sehr leistungsf higes Open Source Content Manage ment System auf der Basis von PHP und einer Datenbank normalerweise MySQL http www papaya cms com Auch dieses Open Source Content Management System an dem der Autor dieses Buchs mitarbeitet ist in PHP geschrieben Die Standarddatenbank ist ebenfalls MySQL Papaya CMS setzt vollst ndig auf offene Standards f r Templates kommt etwa die offizielle XML Transformationssprache XSLT zum Einsatz http www phpbb com phpBB ist eine beliebte PHP und MySQL basierte Open Source Software zum Aufsetzen frei konfigurierbarer Diskussionsforen Zahlreiche beliebte Foren Communities im Web verwenden diese Software als Grundlage http web f4 fhtw berlin de morcinek sqltutor Leicht verst ndliches und bersichtliches SQL Tutorial von
480. unden und mich an manchen Stellen auf Unklarheiten und Erg nzungsbedarf hingewiesen Weiterer Dank gilt dem O Reilly Verlag insbesondere den Lektoren Michael Gerth erste Auflage und Inken Kiupel zweite Auflage die das Projekt mit Geduld und Kompetenz begleitet haben Dank geb hrt auch den Entwicklern der in diesem Buch behandelten Open Source Software damit meine ich nicht nur den MySQL Datenbankserver sondern bei spielsweise auch den Webserver Apache und die Programmiersprache PHP Dass diese Menschen den Mut besitzen der ffentlichkeit das Ergebnis jahre und n ch telanger Entwicklungsarbeit frei und nicht nur kostenlos zur Verf gung zu stellen ist gewiss keine Selbstverst ndlichkeit und verdient Anerkennung Wenn auch Sie von Open Source Software profitieren wovon auszugehen ist wenn Sie gerade dieses Buch lesen k nnen Sie dieser Anerkennung auf vielf ltige Weise Ausdruck verleihen Beispielsweise k nnen Sie Organisationen wie die Apache Soft ware Foundation oder die Free Software Foundation mit Geldspenden unterst tzen oder sich eine kommerzielle MySQL Lizenz kaufen die Ihnen das zus tzliche Recht verleiht den MySQL Server selbst in kommerzielle Software einzubetten Auch Beitr ge zu den Softwareprojekten selbst sind immer willkommen Sie brauchen nicht gleich eine umfangreiche Erweiterung zu programmieren sondern helfen auch schon wenn Sie gefundene Fehler in der Software oder ihrer Dokumen tati
481. ur nachvollziehen wenn Sie sich eine komplette Rails Anwendung anschauen Das nachfolgende stark gek rzte Komplettbeispiel stammt ebenfalls aus meinem Buch Praxiswissen Ruby es handelt sich um eine kleine Anwendung die Rockbands und ihre Alben zeigt 1 Wenn Sie noch mehr ber Ruby on Rails wissen m chten schauen Sie sich das Buch Praxiswissen Ruby on Rails von Denny Carl an O Reilly Verlag Ruby on Rails Active Record 315 Zun chst m ssen Sie Rails selbst installieren Wenn Sie bereits Ruby haben gelingt dies leicht mithilfe der folgenden Kommandozeilenanweisungen gt gem update gt gem install mysql include dependencies Der erste Schritt besteht darin das Skelett der Anwendung zu erzeugen Erstellen Sie ein Verzeichnis f r Ihre Rails Anwendungen und geben Sie darin Folgendes ein gt rails rock_n_roll Dadurch wird automatisch eine Verzeichnisstruktur erzeugt deren Elemente ange zeigt werden Die wichtigsten Verzeichnisse haben folgende Bedeutung e app enth lt die Komponenten der eigentlichen Anwendung unterteilt in die drei oben genannten MVC Aspekte models views und controllers sowie das zus tzliche Unterverzeichnis helpers f r gemeinsame Hilfsklassen e config enth lt Konfigurationsdateien Rails verwendet zwar ein Prinzip namens Convention over Configuration aber ganz ohne Konfigurationsdateien geht es nun einmal nicht Meist brauchen Sie nur die Datei database yml zu editie ren die die
482. uration abgelehnt haben k nnen Sie die MySQL Server Instance Configuration auch nachtr glich starten W hlen Sie dazu Alle Programme gt MySQL gt MySQL Server 5 0 gt MySQL Server Instance Config Wizard aus dem Startmen Der Konfigurationsdialog enth lt folgende Einzelseiten 1 Welcome Kurze Information ber die Installation Dr cken Sie hier und auf allen folgenden Bildschirmen Next um weiterzubl ttern Falls MySQL bereits installiert war k nnen Sie sich zwischen der Neukonfigu ration des vorhandenen Servers Reconfigure Instance oder seiner Deinstalla tion Remove Instance siehe oben entscheiden W hlen Sie Detailed Configuration um alle hier beschriebenen Einstellungen manuell vornehmen zu k nnen oder Standard Configuration wenn Sie nur wenige Optionen anpassen m chten Server Type Entscheiden Sie sich zwischen einem Arbeitsplatzrechner auf dem MySQL nur nebenher l uft Developer Machine einem Serverrechner auf dem MySQL neben anderen Serverdiensten ausgef hrt wird Server Machine oder einem exklusiv f r die Datenbank reservierten Serverrechner Dedicated MySQL Server Machine Zum Durcharbeiten dieses Buchs ist Developer Machine in der Regel die richtige Wahl Database Usage Entscheiden Sie sich zwischen Transaktionsoptimierung und Performance Multifunctional Database bietet eine ausgewogene Unterst tzung f r die beiden Haupt Tabellentypen MyISAM und InnoDB Transactional Da
483. urf 64 127 Beispiel Web Gewinnspiel 64 Entity Relationship Modell 129 intuitiver 127 Normalisierung 132 Datenbanktabelle Daten einf gen 160 Definition 3 erstellen 42 erstellen phpMyAdmin 122 Inhalt bearbeiten phpMyAdmin 118 kopieren phpMyAdmin 122 Index 335 l schen MySQL 198 Namenskonventionen 66 phpMyAdmin 115 sortieren phpMyAdmin 121 Struktur ndern 196 Struktur ermitteln 107 Struktur phpMyAdmin 116 Typen in MySQL 143 verf gbare ermitteln 107 Datenbankverwaltungssystem 1 Datenfeld 4 Datensatz Anzahl ge nderte PHP 81 Definition 3 eingeben phpMyAdmin 124 l schen MySQL 198 Datensicherung MySQL 296 Datentyp MySQL 147 Aufz hlung 152 Bin rbl cke 151 BINARY 151 BIT 148 BLOB 151 CHAR 151 DATE 150 DATETIME 150 Datum Uhrzeit 150 DECIMAL 149 DOUBLE 149 ENUM 42 153 Festkomma 149 Flie komma 149 FLOAT 149 ganzzahlig 147 INT 147 NUMERIC 149 REAL 149 SET 153 Strings 150 TEXT 151 Textbl cke 151 TIME 150 TIMESTAMP 150 UNSIGNED Option 147 VARBINARY 151 VARCHAR 42 151 YEAR 150 ZEROFILL Option 148 DATETIME MySQL Datentyp 150 Datum Uhrzeit aktuelle MySQL 150 MySQL Datentypen 150 MySQL Funktionen 188 in PHP 223 DBI Perl Datenbankschnittstelle 309 DBMS 1 DEALLOCATE PREPARE MySQL Anwei sung 208 DECIMAL MySQL Datentyp 149 DEGREES MySQL Funktion 186 DELETE MySQL Anweisung 198 306 DELIMITER mysql Client Anweisung 105 Deny Apache Direkti
484. usch mit 297 exec PDO Methode 242 execute PDO Methode 243 EXECUTE MySQL Anweisung 206 exit mysql Client Anweisung 111 EXP MySQL Funktion 186 explode PHP Funktion 221 Export MySQL 294 in phpMyAdmin 297 F FEDERATED MySQL Tabellentyp 145 fetch PDO Methode 239 fetch_array mysqli Methode 232 fetch_row mysqli Methode 232 fetchAllO PDO Methode 240 FLOAT MySQL Datentyp 149 FLOOR MySQL Funktion 186 FLUSH LOGS MySQL Anweisung 300 FLUSH PRIVILEGES MySQL Anweisung 287 FLUSH TABLES MySQL Anweisung 301 for PHP Anweisung 219 FOREIGN KEY MySQL Klausel 157 lt form gt HTML Tag 72 Formulare Auslesen per PHP 73 Beispiel 73 Eingabeelemente 72 Versandmethoden 72 Forum PHP 265 forum php PHP Skript 267 Fremdschl ssel festlegen 156 FROM_UNIXTIME MySQL Funktion 191 FTP File Transfer Protocol Upload 95 FULLTEXT MySQL Index 154 function PHP 223 F nfte Normalform 136 Funktionen JavaScript 246 Funktionen MySQL 184 Datum Uhrzeit 188 mathematische 185 f r Strings 187 Funktionen PHP 223 G gast php PHP Skript 261 G stebuch PHP 259 gcc 16 GET HTTP Methode 70 72 _GET PHP Variable 74 getElementByld DOM 249 getElementsByTagName DOM 249 GNOME Terminal 18 GNU General Public License GPL 10 GPL 10 GRANT MySQL Anweisung 50 66 285 Benutzerrechte 285 grep Unix Dienstprogramm 173 Gro und Kleinschreibung Dateinamen 19 MySQL 42 Regul re Ausdr cke 176 GROU
485. ve 31 DESCRIBE MySQL Anweisung 107 307 dir Windows Konsolenbefehl 21 lt Directory gt Apache Direktive 30 DirectoryIndex Apache Direktive 32 Direktiven Apache 28 Diskussionsforum PHP 265 DISTINCT ROW MySQL Klausel 166 Document Object Model siehe DOM document JS Objekt 245 DocumentRoot Apache Direktive 30 DOM 247 Ajax XML Antworten 252 appendChild 250 Baumstruktur 248 childNodes 248 createlextNode 250 getElementByld 249 getElementsByTagName 249 hasChildNodes 248 nodeName 248 nodeType 248 nodeValue 248 removeChild 250 DOUBLE MySQL Datentyp 149 Dritte Normalform 134 DROP COLUMN MySQL Klausel 197 DROP DATABASE MySQL Anweisung 198 DROP FOREIGN KEY MySQL Klausel 159 DROP PROCEDURE MySQL Anwei sung 211 DROP TABLE MySQL Anweisung 198 305 DROP TRIGGER MySQL Anweisung 214 DROP USER MySQL Anweisung 284 DROP VIEW MySQL Anweisung 206 Druckansicht phpMyAdmin 118 336 Index E each PHP Funktion 221 echo PHP Funktion 216 Einf geabfrage 42 68 Eingabeaufforderung 17 Eingabefehler abfangen PHP 94 Eingabevervollst ndigung mysql Client 109 ENGINE MySQL Klausel 143 Engines siehe Tabellentypen Enterprise MySQL Variante 12 Entity 4 Entity Relationship Modell 129 Attribut 129 Entity 129 Relationen 131 Rolle 130 ENUM MySQL Datentyp 42 153 EPOCH 223 in MySQL 191 ergebnis php PHP Skript 278 Error Log 299 Erste Normalform 132 Event Handler JavaScript 245 Excel Datenausta
486. ve 97 AuthUserFile Apache Direktive 97 AUTO_INCREMENT Eigenschaft 68 156 Autocommit PDO 237 Autocommit ausschalten 200 automatischer MySQL Start Unix 293 AVG MySQL Funktion 192 awk Unix Dienstprogramm 173 Axmark David 10 B Backup MySQL 296 bash 18 BCNF 135 BDB 144 Benutzerkonto MySQL 66 Benutzervariablen MySQL 207 Benutzerverwaltung MySQL 50 283 in phpMyAdmin 287 Berkeley DB MySQL Tabellentyp 144 BIGINT MySQL Datentyp 148 BIN MySQL Funktion 187 BINARY MySQL Datentyp 151 BINARY MySQL Funktion 176 bindParam PDO Methode 243 BIT MySQL Datentyp 148 BLACKHOLE MySQL Tabellentyp 145 BLOB MySQL Datentyp 151 Boyce Codd Normalform 135 C CALL MySQL Anweisung 209 C Compiler 16 cd Konsolenbefehl 20 cgi_param PHP Hilfsfunktion 74 CHANGE COLUMN MySQL Klausel 197 CHANGE MASTER MySQL Anweisung 302 CHAR MySQL Datentyp 151 CHARACTER SET MySQL Klausel 143 childNodes DOM 248 chkconfig 26 334 Index class PHP Deklaration 225 CLEAR mysql Client Anweisung 106 Client Server System MySQL 11 close mysqli Methode 233 Codd Edgar F 3 COLLATE MySQL Klausel 143 Comma Separated Values CSV 144 COMMIT MySQL Anweisung 200 CONCAT MySQL Funktion 187 CONSTRAINT MySQL Klausel 157 ON DELETE CASCADE 159 Constraints 156 CONV MySQL Funktion 187 Cookies PHP 228 COS MySQL Funktion 185 COT MySQL Funktion 185 COUNT MySQL Funktion 192 CRC32 MySQL Funktion
487. versen nderungen gef hrt haben kennen Sie bereits Die PHP Skripten 91 Beispiel 3 5 auswert php Antworten berpr fen und Gewinner ziehen PDO Version lt php function pdo_conn Nerbindungsparameter host localhost user winuser pass G3winn3n db gewinnspiel try conn new PDO mysql host host dbname db user pass array PDO ERRMODE_EXCEPTION gt true PDO ATTR_PERSISTENT gt true catch PDOException e echo FEHLER e gt getMessage return null return conn try Erste Verbindung herstellen conn pdo_conn gt lt html gt lt head gt lt title gt Gewinnspiel Auswertung lt title gt lt head gt lt body gt lt h1 gt Gewinnspiel Auswertung lt h1 gt lt php Nummern der richtigen Antworten speichern fr_query conn gt query SELECT fr_korrekt FROM gw fragen ORDER BY fr_id ASC korrekt array while list fr_korrekt fr_query gt fetch array push korrekt fr_korrekt Alle Teilnehmer ermitteln tn_query conn gt query SELECT tn_id FROM gw teilnehmer teilnehmer array while list tn_id tn_query gt fetch array push teilnehmer tn_id F r jeden Teilnehmer herausfinden ob er alles richtig beantwortet hat korr_teilnehmer array foreach teilnehmer as tn_id Vermutung Alles richtig richtig 1 92 Kapitel 3 Die erste Weban
488. vor die Skripten selbst beschrieben werden wird kurz erl utert wie Daten aus Webformu laren mithilfe von PHP gelesen werden HTTP Grundwissen Webserver wie Apache kommunizieren ber das Anwendungsprotokoll HTTP HyperText Transfer Protocol mit Clientprogrammen die meisten von ihnen sind Webbrowser wie Firefox oder Internet Explorer Die genaue Definition der aktuel len HTTP Version steht in RFC 2616 online zum Beispiel unter http www fags org rfes rfc2616 html Dieses Dokument ist allerdings sehr trocken und braucht normalerweise nur Entwickler zu interessieren die den HTTP Standard in die eigene Software implementieren m chten HTTP ist ein klartextbasiertes Internet Anwendungsprotokoll das hei t Webser ver und Browser verwenden meist hinter den Kulissen eine f r Menschen lesbare Sprache f r ihre Kommunikation Das erleichtert Administratoren und Program mierern die Arbeit Wie alle Internet Kommunikationsstandards geh rt HTTP zur Anwendungsebene oberhalb der Vermittlungs und Transportprotokolle TCP IP Um Webanwendun gen mit PHP und MySQL zu schreiben sollten Sie sich einigerma en damit ausken nen Unter http www galileocomputing de openbook kit itkomp13002 htm finden Sie eine relativ ausf hrliche Einf hrung es handelt sich um den entsprechenden Abschnitt aus der Onlinefassung meines Buchs Kompendium der Informations technik 3 RFC hei t Request for Comments Bitte um Kommentare Seit ber 30 J
489. weise with mysqli usr local mysql bin mysql_ config oder with pdo with pdo mysql usr local mysql bin mysql_config 44 Kapitel 2 Installation und Inbetriebnahme Das folgende Beispiel konfiguriert PHP mit allen MySQL Schnittstellen als Apache 2 Modul zur Installation im Verzeichnis usr local php3 configure prefix usr local php5 with apxs2 usr local apache2 bin apxs with mysql usr local mysql with mysqli usr local mysql bin mysql_config with pdo with pdo_mysql usr local mysql bin mysql_config Das n chste Beispiel bereitet PHP dagegen zur Installation als externe CGI Sprache ins Verzeichnis usr local php vor wobei nur die klassische mysql Schnittstelle ein gerichtet wird configure prefix usr local php with mysql usr local mysql Wie blich werden nach der Konfiguration die Standardbefehle zur Kompilierung und Installation aufgerufen make make install Wenn Sie PHP als Apache Modul installiert haben hat apxs automatisch folgende Zeile zur Konfigurationsdatei httpd conf hinzugef gt LoadModule php5_module modules libphp5 so Zus tzlich m ssen Sie manuell daf r sorgen dass Dateien mit der Endung php als PHP 5 Skripten erkannt werden F gen Sie dazu unter den vorhandenen AddHand ler Eintr gen folgende Direktive zur httpd conf hinzu AddHandler php5 script php Wenn Sie m chten k nnen Sie durch Leerzeichen getrennt auch die veralteten Endungen php
490. wendung Beispiel 3 5 auswert php Antworten berpr fen und Gewinner ziehen PDO Version Fortsetzung Alle Antworten des Teilnehmers durchlaufen tl_query conn gt query SELECT tl_frag tl_antw FROM gw_teilnahme WHERE tl_tln tn_id ORDER BY tl_frag ASC for i 0 list tl_frag tl_antw tl_query gt fetch i Falsche Antwort if tl_antw korrekt i Also nicht alles richtig richtig 0 Alles richtig if richtig array push korr teilnehmer tn_id gt Folgende Teilnehmer haben alle Fragen richtig beantwortet lt br gt lt br gt lt table border 2 cellpadding 4 gt lt tr gt lt th gt Teilnehmer lt th gt lt th gt E Mail lt th gt lt th gt Lieblingsstadt lt th gt lt tr gt lt php Die Lieblingsst dte staedte array Paris London Istanbul Rom Ausgabe aller korrekten Einsendungen foreach korr _teilnehmer as kt Zus tzliche Verbindung conn2 pdo_conn kt_query conn2 query SELECT tn_uname tn_email tn_interest FROM gw teilnehmer WHERE tn_id kt list tn_uname tn_email tn_interest kt_query gt fetch conn2 null echo lt tr gt n echo lt td gt tn_uname lt td gt n echo lt td gt tn_email lt td gt n echo lt td gt staedte tn interest 1 lt td gt n echo lt tr gt n gt lt table gt lt br gt Die PHP Skripten 93 Beis
491. wortein gabe gestartet zum Beispiel gt mysql u root p Enter password Welcome to the MySQL monitor Commands end with or g Your MySQL connection id is 1 Server version 5 0 41 community nt MySQL Community Server GPL Type help or h for help Type c to clear the buffer Die Sternchen f r die Passworteingabe werden nur unter Windows angezeigt auf Unix Rechnern erfolgt wie blich kein Feedback 101 Es gibt zahlreiche weitere Optionen f r den Start von mysql Wenn Sie eine Gesamt bersicht erhalten m chten k nnen Sie Folgendes eingeben mysql help Da die Ausgabe zu lang ist sollten Sie sie durch eine Pipe an einen Pager wie less Linux oder more Windows weiterleiten mysql help less gt mysql help more Alternativ k nnen Sie den gesamten Text auf beiden Systemen in eine Datei umlei ten mysql help gt myhelp txt Hier noch zwei weitere wichtige Kommandozeilenoptionen h Hostname oder host Hostname Verbindung zum MySQL Server auf einem anderen Rechner herstellen Sie k nnen einen Hostnamen wie dbserver test local oder eine IP Adresse wie 192 168 0 17 angeben tee Dateiname S mtliche Ein und Ausgaben der mysql Sitzung zus tzlich in die angegebene Datei schreiben Falls die Datei bereits besteht werden die neuen Daten ange h ngt Dieselbe Funktion k nnen Sie auch mithilfe eines weiter unten gezeigten Clientbefehls ein und wieder ausschalten Hin
492. yntax sieht folgenderma Ren aus GRANT Recht Spalte Recht Spalte ON Datenbank Tabelle TO Benutzername Hostname IDENTIFIED BY Passwort Das folgende Beispiel erteilt einem zuvor mittels CREATE USER angelegten Benutzer namens newuser alle Rechte an allen Datenbanken dies sollten Sie nur in Ausnah mef llen in Betracht ziehen GRANT ALL PRIVILEGES ON TO newuser localhost Der Platzhalter steht f r alle Tabellen in allen Datenbanken Datenbankname bezeichnet dagegen alle Tabellen der angegebenen Datenbank Das n chste Beispiel erm glicht dem Benutzer rb_mitarbeiter das Ausw hlen Erg nzen und ndern von Informationen in der gesamten Datenbank reisebuero GRANT SELECT INSERT UPDATE ON reisebuero TO rb_mitarbeiter localhost Mit dem nachfolgenden Beispiel werden dem Benutzer leser sofern er sich vom lokalen System aus anmeldet Auswahlabfragen auf die Tabelle rb_kunden der Datenbank reisebuero gestattet GRANT SELECT ON reisebuero rb kunden TO leser localhost Wenn leser das Recht erhalten soll den Text in der Spalte kd_bemerk der Tabelle rb_kunden zu ndern funktioniert dies wie folgt GRANT UPDATE kd_bemerk ON reisebuero rb kunden TO leser locahost Tabelle 9 1 zeigt die wichtigsten Benutzerrechte f r GRANT im berblick Einige von ihnen beziehen sich nicht auf Tabellen sondern zum Beispiel auf Views oder Stored Procedures das wird hier nicht n her erl utert d rfte aber
493. ysql Client Anweisung 108 Stored Functions 212 Stored Procedures 208 ndern 211 aufrufen 209 definieren 209 l schen 211 Parameter 209 Stored Functions 212 Variablen 210 String Funktionen MySQL 187 Structured Query Language siehe SQL submit JS Methode 247 SUBSTRING MySQL Funktion 188 SUM MySQL Funktion 192 SUSE Linux siehe openSUSE T Tabelle siehe Datenbanktabelle Tabellentypen MySQL 143 ARCHIVE 145 Berkeley DB 144 BLACKHOLE 145 CSV 144 FEDERATED 145 HEAP 144 InnoDB 144 MEMORY 144 MyISAM 144 Index 347 TAN MySQL Funktion 186 TEE mysql Client Anweisung 108 teilnahme php PHP Skript 80 Terminal 17 Testen PHP Webanwendung 98 TEXT MySQL Datentyp 151 Three Tier Anwendungen 8 time PHP Funktion 223 TIME MySQL Datentyp 150 TIMESTAMP MySQL Datentyp 150 TINYBLOB MySQL Datentyp 151 TINYINT MySQL Datentyp 148 TINYTEXT MySQL Datentyp 151 Torvalds Linus VII Transaktion 199 Transaktionen ACID 199 Savepoints 201 Trigger 212 TRUNCATE MySQL Funktion 186 try catch 238 Two Tier Anwendungen 7 TYPE MySQL Klausel 143 U UCASE MySQL Funktion 188 UNIQUE MySQL Index 154 UNIX Dateisystem 19 Konsolenbefehle 21 Prompt 18 Shell 18 Terminalfenster 18 NIX_TIMESTAMP MySQL Funk tion 191 nix Timestamps 191 NSIGNED MySQL Typoption 147 nterabfrage 192 pdatable Views 204 PDATE MySQL Anweisung 194 306 WHERE Klausel 195 pdate Log 300 PPER MySQL Funktion 188 SE
494. z Elemente speichern absaetze document getElementsByTagName p ausgabe Absatz vorhanden if absaetze length gt nr Text des gew hlten Absatzes speichern ausgabe absaetze nr 1 firstChild nodeValue Clientseitiges Scripting mit JavaScript und Ajax 249 else Fehlermeldung speichern ausgabe Fehler Absatz nicht vorhanden Das Element mit der ID anzeige speichern anzeigeblock document getElementById anzeige Den bisherigen Text l schen anzeigeblock removeChild anzeigeblock firstChild Einen Textknoten mit dem neuen Text erzeugen txt document createTextNode ausgabe Im richtigen Bereich einh ngen anzeigeblock appendChild txt lt script gt lt head gt lt body gt lt p gt DOM ist ein Konzept zum Lesen und amp Auml ndern der Struktur und der Inhalte eines HTML Dokuments lt p gt lt p gt Das Verfahren wurde 1999 vom W3C standardisiert lt p gt lt p gt Heute bildet DOM eine der Grundlagen von Ajax lt p gt lt p gt Im n amp auml chsten Beispiel werden Inhalte eingef amp uuml gt gel amp ouml scht und modifiziert lt p gt lt form name f gt Absatz Nr lt input type text name zahl gt lt input type button value Anzeigen onclick absatzWahl gt lt form gt lt div id anzeige gt amp nbsp lt div gt lt body gt lt html gt Das Skript demonstriert einige weitere wichtige DOM Aspekte insb
495. zeichnisname verwendet zum Beispiel unter Windows C Dokumente und Einstellungen Sascha Eigene Dateien gt cd C Dokumente und Einstellungen Sascha gt Diese Techniken lassen sich kombinieren um ber sogenannte relative Pfade von jedem beliebigen Verzeichnis in jedes andere zu wechseln Das folgende Beispiel vollzieht auf einem Unix Rechner einen Wechsel aus dem oben gezeigten Verzeich nis briefe in das Geschwister Verzeichnis rechnungen sascha linuxbox mydata briefe gt cd rechnungen sascha linuxbox mydata rechnungen gt Um unterhalb des aktuellen Arbeitsverzeichnisses ein neues Verzeichnis zu erstel len wird das Kommando mkdir verwendet Windows erlaubt auch die Kurzfassung md Hier wird beispielsweise ein Verzeichnis f r Termine angelegt sascha linuxbox mydata gt mkdir termine 20 Kapitel 2 Installation und Inbetriebnahme Beachten Sie dass Sie auf einer Unix Maschine lediglich innerhalb Ihres eigenen Home Verzeichnisses neue Verzeichnisse erstellen d rfen In anderen Bereichen des Dateisystems darf dies nur der Superuser root Geben Sie su und das root Passwort ein wenn Sie vor bergehend als root arbeiten m ssen und exit sobald Sie damit fertig sind Sie k nnen auch einen einzelnen Befehl als root ausf hren indem Sie sudo Befehl Optionen und anschlie end das root Passwort eingeben Wenn Sie dies zum ersten Mal tun wird der folgende Sicherheitshinweis angezeigt We trust you hav
496. zerlegt string an jeder Stelle an der muster vorkommt zum Beispiel airportlist K ln Bonn London Heathrow Roma Fiumicino airports explode string airports 0 ist K ln Bonn airports 1 ist London Heathrow airports 2 ist Roma Fiumicino PHP Grundlagen 221 Die Funktion implode muster array erledigt das Gegenteil sie fasst array zu einem String zusammen in dem die bisherigen Elemente durch muster getrennt werden Dazu dieses Beispiel airlines array Turkish Airlines KLM Iberia airlinelist implode airlines airlinelist ist Turkish Airlines KLM Iberia Regul re Ausdr cke Genau wie MySQL unterst tzt auch PHP regul re Ausdr cke und zwar sogar in mehreren Implementierungen Die leistungsf higste Variante sind die Funktionen f r Perl kompatible regul re Ausdr cke PCRE Die Grundlagen der RegExp Syn tax selbst k nnen Sie in Kapitel 6 nachschlagen Beachten Sie dass Klasse Kons trukte in PCRE nicht zur Verf gung stehen Mithilfe der Funktion preg match regexp string k nnen Sie berpr fen ob der regul re Ausdruck regexp auf string passt Das folgende Beispiel berpr ft ob der Inhalt der Variablen name mit A beginnt if preg match A name echo name beginnt mit Acbr gt else echo name beginnt nicht mit A lt br gt Der regul re Ausdruck muss in Anf hrungszeichen sowie zwischen Slas
497. zers angeben der automatisch in phpMyAdmin ausgew hlt werden soll F r alle anderen Modi k nnen Sie die beiden Felder dagegen frei lassen F r http oder cookie muss dagegen zun chst der Control User zum Auslesen der Anmeldedaten erstellt werden ffnen Sie dazu den Kommandozeilenclient mysql und geben Sie folgende Zeilen ein den Usernamen phpcontroller und vor allem das Passwort ctrlPHP sollten Sie dabei ndern mysql gt CREATE USER phpcontroller localhost IDENTIFIED BY ctrlPHP mysql gt GRANT SELECT ON mysql TO phpcontroller localhost mysql gt FLUSH PRIVILEGES Nun k nnen Sie den Usernamen und das Passwort unter phpMyAdmin control user beziehungsweise phpMyAdmin control user password eingeben 60 Kapitel 2 Installation und Inbetriebnahme Wenn Sie m chten k nnen Sie eine separate Datenbank anlegen in der phpMyAd min Verwaltungsinformationen speichern kann Dies er ffnet einige zus zliche M glichkeiten Erzeugen Sie diese Datenbank zum Beispiel im Kommandozeilen client mittels mysql gt CREATE DATABASE phpmyadmin Geben Sie den Namen der Datenbank hier phpmyadmin unter phpMyAdmin data base for advanced features ein F r den Anmeldetyp signon m ssen Sie unter Session name for signon auth den Namen der Session angeben den die andere beteiligte Anwendung vorgibt Auch die Login URL for signon auth muss eingetragen werden F r alle Anmeldeverfahren au er config k nnen Sie zuletzt eine Logout URL fest
498. zt um Funktionen zu definieren Hier ein erstes kurzes Komplettbei spiel das das Ergebnis einer Berechnung im Body anzeigt lt html gt lt head gt lt title gt Erstes JavaScript Beispiel lt title gt lt head gt lt body gt lt h1 gt Berechnung durch JavaScript lt h1 gt lt script language JavaScript type text javascript gt ergebnis 7 6 document write 7 6 ergebnis lt script gt lt body gt lt html gt Bereits dieses kurze Beispiel zeigt einige wichtige Eigenschaften von JavaScript 1 Die Syntax ist derjenigen von PHP recht hnlich 2 Variablennamen beginnen nicht mit einem Dollarzeichen sondern stets mit einem Buchstaben oder Unterstrich 3 Aus diesem Grund ist innerhalb von Strings keine Variablensubstitution m g lich Zur Verkettung von Strings wird zudem kein Punkt wie in PHP verwendet sondern ein Pluszeichen 4 document ist ein Objekt das das aktuelle HTML Dokument repr sentiert Seine Methode write schreibt einfachen Text oder HTML an die aktuelle Position im Dokument hnlich wie die PHP Funktion echo aber mit dem wichtigen Unterschied dass diese bereits auf dem Server ihre Arbeit erledigt Beachten Sie aber dass document write nicht verwendet werden kann um Inhalte nach dem erstmaligen Aufbau des Dokuments hinzuzuf gen oder auszutauschen daf r ist DOM zust ndig Der blichere Weg JavaScript Code aufzurufen besteht in der Verwendung soge nannter
499. zu folgende Kommandos ein gt ruby script generate model Band gt ruby script generate model Album 318 Anhang B Sonstige APIs Die erstellten Klassen sind sogenannte Stubs englisch f r Stummel oder Stumpf Sie enthalten also die Basisfunktionalit t ohne irgendwelche Extras Das Wich tigste das Sie hinzuf gen m ssen sind die Relationen zwischen den Daten ffnen Sie also zun chst die Datei app models bands rb Sie besteht nur aus den fol genden beiden Zeilen class Bands lt ActiveRecord Base end Die Klasse Bands die mit der gleichnamigen kleingeschriebenen Datenbanktabelle korrespondiert wird also von ActiveRecord Base abgeleitet wo alles Wesentliche f r die Umsetzung der Datens tze in Ruby Instanzen bereits existiert Erg nzen Sie die Klassendefinition wie folgt um klarzustellen dass eine Band mehrere Alben ver ffentlichen kann class Bands lt ActiveRecord Base has _many albums end Auch app models albums rb m ssen Sie entsprechend erweitern Hier lautet die pas sende Beziehung belongs_to weil ein Album stets einer bestimmten Band zugeord net ist der Sonderfall Sampler wird hier nicht betrachtet Die urspr ngliche Fassung class Albums lt ActiveRecord Base end wird somit zu class Albums lt ActiveRecord Base belongs to band end Beachten Sie den Singular bei belongs_to band Was an dieser Stelle nicht behandelt wird ist die M glichkeit Validierungsanforde rungen

Download Pdf Manuals

image

Related Search

Related Contents

CPB902 User Manual 1.5b E  取扱説明書 ライトフライホイール (ミツバ用) ご使用前に必ずご確認ください  Gardena 08893-20 cordless grass shear  Trust MaxTrack  第2章 相談内容別回答マニュアル - 住宅リフォーム・紛争処理支援センター      MAC-3500 MAC-3540 MAC-3580  Programa curso_ introduccion fotografia  ICIDU Optical USB Mini Mouse  

Copyright © All rights reserved.
Failed to retrieve file