Diplomarbeit Interaktiver Dialog der Skriptsprache PHP zu MySQL und Oracle 9i Datenbanken Diplomand: Rückerl Roman Matrikel-Nr.: 2040842 Semestergruppe: I8IW.W Anschrift: Vilsstrasse 9 93059 Regensburg Email: [email protected] Aufgabensteller/Betreuer: Hr. Prof. Sauer Zweitprüfer: Hr. Prof. Dr. Kopp Gliederung 1. Einleitung 4 1.1 Die Geschichte von PHP 4 1.2 Gründe für die Themenwahl 7 2. PHP 8 2.1 Voraussetzung und Installation 8 2.1.1 Der Apache-Webserver 9 2.1.2 Installation von PHP unter WindowsMe 15 2.2 Die Skriptsprache PHP 18 2.2.1 Was ist PHP? 18 2.2.2 Programmieren mit PHP 19 2.2.2.1 Variablen 22 2.2.2.2 Konstanten 25 2.2.2.3 Operatoren 25 2.3 Programmsteuerung 30 2.3.1 Beenden des Programms 30 2.3.2 Entscheidungen mit if 30 2.3.3 Entscheidungen mit switch 31 2.3.4 Schleifen mit while 32 2.3.5 Die do-while-Schleife 33 2.3.6 Die for Schleife 33 2.3.7 Die foreach-Schleife 33 2.3.8 Funktionen 34 2.4 Arrays 37 2.4.1 Indiziertes Array 37 2.4.2 Assoziative Arrays 38 1 2.5 Klassen in PHP 40 2.5.1 Definieren einer Klasse 40 2.5.2 Eigenschaften und Methoden 40 2.5.3 Verwenden einer Klasse 42 2.5.4 Vererbung 42 3. Die Datenbanken MySQL und Oracle 9i 3.1 MySQL 44 44 3.1.1 Voraussetzung und Installation einer MySQL-DB 44 3.1.2 MySQL-Monitor 45 3.1.3 PHPMyAdmin 47 3.1.4 PHP und Datenbanken 50 3.1.4.1 Verbindung zum Datenbankserver 50 3.1.4 Befehle an die Datenbank schicken 51 3.1.4.3 Datensätze der Abfrage ermitteln 52 3.1.4.4 Funktionen für MySQL 53 3.1.4.5 Ein allgemeines Beispiel für PHP in Verbindung mit 58 MySQL-Datenbanken 3.1.5 Anlegen einer Datenbank unter MySQL 60 3.1.6 Erstellen und Verwalten von Tabellen 62 3.1.6.1 Tabellen mit MySQL-Monitor anlegen 62 3.1.6.2 Tabellen mit PHPMyAdmin anlegen 64 3.1.6.3 Hinzufügen von Datensätzen 66 3.1.7 PHP-Skripte in Anwendung mit einer MySQL-Datenbank am 71 Beispiel der Datenbank Personalwesen 3.1.7.1 Das HTML-Formular PHP_Formular 71 3.1.7.2 Das PHP-Skript der SQL-Anweisungen 71 3.1.7.2.1 Hauptprogramm und Klassenvariablen 76 3.1.7.2.2 Konstruktor der Klasse mysql_db 78 3.1.7.2.3 Die Funktion connect_db() 78 3.1.7.2.4 Die Funktion query($sql) 79 3.1.7.2.5 Die Funktion echoerror() 80 2 3.1.7.2.6 Die Funktion geanderte_Dts($sql) 81 3.1.7.2.7 Die Funktion get_tablename($sql, $Art) 82 3.1.7.2.8 Die Funktion Create_Table($sql) 84 3.1.7.2.9 Die Funktion Drop_Table($sql) 85 3.1.7.2.10 Die Funktion Alter_Table($sql) 85 3.2 Oracle 87 3.2.1 Verbindung zur Oracle-Datenbank der Fachhochschule Regensburg herstellen 87 3.2.2 PHP-Funktionen für Oracle-Datenbanken 96 3.2.3 Erstellen der Tabellen unter Oracle 101 3.2.4 Hinzufügen von Datensätzen unter Oracle 102 3.2.5 Ein allgemeines Beispiel für PHP in Verbindung mit 104 Oracle-Datenbanken 3.2.6 PHP-Skripte in Anwendung mit einer Oracle-Datenbank 106 3.6.1 Hauptprogramm und Klassenvariablen 107 3.6.2 Konstruktor der Klasse oracle_db 109 3.6.3 Die Funktion connect_db() 109 3.6.4 Die Funktion query($sql) 110 3.6.5 Die Funktion geanderte_Dts($sql) 111 3.6.6 Die Funktionen Create_Tavle($sql), Alter_Table($sql) und Drop_Table($sql) 112 Abbildungsverzeichnis 115 Literaturverzeichnis 117 3 1. Einleitung 1.1 Die Geschichte von PHP PHP ist der Nachfolger eines älteren Produktes, PHP/FI (1995, Rasmus Lerdorf). Ursprünglich war PHP/FI ein Set von Perl Skripten zur Erfassung der Zugriffe auf einen Webauftritt. Er nannte dieses Set von Skripten „Personal Home Page Tools“. Als dann mehr Funktionalität benötigt wurde, schrieb Hr. Lerdorf eine viel größere Umsetzung in C, welche auch mit Datenbanken kommunizieren konnte und den Benutzern die Entwicklung einfacher dynamischer Webapplikationen ermöglichte. Rasmus Lerdorf entschloss sich, den Sourcecode von PHP/FI zu veröffentlichen, so dass ihn jeder benutzen, von Fehlern bereinigen und weiterentwicklen konnte. PHP/FI stand für Personal Home Page / Forms Interpreter und beinhaltete manches an Funktionalität des heutigen PHP. Es besaß Variablen wie in Perl, eine automatische Interpretation von Formilarvariablen und eine in HTML eingebettete Syntax. Die Syntax selbst war der von Perl ähnlich, wenn auch viel eingeschränkter, einfach und ziemlich konsistent. 1997 war PHP/FI 2.0, die zweite Überarbeitung der C Implementierung, Kult für einige tausend Benutzer weltweit (geschätzt). Etwa 50.000 Domains berichteten, PHP/FI 2.0 installiert zu haben, was mit ca. 1% der Domains im Internet zu Buche schlug. Obwohl mehrere Leute diesem Projekt ein Stück Code beisteuerten, war es insgesamt immer noch ein Ein-Mann-Projekt. PHP 3.0 war die erste Version, die dem heutigen PHP sehr gleicht. Es wurde 1997 von Andi Gutmans und Zeev Suraski neu geschrieben, nachdem PHP/FI 2.0 ihrer Meinung nach für die Entwicklung ihrer e-Commerce Applikation viel zu schwach war. Auf die Basis der bestehenden Benutzer von PHP/FI aufbauend, entschieden sich Hr. Gutmans, Hr. Lerdorf und Hr. Suraski zur Kooperation und kündigten PHP 3.0 als den offiziellen Nachfolger von PHP/FI 2.0 an, und die Entwicklung von PHP/FI 2.0 wurde größtenteils eingestellt. 4 Eine der größeren Stärken von PHP 3.0 waren die großen Erweiterungsmöglichkeiten. Zusätzlich zu der soliden Infrastruktur für eine Menge an Datenbanken, Protokollen und APIs lockten vor allem die Erweiterungsmöglichkeiten von PHP 3 Dutzende von Entwicklern an, welche sich beteiligten und neue Erweiterungsmodule einbrachten. Möglicherweise war das der Schlüssel zu dem gewaltigen Erfolg von PHP 3.0. Weitere besondere Merkmale waren die Unterstützung für objektorientierte Syntax und die viel bessere, sowie konsistentere Sprachsyntax. Die gesamte neue Sprache wurde unter einen neuen Namen veröffentlicht, welche die im Namen PHP/FI 2.0 vorhandene Implizierung einer eingeschränkten persönlichen Nutzung beseitigte. Es wurde einfach „PHP“ genannt. PHP steht für PHP Hypertext Preprocessor. Gegen Ende 1998 wuchs PHP auf eine installierte Basis von geschätzten zehntausenden Benutzern und hunderttausenden Websites, auf denen PHP installiert war, heran. An seinem Höhepunkt war PHP 3.0 auf etwa 10% der Webserver im Internet installiert. PHP 3.0 wurde im Juni 1998 nach einer neunmonatigen öffentlichen Testphase offiziell freigegeben. Im Winter 1998, kurz nach der offiziellen Freigabe von PHP 3.0, begannen Andi Gutmans und Zeev Suraski den Kern von PHP umzuschreiben. Die Ziele waren eine verbesserte Leistung von komplexen Applikationen und eine verbesserte Modularität des Basiscodes. Solche Applikationen wurden durch die neuen Leistungsmerkmale von PHP 3.0, der Unterstützung einer großen Auswahl von Datenbanken und APIs von Drittanbietern, möglich gemacht, aber PHP 3.0 war nicht dafür entworfen, solche komplexen Applikationen auch effizient zu handhaben. Die neue Engine, bezeichnet sich als „Zend Engine“ (aus den Vornamen Zeev und Andi gebildet), entsprach diesen Zielen erfolgreich und wurde zum ersten mal 1999 eingeführt. PHP 4.0, das auf dieser Engine - verbunden mit einer großen Auswahl an zusätzlichen Leistungsmerkmalen - basiert, wurde im Mai 2000 offiziell freigegeben, fast zwei Jahre nach seinem Vorgänger PHP 3.0. Zusätzlich zu der stark verbesserten Leistung inkludierte PHP 4.0 andere wichtige Leistungsmerkmale, wie Unterstützung für viele weitere Webserver, HTTP5 Sessions, Ausgabepufferung, sichere Wege im Umgang mit Benutzereingaben und verschiedene neue Sprachkonstrukte. PHP 4 ist die derzeit aktuellste freigegebene Version von PHP. Die Arbeit an der Modifikation und die Verbesserung der Zend Engine zur Integration der neuen für PHP 5.0 entworfenen Leistungsmerkmale hat bereits begonnen. Heute wird PHP von hundertausenden von Entwicklern verwendet, und es wird von mehreren Millionen Sites berichtet, auf welchen PHP installiert ist, was mit über 20% der Domains im Internet zu Buche schlägt. 6 1.2 Gründe für die Themenwahl Ich habe mich für dieses Thema aus mehreren Gründen entschieden. Der erste ist, dass PHP im Informatikstudium derzeit nicht gelehrt wird. In meiner Tätigkeit als Werksstudent habe ich auch noch keine Erfahrungen mit PHP sammeln können. Zweitens da PHP nur in Verbindung mit einem Webserver läuft, bietet es Gelegenheit, sich mit Installation und Konfiguration eines solchen Servers vertraut zu machen. Für das Projekt war es notwendig, eine Internetanbindung über PHP zu einer MySQLDatenbank zu schaffen. Aufgrund der Projektvorgabe, laut der die Inhalte der Website dynamisch eingefügt werden sollen, wobei diese in Tabellenform gespeichert werden können, ist eine Datenbank ein naheliegendes Hilfsmittel. Die Daten können z.B. in einer MySQLDatenbank hinterlegt werden. Da ein Webserver kein Datenbank-Client ist, wird hier eine Schnittstelle benötigt. Diese Schnittstelle ist PHP. Neben den Skripting-Eigenschaften eignet sich PHP als MySQL-Client, um Daten in die Webseiten zu integrieren. Die Erstellung einer solchen MySQL-Datenbank und das Modifiziern, Löschen und Abfragen mittels PHP-Skript ist für mich von besonderen Interesse. 7 2. PHP PHP ist eine Programmiersprache, die der Syntax von C und Java sehr ähnelt. Im Gegensatz zu C und Java findet in PHP aber keine Übersetzung in einen binären Objektcode statt. Die Programme liegen im Quelltext auf dem Server und werden in dem Moment, in dem sie aufgerufen werden, von einem Servermodul interpretiert. Man bezeichnet eine solche Programmiersprache auch als Skriptsprache. Diese Vorgehensweise hat gegenüber binärem Code zwar Geschwindigkeitsnachteile, aber PHP ist dafür plattformunabhängig und kann in HTML-Seiten eingebettet werden. Im Internet läuft PHP in Verbindung mit einem Webserver. Dazu wird ein Modul geladen, das die PHP-Anwendung ausführt. Vorraussetzung ist demnach, dass man einen Webserver mit PHP-Modul besitzt oder ihn so konfigurieren kann. Man kann PHP auch als CGI-Variante betreiben. CGI steht für Common Gateway Interface und beschreibt die Verfahrensweise, wie der Webserver externe Programme aufruft und wie letztendlich die HTML-Seite entsteht, die im Client angezeigt wird. Die CGI-Variante ist aber im Webserver-Betrieb als ungünstiger zu bezeichnen, da sie mehr Ressourcen verbraucht und langsamer läuft. Die Variante als Servermodul ist dem vorzuziehen. 2.1 Voraussetzungen und Installation Im Internet läuft PHP in Verbindung mit einem Webserver. Dazu wird ein Modul geladen, das die PHP-Anweisung ausführt. Vorraussetzung ist demnach, dass man einen Webserver mit PHP-Modul besitzt oder ihn so konfigurieren kann. Auf Servern im Internet wird oft Apache mit PHP und MySQL betrieben. 8 PHP ist plattformunabhängig. Wird Windows verwendet, sollte es aber mindestens Windows NT oder Windows 98 sein. Für die Beispielinstallation wurde WindowsMe verwendet. Man kann PHP aber auch unter Linux bzw. Unix-Betriebssystemen installieren. Es gibt nur wenige Funktionen, die unter Linux und Windows verschieden sind. Es sollte ebenfalls ein TCP/IP-Protokoll installiert sein. Wird Linux benutzt, dann sollte es eine Linux-Version mit einem Kernel ab Version 2.2 sein. Ein installiertes TCP/IP-Protokoll sollte vorhanden sein. Außerdem werden ein C-Compiler, der Linker und die entsprechenden Bibliotheken benötigt. Wenn im Computer keine Netzwerkkarte eingebaut ist, muss unter Windows 9x und Windows 2000 wenigstens das DFÜ-Netzwerk installiert sein, damit TCP/IP mit der IPAdresse 127.0.0.1 und dem Alias "localhost" verfügbar ist. Unter Windows NT installieren Sie dazu den "Microsoft Loopback Adapter". Unter Linux sollte das "Loopback Device" standardmäßig installiert sein. Für die Installation von Apache, MySQL, PHP und PHPMyAdmin wurde ein Verzeichnis C:\Web auf der Festplatte angelegt und alle Programme wurden in dieses Verzeichnis installiert. Die festen Pfade werden in dieser Diplomarbeit fettgedruckt dargestellt.. 2.1.1 Der Apache-Webserver Um das TCP/IP-Protokoll unter Windows zu installieren, wechseln Sie zunächst ins Arbeitsplatzmenü auf dem Desktop ihres Computers. Gehen Sie jetzt in die Systemsteuerung. Doppelklicken Sie auf das Icon Netzwerk und auf den Button Hinzufügen. 9 Aktivieren des Buttons Hinzufügen (Abb.1: Hinzufügen eines Netzwerkprotokolls) Wählen Sie nun die Eigenschaft „Protokoll“ aus. Wählen Sie als Hersteller Microsoft aus und als Netzwerkprotokoll TCP/IP. 10 Auswahl des TCP/IPProtokolls (Abb.2: Hinzufügen des TCP/IP-Protokolls) Am Ende sollte dann Ihre Netzwerkumgebung folgendes Aussehen haben, je nachdem welche anderen Protokolle Sie noch zusätzlich installiert haben. 11 (Abb.3: Netzwerkumgebung) Ist das TCP/IP-Protokoll richtig installiert, kann mit der Installation des Apache-Webservers begonnen werden. Eine aktuelle Version des Apache-Webservers ist gegebenenfalls im Internet unter http://www.apache.org herunterzuladen. In der Beispielinstallation wird die Version 2.0.43 verwendet. Starten Sie das Setup-Programm durch einen Doppelklick auf die Datei und folgen Sie den Anweisungen. 12 (Abb.4: Start der Apache-Installation) Netzwerkname des PCs (Abb.5: Netzwerknamen für den Apache-Webserver eintragen) 13 Tragen Sie unter Server Name nur den Netzwerknamen ihres PCs ein. Diesen erfahren Sie in den Netzwerkeinstellungen. Als Beispiel wurde eine benutzerdefinierte Installation durchgeführt und als Zielverzeichnis C:\Web\Apache eingetragen. Danach kann der Apache-Webserver installiert werden. Nachdem die Installation beendet ist, sollte Sie ihr System neu starten. Gehen Sie nun in Ihr Startmenü, öffnen Sie den Münepunkt der Apache-Anwendungen und danach Control Apache Server und führen Sie das Programm Start Apache in Console aus. Testen Sie die Apache Installation, indem Sie im Internet Explorer http://localhost oder http://127.0.0.1 eintippen. (Abb.6: Überprüfen der Apache-Installation) 14 Sollte die Testseite des Apache-Webservers nicht erscheinen, wurde offenbar der ApacheDienst nicht richtig eingerichtet. Das kann jedoch in der MS-DOS-Eingabeaufforderung nachgeholt werden. Wechseln Sie in das Installationsverzeichnis des Apache-Webservers. In der Beispielinstallation ist das C:\Web\Apache\bin. Geben Sie apache -k start ein und bestätigen Sie die Eingabe mit der Enter-Taste. Wiederholen Sie den Installationstest. Mit dem Befehl apache -k stop beenden Sie den Apache-Webserver. Nun sollte der Apache-Webserver auf ihren Computer installiert sein. 2.1.2 Installation von PHP unter WindowsMe Sie können eine aktuelle Version von PHP aus dem Internet unter www.apache.org herunterladen. Entpacken Sie dann diese Dateien in einen Ordner, der in der Beispielinstallation unter der Namen C:\Web\PHP angegeben wurde. Als nächstes muss die Datei PHP.INI_DIST, die in der Beispielinstallation unter dem Verzeichnis C:\Web\PHP zu finden ist, in das Windows-Verzeichnis (z.B. C:\Windows) kopiert werden. Benennen Sie jetzt die Datei in PHP.INI um und entfernen Sie gegebenenfalls den Schreibschutz. Öffnen Sie die Datei PHP.INI mit einem Texteditor wie z.B. WordPad und nehmen Sie folgende Änderungen vor: ?? Setzen Sie den Wert max_execution_time = 60, der es erlaubt, dass ein PHP-Skript bis zu 60 Sekunden laufen darf. ?? Setzen Sie doc_root auf den htdocs-Ordner Ihrer Apache-Installation. Im Beispiel ist das doc_root = C:\Web\Apache\htdocs. In diesem Verzeichnis müssen die erstellten PHP-Dateien gespeichert werden. ?? Setzen Sie extensions_dir auf den Ordner PHP\extensions\. Im Beispiel lautet die Zuweisung extensions_dir = C:\Web\PHP\extensions\. 15 ?? Aktivieren Sie (Enfernen des ’;’) im Abschnitt Windows Extensions PHP_GD.DLL. ?? Setzen Sie display_errors = On, um Fehlermeldungen zu aktivieren. Speichern und schließen Sie die Datei PHP.INI. Verschieben Sie die Datei PHP4TS.DLL aus ihrem PHP-Verzeichnis in das SystemVerzeichnis von Windows (z.B. C:\Windows\System.) Öffnen Sie die Datei HTTPD.CONF in ihrem Apache-Ordner, im Beispiel ist das C:\Web\Apache\Conf\HTTPD.CONF, mit einem Texteditor und fügen Sie am Ende der Datei folgende Zeilen an, die PHP als Module in Apache laden und Dateien, die auf .PHP, .PHP3 und .PHP4 enden, auf den PHP-Parser umleiten. ?? LoadModule php4_module c:/web/php/sapi/php4apache.dll Beachten Sie bitte, dass das Verzeichnis mit ’/’ und nicht mit ’\’ angegeben werden muss. ?? AddType application/x-httpd-php .php ?? AddType application/x-httpd-php .php3 ?? AddType application/x-httpd-php .php4 Starten Sie Ihren Apache-Webserver neu. Erstellen Sie mit einem Texteditor im Verzeichnis HTDOCS Ihrer Apache-Installation die Datei Info.PHP, die folgenden Inhalt aufweist: <?php phpinfo(); ?> Geben Sie im InternetExplorer http://127.0.0.1/info.php oder http://localhost/info.php ein. Wenn alle Schritte richtig vollzogen sind, sehen Sie die PHP-Info-Seite mit Angaben zur PHP-Installation. 16 (Abb.7: Überprüfung der PHP-Installation) 17 2.2 Die Skriptsprache PHP PHP ist eine Programmiersprache, die nicht in einen für den Computer ausführbaren Programmcode übersetzt wird. PHP wird sozusagen interpretiert, ist also plattformunabhängig und lässt sich leicht in Webseiten integrieren. PHP wird zur Erzeugung von Server Pages verwendet. Server Pages sind HTML-Dateien mit variablem Inhalt. Dieser variable Inhalt wird durch PHP erzeugt. 2.2.1 Was ist PHP? PHP ist eine Skriptsprache, die serverseitig verarbeitet wird und deren Syntax direkt in HTML-Dokumente geschrieben wird. PHP kennt außerdem das <BR>-Zeichen von HTML das einen Zeilenumbruch hervorruft. Um PHP-Skripte auszuführen, wird ein Server benötigt, der entsprechend konfiguriert ist. Die meisten Webserver sind so konfiguriert, dass Sie den PHP-Dateien eine bestimme Erweiterung geben müssen. Ohne diese würde der Webserver die Datei nicht an den PHPProzessor weiterleiten. Für gewöhnlich werden die Dateierweiterungen .PHP, .PHP3, .PHP4 und PHTML unterstützt. PHP-Dateien können Sie mit jedem Texteditor schreiben. Empfehlenswert ist ein Editor mit farblicher Syntaxhervorhebung, um einen besseren Überblick zu behalten. Der EditPlusText Editor eignet sich z.B. sehr gut dafür und kann unter der Adresse www.editplus.com heruntergeladen werden. EditPlus ist eine Sharewareversion, die Sie nach 30 Tagen registrieren müssen. Ein herkömmlicher Text Editor wie WordPad funktioniert aber auch. 18 Beachten Sie, dass die erstellten Dateien die Endung .PHP, .PHP3, .PHP4 oder PHTML besitzen müssen. Speichern Sie alle Dateien in dem Apache-Server zugeordneten Verzeichnis. Bei der Beispielinstallation ist das C:\Web\Apache\htdocs. 2.2.2 Programmieren mit PHP Der PHP-Quellcode kann direkt in den HTML-Text geschrieben und zwischendurch von HTML unterbrochen werden. PHP arbeitet den Code von oben nach unten ab. Innerhalb der Begrenzungen von PHP darf kein reines HTML stehen. Sie benötigen eine Schreibweise, die dem PHP-Prozessor mitteilt, wann PHP beginnt und endet. Die gängigste Schreibweise ist der XML-Stil: HTML-Quelltext <?php //PHP-Quelltext ?> HTML-Quelltext Kommentare Kommentare sind ein wichtiges Werkzeug für den Programmierer. Kommentare werden in PHP genauso wie in C++ erstellt. <?php /* Dies ist ein Kommentar*/ // Dies ist auch ein Kommentar ?> Kommentare dürfen auch nach abgeschlossenen Anweisungen folgen. <?php echo(“Testausgabe“); // Kommentar ?> 19 Anweisungen Anweisungen werden von oben nach unten abgearbeitet. PHP unterscheidet Zuweisungen, Funktionsaufrufe, Bedingungen und Schleifen. Jede Befehlskette wird mit einem Semikolon abgeschlossen. Die erste Anweisung ist die echo-Anweisung. Mit diesem Befehl gibt der Browser einen Text aus. <HTML><HEAD><TITLE> Mein erstes Programm </TITLE><</HEAD> <BODY> <?php echo(“Hello World!”); //Anweisung ?> </BODY></HTML> Ausgabe: Hello World Der echo-Befehl Der echo-Befehl gibt Strings aus. Der Text, der ausgegeben werden soll, muss natürlich in Anführungsstrichen stehen, da der Server sonst versucht, ihn als PHP-Befehl zu interpretieren. Bei den Anführungsstrichen gibt es zwei verschiedene: einmal das einfache „ ’ “ und dass doppelte „ “ “. Es gibt auch einen Unterschied zwischen den beiden. Bei den doppelten Anführungsstrichen versucht der Server den Text zu interpretieren, bei den einfachen gibt er ihn dagegen einfach aus. <?php $var = 110; echo(’Die Variable $var hat den Wert 110’ . “<BR>“); echo(“Die Variable $var hat den Wert 110 <BR>“); ?> Ausgabe: Die Variable $var hat den Wert 110 Die Variable 110 hat den Wert 110 20 Unterdrücken von Sonderzeichen Einige Ausdrücke können durch PHP fehlerhaft interpretiert werden, wie das folgende Beispiel zeigt. <?php echo("$var ist eine "Variable"."); ?> Dieses Skript wird nicht ausgeführt, da die Anführungszeichen um das Wort „Variable“ als PHP-Syntax gedeutet werden. Außerdem wird $var nicht ausgegeben, da diese Variable noch keinen Inhalt besitzt. Es soll außerdem nur der String $var ausgegeben werden. Der Begriff $var wird als Variable interpretiert. Abhilfe erfolgt durch das Setzen eines Backslash \ vor das Sonderzeichen. <?php echo("\$var ist eine \"Variable\"."); ?> Ausgabe: $var ist eine "Variable". Blöcke und Strukturen PHP-Skripts werden durch Kontrollstrukturen gesteuert. Im wesentlichen sind das Schleifen und Bedingungen. Wie schon bei den PHP-Begrenzungen <?php ?> müssen auch Strukturen begrenzt werden. Dazu werden geschweifte Klammern {} verwendet. <?php $variable = 1; if ($variable ==1) { echo("Das ist eine If-Anweisung in PHP."); } ?> Jede Struktur, die von geschweiften Klammern eingeschlossen wird, ergibt einen Anweisungsblock. Auch dieser darf von HTML unterbrochen werden. 21 Achten Sie darauf, dass der Block ordnungsgemäß durch eine geschweifte Klammer beendet wird. Anweisungsblöcke dürfen auch verschachtelt werden. PHP-Dateien einbinden Soll ein PHP-Programm ein weiteres PHP-Programm einbinden, bietet PHP die Anweisungen include und require. Damit sind Sie in der Lage, Programmstrukturen auszulagern oder einfach Inhalte in Ihre Seite oder Ihr Skript zu implementieren. Der Unterschied der beiden Befehle besteht in der Art der Einbindung. Include ruft eine Datei nur dann auf, wenn es erwünscht wird. Steht diese Anweisung innerhalb eines Blocks, der nicht abgearbeitet wird, so wird auch die Datei nicht eingebunden, welche in include definiert wurde. Im Gegensatz dazu wird require immer ausgeführt, auch dann, wenn der Befehl innerhalb einer nicht abzuarbeitenden Struktur steht. <?php include ("Dateiname"); require ("Dateiname"); ?> Wird eine Datei durch include() an mehreren Stellen des Skripts aufgerufen, wird diese auch mehrmahls ausgeführt. Dateien, die require() einbindet, führt PHP nur einmal aus. 2.2.2.1 Variablen Wertzuweisungen Variablen setzen sich in PHP aus einem vorangestellten $-Zeichen, dem Namen der Variable und dem Operator „=“ zusammen. Hinter dem Operator steht der Wert der Variable. <?php $variable1 = “Hello World!“; //String $variable2 = 10; //Integer $variable3 = 0.5; //Double 22 ?> $variable4 = True; //Boolean $variable5 = Object; //Objekt $variable6 = Array; //Feld In PHP wird der Typ einer Variablen automatisch durch den zugewiesenen Wert bestimmt. D.h. es ist nicht nötig, jeden Datentyp explizit zu deklarieren. Werden unterschiedliche Datentypen miteinander verknüpft, wird dem entstandenen Wert automatisch der sinnvollste Datenentyp zugewiesen. <?php $var1 = 10; //Integer $var2 = 10.5; //Double $c = $a + $b; //c ist vom Typ Double ?> Globale Variablen Um Variablen bekannt zu machen, wird das Schlüsselwort global verwendet. Damit können Variablen und deren Werte strukturübergreifend benutzt werden. <?php $a = 100; function show() { global $a; echo ("Der Wert der Variablen \$a ist:" . $a); } show(); ?> Ausgabe: Der Wert der Variablen $a ist: 100 Mit dem Operator „ , “ können mehrere Variablen global zusammengefasst bzw. definiert werden. <?php global $a, $b, $c; ?> 23 Statische Variablen Normalerweise verlieren Variablen nach Verlassen eines Strukturblocks, z.B. einer Funktion oder einer Schleife, ihren in der Struktur neu berechneten Wert. Ist das nicht erwünscht, können Sie die Variable mit static deklarieren. <?php ?> function show() { static $var = 100; $var = $var + $var; echo ("Der Wert der Variablen \$var ist: $var <BR>"); } show(); show(); Ausgabe: Der Wert der Variablen $var ist: 200 Der Wert der Variablen $var ist: 200 Die statisch deklarierte Variable behält ihren in der Struktur neu zugewiesenen Wert bei. <BR> entspricht den New-Line-Zeichen. Dynamische Variablen PHP bietet Ihnen die Möglichkeit, eine Variable in einer anderen zu speichern. Im folgenden Beispiel wird zuerst der Variablen $a der Wert name zugewiesen. Im zweiten Schritt wird eine neue Variable dynamisch erzeugt, indem zwei $-Zeichen ($$) verwendet werden. Der neuen Variablen wird der Wert lernen zugewiesen. Der Variablenname der dynamisch erzeugten Variable hat den Wert der Variablen $a angenommen. Das bedeutet, dass die dynamische Variable jetzt eigentlich $name heißt. <?php $a = "name"; $$a = "lernen"; echo ($name); ?> 24 Ausgabe: lernen Diese Art der Deklaration von Variablen ist auch mit Arrays möglich. 2.2.2.2 Konstanten Wird eine Konstante deklariert, so ist sie global im gesamten Skript verfügbar. Das ist sinnvoll, wenn ein Wert an mehreren Stellen des Skripts mehrmals benötigt wird. Damit Sie bei Änderung des Wertes nicht das gesamte Skript nach dem Wert durchsuchen müssen, lohnt sich die Definition einer Konstanten, um dann nur diesen Wert zu ändern. Konstanten werden mit define(“Konstantenname“, “Konstanteninhalt“) deklariert. <?php ?> define("Bearbeiter", "Hans Mustermann"); echo("Ihr aktueller Sachbearbeiter ist " . Bearbeiter); Ausgabe: Ihr aktueller Sachbearbeiter ist Hans Mustermann Beim Aufruf einer Konstanten muss das $-Zeichen weggelassen werden. 2.2.2.3 Operatoren Zuweisungsoperatoren Mit dem Gleichheitszeichen = wird der Wert einer Variablen an eine andere Variable, dem Operanden übergeben. 25 Operator Ergebnis $c = $a Der Wert der Variable $a wird der Variable $c zugewiesen. $a = 1 Der Variable $c wird die Speicheradresse für den Wert der Variablen $a $c = &$a zugewiesen. Arithmetische Operatoren In PHP stehen wie auch in allen anderen Programmiersprachen die vier Grundrechenarten zur Verfügung, sowie die Modulo-Funktion. Operator Ergebnis $c = $a -$b Differenz von $a und $b $a -= $b Der Wert der Variablen $a wird durch Subtraktion um den Wert $b verringert. Das Ergebnis wird in der Variablen $a gespeichert. $c = $a + $b Summe von $a und $b $a += $b Der Wert der Variablen $a wird durch Addition um den Wert $b erhöht. Das Ergebnis wird in der Variablen $a gespeichert. $c = $a * $b Produkt von $a und $b $a *= $b Der Wert der Variablen $a wird durch Multiplikation um den Wert $b erhöht. Das Ergebnis wird in der Variablen $a gespeichert. $c = $a / $b Quotient von $a und $b $a /= $b Der Wert der Variablen $a wird durch den Wert $b geteilt. Der Rest des Ergebnisses wird in der Variablen $a gespeichert. $ c = $a % $b Rest der Division von $a und $b; entspricht der Modulo-Funktion String-Operator Verschiedene Zeichenketten lassen sich mit dem String-Operator miteinander verknüpfen. Dieser Operator ist auch in der Lage, mehr als zwei Variablenwerte miteinander zu verknüpfen. 26 Operator Ergebnis $c = $a . $b Verknüpfung von Werten $a .= $b <?php $a = "Beispiel "; $b = "für den "; $c = "String-Operator!"; $d. = $a . $b . $c; echo($d); ?> Ausgabe: Beispiel für den String-Operator! Vergleichsoperatoren Vergleichsoperatoren überprüfen zwei Variablen auf Abhängigkeit. Trifft die zu untersuchende Abhängigkeit zu, wird der Boolean-Wert 1 als wahr zurückgegeben, andernfalls der Wert 0. Operator Ergebnis $a == $b Die Werte der Variablen $a und $b werden auf ihre Gleichheit überprüft. $a != $b Die Werte der Variablen $a und $b werden auf ihre Ungleichheit überprüft. $a > $b Für die Variable $b wird überprüft, ob ihr Wert kleiner ist als der Wert der Variablen $a. $a < $b Für die Variable $a wird überprüft, ob ihr Wert kleiner ist als der Wert der Variablen $b. $a >= $b Es wird geprüft, ob der Wert der Variablen $a größer oder genau gleich dem Wert der Variablen $b ist. $a <= $b Es wird geprüft, ob der Wert der Variablen $a kleiner oder genau gleich dem Wert der Variablen $b ist. $a === $b Die Variablen $a und $b werden überprüft, ob ihre Werte und ihre Datentypen übereinstimmen. $a !== $b Die Variablen $a und $b werden darauf überprüft, ob ihre Werte und ihre 27 Datentypen verschieden sind. <?php $a = "PHP" $b = "php" if ($a != $b) { echo ("Die Variablen \$a und \$b haben unterschiedliche Werte."); } ?> Ausgabe: Die Varaiablen $a und $b haben unterschiedliche Werte. Logische Operatoren Operator Ergebnis $a and $b Ist wahr, wenn $a und $b wahr sind $a or $b Ist wahr, wenn entweder $a oder $b wahr ist oder beide wahr sind $a xor $b Ist wahr, wenn entweder $a oder $b wahr ist, aber nicht beide wahr sind $a && $b Ist wahr, wenn $a und $b wahr sind $a || $b Ist wahr, wenn entweder $a oder $b wahr ist !$a Ist wahr, wenn $a nicht wahr ist Operatoren für In- und Dekrementierung Durch Inkrementierung wird der Wert einer Variablen bequem um den Wert 1 erhöht. Dekrementierung verringert den Wert einer Variablen um den Wert 1. ++$a Der Wert der Variablen $a wird um den Wert 1 erhöht. Der neue Wert der Variablen $a wird zurückgegeben. $a++ Der Wert der Variablen $a wird zurückgegeben und dann um den Wert 1 erhöht. --$a Der Wert der Variablen $a wird um den Wert 1 verringert. Der neue Wert der Variablen $a wird zurückgegeben. 28 $a-- Der Wert der Variablen $a wird zurückgegeben und dann um den Wert 1 verringert. <?php ?> $i = 0; while ($i < 10) { $a .= $i . ", "; } echo($a); Ausgabe: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 29 2.3 Programmsteuerung 2.3.1 Beenden des Programms PHP stellt zwei Befehle zur Verfügung um die Programmabarbeitung an beliebiger Stelle sofort zu beenden. Exit Der Befehl exit beendet die Abarbeitung aller PHP-Befehle der aktuellen Seite, nicht nur des aktuellen Blocks. Die Ebenso wie exit, bricht die die Programmausführung ab. 2.3.2 Entscheidungen mit if Nach dem Vorbild der Programmiersprache C beherrscht PHP die if-Anweisung. <?php ?> if (logischer Ausdruck) { // Anweisung 1 } else { // Anweisung 2 } Werden mehr Bedingungen in einer Struktur vereint, muss elseif verwendet werden. Dieser Befehl steht immer im Zusammenhang mit einer Bedingung. <?php $a = 10; 30 $b = 20; if ($a > $b) { echo ("\$a ist größer als \$b."); } elseif ($a == $b) { echo("\$a ist genauso groß wie \$b."); } else { echo ("\$a ist kleiner als \$b."); } $> Ausgabe: $a ist kleiner als $b. Die elseif-Anweisung kann mehrmals hintereinander angewendet werden. 2.3.3 Entscheidungen mit switch Muss eine Variable mehrfach getestet werden, dann bietet sich in PHP der switch-Befehl an. Mit break kann die Entscheidung abgebrochen werden. <?php ?> $zahl = 4 switch ($zahl) { case 1: echo ("Der Wert der Zahl ist: " . $zahl); break; case 2: echo ("Der Wert der Zahl ist: " . $zahl); break; case 3: echo ("Der Wert der Zahl ist: " . $zahl); break; case 4: echo ("Der Wert der Zahl ist: " . $zahl); break; } Ausgabe: Der Wert der Zahl ist: 4 31 2.3.4 Schleifen mit while Mit Hilfe von while wird ein Anweisungsblock definiert, der in Abhängigkeit von einer Bedingung mehrfach abgearbeitet wird. <?php ?> $a = 10; $b = 0; while ($b < $a) { echo ("$a. Die Schleife wird 10x durchlaufen. <BR>"); } Solange der Wert der Variablen $b kleiner als 10 ist, wird der Anweisungsblock ausgeführt. Erst wenn der logische Ausdruck die Bedingung FALSE ergibt, wird die Schleife nicht weiter ausgeführt. 2.3.5 Die do-while-Schleife Im Gegensatz zur while-Schleife wird hier die Austrittsbedingung erst am Ende des Anweisungsblocks untersucht. D.h., dass die Anweisungen mindestens einmal abgearbeitet werden. <?php $austritt = 0; $zaehler = 0; do { echo ("$zaehler. Die Schleife wird 1x durchlaufen.<BR>"); $zaehler ++; } while ($zaehler < austritt) ?> 32 2.3.6 Die for-Schleife Die for-Schleife wird auch als Zählschleife bezeichnet. Im normalen Verwendungsfall durch eine Zählvariable, die die Bedingung und die Veränderung des Zählers zur Laufzeit ermittelt. <?php for ($i = 1; $i <= 5; $i++) { echo ("Die Schleife wird zum $i. Mal durchlaufen.<BR>"); } ?> Diese Schleife wird fünfmal durchlaufen. Der Zählvariable $i wurde der Startwert 1 zugewiesen. Sie wird durch die Bedingung überprüft. Solange die Bedingung zutrifft, wird die Zählervariable in dem Beispiel erhöht und der Anweisungsblock ausgeführt. 2.3.7 Die foreach-Schleife Die foreach-Schleife ist die Schleife für Arrays. Der Umgang mit Arrays erfährt durch die Anwendung dieses Schleifentyps eine deutliche Erleichterung. Foreach arbeitet jedes Element des Arrays nacheinander ab. Der Befehl ermittelt dabei die Anzahl der Elemente und setzt den internen Zeiger in jedem Schleifendurchlauf um ein Element weiter. Es stehen zwei Möglichkeiten zur Verfügung, um die Schleife aufzurufen. <?php ?> $array = array ("1","2","3"); foreach ($array as $element) { $element .= "0"; echo ("$element, "); } Ausgabe: 10, 20, 30, 33 Durch diese Schreibweise kann jedes Element des Arrays bearbeitet werden. An alle Elemente wird in diesem Beispiel die Zahl 0 angehängt. Mit der zweiten Schreibweise können die Schlüssel des Elements verarbeitet werden. <?php $array = array("1","2","3"); foreach ($array as $key => $element) { $element .= "0"; $key .= "x"; echo ("Schlüssel: $key, Element: $element<BR>"); } ?> Ausgabe: Schlüssel: 0x, Element: 10 Schlüssel: 1x, Element: 20 Schlüssel: 2x, Element: 30 Jedes Element wurde genauso behandelt wie im vorhergehenden Beispiel. Hinzugekommen ist die Bearbeitung des Schlüssels, dem das Zeichen x angehängt wird. 2.3.8 Funktionen Eine Funktion ist ein separater Programmteil, der eine besondere Aufgabe löst. Sie wird etwa verwendet, um eine Formel zu berechnen. Ihr werden dazu die notwendigen Eingabewerte übergeben; als Ausgabewerte erhält man das Ergebnis. Normalerweise wird eine Funktion in Verbindung mit der gewünschten Rückgabe eines Wertes benutzt. In PHP ist eine Funktion mehr. Sie stellt ein Modul dar, welches beliebig oft aufrufbar ist. In PHP sind bereits viele spezielle Funktionen implementiert. Durch function, den Funktionsnamen und die Parameter wird eine Funktion definiert. <?php function name( $Parameter, $Parameter, ...) 34 { } // Anweisung return $varable; // Rückagebwert ?> Sind keine Parameter vorhanden, bleibt der Inhalt der Klammern leer. Parameter übergeben Werte entweder über Variablen oder auch direkt in die Funktionsstruktur. Durch die Verwendung von return wird das Ergebnis aus der Struktur zurückgegeben. An welcher Stelle sich Funktionen im Quelltext befinden, spielt in PHP4 keine Rolle. Wenn PHP auf die Definition einer Funktion im Quelltext stößt, wird der Code übersprungen und erst dann ausgeführt, wenn die Funktion aufgerufen wird. <?php $b = 13; $c = test("20", $b); //Funktionsaufruf echo($c); function test ($a, $b) { if ($a < $b) { return $a + $b; } else { return $a - $b; } } ?> Ausgabe: 7 By Value Häufig werden Funktionen verwendet, um den Wert von Variablen zu verändern. Ist erwünscht, dass eine Variable nur innerhalb einer Funktion verändert wird, verwendet man die Schreibweise ($a, $b, ...). Die Funktion hat damit keinen Einfluss auf den Originalwert der Variablen; nach Beendigung der Ausführung erhält man den ursprünglichen Wert zurück. 35 <?php $a = 100; addiere ($a); echo ($a); function addiere ($x) { $x += $x; } ?> Ausgabe: 100 Obwohl der Übergabeparameter innerhalb der Funktion verändert wird, hat das keinen Einfluss auf den Originalwert. By Reference wird definiert, indem das &-Zeichen dem Parameter vorangestellt wird. By Reference By Reference bedeutet, dass nicht der Wert des Parameters, sondern ein Verweis auf die Speicherzelle übergeben wird. Damit hat die Funktion Zugriff auf die Originalvariablen. <?php ?> $a = 100; addiere ($a); echo($a); function addiere (&$x) { $x += $x; } Ausgabe: 200 Die Veränderung des Parameters innerhalb der Funktion wirkt sich auf den Ausgangswert aus. 36 2.4 Arrays Für Daten, die ausgedruckt in einer Liste oder einer Tabelle ausgegeben werden, wurde der Typ „Array“ entwickelt. Er speichert beliebig viele Werte in einer Variablen. Durch einen Arrayschlüssel ist jeder Wert innerhalb der Variablen eindeutig einer Speicheradresse zugeordnet. 2.4.1 Indiziertes Array Indizierte Arrays verwenden Ganzzahlen als Schlüssel, die PHP vergibt. Durch zwei verschiedene Möglichkeiten lassen sich Arrays definieren. In der ersten Schreibweise wird der Schlüssel durch die eckigen Klammern manuell festgelegt. <?php $a[0] = "a"; $a[1] = "b"; $a[2] = "c"; $a[3] = "d"; echo ($a[3]); //Rückgabe eines Arrays ?> Ausgabe: d Um Werte in einem Array hinzuzufügen, kann man beispielsweise so vorgehen. <?php $a[] = "a"; $a[] = "b"; $a[] = "c"; $a[] = "d"; echo ($a[3]); ?> Diese Definition von Arrays ist jedoch sehr aufwendig. PHP kennt die Funktion array, die einfacher zu handhaben und damit deutlich effektiver ist. 37 <?php $b = "b"; $a = array ("a", $b, "c", "d"); echo ($a[3]); ?> Ausgabe: d Beim Bestimmen eines Arrays muss jedoch die Zahl der zu speichernden Werte nicht festgelegt werden. <?php $a = array (); $a = "a"; $a = "b"; $a = "c"; $a = "d"; ?> Auf diese Art werden beliebig viele Werte an das Array angehängt. 2.4.2 Assoziative Arrays Schlüsselnamen müssen nicht numerisch sein; sie können einen beliebigen Wert annehmen, etwa eine Zeichenkette, die Assoziationen zum Schlüssel erzeugt. Diese assoziativen Schlüssel heißen Hashes. <?php ?> $farbe["rot"] = "1"; $farbe["blau"] = "2"; $farbe["gelb"] = "3"; $farbe["schwarz"] = "4"; echo ($farbe[rot]); //Rückgabe eines Arrays Ausgabe: 1 38 Die Veränderung des Wertes erfolgt auch hier durch Angabe des Schlüsselnamens. Für die Erzeugung assoziativer Arrays besitzt die Funktion array eine erweiterte Syntax. Durch den Operator => verweist der assoziative Schlüssel auf den Wert. <?php $farbe = array ("rot" => "1", "blau" => "2", "gelb" => "3", "schwarz" => "4"); echo ($farbe["blau"]); ?> Ausgabe: 2 39 2.5 Klassen in PHP 2.5.1 Definieren einer Klasse In PHP wird eine Klasse mit folgender Syntax definiert: <?php class Name extends Elternname { ... } ?> Nach dem Namen der Klasse folgt hinter dem Schlüsselwort extends der Name der übergeordneten Klasse. Eine Klasse muss nicht von einer übergeordneten Klasse abgeleitet werden. <?php class Name { ... ?> } 2.5.2 Eigenschaften und Methoden Eigenschaften einer Klasse werden in Variablen gespeichert, die im Block der Klasse angelegt wurden. <?php class Name { var $fname; } ?> 40 Eine Methode wird wie eine normale Funktion definiert, nur innerhalb der Klassenstruktur. Methoden greifen auf die Eigenschaften der Klasse zu, indem Sie den reservierten Zeiger $this verwenden. <?php class Name { var $fname; function xyz ($wert) { $this->fname = $wert; } function Ausgabe () { return $this->fname; } } ?> Eine spezielle Methode der Klasse heißt Konstruktor. Er wird beim Initialisieren einer Klasse automatisch aufgerufen und besitzt den gleichen Namen wie die Klasse. <?php class Name { var $fname; function Name ($Anfangswert) { $this->fname = $Anfangswert; } function WertFestlegen ($wert) { $this->fname = $wert; } function Ausgabe () { return $this->fname; } ?> } 41 2.5.3 Verwenden einer Klasse Wurde eine Klasse einmal definiert, muss das Schlüsselwort new verwendet werden um mehrere Instanzen der Klasse zu erzeugen. <?php include ("myclass.php"); $object1 = new Name ("Roland"); $object2 = new Name ("Katrin"); echo($object1->Ausgabe()); echo("<br>"); $object1->WertFestlegen("Dominique"); echo($object1->Ausgabe()); echo("<br>"); echo($object2->Ausgabe()); echo("<br>"); ?> Ausgabe: Roland Dominique Katrin 2.5.4 Vererbung Nun wird eine neue Klasse Adresse angelegt, um Vor- und Zunamen zu speichern. Sie erbt die Eigenschaften und Methoden der Klasse Name. <?php include("myclass.php"); class Adresse extends Name { var $vname; //Konstruktor der Klasse Adresse function Adresse ($vor, $zu) { Name::Name($zu); $this->vname = $vor; } function WerteFestlegen ($vor, $zu) { 42 Name::WerteFestlegen ($zu); $this->vname = $vor; } function Ausgabe() { $hilf = Name::Ausgabe(); return "$this->vname $hilf"; } } $MeinName = new Adresse ("Andreas", "Hackl"); echo ($MeinName->Ausgabe()); ?> Ausgabe: Andreas Hackl Die Klasse Adresse nutzt die Eigenschaften der Elternklasse Name. Die Syntax für die Methoden der Elternklasse lautet: ElternklasseName::Elternklassenfunktion (Parameter) 43 3. Die Datenbanken MySQL und Oracle 9i In diesem Kapitel wird der Zugriff auf eine MySQL- und eine Oracle-Datenbank mit PHP erklärt. Die Programmschnittstellen die PHP für den Zugriff auf die bedien Datenbanken besitzt sind sehr unterschiedlich und müssen deshalb separat erläutert werden. 3.1 MySQL 3.1.1 Voraussetzung und Installation einer MySQL Datenbank MySQL ist genau wie PHP plattformunabhängig. D.h. Sie können MySQL unter einer gängigen Windows-Version wie z.B. WindowsMe oder unter Linux oder UnixBetriebssystemen installieren. Die Installation unterscheidet sich aber von der Installation unter Windows. Sonst werden keine Vorraussetzungen für MySQL benötigt. Die neueste Version von MySQL können Sie aus dem Internet unter http://www.mysql.com/ herunterladen. Um MySQL zu starten, führen Sie das Setup-Programm (SETUP.EXE) aus und installieren MySQL in ein beliebiges Verzeichnis. Im Beispiel wurde die MySQLInstallation in das Verzeichnis C:\Web\MySQL installiert. Nachdem die Installation abgeschlossen ist, öffnen Sie mit einem Texteditor (WordPad) die Datei My-Example.cnf in Ihrem MySQL-Verzeichnis und entfernen das Kommentarzeichen # in der Zeile mit der Anweisung basedir. In der Beispielinstallation ist die Datei unter C:\Web\MySQL\My-Example.cnf zu finden. Tragen Sie als Verzeichnis hier Ihr MySQL-Verzeichnis ein (z.B. C:\Web\MySQL). Speichern Sie die Datei als C:\My.cnf. Sie können den Start von MySQL unter WindowsME mit Hilfe des Registry-Editors automatisieren. Fügen Sie dazu unter HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\ 44 RunServices eine Zeichenkette mit dem Namen mysqld-max und dem Pfad der Datei MySQLD-Max.exe ein. In der Beispielinstallation war das C:\Web\MySQL\Bin\MySQLD-Max.exe. Testen von MySQL Nach dem nächsten Neustart können Sie testen, ob der Eintrag zu dem gewünschten Erfolg geführt hat. Wechseln Sie dazu in der Eingabeaufforderung in das MySQL-Verzeichnis, dann in das Unterverzeichnis bin und geben den Befehl mysqladmin ping ein. Z.B. c:\Web\mysql\bin\mysqladmin ping. 3.1.2 MySQL-Monitor Um eine MySQL-Datenbank abzufragen, zu aktulaisieren oder zu erstellen, benutzen Sie das Kommandozeilen-Programm mysql.exe unter Windows. Korrekt heißt dieses Programm MySQL-Monitor. (Abb.8: MySQL-Monitor) Starten Sie MySQL-Monitor ohne weitere Parameter, versucht es zur lokalen MySQLDatenbank (localhost) ohne spezifizierten Benutzer und ohne Passwort zu verbinden. Das funktioniert nur, wenn der Zugriff ohne Passwort erlaubt ist, was aber nach der Installation ohne weiteres Eingreifen der Fall ist. 45 Mit Hilfe des MySQL-Monitors ist es möglich, eine Verbindung zu jeder beliebigen MySQLDatenbank auf der Welt aufzubauen. Sie benötigen lediglich die entsprechenden Rechte und Kennwörter. (Abb.9: Information zu MySQL-Monitor) In die Eingabezeile des MySQL-Monmitors geben Sie verschiedene Steuerkommandos ein, die mit „\“ beginnen, oder beliebige 4SQL-Kommandos, die MySQL unterstützt. MySQL-Kommando Funktion show database; Gibt alle erzeugten Datenbanken zurück. Es sollte mindestens die Datenbank mysql angezeigt werden. use test; Verwendet die Datenbank mit dem Namen test. Alle weiteren SQL-Kommandos beziehen sich dann auf diese Datenbank. show tables; Zeigt alle erzeugten Tabellen der aktuell gewählten Datenbank an. quit oder exit Beendet MySQL-Monitor. Das Kommandozeilen-Programm unterstützt zahlreiche Parameter, die Sie erhalten, wenn Sie mysql –-help eintippen. 46 3.1.3 phpMyAdmin Bei Webspace-Angeboten mit MySQL richten die Hosts die Datenbank fast immer so ein, dass ein Zugriff nur von einer oder wenigen IP-Adressen möglich ist. Zu diesen Adressen gehört normalerweise immer die des Webservers, aber nur selten der heimische PC. Es bleibt daher nur die Möglichkeit, ein Programm auf dem Webserver zu installieren, das Vermittler ist und gleichzeitig die Oberfläche zur Datenbank herstellt. Um eine Datenbank sowie deren Tabellen komfortabel und einfach zu verwalten, gibt es von PHP ein Programm, nämlich phpMyAdmin. PhpMyAdmin ist ein Set an PHP-Skripts, die eine Menü- und Formulargesteuerte Verwaltung einer MySQL-Datenbank über das Internet ermöglichen. Damit phpMyAdmin richtig funktioniert, ist es erforderlich, dass der Webserver Dateien mit der Erweiterung .PHP3 an die PHP-Engine weiterleitet, falls Sie keine spezielle Version von PhpMyAdmin für PHP4 besitzen. Sie können PHPMyAdmin im Internet unter der Adresse http://phpmyadmin.sourceforge.net/ herunterladen. Installieren Sie phpMyAdmin in das Dokumenten-Verzeichnis des Webservers, so dass das Verzeichnis phpmyadmin entsteht. Z.B. c:\Web\apache\htdocs\phpmyadmin. Öffnen Sie die Datei confic.inc.php3 im Verzeichnis phpmyadmin mit einem Texteditor, zum Beispiel WordPad. Stellen Sie wie in der unteren Abbildung die korrekten Werte ein. // The $cfgServers array starts with $cfgServers[1]. Do not use $cfgServers[0]. // You can disable a server config entry by setting host to ''. $cfgServers[1]['host'] = 'localhost'; // MySQL hostname $cfgServers[1]['port'] = ''; // MySQL port - leave blank for default port $cfgServers[1]['adv_auth'] = false; // Use advanced authentication? $cfgServers[1]['stduser'] = ''; // MySQL standard user (only needed with advanced auth) $cfgServers[1]['stdpass'] = ''; // MySQL standard password (only needed with advanced auth) 47 $cfgServers[1]['user'] = 'root'; $cfgServers[1]['password'] = ''; auth) $cfgServers[1]['only_db'] = 'Verwaltung'; $cfgServers[1]['verbose'] = ''; show the hostname $cfgServers[1]['bookmarkdb'] = ''; support $cfgServers[1]['bookmarktable'] = ''; support // MySQL user (only needed with basic auth) // MySQL password (only needed with basic // If set to a db-name, only this db is accessible // Verbose name for this host - leave blank to // Bookmark db - leave blank for no bookmark // Bookmark table - leave blank for no bookmark Sie starten phpMyAdmin durch die Eingabe von http://localhost/phpMyAdmin/index.php3. (Abb.10: PhpMyAdmin) Nach dem Start von phpMyAdmin erscheint das Begrüssungsfenster. PhpMyAdmin besteht aus einem Frameset. Im linken Frame wechseln Sie die aktuelle Datenbank und Tabelle, im rechten werden Abfragen ausgeführt. 48 Um alle Tabellen einer Datenbank zu sehen, klicken Sie im linken Rahmen auf den Namen der Datenbank. Das entspricht dem MySQL-Befehl SHOW TABLES. Natürlich benötigen Sie die entsprechenden Zugriffsrechte. Datenbankbezogene Aktionen, wie beispielsweise das „Anlegen von Tabellen“ oder „Abfragen von Tabellen“ werden im linken Rahmen ausgeführt, indem Sie auf die Tabelle klicken, auf der sich die Aktion bezieht. Grundsätzlich kann man mit MySQL-Monitor und PhpMyAdmin die gleichen Funktionen ausführen. Gegebenenfalls unterscheidet sich die Vorgehensweise. Die Seite mit den Tabellenübersichten einer Datenbank enthält ein SQL-Fenster, in das Sie beliebige SQLBefehle eintippen können. Damit sind Sie nicht an die manchmal gewöhnungsbedürftige Menüführung von PhpMyAdmin gebunden. 49 3.1.4 PHP und Datenbanken 3.1.4.1 Verbindung zum Datenbankserver Um PHP mit einer MySQL-Datenbank zu verbinden, braucht man zuerst eine Verbindung zum Datenbankserver. Diese Verbindung ist Vorraussetzung, um eine bestimmte Datenbank auf dem Datenbankserver auszuwählen. Es stehen zwei Funktionen für diesen Zweck zur Verfügung: mysql_connect() und mysql_pconnect(). Der Unterschied zwischen diesen beiden Funktionen besteht darin, dass die Verbindung, die mysql_pconnect() erstellt, auch nach Ende des Programms bestehen bleibt und bei einem erneuten Aufruf von mysql_pconnect() wieder genutzt werden kann. Verbindungen, die mysql_connect() erstellt, verlieren nach Ablauf ihre Gültigkeit. Syntax: int mysql_connect(string host, string benutzer, string passwort); Der Funktion werden drei Parameter übergeben, die den Namen des Datenbankservers, den anzumeldenden Benutzer und dessen Passwort bestimmen. Der Rückgabewert ist ein sogenannter Link-Identifizierer, der für andere MySQL-Funktionen benötigt wird. Die Syntax von mysql_pconnect() ist gleich. Der Rückgabewert ist FALSE, wenn keine Verbindung zum Datenbankserver hergestellt werden konnte. Die Paramteter sind optional, Standardwerte sind host = localhost, benutzer = Benutzer und Passwort = keins. 50 Auswählen der Datenbank Auf der Grundlage einer bestehenden Verbindung kann das PHP-Programm eine Datenbank auf dem Datenbankserver auswählen. PHP bietet für diesen Zweck die Funktion mysql_select_db(). Syntax: int mysql_select_db(string db_name [, int linkID]); Als Parameter werden der Name der Datenbank und der Rückgabewert der Funktion mysql_connect() übergeben. Diese Funktion liefert FALSE zurück, wenn die Datenbank nicht ausgewählt werden kann. Der Parameter linkID kann entfallen, PHP nutzt in diesem Fall den zuletzt erzeugten Link. Das gilt ebenso für alle anderen Funktionen, die linkID als optionalen Parameter enthalten. <?php ?> $linkID = mysql_connect("localhost", "root", ""); if (!$linkID) die("Es wurde keine Verbindung zum Datenbankserver hergestellt."); if (mysql_select_db("Personalwesen", $linkID)) echo("Die Datenbank Personalwesen wurde ausgewählt."); else die ("Fehler beim auswählen der Personalwesen!"); 3.1.4.2 Befehle an die Datenbank schicken Wurde eine Verbindung zum Datenbankserver hergestellt und eine Datenbank auf diesem Server ausgewählt, können SQL-Befehle an die Datenbank geschickt werden. Für die Verwendung der Befehle INSERT, SELECT, UPDATE oder eines sonstigen SQLBefehles wird in PHP nur eine einzige Funktion verwendet. Syntax: int mysql_query(string sql [, int linkID]); 51 Der Funktion mysql_query() werden eine SQL-Zeichenfolge und die linkID der Verbindung übergeben. Die SQL-Zeichenfolge soll aber kein abschließendes Semikolon enthalten. Der Rückgabewert ist eine ID, die Sie zum Abfragen der Ergebnismenge benutzen können. Ist die SQL-Abfrage fehlerhaft oder haben Sie keinen entsprechenden Zugriff auf die entsprechenden Tabellen, dann gibt diese Funktion den Wert FALSE zurück. Senden des SQL-Befehls SELECT name, adresse FROM Kunden: <?php $linkID = mysql_connect("localhost", "root", ""); if (!$linkID) die("Es wurde keine Verbindung zum Datenbankserver hergestellt."); if (mysql_select_db("Personalwesen ", $linkID)) echo("Die Datenbank Personalwesen wurde ausgewählt."); else die ("Fehler beim auswählen der Personalwesen!"); // SELECT-Befehl $abfrage = "SELECT * FROM job"; $resID = mysql_query($abfrage, $linkID); if (!resID) die ("Es ist ein Fehler in der SQL-Anweisung azufgetreten."); ?> 3.1.4.3 Datensätze der Abfrage ermitteln Nachdem eine Abfrage an den Datenbankserver mit mysql_query() gesendet wurde, wird eine andere Funktion zum Erhalten der Daten vom Datenbankserver benötigt. Diese Funktion darf jedoch nur benutzt werden, wenn die gesendete Abfrage auch eine Ergebnismenge zurückliefert. Zum Abfragen der Daten eignet sich die Funktion mysql_fetch_array(). Syntax: Array mysql_fetch_array(int resID [, int ErgTyp]); 52 Mysql_fetch_array() wird mit dem Rückgabewert der Funktion mysql_query() als erster Parameter aufgerufen. Der zweite optionale Parameter bestimmt, ob das Array ein indiziertes Array (MYSQL_NUM), ein assoziatives Array (MYSQL_ASSOC) oder beides (MYSQL_BOTH) ist. Der Rückgabewert der Funktion ist ein Array, das die Zelleninhalte eines Datensatzes enthält. Um mehrere Datensätze abzurufen, müssen die Funktionen erneut aufgerufen werden. Der Rückgabewert der Funktion ist FALSE, wenn kein weiterer Datensatz verfügbar ist. Bildschirmausgabe der Datensätze von SELECT name, adresse FROM Kunden. <?php $linkID = mysql_connect("localhost", "root", ""); if (!$linkID) die("Es wurde keine Verbindung zum Datenbankserver hergestellt."); if (mysql_select_db("Personalwesen ", $linkID)) echo("Die Datenbank Personalwesen wurde ausgewählt."); else die ("Fehler beim auswählen der Personalwesen!"); // SELECT-Befehl $abfrage = "SELECT * FROM job"; $resID = mysql_query($abfrage, $linkID); if (!resID) die ("Es ist ein Fehler in der SQL-Anweisung aufgetreten."); ?> // Ausgabe der Datensätze while ($zeile = mysql_fetch_array ($resID, MYSQL_BOTH)) { echo ("Name: " .$zeile[0]); echo (" - Adresse: " $zeile["adresse"] . "<br>\n"); Auf das erste Feld der Ergebnistabelle (Name) wird mit Hilfe des Index zugegriffen, auf das zweite Feld (Adresse) assoziativ. 3.1.4.4 PHP-Funktionen für MySQL In diesem Kapitel werden einige wichtige PHP-Funktionen für MySQL-Datenbanken erläutert. 53 mysql_affected_rows int mysql_affected_rows ([int resID]) Gibt eine Anzahl der Datensätze zurück, die nach einem UPDATE-, INSERT- oder DELETEBefehl betroffen waren. Der Parameter bestimmt die Ergebnis-ID von mysql_query(). mysql_close int mysql_close ([int linkID]) Schließt eine mit mysql_connect() geöffnete Verbindung. Wird die linkID weggelassen, wird die letzte geöffnete Verbindung geschlossen. Eine Verbindung eines PHP-Skripts wird jedoch automatisch geschlossen, wenn das Skript beendet ist. mysql_create_db int mysql_create_db(string dbName, [, int linkID]) Erstellen einer Datenbank mit den Namen dbName. mysql_data_seek int mysql_data_seek (int resID, int znummer) Bewegt den Datensatzzeiger der Abfrage in resID nach zNummer. mysql_db_query 54 int mysql_db_query(string database, string abfrage [, int linkID]) Sendet einen SQL-Befehl, ermöglicht aber im Gegensatz zu mysql_query() zusätzlich die Angabe eines Datenbankservers. mysql_drop_db bool mysql_drop_db(string dbname [, int linkID]) Löscht die Datenbank dbName in der Verbindung von linkID. mysql_errno int mysql_errno([int linkID]) Gibt eine Fehlernummer der letzten MySQL-Operation der Verbindung linkID zurück. Der Rückgabewert ist 0, wenn kein Fehler auftrat. mysql_error string mysql_error([int linkID]) Gibt eine Fehlermeldung der MySQL-Operation zurück. mysql_escape_string string mysql_escape_string(string sql) Maskiert Sonderzeichen in einem SQL-Befehl. 55 mysql_fetch_assoc Wie mysql_fetch_array, der Ergebnistyp ist aber ausschließlich ein assoziatives Array. mysql_fetch_field Object mysql_fetch_field(int resID [, int feldNr]) Mit mysql_fetch_field() kann man sich anhand der resID ein Objekt mit Feldinformationen aus einem Abfrage zurückgeben lassen. Gibt man den optionalen Parameter Feld-Offset nicht an, so werden die Informationen des nächsten Feldes geliefert, das noch nicht mit mysql_fetch_field() ausgegeben wurde. Eigenschaft Beschreibung Object->table Name der Tabelle, aus der das Feld stammt Object->max_lenght Maximale Spaltenbreite Object->not_null Enthält 1, wenn die Spalte keine NULL-Werte annehmen kann Object->primary_key Enthält 1, wenn die Spalte Primärschlüssel ist Object->unique_key Enthält 1, wenn die Spalte ein eindeutiger Schlüssel ist Eigenschaft Beschreibung Object->multiple_key Enthält 1, wenn die Spalte ein "gewöhnlicher" Schlüssel ist Object->numeric Enthält 1, wenn die Spalte numerisch ist Object->blob Enthält 1, wenn die Spalte ein BLOB ist Object->type Datentyp der Spalte Object->unsigned Enthält 1, wenn die Spalte keine negative Zahlen speichern kann Object->zerofill Enthält 1, wen die Spalte den Zusatz ZEROFILL hat mysql_fetch_object Wie mysql_fetch_array, aber der Rückgabewert besitzt eine Objektstruktur. 56 mysql_fetch_row Wie mysql_fetch_array, aber der Rückgabewert ist ausschließlich ein indiziertes Array. mysql_insert_id int mysql_insert_id([int linkID]) Gibt den letzten eingefügten Autowert der Verbindung linkID zurück. Der Funktionsaufruf muss unmittelbar nach dem INSERT-Befehl erfolgen. Er funktioniert nicht, wenn die Autowert-Spalte den Datentyp BIGINT hat. mysql_num_fields int mysql_num_fields(int resID) Gibt die Anzahl der Spalten der Abfrage resID zurück. mysql_num_rows int mysql_num_rows(int resID) Gibt die Anzahl der Datensätze der Abfrage resID zurück, die eine SELECT-Abfrage war. Setzt man vor eine der oben angegebenen Funktionen ein „@“, dann wird die Fehlerausgabe der Funktion unterdrückt. Beispiel: <?php $linkID = mysql_connect("localhost", "root", ""); if (!$linkID) die("Es wurde keine Verbindung zum Datenbankserver hergestellt."); if (mysql_select_db("Personalwesen ", $linkID)) echo("Die Datenbank Personalwesen wurde ausgewählt."); else die ("Fehler beim auswählen der Personalwesen!"); 57 // SELECT-Befehl $abfrage = "SELECT * FROM job"; // verursacht mysql_query einen Fehler, dann wird die Ausgabe unterdrückt $resID = @mysql_query($abfrage, $linkID); if (!resID) die ("Es ist ein Fehler in der SQL-Anweisung azufgetreten."); ?> 3.1.4.5 Ein allgemeines Beispiel für PHP in Verbindung mit MySQL-Datenbanken In diesem Kapitel möchte ich ein kleines PHP-Skript vorstellen, mit dem Sie Daten aus einer Tabelle ausgeben können. Das Skript greift auf die Datenbank „Personalwesen“ und die Tabelle „Job“ zu und gibt den Inhalt der Tabelle in einer HTML-Tabelle aus. <HTML><HEAD><TITLE></TITLE></HEAD> <BODY BGCOLOR="#FFFFF"> <?php // Verbidnung zu MySQL herstellen $linkID = mysql_connect("","",""); if (!$linkID) die("Es konnte keine Verbindung zu MySQL hergestellt werden."); // Datenbank "Personalwesen" auswählen if (mysql_select_db("Personalwesen", $linkID)) echo("Die Datenbank Personalwesen wurde ausgewählt."); else echo("Fehler!"); // einen SQL-Befehl an die Datenbank schicken $abfrage = "SELECT * FROM job"; $resID = mysql_query($abfrage, $linkID); if (!$resID) die ("Es ist ein Fehler in der Abfrage aufgetreten."); // Ausgabe der Datensätze in Tabellenform echo("<table border cellpadding=\"3\"><tr>"); while($field=mysql_fetch_field($resID)) echo("<th>$field->name</th>"); while ($zeile = mysql_fetch_array($resID,MYSQL_BOTH)) { echo("<tr>"); for($i=0; $i<mysql_num_fields($resID); $i++) echo("<td>".htmlentities($zeile[$i])."</td>"); 58 echo("</tr>\n"); } echo("</table>"); ?> </BODY></HTML> 59 3.1.5 Anlegen einer Datenbank unter MySQL Bevor Tabellen angelegt werden, ist es erforderlich eine Datenbank anzulegen. Der dazugehörige Befehl in MySQL lautet: CREATE DATABASE [IF NOT EXISTS] db_name; IF NOT EXISTS dient zum Überprüfen, ob die Datenbank bereits existiert oder nicht. Das Anlegen einer Datenbank in MySQL hat zur Folge, dass im Datenverzeichnis von MySQL z.B. C:\WEB\MYSQL\DATA ein Unterverzeichnis mit dem Namen der Datenbank erzeugt wird. (Abb.11: Erstellen einer Datenbank mit MySQL-Monitor) Datenbankbezogene SQL-Befehle in MySQL Befehl Funktion DROP DATABASE db_name; Dieser Befehl löscht die Datenbank db_name und alle darin enthaltenen Tabellen. USE db_name; Wählt db_name als aktuelle Datenbank aus. SHOW DATABASES; Listet alle verfügbaren Datenbanken auf. Für diese Diplomarbeit wurde die Datenbank Personalwesen aus dem Vorlesungsskript Datenbanken von Prof. Sauer als beispielhafte Anwendung benutzt (http://rfhs8012.fh- 60 regensburg.de/~saj39122/DB/). Dazu muss zuerst die Datenbank mit dem CREATE DATABASE Befehl erzeugt werden, wir die untere Abbildung zeigt. 61 3.1.6 Erstellen und Verwalten von Tabellen Als nächstes müssen die Tabellen der Datenbank Personalwesen erzeugt werden. Die Syntax dazu lautet: CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(TABELLENDEFINITION, …)} [TABELLENOPTIONEN] [SELECT-Befehl] Das reservierte Wort TEMPORARY erzeugt eine flüchtige Tabelle, die nur solange besteht wie die Verbindung zur Datenbank. Der Befehl wurde jedoch beim Erstellen der Tabellen nicht benötigt. Durch die Angabe von IF NOT EXISTS wird keine Fehlermeldung ausgegeben, wenn die Tabelle bereits existiert. Allerdings werden die Strukturen von alter und neuer Tabelle nicht überprüft. 3.1.6.1 Tabellen mit MySQL-Monitor anlegen Die zu erzeugenden Tabellen wurden mit einem Texteditor geschrieben und dann unter dem Dateinamen C:\EIGENE DATEIEN\DB\TABLES.SQL gespeichert. Die Tabellen haben folgenden Aufbau: CREATE TABLE abteilung (abt_id VARCHAR(2) NOT NULL PRIMARY KEY bezeichnung VARCHAR(40)); CREATE TABLE job (job_id VARCHAR(2) NOT NULL PRIMARY KEY, titel VARCHAR (30), gehalt DOUBLE(8,2)); 62 CREATE TABLE angestellte (ang_id VARCHAR (3) NOT NULL PRIMARY KEY, name VARCHAR (10), gebdatum DATE, abt_id VARCHAR (2), CONSTRAINT FKabt_id FOREIGN KEY(abt_id) REFRENCES abteilung(abt_id) ON DELETE CASCADE, job_id VARCHAR(2), CONSTRAINT FKjob_id1 FOREIGN KEY(job_id) REFERENCES job(job_id) ON DELETE CASCADE); CREATE TABLE qualifikation(ang_id VARCHAR(3) NOT NULL, FOREIGN KEY(ang_id) REFERENCES angestellte(ang_id) ON DELETE CASCADE, job_id VARCHAR(2) NOT NULL, CONSTRAINT FKjob_id2 FOREIGN KEY(job_id) REFERENCES job(job_id) ON DELETE CASCADE, CONSTRAINT PKquali PRIMARY KEY(ang_id,job_id)); Um die Tabellen anzulegen, wechseln Sie in das MySQL-Verzeichnis in meiner Installation war das C:\WEB\MYSQL\BIN. Die Tabellen werden mit dem MySQL-Monitor in einer Kommandozeile wie folgt angelegt: \. C:\EIGENE~1\DB\TABLES.SQL (Abb.12: Erstellen der Tabellen mit MySQL-Monitor) 63 3.1.6.2 Tabellen mit phpMyAdmin anlegen PhpMyAdmin bietet drei gängige Möglichkeiten, Tabellen anzulegen. Zuerst muss phpMyAdmin mit der URL http://localhost/phpmyadmin/index.php3 gestartet werden. Als nächstes muss die Datenbank Personalwesen ausgewählt werden. Variante 1 Eingeben eines SQL-Befehls in das SQL-Eingabefeld. Variante 2 Durch klicken auf den Button Durchsuchen kann eine Datei ausgewählt werden, die SQLBefehle enthält (z.B. C:\EIGENE DATEIEN\DB\TABLES.SQL). Variante 3 Die Tabellen können auch einzeln menügesteuert angelegt werden. Unter dem Menüpunkt Neue Tabelle erstellen in Datenbank Personalwesen kann die Tabelle mit der Anzahl der Felder festgelegt werden. 64 (Abb.13: Auswahl einer Datenbank mit PhpMyAdmin) Bei Aktivieren des Buttons OK wird die Seite mit der Tabellendefinition angezeigt. (Abb.14: Erstellen von Tabellen mit PhpMyAdmin) Wurden alle CREATE TABLE-Befehle richtig ausgeführt, dann sollte die Datenbank folgenden Aufbau haben: 65 (Abb.15: Tabellen der Datenbank „Personalwesen“ unter PhpMyAdmin) 3.1.6.3 Hinzufügen von Datensätzen Es wurden nun alle vier Tabellen erzeugt. Nun können die dazugehörigen Datensätze mit dem SQL-Befehl INSERT in die Tabellen eingefügt werden. Die dazugehörige Syntax lautet: INSERT INTO tbl_name [(Spalte1, Spalte2, ...)] VALUES (Wert1, Wert2, ...); Die Daten werden in die Tabelle tbl_name eingefügt. Die Spaltennamen links von VALUES stehen mit den Werten rechts von VALUES in Beziehung. Für jeden Attributnamen auf der linken Seite muss auf der rechten Seite ein Wert stehen. Werden auf der linken Seite keine Attributnamen angegeben, dann muss auf der rechten Seite für jedes Attribut ein Wert angegeben werden. Die dazugehörigen Daten können von der Hompage von Prof. Sauer unter http://rfhs8012.fhregensburg.de/~saj39122/DB/ heruntergeladen werden und dann entweder über eine Datei mit den SQL-Monitor oder mit phpMyAdmin eingefügt werden. Es besteht außerdem die Möglichkeit, die Daten per Hand mit phpMyAdmin zu erstellen. Als Beispiel wurden die INSERT INTO-Befehle von aus dem Vorlesungsskript Datenbanken von Prof. Sauer (http://rfhs8012.fh-regensburg.de/~saj39122/DB/) in die Datei INSERTS.SQL geschrieben und dann über den SQL-Monitor erstellt. 66 insert into abteilung values ('KO','Konstruktion'); insert into abteilung values ('OD','Organisation und Datenverarbeitung'); insert into abteilung values ('PA','Personalabteilung'); insert into abteilung values ('RZ','Rechenzentrum'); insert into abteilung values ('VT','Vertrieb'); insert into job values ('KA','Kaufm. Angestellter',3000.00); insert into job values ('TA','Techn. Angestellter',3000.00); insert into job values ('PR','Programmierer',3000.00); insert into job values ('SY','Systemplaner',6000.00); insert into job values ('IN','Ingenieur',6000.00); insert into job values ('OR','Operateur',3500.00); insert into angestellte values ('A1','Fritz','02.01.1950','OD','SY'); insert into angestellte values ('A2','Tom','02.01.1951','KO','IN'); insert into angestellte values ('A3','Werner','23.01.1948','OD','PR'); insert into angestellte values ('A4','Gerd','03.11.1955','VT','KA'); insert into angestellte values ('A5','Emil','02.03.1960','PA','PR'); insert into angestellte value ('A6','Uwe','03.04.1952','RZ','OP'); insert into angestellte values ('A7','Erna','17.11.1955','KO','TA'); insert into angestellte values ('A8','Rita','02.12.1957','KO','TA'); insert into angestellte values ('A9','Ute','08.09.1962','OD','SY'); insert into angestellte values ('A10','Willi','07.07.1956','KO','IN'); 67 insert into angestellte values ('A12','Anton','05.07.1948','OD','SY'); insert into angestellte values ('A13','Josef','02.08.1952','KO','SY'); insert into angestellte values ('A14','Maria','17.09.1964','PA','KA'); insert into qualifikation values ('A1','SY'); insert into qualifikation values ('A1','PR'); insert into qualifikation values ('A1','OP'); insert into qualifikation values ('A2','IN'); insert into qualifikation values ('A2','SY'); insert into qualifikation values ('A3','PR'); insert into qualifikation values ('A4','KA'); insert into qualifikation values ('A5','PR'); insert into qualifikation values ('A6','OP'); insert into qualifikation values ('A7','TA'); insert into qualifikation values ('A8','TA'); insert into qualifikation values ('A9','IN'); insert into qualifikation values ('A9','SY'); insert into qualifikation values ('A10','IN'); insert into qualifikation values ('A11','KA'); insert into qualifikation values ('A12','SY'); insert into qualifikation values ('A13','IN'); insert into qualifikation values ('A14','KA'); (Abb.16: Insert-Befehle unter MySQL-Monitor) Die Daten können über den Button Einfügen mit phpMyAdmin auch eingefügt werden. 68 (Abb.17: füllen der Tabellen mit Daten unter PhpMyAdmin) Man kann sich nun mit phpMyAdmin die Tabelleninhalte anzeigen lassen. Die Tabelle Angestellte sollte nun die folgenden Datensätze beinhalten: (Abb.18: anzeigen der Tabelleninhalte unter PhpMyAdmin) 69 (Abb. 19: Datensätze der Tabelle „Angestellte“) 70 3.1.7 PHP-Skripte in Anwendung mit einer MySQL-Datenbank am Beispiel der Datenbank Personalwesen In diesem Kapitel wird anhand einer beispielhaften Anwendung PHP mit einem MySQLZugriff vorstellen. Dazu wurde ein HTML-Formular entwickelt, das an ein PHP-Skript eine SQL-Anweisung abschickt und dann die SQL-Anweisung ausführt. 3.1.7.1 Das HTML-Formular PHP_Formular (Abb.20: PHP-Formular) In diesem Formular kann man anhand der Radiobuttons die SQL-Anweisung auswählen, die von PHP verarbeitet werden soll. Wählt man den Button SELECT, kann im unteren Textfeld 71 ein Select-Befehl eingegeben werden. Durch Aktivieren des Buttons „Abschicken“ wird der SELECT-Befehl an das PHP-Skript SQL.php3 weitergeleitet. Das PHP-Skript überprüft den eingegebenen SELECT-Befehl auf seine Richtigkeit und gibt dann das Ergebnis in einer Tabelle wieder aus. Als Datenbank wurde die Datenbank Personalwesen von aus dem Vorlesungsskript Datenbanken von Prof.. Sauer (http://rfhs8012.fh-regensburg.de/~saj39122/DB/) verwendet. Die Anweisung SELECT * FROM JOB; bewirkt dann folgende Ausgabe: (Abb.21: Ergebnis einer SELECT-Anweisung) Das Feld Nr dient nur zur Übersicht für den Benutzer und ist kein Primärschlüssel der Tabelle. Der eingegebene SQL-Befehl muss nicht mit Strichpunkt (;) beendet werden. Dieser Strichpunkt kann auch weggelassen werden. Gross- und Kleinschribung muss auch nicht 72 beachtet werden. Es kann jeder beliebige SELECT-Befehl in das Textfeld des HTMLFormulars PHP_Formular eingegeben werden. Es können auch komplexere SELECT-Anweisungen an die Datenbank geschickt werden. Jeder Befehl unterstützt, der MySQL bekannt ist, wird unterstützt. Z.B. liefert die SELECT-Anweisung SELECT * FROM Angestellte, Qualifikation WHERE Angestellte.ang_id = Qualifikation.ang_id folgendes Ergebnis: (Abb.22: Ergebnis einer komplexeren SELECT-Anweisung) Code des Formulars <title>PHP-Skripte in Anwendung mit einer MySQL-Datenbank</title> <body bgcolor="#fffff#"><br> <h1>PHP-Skripte in Anwendung mit einer MySQL-Datenbank</h1> <form method="post" action ="SQL.php3"> <table> <h2>Es werden folgende SQL-Anweisungen von PHP unterstützt</h2> 73 <table border="3"> <tr> <th><input type ="radio" NAME = "Auswahl" VALUE = "Select" CHECKED> SELECT </th> <th><input type ="radio" NAME = "Auswahl" VALUE = "Create" > CREATE-Table</th> </tr> <tr> <th><input type ="radio" NAME = "Auswahl" VALUE = "Update" >UPDATE<BR>&nbsp INSERT<BR> &nbsp DELETE</th> <th><input type ="radio" NAME = "Auswahl" VALUE = "Drop" >DROP-Table<BR> </tr> <tr> <th>&nbsp</th> <th><input type ="radio" NAME = "Auswahl" VALUE = "Alter" > ALTER-Table</th> </tr> </table> <BR><BR>Bitte geben Sie die SQL-Anweisung ein:<BR><BR> <textarea name="Anweisung" rows="10" cols="95"></textarea><br> <input type ="submit" Value ="Abschicken" size ="25"> <input type ="reset" Value = "Eingaben löschen" size = "25"> </form></body></head> Durch den HTML-Befehl <form method="post" action ="SQL.php3"> werden alle Eingaben des Formulars an die Datei SQL.php3 übergeben. Jeder Elementname wird in das globale Feld $_Post geschrieben, das von PHP zum ermitteln der übergebenen Variablen dient. Genauso gut kann der Inhalt des Formulars auch an dieselbe Datei geschickt werden. In PHP wird dann mit der foreach-Schleife, der Schleife für Felder, der Inhalt des Feldes $_Post über den Feldschlüssel $var ermittelt und in ein Feld mit den Namen $array() geschrieben. Danach kann über den Feldindex des beschriebenen Feldes $array() der Inhalt in die Variablen $Anweisung und $Auswahl geschrieben werden. In $Anweisung steht dann der SQL-Befehl und in $Auswahl der Inhalt der Radiogruppe. Die einzelnen Buttons können dann über den String wie z.B. „Select“ in PHP überprüft werden. Die Befehle zum ermitteln der Inhalte des Post-Befehls lauten: $array = array(); 74 // ermitteln der Inhalte des Globalen Feldes $_Post, die über das HTML-Formular geschickt // wurden foreach ($_POST as $var => $value) { $array[] = $value; } // zuweisen der Feldinhalte $Auswahl = $array[0]; $Anweisung = $array[1]; Der Befehl zum überprüfen des Inhalts der des ausgewählten Radiobuttons lautet dann: if($Auswahl==“Select“) { // Anweisung } Tritt die If-Anweisung ein, so kann der SELECT-Befehl abgearbeitet werden. Das übernimmt jedoch das PHP-Skript SQL.php3 und wird im nächsten Abschnitt ausführlich erklärt. Die Inhalte der Post-Variable kann auch anders ermittelt werden. Man kann mit dem Befehl $HTTP_POST_VARS auf den Inhalt zugreifen. $HTTP_POST_VARS ist ebenfalls ein Feld und der Inhalt dieses Feldes kann z.B. mit $HTTP_POST_VARS[’Anweisung’] ermittelt werden. Der Vorteil dieses Befehls ist, das die Inhalte nicht mehr durch eine Schleife ermittelt werden müssen und diese Art der Ermittlung der Inhalte der Post-Variable ist sicherer (siehe Diplomarbeit von Zimmermann Stefan unter der folgenden Seite: http://rfhs8012.fh-regensburg.de/~saj39122/Meile.html). Die Befehle haben dann folgendes aussehen: // zuweisen der Feldinhalte $Auswahl = $HTTP_POST_VARS['Auswahl']; $Anweisung = $HTTP_POST_VARS['Anweisung']; Der Feldinhalt muss jedoch nicht unbedingt in die Variablen geschrieben werden. 75 3.1.7.2 Das PHP-Skript der SQL-Anweisungen Für die Implementierung der SQL-Anweisungen wurde eine Klasse mysql_db erstellt, die folgendenen Inhalt umfasst: - Es soll eine automatische Verbindung zur Datenbank Personalwesen von Prof. Sauer hergestellt werden. - Es sollen die Befehle SELECT, UPDATE, INSERT, DELETE, CREATE-TABLE, ALTER-TABLE und DROP-TABLE ausgeführt werden. - Die eingegebenen SQL-Anweisungen müssen auf Fehler überprüft werden. - Bei allen Befehlen aus dem SELECT-Befehl soll der Name der betroffenen Tabelle mit ausgegeben werden. - Bei einem UPDATE-, INSERT- oder DELETE-Befehl soll die Tabelle komplett ausgegeben werden. 3.1.7.2.1 Hauptprogramm und Klassenvariablen Im Hauptprogramm der Datei SQL.php3 wird eine Instanz der Klasse mysql_db erzeugt. Nun muss als nächstes der Inhalt des globalen Feldes $_Post, wie oben beschrieben ermittelt werden. Danach wird anhand der Radiobuttons des Formulars die SQL-Anweiung mit einer SWITCH-Anweisung ermittelt. Wird der Button SELECT ausgewählt, wird die Funktion query() aufgerufen, die den SELECT-Befehl weiterverarbeitet. Bei der Auswahl des Buttons UPDATE wird die Funktion geanderte_Dts() aufgerufen, die die SQLAnweisungen INSERT, UPDATE und DELETE verarbeitet usw. Syntax: $datenbank = new mysql_db; $array = array(); // ermitteln der Inhalte des Globalen Feldes $_Post, die über das HTML-Formular geschickt 76 // wurden foreach ($_POST as $var => $value) { $array[] = $value; } // zuweisen der Feldinhalte $Auswahl = $array[0]; $Anweisung = $array[1]; // Select-Anweisung an die Datenbank schicken switch($Auswahl) { case "Select" : if (!$Anweisung) echo("Es wurde keine SQL-Anweisung eingegeben."); else $datenbank->query($Anweisung); break; case "Update" : if (!$Anweisung) echo("Es wurde keine SQL-Anweisung eingegeben."); else $datenbank->geanderte_Dts($Anweisung); break; case "Create": if (!$Anweisung) echo("Es wurde keine SQL-Anweisung eingegeben."); else $datenbank->Create_Table($Anweisung); break; case "Alter" : if (!$Anweisung) echo("Es wurde keine SQL-Anweisung eingegeben."); else $datenbank->Alter_Table($Anweisung); break; case "Drop" : if (!$Anweisung) echo("Es wurde keine SQL-Anweisung eingegeben."); else $datenbank->Drop_Table($Anweisung); break; } Es wurden nur drei Klassenvariablen benötigt. Die Verbindung zur Datenbank mit $linkID, der Datenbankname $db und das Ergebnis der SQL-Anweisungen werden in die Variable $resID gespeichert. Diese Variablen sind in jeder Funktion der Klasse zugänglich. Syntax: class mysql_db { var $linkID = false; var $resID = false; var $db = "Personalwesen"; .... } 77 3.1.7.2.2 Konstruktor der Klasse mysql_db Der Konstruktor der Klasse mysql_db ruft die connect_db() Funktion auf, die die Verbindung zur Datenbank herstellt. Syntax: // Konstruktor der Klasse mysql_db function mysql_db() { $this->connect_db(); } 3.1.7.2.3 Die Funktion connect_db() In dieser Funktion wird die Verbindung zu MySQL und zur Datenbank Personalwesen hergestellt. Scheitert eine der beiden Anweisungen, wird eine Fehlermeldung ausgegeben, und das Programm wird abgebrochen. Syntax: // Verbindung zur Datenbank function connect_db() { // Verbindung zu MySQL herstellen $this->linkID = mysql_connect("","",""); if (!$this->linkID) { die("Es konnte keine Verbindung zu MySQL hergestellt werden.<BR><BR>"); return false; } else { echo("Die Verbindung zu MySQL wurde hergestellt.<BR><BR>"); } // Datenbank Personalwesen auswählen 78 if (mysql_select_db($this->db, $this->linkID)) echo("Datenbank “ . $this->db . “ wurde ausgewählt.<BR><BR>"); else die("Es ist ein Fehler aufgetreten. Die Datenbank “ . $this->db . “ konnte nicht ausgewählt werden. <BR><BR>"); }// Ende der Funktion connect_db 3.1.7.2.4 Die Funktion query($sql) Zuerst werden alle Backslashes (\) in der SQL-Anweisung entfernt. Gibt man nämlich bei einem SELECT-Befehl z.B. SELECT * FROM job WHERE job_id = ’KO’ ein, so wird vor jedes Hochkommazeichen ein Backslash angehängt. Der Befehl hat dann folgendes Aussehen: SELECT * FROM job WHERE job_id = \’KO\’ Mit der STRING-Funktion stripslashes($string) werden dann automatisch alle Backslashes entfernt. Als nächstes wird dann überprüft, ob sich im angegebenen SELECT-Befehl auch das Wort SELECT befindet. Das geschieht mit der STRING-Funktion stristr($string, $suchstring). Mit dieser Funktion kann innerhalb eines Strings nach einer bestimmten Zeichenkette gesucht werden. Wird das Wort SELECT nicht gefunden, so wird das Programm abgebrochen. Nun wird der übergebende String $sql ausgeführt. Dann wird mit der Funktion echoerror() die Richtigkeit der SQL-Syntax überprüft. Ist kein Fehler aufgetreten, so wird das Ergebnis anhand einer Tabelle ausgegeben. Zuerst werden die Feldnamen mit der Funktion mysql_fetch_field() geholt und als Spaltenüberschrift deklariert. Danach werden die Datensätze in einem array gespeichert und mit der Funktion mysql_num_fields() zeilenweise ausgegeben. 79 Syntax: function query($sql) { // schneidet die Backslashes bei der Eingabe ab $sql = stripslashes($sql); // Suche nach dem Wort SELECT $treffer = stristr($sql, "Select"); if ($treffer==false) die("Sie haben keine korrekte SELECT-Anweisung eingegeben."); $this->resID = mysql_query($sql, $this->linkID); $this->echoerror(); echo("<table border cellpadding=\"3\"><tr>"); echo("<th>Nr</th>"); while($field=mysql_fetch_field($this->resID)) echo("<th>$field->name</th>"); $index = 0; while ($zeile = mysql_fetch_array($this->resID,MYSQL_BOTH)) { $index++; echo("<tr><td>$index</td>"); for($i=0; $i<mysql_num_fields($this->resID); $i++) echo("<td>".htmlentities($zeile[$i])."</td>"); } echo("</tr>\n"); echo("</table>"); }// Ende der Funktion query 3.1.7.2.5 Die Funktion echoerror() In dieser Funktion wird die MySQL-Funktion mysql_error() aufgerufen, die einen englischen Fehlertext der zuvor ausgeführten Operation zurückgibt. 80 Syntax: // Ausgabe bei einem Fehler function echoerror() { // Tritt ein Fehler in der SQL-Anweisung auf, dann bricht das Programm ab if( mysql_error()) { echo( mysql_error()."<BR><BR>"); echo("Das Programm wurde abgebrochen."); exit; } }// Ende der Funktion echoerror 3.1.7.2.6 Die Funktion geanderte_Dts($sql) Wird ein UPDATE-, INSERT- oder DELETE-Befehl ausgeführt, dann wird die Funktion geanderte_Dts($sql) aufgerufen. Der Funktion wird der String $sql übergeben, der die SQL-Anweisung enthält. Genau wie bei der Funktion query() werden zuerst alle Backslashes aus dem SQL-Befehl entfernt und dann wird überprüft, ob sich eines der Wörter UPDATE, INSERT oder DELETE in der SQL-Anweisung befindet. Danach wird der SQL-Befehl an die Datenbank geschickt und es wird die Funktion echoerror() aufgerufen. Als nächste wird die Anzahl der Datensätze, die beim Befehl betroffen waren, zurückgegeben und es wird die Funktion get_tablename($sql, „Update“) aufgerufen. Syntax: // Betroffene Datensätze bei einem UPDATE, INSERT oder DELETE ermitteln function geanderte_Dts($sql) { // schneidet die Backslashes bei der Eingabe ab $sql = stripslashes($sql); // suche nach den Worten UPDATE, INSERT, DELETE $feld = array("Update", "Insert", "Delete"); $falg = false; 81 foreach($feld as $element) { $treffer = stristr($sql, $element); if ($treffer==true) { $flag = true; break; } } if ($flag==false) die("Sie haben keine korrekte UPDATE-, INSERT-, oder DELETE-Anweisung eingegeben."); $this->resID = mysql_query($sql, $this->linkID); $this->echoerror(); if (mysql_affected_rows()==1) echo("Die SQL-Anweisung wurde durchgeführt. <BR> Es wurde mysql_affected_rows() . " Datensatz betroffen."); else echo("Die SQL-Anweisung wurde durchgeführt. <BR> Es wurden mysql_affected_rows() . " Datensätze betroffen."); ". ". $this->get_tablename($sql,"Update"); }// Ende der Funktion geanderteDts 3.1.7.2.7 Die Funktion get_tablename($sql, $Art) Diese Funktion ermittelt den Tabellennamen, der bei einem UPDATE, INSERT, DELETE, ALTER-TABLE, DROP-TABLE oder CREATE-TABLE betroffen wurde. Bei einem UPDATE, INSERT oder DELETE wird danach die Funktion query() aufgerufen, um das geänderte Ergebnis anzeigen zu lassen. Zuerst wird ein dynamisches Feld angelegt, in dem später alle Tabellennamen gespeichert werden. Alle Tabellen werden mit mysql_list_tables() aufgelistet, und danach wird die Anzahl der Tabellen der Datenbank mit mysql_num_rows() ermittelt. Als nächstes wird eine Schleife über die Anzahl der Tabellen durchlaufen, und jeder Tabellenname wird in das Feld $tabellen gespeichert. 82 Für jedes Element des Feldes $tabellen wird nun überprüft, an welcher Position es im String $sql vorkommt. Danach wird der Tabellenname ermittelt. Kommt eine der Tabellen im String vor, dann wird diese Tabelle ausgegeben. Die Art der Ausgabe wird mit einer SWITCH-Anweisung ermittelt. Syntax: function get_tablename($sql,$Art) { // dynamisches Feld für die Tabellennamen anlegen $tabellen = array(); // schreibe alle Tabellen in $result $result = mysql_list_tables($this->db,$this->linkID); $menge = mysql_num_rows($result); // hole die einzelnen Tabellennamen aus $result for($i = 0; $i < $menge; $i++) { $table_name = mysql_tablename($result,$i); // schreibe die Tabellennamen in das Feld tabellen $tabellen[] = $table_name; } foreach($tabellen as $element) { $treffer = strpos($sql,$element); if ($treffer==true) { $flag = true; $leerzeichen = strpos($sql, " ", $treffer); $div = $leerzeichen - $treffer; $tabelle = substr($sql,$treffer, $div); break; } } if ($flag == true) { switch($Art) { case "Update" : echo("<BR><BR>"); $this->query("Select * From " . $tabelle); break; case "Create" : echo("Die Tabelle " . $tabelle. " wurde erfolgreich erstellt."); break; case "Drop" : echo("<BR><BR>Die Tabelle wurde erfolgreich gelöscht."); 83 break; case "Alter" : echo("<BR><BR>Die Tabelle " . $tabelle. " wurde erfolgreich geändert.<BR>"); $this->query("Select * From " . $tabelle); break; } } }// Ende der Funktion get_tablename 3.1.7.2.8 Die Funktion Create_Table($sql) Zu Beginn der Funktion werden die Backslashes vom übergebenen String $sql abgeschnitten. Danach wird in der SQL-Anweisung nach dem String CREATE gesucht. Wurde der String gefunden, dann wird der Befehl ausgeführt. Die Funktion echoerror() wird aufgerufen und die neu erstellte Tabelle wird mit der Funktion get_tablename($sql) ausgegeben. Syntax: // In dieser Funktion wird eine neue Tabelle erzeugt function Create_Table($sql) { // schneidet die Backslashes bei der Eingabe ab $sql = stripslashes($sql); $treffer = stristr($sql, "Create"); if ($treffer==false) die("Sie haben keine korrekte CREATE-Anweisung eingegeben."); $this->resID = mysql_query($sql, $this->linkID); $this->echoerror(); $this->get_tablename($sql, "Create"); }// Ende der Funktion Create_Table 84 3.1.7.2.9 Die Funktion Drop_Table($sql) Diese Funktion ist fast identisch mit der Funktion Create_Table($sql). Der Unterschied der beiden Funktionen besteht nur darin, dass nach dem String DROP in der SQLAnweisung gesucht wird. Syntax: // In diese Funktion wird eine Tabelle gelöscht function Drop_Table($sql) { // schneidet die Backslashes bei der Eingabe ab $sql = stripslashes($sql); $treffer = stristr($sql, "Drop"); if ($treffer==false) die("Sie haben keine korrekte DROP-Anweisung eingegeben."); $this->resID = mysql_query($sql, $this->linkID); $this->echoerror(); $this->get_tablename($sql, "Drop"); }// Ende der Funktion Drop_Table 3.1.7.2.9 Die Funktion Alter_Table($sql) Die Funktion Alter_Table($sql) entspricht ebenfalls bis auf eine Kleinigkeit der Funktion Create_Table($sql). Es werden auch die Backslashes des String $sql abgeschnitten und dann wird nach dem Wort ALTER im String gesucht. Die SQL-Anweisung wird ausgeführt, und die betroffene Tabelle wird mit get_tablename($sql) ermittelt. 85 Syntax: // In dieser Funktion wird eine Tabelle geändert function Alter_Table($sql) { // schneidet die Backslashes bei der Eingabe ab $sql = stripslashes($sql); $treffer = stristr($sql, "Alter"); if ($treffer==false) die("Sie haben keine korrekte ALTER-Anweisung eingegeben."); $this->resID = mysql_query($sql, $this->linkID); $this->echoerror(); $this->get_tablename($sql, "Alter"); }// Ende der Funktion Alter_Table 86 3.2 Oracle 3.2.1 Verbindung zur Oracle-Datenbank auf dem Server der Fachhochschule Regensburg herstellen Damit man mit PHP auf eine Oracle-Datenbank zugreifen kann, ist es notwendig, einen Oracle-Server zu installieren. Da die Installation aber recht aufwendig ist, habe wird das PHPSkript auf den Oracle-Server der FH-Regensburg gestellt. Der Server der FH-Regensburg ist in der Lage, PHP-Skripte an eine Oracle-Datenbank weiterzuleiten. Allerdings ist der Zugang zum Server der FH-Regensburg und der dort installierten Oracle-Datenbank unbedingt erforderlich. Die Verbindung erfolgt mittels Secure-FTP-Zugriff. Man benötigt ein Programm wie z.B. SSH Secure Shell, das Sie im Internet unter der Seite http://www.ssh.com/support/downloads herunterladen können. Nehmen Sie das Programm „ssh Secure Shell for workstations“ und wählen dann den Link „Noncommercial downloads“. Das Programm ist freeware und somit kostenlos. Installieren Sie das Programm auf ihrer Festplatte, z.B. in das Verzeichnis C:\Programm Files\SSH SECURE SHELL. Nun muss die Verbindung zum FH-Server hergestellt werden. Öffnen Sie dazu das Programm „Secure File Transfer Client.“ Klicken Sie im Menü auf „File“ und dann auf „Connect“. 87 (Abb.23: Connect mit SSH herstellen) Tragen Sie unter „Host Name“ tabaluga.fh-regensburg.de ein. tabaluga.fhregensburg.de ist der Zielrechner, auf dem Sie ihre HTML-Formulare und Ihre PHPSkripte ablegen müssen. Unter „User Name“ ist Ihr FH-Kürzel in der Form abc12345 einzutragen und unter „Port Number“ 22. Der Server mit der Oracle-Datenbank läuft unter dem Betriebssystem Unix. Aktivieren Sie dann den Button „Connect“. Nun werden Sie nach ihrem Unix-Passwort gefragt. Tragen Sie ihr Passwort ein und bestätigen Sie die Eingabe mit „OK“. 88 Aktivieren des Buttons „Connect“ (Abb.24: FTP-Verbindung herstellen) Nun haben Sie eine FTP-Verbindung zu einem Unix-File-Server der FH-Regensburg hergestellt. Das angezeigte Fenster hat dann folgenden Aufbau: - im linken Fenster ist Ihr aktueller Windows-Desktop - im rechten Fenster Ihr Unix-Home-Directory 89 Windows-Desktop Unix-Home-Directory (Abb.25: Secure Shell File Transfer –Fenster) Öffnen Sie nun in der Menüleiste das Menü „Window“ und dann auf „New Terminal“. Nun haben Sie vor sich ein Unix-Terminalfenster. Erstellen Sie nun im Terminal einen Ordner mit dem Befehl „mkdir public_html“ und drücken die Eingabetaste. Legen Sie danach die Lese- und Schreibrechte dieses Ordners mit den Befehlen „chmod o+x .“ und „chmod o+x public_html“ fest. 90 (Abb.26: Lese- und Schreibrechte festlegen) Überprüfen Sie die Eingaben, indem Sie den Befehl „ls -lod . public_html“ eintippen. Bei den Eigenschaften des Ordners public_html muss am Ende ein „x“ stehen. am Ende dieser Zeichenfolge muss ein „x“ stehen (Abb.27: überprüfen der Schreibrechte) 91 Schließen Sie nun das Terminal. Klicken Sie danach auf den Button Refresh im „Secure Shell File Transfer-Fenster“. Danach muss der Ordner public_html sichtbar sein. dieser Ordner muss vorhanden sein (Abb.28: überprüfen des Ordners public_html) Öffnen Sie den Ordner public_html. Suchen Sie im linken Fenster Ihre PHP-Skripte und kopieren Sie diese mittels „drag and drop“ in den Ordner public_html. 92 (Abb.29: kopieren der PHP-Skripte) Nun können Sie über das Internet mit der URL http://rfhs8012.fh-regensburg.de/~rur35679/PHP_Oracle_Formular.html auf das HTML- Formular zugreifen und die SQL-Anweisungen ausführen. 93 (Abb.30: HTML-Formular für die Eingabe der SQL-Anweisungen) Wenn Sie die Anweisung SELECT * FROM job eingeben, liefert das Formular die folgende Ausgabe: 94 (Abb.31: Ausgabe eines Select-Befehls) 95 3.2.2 PHP-Funktionen für Oracle-Datenbanken Für den Zugriff auf die Oracle-Datenbank wurden folgende Funktionen von PHP benötigt: ora_logon int ora_logon ([string Benutzername, string Passwort]) Es wird eine Oracle-Verbindung hergestellt. ora_open int ora_open (int Verbindung) Es wird ein Oracle-Cursor geöffnet. Beispiel für ora_logon und ora_open: <?php //Verbindung zu Oracle herstellen $linkID = ora_logon ("rur35679@rfhs8012_ora9i”, “rur35679”); if (!$linkID) die(“Es konnte keine Verbindung zu Oracle hergestellt werden.“); else echo(“Verbindung zu Oracle wurde hergestellt“); //öffnet einen Oracle-Cursor $cursor = ora_open ($linkID); ?> ora_parse 96 int ora_parse (int Cursor_id, string SQL-Anweisung, int aufschieben) Es wird eine SQL-Anweisung analysiert. ora_exec int ora_exec(int cursor) Es wird eine analysierte SQL-Anweisug bei einem Cursor durchgeführt. Beispiel für ora_parse und ora_exec: <?php //Verbindung zu Oracle herstellen $linkID = ora_logon ("rur35679@rfhs8012_ora9i”, “rur35679”); if (!$linkID) die(“Es konnte keine Verbindung zu Oracle hergestellt werden.“); else echo(“Verbindung zu Oracle wurde hergestellt“); //öffnet einen Oracle-Cursor $cursor = ora_open ($linkID); // eine SQL-Anweisung analysieren if (!ora_parse ($cursor, “SELECT * FROM dual”)) die (“Die SQL-Anweisung konnte nicht ausgeführt werden.“); else // eine analysierte SQL-Anweisung durchführen ora_exec ($cursor); ?> ora_close int ora_close (int Corsor) Es wird ein Oracle-Cursor geschlossen. Beispiel: <?php 97 // schließen des zuvor geöffneten Oracle-Cursors ora_close($cursor); ?> ora_ColumnName string ora_ColumnType (int cursor, int column) Es wird der Typ eines Ergebnisfeldes ermittelt. ora_numcols int ora_numrows (int cursor_ind) Es wird die Menge der Felder eines Ergebnisses ermittelt. ora_getcolumn array ora_getcolumn (int Cursor, mixed Feld) Es werden die Daten eines Feldes geliefert. ora_numrows int ora_numrows (int cursor_ind) Es wird die Menge der Datensätze eines Ergebnisses ermittelt. 98 ora_fetch int ora_fetch_into (int Cursor) Es wird ein Datensatz eines Oracle-Cursors abgerufen. Beispiel für die Ausgabe eines SELECT-Befehls: <?php // Verbindung zu Oracle herstellen, einen Cursor öffnen, SQL-Anweisung analysieren // und die analysierte Anweisung ausführen (siehe oben) .... // Anzahl der Spalten des SELECT-Befehls ermitteln $spalten = ora_numcols($cursor); $hilf = 0; while($hilf <> $spalten) { // Spaltenüberschriften ermitteln $name = ora_ColumnName($cursor, $hilf); // ausgeben der eines einzelnen Spaltennamens, “\t“ setzt nach // der Spaltenüberschrift einen Tabulator echo($name . "\t\t"); $hilf++; } $index = 0; // ermitteln der Datensätze beim Oracle-Cursor $cursor while (ora_fetch($cursor)) { $index++; echo("<BR>$index"); for($i=0; $i < $spalten; $i++) // hier wird der Inhalt eines Datensatzes der Spalte $i ausgegeben echo(("\t\t" . ora_getcolumn($cursor, $i))); } echo("<BR>"); ?> Setzt man vor jede der oben aufgeführten Funktionen ein „@“, dann wird die Fehlerausgabe der Funktion unterdrückt. Beispiel: <?php ... // eine SQL-Anweisung analysieren; tritt ein Fehler auf, dann wird die Ausgabe 99 // unterdrückt. if (!@ora_parse ($cursor, “SELECT * FROM dual”)) die (“Die SQL-Anweisung konnte nicht ausgeführt werden.“); else // eine analysierte SQL-Anweisung durchführen ora_exec ($cursor); ?> 100 3.2.3 Erstellen der Tabellen unter Oracle Die Tabellen unter Oracle unterscheiden sich von der Syntax zu den Tabellen unter MySQL. Die Tabellen haben folgenden Aufbau: create table abteilung (abt_id varchar2(2) not null, bezeichnung varchar2(40)); create table job(job_id varchar2(2) not null, titel varchar2(30), gehalt number(8,2)); create table qualifikation(ang_id varchar2(3), job_id varchar2(2)); create table angestellte(ang_id varchar2(3) not null, name varchar2(10), gebdatum date, abt_id varchar2(2), job_id varchar2(2)); 101 3.2.4 Hinzufügen von Datensätzen unter Oracle Die Insert-Befehle der Datenbank „Personalwesen“ haben unter Oracle folgenden Aufbau: insert into abteilung values('KO','Konstruktion'); insert into abteilung values('OD','Organisation und Datenverarbeitung'); insert into abteilung values('PA','Personalabteilung'); insert into abteilung values('RZ','Rechenzentrum'); insert into abteilung values('VT','Vertrieb'); insert into job values('KA','Kaufm. Angestellter',3000.00); insert into job values('TA','Techn. Angestellter',3000.00); insert into job values('PR','Programmierer',3000.00); insert into job values('SY','Systemplaner',6000.00); insert into job values('IN','Ingenieur',6000.00); insert into job values('OR','Operateur',3500.00); insert into angestellte values('A1','Fritz','02-JAN50','OD','SY'); insert into angestellte values('A2','Tom','02-MAR51','KO','IN'); insert into angestellte values('A3','Werner','23-JAN48','OD','PR'); insert into angestellte values('A4','Gerd','03-NOV55','VT','KA'); insert into angestellte values('A5','Emil','02-MAR60','PA','PR'); insert into angestellte values('A6','Uwe','03-APR52','RZ','OP'); insert into angestellte values('A7','Erna','17-NOV55','KO','TA'); 102 insert into angestellte values('A8','Rita','02-DEC57','KO','TA'); insert into angestellte values('A9','Ute','08-SEP62','OD','SY'); insert into angestellte values('A10','Willi','07-JUL56','KO','IN'); insert into angestellte values('A12','Anton','05-JUL48','OD','SY'); insert into angestellte values('A13','Josef','02-AUG52','KO','SY'); insert into angestellte values('A14','Maria','17-SEP64','PA','KA'); insert into qualifikation values('A1','SY'); insert into qualifikation values('A1','PR'); insert into qualifikation values('A1','OP'); insert into qualifikation values('A2','IN'); insert into qualifikation values('A2','SY'); insert into qualifikation values('A3','PR'); insert into qualifikation values('A4','KA'); insert into qualifikation values('A5','PR'); insert into qualifikation values('A6','OP'); insert into qualifikation values('A7','TA'); insert into qualifikation values('A8','TA'); insert into qualifikation values('A9','IN'); insert into qualifikation values('A9','SY'); insert into qualifikation values('A10','IN'); insert into qualifikation values('A11','KA'); insert into qualifikation values('A12','SY'); insert into qualifikation values('A13','IN'); insert into qualifikation values('A14','KA'); 103 3.2.5 Ein allgemeines Beispiel für PHP in Verbindung mit Oracle-Datenbanken In diesem Kapitel möchte ich ein kleines PHP-Skript vorstellen, mit dem Sie Daten aus einer Tabelle ausgeben können. Das Skript greift auf die Datenbank „Personalwesen“ und die Tabelle „Job“ zu und gibt den Inhalt der Tabelle in einer HTML-Tabelle aus. <HTML><HEAD><TITLE></TITLE></HEAD> <BODY BGCOLOR="#FFFFF"> <?php // Verbidnung zu Oracle herstellen; Benutzernamen und Passwort eintragen $linkID = ora_logon("abc12345@rfhs8012_ora9i", " abc12345"); if (!$linkID) die("Es konnte keine Verbindung zu Oracle hersgestellt werden."); // öffnet einen Oracle-Cursor $cursor = ora_open($linkID); // einen SQL-Befehl an die Datenbank schicken $abfrage = "SELECT * FROM job"; $resID = @ora_parse($cursor, $abfrage); if (!$resID) die ("Es ist ein Fehler in der Abfrage aufgetreten."); ora_exec($cursor); // Ausgabe der Datensätze in Tabellenform echo("<table border cellpadding=\"3\"><tr>"); $spalten = ora_numcols($cursor); $hilf = 0; while($hilf <> $spalten) { $name = ora_ColumnName($cursor, $hilf); echo("<th>$name</th>"); $hilf++; } while (ora_fetch($cursor)) { $ spalten = ora_numcols($cursor); echo("<tr>"); for($i=0; $i < $ spalten; $i++) echo("<td>".htmlentities(ora_getcolumn($cursor, $i))."</td>"); echo("</tr>\n"); } 104 echo("</table>"); ?> </BODY></HTML> 105 3.2.6 PHP-Skripte in Anwendung mit einer Oracle-Datenbank Für die Eingabe der SQL-Befehle wurde dasselbe HTML-Formular verwendet wie für den Zugriff auf eine MySQL-Datenbank. Es können die Befehle SELECT, INSERT, DELETE, UPDATE, CREATE-Table, ALTERTable und DROP-Table ausgeführt werden. Es darf jedoch nicht wie bei einer MySQLDatenbank ein Strichpunkt am Ende der SQL-Anweisung stehen. (Abb.32: PHP_Oracle_Formular) Durch Aktivieren des Buttons „Abschicken“ wird dann die SQL-Anweisung an das PHPSkript Oracle.php3 über den Server an die Oracle-Datenbank geschickt. 106 3.2.6.1 Hauptprogramm und Klassenvariablen Im Hauptprogramm der Datei Oracle.php3 wird eine Instanz der Klasse oracle_db erzeugt. Als nächstes wird über die globale Variable $_POST der Inhalt des HTMLFormulars PHP_Oracle_Formular.html ermittelt. Dazu wird ein dynamische Feld mit den Namen $array erzeugt und mit der foreach-Schleife der Inhalt des Feldes $_POST ausgelesen. Der ausgelesene Inhalt wird dem Feld $array angehängt. Zuletzt wird der ausgelesene Inhalt den Variablen $Auswahl und $Anweisung zugewiesen. Danach wird mit einer SWITCH-Anweisung ermittelt, welcher Radiobutton im HTML-Formular ausgewählt wurde. Der dafür benötigte String steht in der Variablen $Auswahl. Die Inhalte der Post-Variable kann auch anders ermittelt werden. Man kann mit dem Befehl $HTTP_POST_VARS auf den Inhalt zugreifen. $HTTP_POST_VARS ist ebenfalls ein Feld und der Inhalt dieses Feldes kann z.B. mit $HTTP_POST_VARS[’Anweisung’] ermittelt werden. Der Vorteil dieses Befehls ist, das die Inhalte nicht mehr durch eine Schleife ermittelt werden müssen und diese Art der Ermittlung der Inhalte der Post-Variable ist sicherer (siehe Diplomarbeit von Zimmermann Stefan unter der folgenden Seite: http://rfhs8012.fh-regensburg.de/~saj39122/Meile.html). Die Befehle haben dann folgendes aussehen: // zuweisen der Feldinhalte $Auswahl = $HTTP_POST_VARS['Auswahl']; $Anweisung = $HTTP_POST_VARS['Anweisung']; Der Feldinhalt muss jedoch nicht unbedingt in die Variablen geschrieben werden. Syntax: $datenbank = new oracle_db; $array = array(); // ermitteln der Inhalte des Globalen Feldes $_Post, die über das HTML-Formular geschickt wurden 107 foreach ($_POST as $var => $value) { $array[] = $value; } // zuweisen der Feldinhalte $Auswahl = $array[0]; $Anweisung = $array[1]; // Select-Anweisung an die Datenbank schicken switch($Auswahl) { case "Select" : if (!$Anweisung) echo("Es wurde keine SQL-Anweisung eingegeben."); else $datenbank->query($Anweisung); break; case "Update" : if (!$Anweisung) echo("Es wurde keine SQL-Anweisung eingegeben."); else $datenbank->geanderte_Dts($Anweisung); break; case "Create": if (!$Anweisung) echo("Es wurde keine SQL-Anweisung eingegeben."); else $datenbank->Create_Table($Anweisung); break; case "Alter" : if (!$Anweisung) echo("Es wurde keine SQL-Anweisung eingegeben."); else $datenbank->Alter_Table($Anweisung); break; case "Drop" : if (!$Anweisung) echo("Es wurde keine SQL-Anweisung eingegeben."); else $datenbank->Drop_Table($Anweisung); break; } Es gibt vier Klassenvariablen in der Datei Oracle.php3. Die Verbindung zur Oracle wird in der Variablen $linkID gespeichert. Der Datenbankname wird in der Variablen $db, der Benutzername in der Variablen $uname und das Passwort in der Variablen $passw gespeichert. Die Variable $cursor ist für den Oracle-Cursor zuständig. Syntax: class oracle_db { var $linkID = false; var $cursor = false; var $uname = "abc12345 @rfhs8012_ora9i"; var $passw = " abc12345"; ... } 108 Bitte beachten Sie, dass Sie den Benutzernamen und das Passwort noch eingeben müssen. 3.2.6.2 Konstruktor der Klasse oracle_db Der Konstruktor der Klasse oracle_db ruft die Funktion connect_db() auf, die die Verbindung zu Oracle herstellt. Syntax: // Konstruktor der Klasse oracle_db function oracle_db() { $this->connect_db(); } 3.2.6.3 Die Funktion connect_db() In dieser Funktion wird eine Verbindung zu Oracle hergestellt, wenn der Benutzername und das Passwort richtig sind. Danach wird ein Oracle-Cursor geöffnet. Syntax: // Verbindung zur Datenbank function connect_db() { // Verbindung zu Oracle herstellen $this->linkID = @ora_logon($this->uname, $this->passw); if (!$this->linkID) { die("Es konnte keine Verbindung zu Oracle hergestellt werden.<BR><BR>"); return false; } else { echo("Die Verbindung zu Oracle wurde hergestellt.<BR><BR>"); } // öffnet einen Oracle-Cursor $this->cursor = @ora_open($this->linkID); 109 }// Ende der Funktion connect_db 3.2.6.4 Die Funktion query($sql) Diese Funktion verarbeitet die eingegebenen SELECT-Anweisungen. Zuerst werden die Backslashes des eingegebenen SQL-Befehls abgeschnitten und dann wird nach dem Wort SELECT im Parameter $sql gesucht. Danach wird mit der Funktion ora_parse() überprüft, ob es sich auch um einen korrekten SQL-Befehl handelt. Sonst wird das Programm mit einer Fehlermeldung abgebrochen. Danach wird der SQL-Befehl mit der Funktion ora_exec() ausgeführt. Als nächstes werden die Feldnamen des SQL-Befehls ermittelt und es wird eine Spaltenüberschrift erstellt. Dafür ist die Funktion ora_ColumnName() zuständig. Mit der Funktion ora_NumCols() werden die Felder des Ergebnisses der Abfrage ermittelt. Danach werden die Daten des Ergebnisfeldes mit der Funktion ora_getcolumn() ermittelt und in eine Tabelle geschrieben. Zuletzt wird der Oracle Cursor geschlossen. Syntax: // Select-Anweisungen an die Datenbank schicken function query($sql) { // schneidet die Backslashes bei der Eingabe ab $sql = stripslashes($sql); // Suche nach dem Wort SELECT $treffer = stristr($sql, "Select"); if ($treffer==false) die("Sie haben keine korrekte SELECT-Anweisung eingegeben.<BR><BR>"); else echo($sql . "<BR><BR>"); if(!@ora_parse($this->cursor, $sql)) die ("<BR><BR>Die Select-Anweisung konnte nicht korrekt ausgeführt werden."); ora_exec($this->cursor); 110 echo("<table border cellpadding=\"3\"><tr>"); echo("<th>Nr</th>"); $spalten = ora_numcols($this->cursor); $hilf = 0; while($hilf <> $spalten) { $name = ora_ColumnName($this->cursor, $hilf); echo("<th>$name</th>"); $hilf++; } $index = 0; while (ora_fetch($this->cursor)) { $index++; $ spalten = ora_numcols($this->cursor); echo("<tr><td>$index</td>"); for($i=0; $i < $ spalten; $i++) echo("<td>".htmlentities(ora_getcolumn($this->cursor, $i))."</td>"); echo("</tr>\n"); } echo("</table>"); ora_close($this->cursor); }// Ende der Funktion query 3.2.6.5 Die Funktion geanderte_Dts($sql) Diese Funktion ermittelt die Anzahl der betroffenen Datensätze, die bei einem UPDATE-, INSEERT- oder DELETE-Befehl betroffen sind. Dabei werden zuerst die Backslashes des übergebenen Parameters $sql entfernt. Danach wird überprüft, ob eines der drei Worte in der SQL-Anweisung vorhanden ist und ob die SQL-Anweisung korrekt ist. Als nächstes wird die SQL-Anweisung ausgeführt. Mit der Funktion ora_numrows() wird die Anzahl der betroffenen Datensätze ermittelt. 111 Syntax: // Betroffene Datensätze bei einem UPDATE, INSERT oder DELETE ermitteln function geanderte_Dts($sql) { // schneidet die Backslashes bei der Eingabe ab $sql = stripslashes($sql); // suche nach den Worten UPDATE, INSERT, DELETE $feld = array("Update", "Insert", "Delete"); $falg = false; foreach($feld as $element) { $treffer = stristr($sql, $element); if ($treffer==true) { $flag = true; break; } } if ($flag==false) die("Sie haben keine korrekte UPDATE-, INSERT-, oder DELETE-Anweisung eingegeben."); if(!@ora_parse($this->cursor, $sql)) die ("Die SQL-Anweisung konnte nicht korrekt durchgeführt werden."); ora_exec($this->cursor); if (ora_numrows($this->cursor)==1) echo("Die SQL-Anweisung wurde durchgeführt. <BR> Es wurde ora_numrows($this->cursor) . " Datensatz betroffen."); else echo("Die SQL-Anweisung wurde durchgeführt. <BR> Es wurden ora_numrows($this->cursor) . " Datensätze betroffen."); ". ". ora_close($this->cursor); }// Ende der Funktion geanderteDts 3.2.6.6 Die Funktionen Create_Table($sql), Alter_Table($sql) und Drop_Table ($sql) Diese drei Funktionen sind bis auf eine Kleinigkeit identisch. In den Funktionen werden zuerst alle vorkommenden Backslashes des Übergabeparameters entfernt. Dann wird nach 112 dem Wort CREATE oder ALTER oder DROP gesucht und die Anweisung wird auf Fehler überprüft. Danach wird die Anweisung ausgeführt. Die Unterscheidung betrifft eigentlich nur die Ausgaben. Diese drei Anweisungen werden in separate Funktionen unterteilt, damit sie leicht veränderbar sind. // In dieser Funktion wird eine neue Tabelle erzeugt function Create_Table($sql) { // schneidet die Backslashes bei der Eingabe ab $sql = stripslashes($sql); $treffer = stristr($sql, "Create"); if ($treffer==false) die("Sie haben keine korrekte CREATE-Anweisung eingegeben."); if(!@ora_parse($this->cursor, $sql)) die ("Die CREATE-Anweisung konnte nicht korrekt durchgeführt werden."); ora_exec($this->cursor); echo ("Die Anweisung " .$sql. " wurde korrekt durchgeführt"); ora_close($this->cursor); }// Ende der Funktion Create_Table // In dieser Funktion wird eine Tabelle gelöscht function Drop_Table($sql) { // schneidet die Backslashes bei der Eingabe ab $sql = stripslashes($sql); $treffer = stristr($sql, "Drop"); if ($treffer==false) die("Sie haben keine korrekte DROP-Anweisung eingegeben."); if(!@ora_parse($this->cursor, $sql)) die ("Es ist ein Fehler in der DROP-Anweisung aufgetreten. Das Programm wurde abgebrochen."); ora_exec($this->cursor); echo ("Die Anweisung " .$sql. " wurde korrekt durchgeführt"); ora_close($this->cursor); 113 }// Ende der Funktion Drop_Table // In dieser Funktion wird eine Tabelle geändert function Alter_Table($sql) { // schneidet die Backslashes bei der Eingabe ab $sql = stripslashes($sql); $treffer = stristr($sql, "Alter"); if ($treffer==false) die("Sie haben keine korrekte ALTER-Anweisung eingegeben."); if(!@ora_parse($this->cursor, $sql)) die ("Es ist ein Fehler in der ALTER-Anweisung aufgetreten. Das Programm wurde abgebrochen."); ora_exec($this->cursor); ora_close($this->cursor); }// Ende der Funktion Alter_Table 114 Abbildungsverzeichnis Abb.1: Hinzufügen eines Netzwerkprotokolls 10 Abb.2: Hinzufügen des TCP/IP-Protokolls 11 Abb.3: Netzwerkumgebung 12 Abb.4: Start der Apache-Installation 13 Abb.5: Netzwerknamen für den Apache-Webserver eintragen 13 Abb.6: Überprüfen der Apache-Installation 14 Abb.7: Überprüfung der PHP-Installation 17 Abb.8: MySQL-Monitor 45 Abb.9: Information zu MySQL-Monitor 46 Abb.10: PhpMyAdmin 58 Abb.11: Erstellen einer Datenbank mit MySQL-Monitor 61 Abb.12: Erstellen der Tabellen mit MySQL-Monitor 63 Abb.13: Auswahl einer Datenbank mit PhpMyAdmin 65 Abb.14: Erstellen von Tabellen mit PhpMyAdmin 65 Abb.15: Tabellen der Datenbank „Personalwesen“ unter PhpMyAdmin 66 Abb.16: Insert-Befehle unter MySQL-Monitor 68 Abb.17: füllen der Tabellen mit Daten unter PhpMyAdmin 69 Abb.18: anzeigen der Tabelleninhalte unter PhpMyAdmin 69 Abb. 19: Datensätze der Tabelle „Angestellte“ 70 Abb.20: PHP-Formular 71 Abb.21: Ergebnis einer SELECT-Anweisung 72 Abb.22: Ergebnis einer komplexeren SELECT-Anweisung 73 Abb.23: Connect mit SSH herstellen 88 Abb.24: FTP-Verbindung herstellen 89 Abb.25: Secure Shell File Transfer-Fenster 90 Abb.26: Lese- und Schreibrechte festlegen 91 Abb.27: überprüfen der Schreibrechte 91 Abb.28: überprüfen des Ordners public_html 92 Abb.29: kopieren der PHP-Skripte 93 Abb.30: HTML-Formular für die Eingabe der SQL-Anweisungen 94 Abb. 31 Ausgabe eines SELECT-Befehls 95 115 Abb.32 PHP_Oracle_Formular 106 116 Literaturverzeichnis - Ulrich Günther: PHP, Ein praktischer Einstieg - Rasmus Lerdorf, Kevin Tatroe: Programmieren mit PHP - Matt Zandstra: Jetzt lerne ich PHP4 - Sven Letzel, Robert Gacki: Jetzt lerne ich MySQL & PHP - Thomas Demmig: MySQL lernen, Anfangen, anwenden, verstehen - Kevin Yank: PHP and MySQL, Schritt für Schritt zur datenbankgestützten Website - www.PHP.net - www.php-homepage.de - www.php-archiv.de - www.phpwelt.de - SELFPHP: www.selfphp.com, www.selfphp4.de 117