• Keine Ergebnisse gefunden

Datenbanken Internet-Teil

N/A
N/A
Protected

Academic year: 2021

Aktie "Datenbanken Internet-Teil"

Copied!
28
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Internet-Teil

Vorlesungsskript Prof. Dr. Edwin Schicker

FH Regensburg

1 Überblick... 2

1.1 Rechnerumgebung... 2

1.2 Installation eines eigenen WWW-Servers... 3

2 Hypertext Markup Language (HTML)... 3

2.1 HTML-Grundlagen ... 4

2.2 HTML-Formulare... 5

2.3 Einfaches Beispiel zu Formularen... 7

3 PHP ... 8

3.1 PHP-Einführung ... 8

3.2 PHP innerhalb von HTML ... 9

3.3 Installation von PHP unter Windows XP ... 10

3.4 Übungsaufgaben ... 11

4 Erste Datenbankzugriffe... 11

4.1 Zugriffsmöglichkeiten ... 11

4.2 Zugriffsmöglichkeiten von PHP auf Datenbanken... 12

4.3 Erster PHP-Zugriff auf Datenbanken ... 15

4.4 Auslesen mehrerer Datenzeilen aus einer Datenbanken... 17

5 Komplexere Datenbankzugriffe ... 20

5.1 Zugriff auf Datenbanken über mehrere Skriptseiten hinweg ... 20

5.2 Fehlerbehandlung ... 22

5.3 Ein komplexes Beispiel ... 23

5.4 Sessionvariable ... 25

5.5 Datenbankunabhängiges Programmieren mit Objekten in PHP... 26

5.6 Ausblick auf weitere Themen... 28

5.7 Übungsaufgaben ... 28

© Copyright liegt beim Autor, Verwendung außerhalb der Fachhochschule Regensburg bedarf der Genehmigung des Autors.

(2)

1 Überblick

Auf Datenbanken kann ohne Weiteres über das Internet zugegriffen werden. Bei Internetzugriffen liegt immer das Client/Server-Konzept zugrunde. Wir benötigen einen WWW-Server und Clients, die mit Hilfe von Browsern auf den WWW-Server zugreifen. Auf den Datenbank-Server, der die Daten- bank verwaltet, greift ausschließlich der WWW-Server zu. Wir erhalten in einer etwas vereinfachten Form folgende Zugriffsreihenfolge:

Der Browser wird vom Benutzer gestartet. Von hier aus greift also der Benutzer auf die Internet-Datenbank zu.

WebServer

DB-Server Browser

Der WWW-Server ist das Bindeglied zwischen Browser und Datenbank.

Auf dem WWW-Server wird die Datenbankverbindung (ODBC, OLE DB, JDBC) hergestellt.

Der Datenbank-Server verwaltet die Datenbank selbstständig. Auf kleine- ren Datenbanken und WWW-Servern sind häufig WWW-Server und DB- Server auf dem selben Rechner installiert.

Mit dem Aufruf der WWW-Seite durch den Browser des Benutzers wird der WWW-Server aktiv und liefert dem Browser die gewünschte Seite. Diese liest der Benutzer und gibt gegebenenfalls in entspre- chenden Feldern Daten ein. Durch einen Klick auf einen Button oder einen speziellen Link wird der WWW-Server aufgerufen und bearbeitet diese Aktion. Ist ein Datenbankzugriff erforderlich, um benö- tigte Informationen zu holen, so wird eine entsprechende Anforderung an den DB-Server gestellt. Die- ser bearbeitet diese und reicht die gewünschten Daten an den WWW-Server zurück. Diese bereitet der WWW-Server auf und schickt die komplette Seite mit den gewünschten Daten an den Client zurück.

Der Browser stellt diese Daten dann dar, der Benutzer liest die Seite.

Der mit Abstand am weitesten verbreitete WWW-Server ist der Apache-Server, gefolgt vom Micro- soft Internet Information Server (Microsoft IIS). Zugriffssprachen sind beispielsweise Perl, verschie- dene Basic-Dialekte, Java, Javascript und in jüngster Vergangenheit immer mehr PHP.

Diese Vorlesung konzentriert sich auf die Datenbankzugriffe. HTML und PHP dienen als Werkzeug und veranschaulichen die Zugriffsmöglichkeiten. Auf den Übungsrechnern wird auf den Unix-Server rfhs8012 mit Apache als Webserver zugegriffen. Verwendung findet die Zugriffssprache PHP. An- dere Konfigurationen sind denkbar, vom Prinzip her gibt es aber nur geringe Unterschiede.

Internet: Selfhtml 8.1, www.teamone.de/projekte/selfhtml.htm

www.php.net (sehr viele Infos, aktuelle Software, Manuale zu PHP) www.php-homepage.de (deutschsprachige Seite zu PHP)

Software: Frontpage (umfangreiches HTML-Werkzeug im Office-Paket)

Dreamweaver (Macromedia, sehr gutes HTML- und Design-Werkzeug) Phase 5 (kostenloser HtmlEditor, www.berretz.de)

AdoDB-Abstraktionsschnittstelle (adodb.sourceforge.net) 1.1 Rechnerumgebung

Übungsraum sind die Räume 511/514 unter WindowsXP mit einer Oracle-Datenbank V9/V10. Als WWW-Server liegt ein Apache-Server auf dem Rechner rfhs8012 (Aliasname: fbim) vor.

Da die PHP-Seiten vom Server interpretiert werden müssen, müssen diese Seiten auch dort abgelegt sein. Folgende Befehle müssen daher von jedem einzelnen Benutzer einmalig ausgeführt werden:

(3)

cd $HOME

mkdir public_html chmod o+x $HOME

chmod 755 public_html

Dies erfordert das einmalige Einloggen in Sun Solaris oder eine Telnet-Verbindung. Im Raum 511/514 wird beim Start von WindowsXP das U-Laufwerk direkt mit dem lokalen Verzeichnis auf dem Sun- rechner verbunden, so dass auch alle Daten direkt ins U-Laufwerk kopiert werden können.

Der Apache-Server interpretiert das Hauptverzeichnis public_html als Internet-Root-Verzeichnis des Benutzers. Im Folgenden wird dies vorausgesetzt. Im soeben erzeugten Unterverzeichnis public_html werden wir nun unsere HTML-/PHP-Seiten ablegen! Die PHP-Seiten werden beim Zugriff vom Apache-Server interpretiert und als HTML-Seite an den Aufrufenden zurückgegeben. Im Browser lautet die URL zu diesen Seiten (mit abc12345 als die eigene Benutzerkennung):

http://rfhs8012.fh-regensburg.de/~abc12345 http://fbim.fh-regensburg.de/~abc12345

Weitere Hinweise werden in der Vorlesung gegeben.

1.2 Installation eines eigenen WWW-Servers

Um die Beispiele der Vorlesung auch auf dem eigenen Rechner zu Hause nachvollziehen zu können, benötigen wir einen WWW-Server. Ein WWW-Server benötigt entweder das Betriebssystem Unix (Linux) oder Windows NT/2000/XP. Hier folgen Kurzhinweise zu Win2000/XP:

Die Installation unter Win2000/XP Workstation ist einfach. Die Installations-CD bietet unter Win- dows2000 beim Einlegen im Anfangsmenü gleich die Möglichkeit der Installation des IIS-Servers an.

Unter WindowsXP Professional wird IIS als Zusatzoption angeboten. Diese Option muss nur ausge- wählt zu werden. In beiden Fällen kann dies auch nachträglich geschehen, den Anweisungen ist zu folgen.

In allen Fällen muss auf dem Rechner ein Netzwerk mit TCP/IP-Protokoll eingerichtet werden, etwa mit der Netzwerkadresse 192.168.255.1. Die WWW-Installation richtet ein WWW-Root-Verzeichnis ein, standardmäßig c:\inetpub\wwwroot. Wird ein HTML-Dokument namens default.htm in diesem Verzeichnis abgelegt, so ist dieses Dokument auf allen Rechnern, die mit diesem Server verbunden sind, unter der Adresse http://192.168.255.1/default.htm zu erreichen. Sind Client und Server iden- tisch, greifen wir also lokal auf den Server zu, so können wir statt der IP-Adresse auch schreiben:

http://localhost/default.htm.

Sollte mit WindowsXP Home-Edition gearbeitet werden, so ist IIS nicht standardmäßig dabei. Es wird in diesem Fall empfohlen, Apache 1.3 zu installieren. Dieser WWW-Server ist kostenlos aus dem In- ternet zu beziehen.

Nun ist nur noch PHP zu installieren. Die Installation von PHP wird im Abschnitt zu PHP detailliert vorgestellt. Nach der Installation von PHP werden PHP-Dateien durch den WWW-Server korrekt in- terpretiert. Diese serverseitige Interpretation erfolgt wirklich nur, wenn diese Seite nicht direkt als Datei, sondern über den Server in den Browser kopiert wird!

Alternativ kann auch der Apache-Server für Windows installiert werden. Natürlich sind auch unter Li- nux sowohl der Apache-Server als auch PHP kostenlos verfügbar. Nichts spricht auch gegen die Ver- wendung von MySQL an Stelle von Oracle.

2 Hypertext Markup Language (HTML)

Um auf Datenbanken über das Internet zuzugreifen, benötigen wir Wissen über SQL, Programmier- sprachen (hier: PHP) und HTML-Dokumente. Mit HTML-Dokumenten wollen wir uns aber nur kurz auseinandersetzen, ebenso mit der Sprache PHP.

(4)

2.1 HTML-Grundlagen

Hier erfolgt nur eine sehr knappe Zusammenfassung zu HTML. Die meisten Beispiele wurden dem sehr empfehlenswerten Programm Selfhtml 8.1 von Stefan Münz entnommen. Selfhtml enthält eine ausführliche Beschreibung von HTML-Befehlen, von StyleGuides und von Javascript (ähnelt PHP).

HTML ist ein normaler Text, der sogenannte Tags enthält. Dies sind Bezeichner, die in spitze Klam- mern eingeschlossen sind. Diese Tags wirken auf den folgenden Bereich, bis diese durch einen ent- sprechenden Ende-Tag beendet werden. Dieser Ende-Tag unterscheidet sich vom Tag-Bezeichner durch einen vorangestellten Schrägstrich (‚/’). Das Grundgerüst eines HTML-Programms enthält einen Kopf, in dem globale Informationen zu dem Programm angegeben werden und einen Rumpf, der die eigentlichen Texte und Grafiken enthält. Ein HTML-Dokument hat somit folgendes Aussehen:

<html>

<head>

<title>Text des Titels</title>

</head>

<body>

Text, Verweise, Grafikreferenzen usw.

</body>

</html>

Der Titel erscheint in der Titelleiste des Browsers. Der eigentliche Text muss noch strukturiert wer- den. Hier stehen zahlreiche Tags zur Verfügung. Eine kleine Auswahl ist:

<hi>Text</hi> Überschrift der Ordnung i mit i=1,…,6

<p>Text</p> Textabschnitt (Ende-Tag ist nicht zwingend) Text<br>Text Zeilenumbruch

<b>Text</b> Fettdruck

<i>Text</i> Kursivschrift

<u>Text</u> Unterstreichung

Auch Nummerierungen lassen sich in HTML-Dokumenten durchführen:

<ol>

<li>Listeneintrag</li>

<li>Listeneintrag</li>

</ol>

Diesen geordneten Listen (ol=ordered list) stehen Aufzählungslisten (ul=unordered list) gegenüber.

Wird also in obigem Beispiel der Tag ol durch ul ersetzt, so wird eine reine Aufzählung ohne Numme- rierung erzeugt.

Wichtig sind für uns Tabellen zur Ausgabe von Relationen. Auch hier wollen wir nur Grundkonzepte ansprechen. Tabellen enthalten Zeilen, jede Zeile enthält Spalten. Wir geben daher in einer Tabelle eine Zeile nach der anderen aus. Innerhalb jeder Zeile werden die Spalten nacheinander angegeben. Es muss nicht jede Zeile die gleiche Spaltenanzahl besitzen. Das Grundgerüst sieht daher wie folgt aus:

<table border>

<tr>

<th>Kopfzelle</th>

<th>Kopfzelle</th>

</tr>

<tr>

<td>Datenzelle</td>

<td>Datenzelle</td>

</tr>

</table>

(5)

Diese Tabelle besitzt eine Kopfzeile mit zwei Spalten und eine weitere Zeile mit ebenfalls zwei Zei- len. Eine Tabelle wird in das Tag table eingeschlossen. Wird die Angabe border im Tag verwendet, so erhält die Tabelle einen Rahmen, ansonsten wird kein Rahmen ausgegeben. Zu weitergehenden Ta- bellen-Formatierungen sei auf Selfhtml verwiesen. Eine Zeile wird in das Tag tr eingeschlossen, eine Spalte in das Tag td. Die erste Zeile darf stattdessen auch das Tag th enthalten. Diese Spalten werden dann als Spalten einer Kopfzeile interpretiert. Die Darstellung dieser Kopfzeilen hängt vom verwen- deten Browser ab (meist Fettdruck, Zentrierung und größere Spaltenhöhe).

Auch ein Verweis auf Referenzen im Internet, auf Bilder oder auf andere HTML-Seiten sind oft erfor- derlich. Die Syntax von Referenzen lautet:

<a href="URL">Verweistext</a>

Als URL kann entweder eine Internetadresse oder eine lokale Datei angegeben werden. Beispiele:

<a href="http:/homepages.fh-regensburg.de/~sce39014">

Homepage von Edwin Schicker</a>

<a href="superbild.jpg">Verweis auf ein Bild im gleichen Verz.</a>

<a href="weiter.html">Nächste Html-Seite</a>

Das erste Beispiel enthält einen Verweis auf eine Internetseite, das zweite einen Verweis auf ein Bild, das dritte einen Verweis auf eine andere HTML-Seite. Zu beachten ist, dass diese Verweise existieren sollten. In den beiden letzten Beispielen sollten also im gleichen Verzeichnis, in dem sich die aktuelle HTML-Seite befindet, auch die beiden angegebenen Dateien stehen.

Ein Problem stellen deutsche Umlaute dar. Viele HTML-Editoren setzen die deutschen Umlaute auto- matisch in den notwendigen Code um. Im Folgenden ist dieser Code angegeben:

&auml; statt ä &Auml; statt Ä

&ouml; statt ö &Ouml; statt Ö

&uuml; statt ü &Uuml; statt Ü

&szlig; statt ß

Natürlich sollten auch Kommentare in einem HTML-Dokument nicht fehlen. Diese werden wie folgt geschrieben:

<!-- Dies ist ein Kommentar -->

2.2 HTML-Formulare

Während zum Auslesen von Daten aus Datenbanken häufig Tabellen verwendet werden, müssen zur Auswahl der gewünschten Daten meist Formulare ausgefüllt werden. Im Bereich von eCommerce müssen persönliche Angaben einschließlich der Kreditkartennummer erfasst werden. Auch bei der Suche von bestimmten Daten wie Büchern oder CDs müssen Suchbegriffe und Rubriken eingegeben werden. Hier unterstützen auch Auswahllisten die Suche erheblich. Weiter müssen die eingegebenen Daten durch entsprechende Buttons bestätigt oder widerrufen werden. Hierzu verwenden wir HTML- Formulare. Das Formulargerüst lautet (die Gänsefüßchen bei Stringangaben sind hier und auch später nur notwendig, wenn die Strings Leerzeichen oder andere Steuerzeichen enthalten):

<form action="Programm" method="post">

<!-- Formularelemente -->

</form>

Ein Formular ruft ein Programm auf, das nach Eingabe der Formulardaten aufgerufen wird. Nur in wenigen Fällen reichen hier HTML-Dokumente als Ziel aus, da die eingegebenen Daten meist über- prüft und weiterverarbeitet werden müssen. Wir verwenden in der Vorlesung ausschließlich PHP-Pro- gramme, es können aber genauso CGI-, Perl-, ASP- oder andere Programme eingesetzt werden. Die Methode post gibt an, dass die übergebenen Formularinhalte auf dem WWW-Server in stdin zur Ver-

(6)

fügung gestellt werden. PHP-Programme können diese Eingaben auf einfache Art und Weise lesen.

Wahlweise steht auch die Methode get zur Verfügung. Hier werden die Formularinhalte zusammen mit dem Programmnamen verschickt und sind für den Benutzer im Browserfenster sichtbar. Auf diese Methode werden wir im Weiteren aber verzichten. Werden keine Formularinhalte weitergereicht, so ist die Angabe einer Methode nicht erforderlich.

Ein Formular kann unterschiedliche Eingabemöglichkeiten verwenden, etwa:

• Einzeiliges Eingabefeld

• Auswahlliste

• Absendebutton

• Abbruchbutton

Weitere Möglichkeiten sind mehrzeilige Eingabefelder, Radiobuttons oder Checkboxen und einige Neuerungen, die erst ab HTML V4.0 zur Verfügung stehen und daher nicht auf allen Browsern ablauf- fähig sind (z.B. allgemeine Klickbuttons und Gruppierung). Wieder wird dazu auf Selfhtml verwiesen.

Wir stellen kurz die HTML-Tags vor, die die obigen Eingabemöglichkeiten beschreiben. Beginnen wir mit den einzeiligen Eingabefeldern:

<input size=x maxlength=x name="Elementname" value="Text">

Size gibt die Größe des Eingabefeldes in Anzahl von Zeichen an. Maxlength beschreibt die maximale Anzahl von Zeichen, die eingegeben werden dürfen. Überschreitet die Eingabe die Größe size, so wird die Eingabe gescrollt. Der Name des Eingabefeldes ist für die Weiterverarbeitung wichtig. Das im Form-Tag angegebene Programm findet die Eingabe unter diesem Namen. Die Angabe value ist wahl- frei und gibt eine Vorbelegung an. Variationen sind beispielsweise:

<input readonly size=x maxlength=x name="Elementname" value="Text">

<input type=password size=x maxlength=x name="Elementname">

Im ersten Fall ist das Eingabefeld nicht veränderlich, die Angabe value muss hier angegeben werden.

Im zweiten Fall erfolgt die Eingabe ohne Echo, um etwa Passwörter eingeben zu können.

Auswahllisten, auch als Comboboxen bezeichnet, können auf einfache Weise in HTML erstellt wer- den. Der Aufbau dieser Listen sieht wie folgt aus:

<select multiple name="Elementname" size=x>

<option> Eintrag

<option> anderer Eintrag

</select>

Das Select-Tag enthält Option-Tags. Die Größe der Auswahlliste entspricht also der Anzahl der Op- tion-Tags. Die wahlfreie Angabe size bewirkt, wie viele Elemente angezeigt werden. Ist x=1, so wird eine Drop-Down-Box generiert. Dies ist die Standardeinstellung. Die ebenfalls wahlfrei Angabe mul- tiple bewirkt, dass mehrere Elemente ausgewählt werden können. Standardmäßig ist nur eine Auswahl erlaubt. Betrachten wir noch zwei interessante Varianten.

<option selected> noch ein Eintrag

<option value="Wert"> weiterer Eintrag

Die Angabe selected bewirkt eine Vorauswahl. Die Angabe value gibt einen Ersatzwert an, der statt des Listeneintrags an das Programm (im Form-Tag angegeben) weitergereicht wird.

Innerhalb eines Form-Tag-Bereichs können auch noch zwei Buttons verwendet werden, ein Button zum Absenden der Daten und ein Button zum Rücksetzen. Diese Buttons werden wie folgt definiert:

<input type="submit" value="Beschriftung">

<input type="reset" value="Beschriftung">

(7)

Die innerhalb eines Formularbereichs eingetragenen Daten werden erst durch Drücken des Submit- Buttons abgeschickt. Umgekehrt werden alle Einträge wieder zurückgesetzt, wenn der Reset-Button angeklickt wird. In HTML 4.0 können auch weitere Buttons definiert werden. Ältere Browser unter- stützen diese Buttons aber noch nicht. Radiobuttons und Checkboxen existieren dafür bereits seit lan- gem. Die Definitionen lauten:

<input type=radio name="Name" value="Wert"> Text

<input type=checkbox name="Name" value="Wert"> Text

Es ist zu beachten, dass alle Radiobuttons mit dem gleichen Namen zusammengehören. Es kann also immer nur ein Radiobutton dieser Gruppe angeklickt sein. Der angegebene Wert wird beim Klicken des Submit-Buttons übertragen. Das Gleiche gilt sinngemäß auch für Checkboxen, nur können hier kein, ein oder mehrere Elemente einer Gruppe markiert sein.

2.3 Einfaches Beispiel zu Formularen

Nach so viel Stoff lassen wir ein kleines Beispiel folgen. Bisher haben wir aber noch nicht kennenge- lernt, wie wir innerhalb eines Formulars eingegebene Werte im Ziel-Dokument auswerten können.

Aus diesem Grund wollen wir uns mit einem recht einfachen Formular begnügen. Dieses Formular ist Ausgangspunkt unserer Vorlesung und die Defaultseite auf dem Server (default.htm). Wir definieren mehrere Buttons. Ein Klick auf einen dieser Buttons führt auf entsprechende Beispielseiten, die wir alle im Laufe der Vorlesung noch kennenlernen werden. Betrachten wir den HTML-Code in leicht gekürzter Form:

<html>

<head>

<title>Erstes Beispiel einer Formularseite</title>

</head>

<body>

<center><h1>Vorlesung Datenbanken</h1></center>

<center><h3>Edwin Schicker</h3></center>

<p>Diese Seite ist die Einstiegsseite zum Internetteil der Vorlesung Datenbanken von E. Schicker. Durch Klick auf den entsprechenden Button kann zu den einzelnen Beispielen der Vorlesung verzweigt werden.</p>

<p>Folgende Seiten stehen zur Verfügung:</p>

<table cellpadding=10>

<tr>

<td align=right> <form action="name.html">

<input type="Submit" value="Erstes PHP-Beispiel">

</form>

</td>

<td valign=top> Die Datei <i>name.html</i> wird angesprungen </td>

</tr>

<tr>

<!-- Die folgenden Tabellenzeilen sind analog aufgebaut -->

</tr>

</table>

<p>

Ende der HTML-Datei</p>

</body>

</html>

Die Tabellenausgabe wurde leicht optimiert, indem einige Optionen hinzugefügt wurden. Cellpadding gibt den Abstand des Textes vom Zellrand (in Pixeln) an, so dass Spalten und Zeilen einen gewissen Abstand voneinander haben. Mit der Option Align kann die horizontale Ausrichtung und mit Valign die vertikale Ausrichtung beeinflusst werden.

(8)

Es ist zu beachten, dass hier und auch in allen weiteren Beispielen die deutschen Umlaute nicht um- schrieben wurden. Wir hätten an Stelle des Wortes gewünschten das Wort gew&uuml;nschten schrei- ben müssen. Wir haben aus Gründen der Übersichtlichkeit aber darauf bewusst verzichtet. Viele HTML-Editoren, wie etwa auch Phase5, setzen deutsche Umlaute automatisch um. Wir können hier also wie gewohnt arbeiten.

Jedes Formular-Tag enthält genau einen Submit-Button. Im Formular-Tag wurde mit der Option Action eingetragen, wohin beim Klick auf den Submit-Button verzweigt werden soll.

In der Regel soll jedoch nicht nur verzweigt werden. Es sollen auch eingetragene Daten ausgelesen werden. Dies ist aber nur noch mittels Programmierung möglich, z. B. mit DHTML (Dynamic HTML). Wir wollen diese Möglichkeiten mit Hilfe von PHP aufzeigen.

3 PHP

Internetprogramme werden immer öfter in PHP geschrieben. Dies liegt vor allem daran, dass PHP auf allen Plattformen (Windows, Unix, Mac) verfügbar ist und dass WWW-Server meist auf Unix-Rech- nern (etwa Linux) zusammen mit der Software von Apache installiert sind. Aber auch Active Server Pages (ASP), Java, Javascript und Perl sind weit verbreitet.

PHP ist eine junge Sprache und wurde 1994 von Rasmus Lerdorf erfunden. PHP baut auf C++, Java und Perl auf und ist speziell auf die Internet-Programmierung zugeschnitten.

3.1 PHP-Einführung

PHP ist völlig identisch zu C/C++/Java in Bezug auf die Kontrollstrukturen if, switch, for, while und do. Das Gleiche gilt für break und continue. Variablen wird das Dollar-Zeichen vorangestellt. Diese müssen in PHP ähnlich wie in Basic nicht vordefiniert werden. PHP unterscheidet nur 6 Datentypen:

int, integer

bool, boolean // mit den logischen Werten TRUE und FALSE double, real

string array object

Wie in C/Java unterscheidet PHP Groß- und Kleinschreibung bei Variablen. Allerdings wird bei reser- vierten Wörtern und Funktionsaufrufen nicht differenziert! Operatoren gibt es fast die gleichen wie in C/C++/Java, sogar mit den gleichen Hierarchiestufen. Einige Besonderheiten betreffen vor allen Din- gen die Zeichenketten:

ƒ Innerhalb einer Zeichenkette dürfen Variablen stehen. Diese Variablen werden substituiert.

ƒ Für Strings ist der Punkt-Operator definiert: Er vereinigt zwei Strings ( $str1 . $str2)

ƒ Strings können mittels des Gleichheitszeichen kopiert werden ($str1 = $str2)

ƒ Wichtige String-Funktionen sind:

trim(string) // führende und schließende Leerzeichen entfernen strlen(string) // Länge des Strings

echo(string,…) // Ausgabe der Strings, Klammern nicht zwingend!

strcmp(string1,string2) // Vergleich der beiden Strings

strcasecmp(str1, str2) // Vergleich der Strings unabhängig von

// Groß- und Kleinschreibung

strtolower(string) // wandelt in Kleinbuchstaben um strtoupper(string) // wandelt in Großbuchstaben um

(9)

Beispiel:

$str = "Hallo";

echo "$str, Freunde\n"; // Ausgabe: Hallo, Freunde echo '$str, Freunde\n'; // Ausgabe: $str, Freunde\n

Das letzte Beispiel zeigt, dass nur innerhalb von Gänsefüßchen (") Variablen substituiert werden, nicht innerhalb von einfachen Anführungsstrichen ('). Dies sollte für eine erste Einführung genügen. Wei- tere Besonderheiten werden in der Vorlesung erwähnt.

3.2 PHP innerhalb von HTML

PHP wird in der Regel nicht als selbstständige Sprache verwendet. Sie findet vielmehr innerhalb von HTML-Dokumenten Anwendung. Im Body-Teil der HTML-Seiten kann überall und beliebig oft PHP- Code eingefügt werden. HTML-Seiten, die PHP-Code enthalten, besitzen die Endung .php. Wir müs- sen nur eine einzige Regel beachten:

• Der PHP-Programmcode wird eingeklammert in <?php … ?> . Die Klammern wirken über beliebig viele Zeilen. Abkürzend ist auch <? … ?> erlaubt.

Der WWW-Server gibt den in diesen Klammern stehenden Code nicht aus, sondern interpretiert die- sen zunächst. Erst das Ergebnis dieser Interpretation wird an den Browser weitergeleitet und dort als HTML-Code behandelt. Auf dem Server sollten daher PHP-Dateien keine Lese-, sondern nur Ausfüh- rungsrechte besitzen.

In PHP werden automatisch Variablen generiert, wenn Werte mittels der Methoden POST oder GET übergeben wurden. Bis PHP 4.0 entsprachen die Variablennamen den Übergabenamen. Seit PHP 4.1 wurde diese einfache Möglichkeit wegen großer Sicherheitsprobleme aufgegeben. Wir werden uns im Weiteren an die neue (leider etwas unhandlichere) Methode halten. Dies heißt: Variablen werden mit- tels den Methoden POST oder GET in assoziative Feldvariablen übergeben.

Betrachten wir ein Beispiel: Wir fordern in einem HTML-Dokument einen Namen in einem Eingabe- feld an. Weiter wollen wir die Anrede wissen. Hier geben wir Radiobuttons vor. Das Dokument könn- te wie folgt aussehen (gespeichert in der Datei name.html):

<html>

<head>

<title>Erstes PHP-Beispiel</title>

</head>

<center><h1>Vorlesung DB</h1></center>

<center><h3>Edwin Schicker</h3></center>

<p>Name und Anrede (mittels eines Radiobuttons) sind anzugeben. Durch Klicken des Submit-Buttons wird auf eine PHP-Seite gewechselt, in der diese Daten ausgelesen und im Browser ausgegeben werden.</p>

<p>Bitte geben Sie die entsprechenden Daten ein und klicken dann den Weiter-Button. Der Rücksetzbutton erlaubt eine Neueingabe.</p>

<form action="name.php" method="post"> <!--Sprung nach name.php-->

<table cellpadding=10>

<tr>

<td align="right">Bitte geben Sie Ihren Namen ein:

</td>

<td> <!-- Eingabefeld: -->

<input size=30 maxlength=30 name="Name">

</td>

</tr>

<tr>

<td align="right">Ihre Anrede:

</td>

(10)

<td> <!-- Radiobutton: -->

Herr<input type="radio" name="Anrede" value="Sehr geehrter Herr">

Frau<input type="radio" name="Anrede" value="Sehr geehrte Frau">

</td>

</tr>

<tr>

<td align="right"> <input type="Submit" value="Weiter">

</td>

<td> <input type="Reset" value="Rücksetzen">

</td>

</tr>

</table>

</form>

</body>

</html>

Dieses Beispiel enthält genau einen Formular-Tag, der wiederum ein Eingabefeld mit dem Namen Name und einen Radiobutton mit dem Namen Anrede enthält. Diese Eingaben sind mittels einer Ta- belle übersichtlich angeordnet. Durch Klick auf den Submit-Button wird in die Datei name.php, unsere erste PHP-Datei, verzweigt. Diese Datei greift mittels der assoziativen Feldvariablen $_POST['Name']

und $_POST['Anrede'] auf die Inhalte der beiden Formulareingaben zu (bzw. $_GET['Name'] und

$_GET['Anrede']).

Hinweis: Bis PHP 4.0 wurden statt der Feldvariablen die Variablen $Name und $Anrede automatisch erzeugt. Soll dies auch für PHP ab Version 4.1 gelten, so ist in der Datei php.ini die Variable

register_globals auf On zu setzen! Wir können dies aus Sicherheitsgründen nicht empfehlen und wer- den auch darauf verzichten. Sehen wir uns nun die Datei name.php an:

<html>

<head>

<title>Erstes PHP-Beispiel, Ergebnis</title>

</head>

<center><h1>Vorlesung DB</h1></center>

<center><h3>Edwin Schicker</h3></center>

<!-- Die mit der Methode POST uebergebenen Daten werden ausgelesen: -->

<?php // PHP-Code beginnt

$Anrede = $_POST['Anrede']; // Einlesen der Variablen $Name = $_POST['Name'];

echo "$Anrede $Name! ";

?> <!-- Ab hier wieder reines HTML -->

Geschafft! Die erste PHP-Seite wurde ausgeführt und interpretiert. Es wird nicht der Code, sondern nur das Ergebnis an den Client weitergereicht.<br>

Mit dem folgenden Link kehren Sie zur Anfangsseite zurück.<br>

<center><a href="default.htm">Startseite</a></center>

</body>

</html>

Der kurze Code ist geklammert in <?php … ?>. Im Wesentlichen haben wir nur die übergebenen Werte ausgelesen und dann an den Browser weitergegeben. Die Ausgabe innerhalb von PHP erfolgt mittels der Echo-Funktion.

3.3 Installation von PHP unter Windows XP

Die Installation von PHP unter Windows XP Professional ist sehr einfach. Zunächst ist allerdings IIS (Internet Information Server) einzurichten, falls noch nicht geschehen. IIS wird mit Windows XP Pro- fessional ausgeliefert. In der Systemsteuerung ist IIS unter Software als Windowskomponente ein- getragen. Diese Komponente IIS muss hinzugefügt werden. Die Standardangaben sind für eine kor- rekte Installation ausreichend. Wird mit Windows XP Home-Edition gearbeitet, so wird die Installa- tion eines Apache-Servers empfohlen.

(11)

Erst nach dem Einrichten eines WEB-Servers (z.B. IIS oder Apache) wird die Installation von PHP empfohlen. Sehr einfach geht dies mit dem PHP-Installer (z.B. PHP-5.0.4-installer.exe) für Windows.

Der Installer richtet PHP komplett ein, die Datei php.ini wird voreingestellt und auch IIS wird konfi- guriert. Sollen etwa nur ODBC-Datenbanken verwendet werden, so ist nichts weiter zu tun.

Für Oracle-, Postgres- oder MySQL-Datenbanken (ab PHP 5) sind noch kleine Zusatzarbeiten erfor- derlich, hier werden so genannte Extensions benötigt, für Oracle die Erweiterung php_oci8.dll, für Postgres die Erweiterung php_pgsql.dll und für MySQL die Erweiterung php_mysqli.dll. MySQL benötigt zusätzlich die Bibliothek libmysql.dll und Oracle mehrere Client-Bibliotheken, die mit Oracle ausgeliefert werden. Diese Dateien werden nicht mit dem PHP-Installer ausgeliefert, sind aber im um- fangreichen Komplettpaket enthalten.

Weiter muss noch zwingend die Datei php.ini angepasst werden. Diese Datei wird standardmäßig im Windows-Verzeichnis angelegt. In der Regel reichen folgende Änderungen:

• Im Abschnitt Paths and Directories ist zu setzen: extension_dir = c:\PHP-Verzeichnis\

• Im Abschnitt Dynamic Extensions sind für die gewünschten Erweiterungen die führenden Semikolons zu entfernen. Bei Verwendung von MySQL wird dringend empfohlen, die Er- weiterung von php.mysql.dll in php.mysqli.dll abzuändern. Damit wird die neuere und mächti- gere Schnittstelle von MySQL verwendet, die beispielsweise auch Transaktionen unterstützt.

Damit sollten jetzt Zugriffe auf ODBC-, Oracle-, MySQL- und Postgres-Datenbanken möglich sein.

Für andere Datenbanken ist die Installation ähnlich einfach. Voraussetzung ist natürlich, dass auch die Datenbanken eingerichtet sind. Ist etwa die Oracle-Datenbank auf einem entfernten Server installiert, so muss lokal zumindest der Oracle-Client vorhanden sein, damit die benötigten Oracle-Bibliotheken vorhanden sind.

3.4 Übungsaufgaben

1. Schreiben Sie eine HTML-Seite, die mehrere Formulareingaben anfordert (Eingabefeld, Checkbuttons, Radiobuttons). Durch Klick auf den Submit-Button werden diese Daten erfasst und tabellarisch ausgegeben. Verwenden Sie die Methode post.

2. Schreiben Sie eine HTML-Seite, die mehrere Multiple-Choice-Fragen enthält. Der Anwender soll diese Fragen beantworten und dann den Submit-Button drücken. Werten Sie die Antwor- ten aus und geben das Ergebnis zurück.

4 Erste Datenbankzugriffe

Im letzten Kapitel haben wir kennen gelernt, erste dynamische Internetseiten zu erstellen. Zu einer umfangreichen Dynamik fehlt aber der Datenbankanschluss. Wir beschreiben hier zunächst die Tech- niken, dann greifen wir auf unsere Beispieldatenbank Bike zu.

4.1 Zugriffsmöglichkeiten

Zum Zugriff auf Datenbanken verwenden wir entweder Direktzugriffe oder vordefinierte und interna- tional normierte Schnittstellen. Eine solche Schnittstelle, die darüber hinaus weit verbreitet ist, ist Open Database Connectivity (ODBC). Diese Schnittstelle wurde von DEC, Lotus, Microsoft und Sybase unter Federführung von Kyle Geigers entwickelt, wurde 1992 definiert und ist heute ein Welt- standard. Insbesondere in der Microsoftwelt ist es die Standardschnittstelle. Praktisch alle CGI-Pro- gramme (CGI = Common Gateway Interface) setzen auf der ODBC-Schnittstelle auf.

Ziel dieser Schnittstelle ist es, dem Programmentwickler nur den Namen einer Datenbank weiter- zugeben. Der physische Ort der Datenbank und der Typ der Datenbank werden ihm verborgen. Damit kann ein Programm die Datenbank wechseln, ohne dass auch nur eine Zeile Code neu geschrieben werden müsste. Die Verwaltung übernimmt ODBC. Das Programm selbst kennt also nur den ODBC-

(12)

Datenbanknamen, die sogenannte DNS. ODBC kapselt also die Datenbank und verwaltet weitere De- tails selbst. Die ausschließliche Zugriffssprache ist SQL (Structured Query Language).

Zum Zugriff auf Datenbanken über ODBC benötigt der WWW-Server folglich einen ODBC-Treiber.

In Windows existiert dazu in der Systemsteuerung der Eintrag „ODBC-Datenquellen“. Hier werden in der Regel im Ordner System-DSN die entsprechenden Daten eingetragen. Zumindest der Pfad zur Datenbank sollte angegeben werden.

Der Weg über ODBC ist zwingend notwendig bei MS-Access. Mittels ODBC kann aber natürlich auch auf Oracle oder MySQL zugegriffen werden. Zu Oracle und MySQL existieren von PHP aus aber auch direkte, wesentlich effektivere Schnittstellen. Diesen Weg werden wir in den Übungen ge- hen.

PHP wurde speziell für Datenbankzugriffe optimiert. Jede Datenbank besitzt daher eigene spezielle Zugriffsmethoden. Dies hat leider einen schweren Nachteil: Die Funktionen zum Direktzugriff auf Oracle oder MySQL oder PostgreSQL und zum Zugriff über ODBC unterscheiden sich. Zunächst werden die Schnittstellen für Oracle, MySQL und ODBC beschrieben. Später wird der Übersicht hal- ber nur noch Oracle verwendet.

4.2 Zugriffsmöglichkeiten von PHP auf Datenbanken

PHP besitzt zahlreiche Funktionen zum Direktzugriff auf Datenbanken. Zusätzlich gibt es auch auf die einzelnen Datenbanken mehrere Schnittstellen. Um nicht im Wust der Möglichkeiten die Übersicht zu verlieren, machen wir mehrere Einschränkungen:

• Wir verwenden nur die neuesten PHP5-Schnittstellen!

• Wir verwenden in Oracle und MySQL nur die neuen Schnittstellen (oci bzw. mysqli). Die neue Oracle-Schnittstelle wird seit Oracle8 unterstützt, die MySQL-Schnittstelle seit MySQL 4.1. In MySQL verwenden wir zusätzlich die moderne objektorientierte Zugriffsweise.

Die hier vorgestellte Liste der Schnittstellen ist stark eingeschränkt, eine vollständige Liste findet sich im PHP-Handbuch (kostenloser Download!).

Verbindungen zu einer Datenbank herstellen:

oci_connect Einloggen in eine Oracle Datenbank.

oci_pconnect Einloggen in eine persistente Oracle Datenbank, sonst wie oci_connect.

oci_close Schließen einer Datenbankverbindung zu Oracle

mysqli Objektkonstruktor zum Einloggen in die MySQL Datenbank.

->close Schließen einer Datenbankverbindung zu MySQL.

(13)

odbc_connect Einloggen in eine ODBC Datenbank

odbc_pconnect Einloggen in eine persistente ODBC Datenbank odbc_close Schließen einer Datenbankverbindung zu ODBC

Diese Funktionen betreffen das Ein- und Ausloggen. Die Einloggfunktion besitzt in Oracle drei String-Parameter: Kennung, Passwort und SID (hier: rfhs8012_ora9i). Diese Funktion liefert eine eindeutige Connection-ID zurück, die als Identifikator für die Verbindung zur Datenbank gilt. ODBC- Verbindungen funktionieren analog. Die drei String-Parameter beim Einloggen sind hier: DSN-Name, Kennung und Passwort. In MySQL verbinden wir uns beim Erzeugen eines Connection-Objekts. Der Konstruktor der Connection-Klasse besitzt als die vier wichtigsten Parameter: Servername, Kennung, Passwort und Datenbank. Mit der Klassenmethode Close wird die Verbindung zur Datenbank wieder geschlossen.

Transaktionsbetrieb:

oci_commit Abschließen einer Transaktion.

oci_rollback Rückgängigmachen einer Transaktion.

->commit Abschließen einer Transaktion (Verbindungsobjekt) ->rollback Rückgängigmachen einer Transaktion.

->autocommit Einstellen, ob mit oder ohne Autocommit.

odbc_commit Abschließen einer Transaktion

odbc_rollback Rückgängigmachen einer Transaktion odbc_autocommit Einstellen, ob mit oder ohne Autocommit

In der Regel schließt nicht jede einzelne Manipulation mit einer Transaktion ab. Daher sollte die Oracle-Funktion Oci_execute im zweiten Parameter immer den Wert OCI_DEFAULT enthalten. Jetzt schließt eine Transaktion erst nach einem Commit-Befehl, hier mit der Funktion Oci_commit. Dies be- schleunigt die Abarbeitung und entspricht auch der Logik der Transaktionsverarbeitung. In MySQL und ODBC wird der Transaktionsbetrieb eingeschaltet, indem die Objektmethode bzw. die Funktion Autocommit mit dem Parameter False aufgerufen wird.

Ausführen eines SQL-Befehls:

oci_parse Analysieren einer Abfrage mit Rückgabe eines Statements.

oci_execute Ausführen eines Statements.

oci_free_statement Freigeben aller mit dem Statement verbundenen Ressourcen.

->query Ausführen eines SQL-Befehls, liefert ein Query-Objekt zurück ->close Freigeben der Query-/Statement-Ressourcen (Query-Objekt!) odbc_exec Ausführen eines SQL-Befehls

odbc_free_result Freigeben aller mit dem Ausführen verbundenen Ressourcen

Eine Abfrage oder eine Manipulation geschieht in Oracle wie folgt: Zunächst überprüft die Funktion Oci_parse den eingegebenen Befehl auf Korrektheit. Diese Funktion erhält als Parameter die Connection-ID und den SQL-Befehl (als String). War die Überprüfung erfolgreich, so kann dieser SQL-Befehl mit der Funktion Oci_execute ausgeführt werden. Spätestens am Ende der Session sollte die Abfrage oder Manipulation wieder freigegeben werden (Oci_free_statement). In MySQL und ODBC existieren die ähnliche Möglichkeiten. Für einfache Ausführungen können hier aber die beiden Funktionen Parse und Execute zusammengefasst werden: zu der Objektmethode Query bzw. zur Funktion Odbc_exec. Die Methode Query liefert ein Query-Objekt zurück. Dieses Objekt wird für die weitere Bearbeitung der Abfrage benötigt. Dieses Query-Objekt besitzt unter anderem auch die Me- thode Close zum Schließen der Abfrage. In ODBC heißt diese Funktion Odbc_free_statement.

(14)

Auslesen der Ergebnisse eines Select-Befehls:

oci_fetch_array Lesen der nächsten Ergebniszeile in ein assoziatives/nummeriertes Feld ->fetch_array Lesen der nächsten Ergebniszeile in ein Feld (Query-Objekt!).

odbc_fetch_array Lesen der nächsten Ergebniszeile in ein assoziatives/nummeriertes Feld Zum Auslesen der Ergebnisse eines Select-Befehls bieten Oracle, MySQL und ODBC die gleichen Schnittstellen an! Mittels der oben angegebenen Funktionen bzw. Methoden wird die nächste Zeile in ein assoziatives und ein nummeriertes Feld eingelesen. Dieses Feld wird als Funktionsergebnis zu- rückgeliefert. Gibt es keine zu lesende Zeile mehr, so wird false zurückgegeben. Liefert etwa ein Select-Befehl kein Ergebnis, so liefert bereits der erste Aufruf einer der obigen Funktion den Wert false!

Die Spalten können direkt aus diesem Feld ausgelesen werden, entweder mit dem Namen der Spalte, so wie er im Select-Befehl steht, oder mit einem Index, der bei 0 beginnt. Es wird dringend empfoh- len, im assoziativen Feld den Namen exakt so anzugeben, wie er im Select-Befehl steht, einschließlich Groß- und Kleinschreibung!

Das Überprüfen auf Null-Werte ist einfach: Der entsprechende Feldindex ist bei Null-Werten auf den PHP-Wert Null gesetzt.

Nützliche Informationen:

oci_field_name Zurückgeben des Spaltennamens

oci_num_rows Ermitteln der Anzahl der betroffenen Zeilen (Vorsicht beim Select!) oci_num_fields Zurückgeben der Anzahl der Spalten

->field_count Eigenschaft enthält die Anzahl der Spalten der letzten Abfrage ->affected_rows Eigenschaft enthält die Anzahl der manipulierten Zeilen

->fetch_field Zurückgeben eines Info-Objekts mit Spalteninfos (Query-Objekt!) ->num_rows Query-Eigenschaft enthält die Anzahl der ausgelesenen Zeilen odbc_field_name Zurückgeben des Spaltennamens

odbc_num_rows Ermitteln der Anzahl der betroffenen Zeilen (Vorsicht beim Select!) odbc_num_fields Zurückgeben der Anzahl der Spalten

Zur Kontrolle dienen die Funktionen Oci_num_rows und Odbc_num_rows und die Eigenschaft affected_rows des Connection-Objekts. Sie liefern die Anzahl der geänderten, gelöschten oder einge- fügten Zeilen zurückliefert. Diese Funktionen sind beim Select-Befehl nur beschränkt (!) anwendbar und liefern nur die in den Puffer eingelesenen Zeilen. In MySQL liefert die Query-Eigenschaft num_rows immer die Anzahl der mit dem Select-Befehl eingelesenen Zeilen. Die weiteren Funktionen liefern die Spaltennamen und die Anzahl der Spalten, in MySQL werden im Query-Objekt fetch_field zusätzliche Spalteninformationen als Objekt zurückgegeben.

Fehlerbehandlung:

oci_error Liefern des letzten Fehlers stmt|conn|global zurück oder FALSE, wenn kein Fehler aufgetreten ist.

mysqli_connect_errno Liefern des letzten Verbindungsfehlers oder 0, falls fehlerfrei mysqli_connect_error Liefern des letzten Verbindungsfehlertextes oder ' '

->errno Liefern der letzten Fehlernummer oder 0, falls kein Fehler auftrat ->error Liefern des letzten Fehlertextes oder ' ', falls kein Fehler auftrat ->sqlstate Liefern des SQLSTATE-Status

(15)

odbc_error Liefern den letzten Fehlercode zurück oder leeren String, wenn kein Fehler aufgetreten ist.

odbc_errormsg Liefern die letzte Fehlernachricht zurück oder leeren String, wenn kein Fehler aufgetreten ist.

In der Praxis ist es sehr wichtig, auf eventuelle Fehler abzufragen. Wir werden darauf zurückkommen.

In Oracle liefert die Funktion Oci_error ein assoziatives Feld zurück, aus dem Fehlercode und Fehler- nachricht ausgelesen werden können. In ODBC gibt es dazu zwei eigene Funktionen, ebenso in MySQL. Allerdings sind in MySQL die beiden Connection-Objekte errno und error nur definiert, wenn auch eine Connection zustande kam. Daher gibt es zum Überprüfen der Connection selbst zwei eigenständige Funktionen. In MySQL gibt es ferner eine Connection-Eigenschaft Sqlstate, die den normierten SQL-Status enthält.

4.3 Erster PHP-Zugriff auf Datenbanken

Grau ist jede Theorie. Beginnen wir daher mit einem ersten Beispiel. Hier greifen wir auf unsere Oracle-Datenbank Bike zu. Gelingt diese Verbindung, so geben wir aus der Relation Personal den Namen und den Wohnort des Mitarbeiters aus, der die Personalnummer 2 besitzt. Der entsprechende SQL-Befehl ist einfach und lautet:

Select Name, Ort From Personal Where Persnr = 2;

Diesen Befehl müssen wir jetzt in unser PHP-Programm einbinden. Wir benötigen dazu folgende Schritte:

• Einloggen in die Datenbank

• Testen und Abschicken des Select-Befehls

• Empfang und Auswerten der Daten

• Schließen der Datenbank

Diese vier Schritte werden mit Hilfe der OCI-Funktionen realisiert. Betrachten wir gleich das voll- ständige Beispiel. Zunächst loggen wir uns mittels der HTML-Datei db_anf.html ein:

<html>

<head> <title>Erster DB-Zugriff</title>

</head>

<body>

<center><h1>Vorlesung DB</h1></center>

<center><h3>Edwin Schicker</h3></center>

<p>Es erfolgt ein Einloggen in die Oracle-DB BIKE. Name und Ort des Mitarbeiters mit der Persnr 2 wird ausgegeben, falls existent!</p>

<p>Geben Sie bitte zunächst Kennung und Passwort ein:</p>

<form action="db_anf.php" method="post">

<table >

<tr>

<td>Kennung: </td>

<td><input type="Text" name="Kennung" size=20 maxlength=20></td>

</tr>

<tr>

<td>Passwort: </td>

<td><input type="Password" name="Passwort" size=20 maxlength=20></td>

</tr>

</table>

<p><input type="Submit" value="Bestätigen"></p>

</form>

<p><center><a href="index.html">Zurück zur Startseite</a></center></p>

</body>

</html>

(16)

Betrachten wir das kleine Programm ganz kurz: Es wird lediglich ein kleines Formular ausgegeben.

Mit diesem Formular wird Kennung und Passwort angefordert. Ein Drücken des Submit-Buttons ruft die Datei db_anf.php. Diese ist nun wesentlich interessanter. Wir wollen diese daher sogleich be- trachten:

<html>

<head>

<title>Erster DB-Zugriff</title>

</head>

<body>

<center><h1>Vorlesung DB</h1></center>

<center><h3>Edwin Schicker</h3></center>

<p>Einloggen in die Datenbank BIKE, Teil 2:</p>

<?php

echo "<p>Aufbau einer Verbindung zur Oracle-Datenbank BIKE.</p>";

$conn=oci_connect($_POST['Kennung'],$_POST['Passwort'],"rfhs8012_ora9i") or die("Verbindung zur Oracle-DB gescheitert");

echo "Die Verbindung zur Datenbank wurde hergestellt.<br><br>";

// Die Datenbank ist geoeffnet, jetzt wird zugegriffen:

$sql = "Select Name, Ort From Personal Where Persnr = 2";

$wert = oci_parse($conn, $sql) // Ueberpruefen des SQL-Befehls or die("Fehler im Select-Befehl");

oci_execute($wert,OCI_DEFAULT) // Ausfuehren des SQL-Befehls or die("Fehler beim Ausfuehren des Select-Befehls");

if ($erg = oci_fetch_array($wert)) { // Einlesen der Daten echo "Der Mitarbeiter mit der Personalnummer 2 heißt ",

"$erg[NAME] und wohnt in $erg[ORT].<br>";

} else {

echo "Der gewünschte Mitarbeiter existiert nicht!<br>";

}

oci_commit($conn);

echo "<br>Die Verbindung zur Datenbank wird geschlossen.";

oci_free_statement($wert);

oci_close($conn);

} // endif

?>

<p><center><a href="index.html">Zurück zur Startseite</a></center></p>

</body>

</html>

Wir loggen uns in die Datenbank mittels der Funktion Oci_connect ein. Die Funktion Oci_connect liefert die ConnectionID zurück, die wir in der Variable $conn ablegen. Misslingt dieses Einloggen, so wird das weitere Ausführen dieser Seite abgebrochen. Die Meldung, die in der Funktion die angege- ben wurde, wird ausgegeben.

Genau genommen funktioniert dieser Abbrech-Mechanismus wie folgt: Der Operator Or entspricht dem ebenfalls erlaubten Operator ‚||’. Dieser hat die gleiche Funktionalität wie in C: Der zweite Ope- rand wird nicht mehr ausgeführt, wenn der erste bereits ein festes Ergebnis liefert. Ist also der erste Operand bereits wahr, so muss der Gesamtausdruck auch wahr sein. Wahr bedeutet in C und auch in PHP, dass der Ausdruck ungleich 0 ist. Die Funktion Oci_connect liefert die ConnectionID zurück, einen Wert ungleich 0. Im Fehlerfall wird der Wert 0 zurückgegeben. Also muss nur dann auch der zweite Operand ausgeführt werden. Die Funktion die beendet immer die PHP-Programmausführung.

(17)

Nach dem erfolgreichen Einloggen speichern wir den gewünschten SQL-Befehl in der Variablen $sql und rufen die Funktion Oci_parse auf. Der erste Parameter dieser Funktion benötigt die Con- nectionID. Es könnten ja mehrere Datenbanken geöffnet sein! Der zweite Parameter enthält den SQL- Befehl. Wurde dieser Befehl als korrekt erkannt, so wird eine Statement-Variable zurückgeliefert (hier: $wert). Der SQL-Befehl kann jetzt mittels dieser Variable und der Funktion Oci_execute ausge- führt werden. Der zweite Parameter OCI_DEFAULT von Oci_execute gibt an, dass eine Transaktion explizit mit Commit geschlossen werden muss.

Mit Oci_execute haben wir auf die Datenbank zugegriffen und den Select-Befehl ausgeführt. Die Er- gebnisdaten werden in einem internen Puffer zwischengespeichert. Dieser Puffer muss nun geleert werden. Der Befehl Oci_fetch_array liest immer die nächste Zeile aus, zunächst also die erste Zeile, und speichert diese Zeile in einem assoziativen Feld. Ist keine solche Zeile vorhanden, so wird false zurückgeliefert. In diesem Fall geben wir eine Mitteilung über die Nichtexistenz des Mitarbeiters aus.

Im Regelfall geben wir die im assoziativen Feld abgelegten Daten einfach aus.

Achtung:

¾ Im Zusammenspiel zwischen PHP und Oracle sollten die Spaltennamen im assoziativen Feld auch in der Klein- und Großschreibung mit den Spaltennamen im Select-Befehl übereinstimmen.

¾ Oracle mag an der PHP-Schnittstelle kein Semikolon am Ende eines SQL-Befehls.

Zum Schluss müssen wir die Transaktion beenden, die Statement-Variable schließen und uns auslog- gen. Das erste PHP-Programm mit Datenbankzugriff wäre damit beendet.

Das Prinzip ist für alle Datenbanken gleich. So kann sehr ähnlich auch auf MySQL- oder MS-Access- Datenbanken zugegriffen werden. In diesem Skript und in der Vorlesung wird überwiegend nur der Mechanismus für Oracle erklärt. Selbstverständlich stehen alle PHP-Programme nicht nur für Oracle, sondern auch für MySQL und MS-Access zur Verfügung. Somit können an diesen Beispielen die kleinen Unterschiede leicht erkannt und geübt werden.

4.4 Auslesen mehrerer Datenzeilen aus einer Datenbanken

Im letzten Abschnitt haben wir nur eine einzige Zeile ausgelesen. Jetzt wollen wir mehrere Ergebnis- zeilen bearbeiten, sprich in den Browser schreiben. Wieder zeigen wir die Vorgehensweise am Bei- spiel.

Bleiben wir bei der Relation Personal. Wir geben einen String ein, und anschließend werden alle Na- men zusammen mit Personalnummer, Wohnort, Geburtsdatum und Gehalt ausgegeben, die diesen String in ihrem Namen enthalten. Groß- und Kleinschreibung spiele dabei keine Rolle.

Wir schreiben dazu eine PHP-Seite, die zunächst ein entsprechendes Eingabefeld enthält. Beim Ab- senden wird die gleiche Seite wieder aufgerufen. Dank eines Tricks wird neben der Anzeige des For- mulars nun auch die Datenbank geöffnet, die Daten werden abgerufen und dann in Tabellenform aus- gegeben. Betrachten wir zunächst den Formular-Ausschnitt aus der Datei mitarbeiter.php:

<form action="mitarbeiter.php" method="post">

<table cellpadding=10>

<tr>

<td align=right>Bitte geben Sie die gesuchten Zeichen ein:</td>

<td> <!-- Eingabefeld: -->

<input size=30 maxlength=30 name=Name> </td>

</tr>

<tr>

<td align=right>Datenbank-Kennung: </td>

<td><input type="Text" name="Kennung">

value=<? echo isset($_POST['Kennung'])?$_POST['Kennung']:"" ?>></td>

</tr><tr>

<td align=right>Datenbank-Passwort: </td>

<td><input type="Password" name="Passwort">

(18)

value=<? echo isset($_POST['Passwort'])?$_POST['Passwort']:"" ?>></td>

</tr><tr>

<td></td>

<td align=right> <input type="Submit" value="Weiter"> <!-- Submit --></td>

</tr>

</table>

</form>

Wir erkennen eine Formular- und eine Tabellendefinition. Eine Tabelle wurde wegen der besseren Anordnung gewählt. Das Formular ruft beim Absenden mit dem Submit-Button sich selbst auf, die eingegebenen Daten werden in den Eingabefeldern Name, Kennung und Passwort mit der Methode post weitergereicht.

Eine Besonderheit bilden das Kennungs- und das Passwort-Feld. Wunsch ist es, beim Zweitaufruf die ausgegebenen Daten anzuzeigen. Gleichzeitig soll aber auch die Möglichkeit bestehen, auf einfache Weise einen anderen Auswahlstring einzugeben. Kennung und Passwort sollten dabei stehen bleiben, um ein ständiges Neueingeben zu vermeiden. Daher wird beim Zweitaufruf die Kennung und das Passwort gleich wieder eingetragen. Dies funktioniert aber nicht so einfach, da beim Erstaufruf beide Daten noch nicht bekannt sind. Nützlich ist hier die PHP-Funktion isset, die überprüft, ob eine Vari- able schon einmal benutzt wurde. Sie liefert true, wenn die angegebene Variable bereits gesetzt wurde, sonst false. Im ersten Fall schreiben wir den aktuellen Wert, im zweiten Fall den leeren String in das entsprechende Formularfeld.

Betrachten wir nun weitere Zeilen der Datei mitarbeiter.php:

<?php

if (isset($_POST['Kennung']) {

$Name = trim($_POST['Name']); // ev. Leerzeichen entfernen if ($_POST['Kennung']==null || $_POST['Passwort']==null) { echo "Bitte Datenbankkennung und -passwort eingeben.<br>";

} elseif (strlen($Name) == 0) {

echo "Es wurden im Formular keine Angaben gemacht.";

} else {

echo "Die Datenbank BIKE wird jetzt nach allen Mitarbeitern ",

"durchsucht, die im Namen den Teilstring $Name enthalten.<br>";

$conn = oci_connect($Kennung,$Passwort,"rfhs8012_ora9i") or die("Verbindung zur Oracle-DB gescheitert");

// Die Datenbank ist geoeffnet, jetzt wird zugegriffen:

$sql = "Select Persnr, Name, Ort, GebDatum, Gehalt, Vorgesetzt From Personal

Where Upper(Name) Like Upper('%$Name%');";

$wert = oci_parse($conn, $sql) // Ueberpruefen des SQL-Befehls or die("Fehler im Select-Befehl");

oci_execute($wert,OCI_DEFAULT) // Ausfuehren des SQL-Befehls or die("Fehler beim Ausfuehren des Select-Befehls");

Unterbrechen wir das Programm nochmals. Wir wenden wieder die PHP-Funktion isset gewinnbrin- gend an. Beim ersten Aufruf dieser Seite wird daher nur das Formular erscheinen. Nach dem Ausfül- len des Formulars und dem Klick auf den Submit-Button, wird die gleiche Seite nochmals aufgerufen.

Jetzt liefert aber die Funktion isset den Wert true zurück, der Datenbankzugriff erfolgt.

Wie bereits bekannt, existiert im PHP-Programm die Variable $_POST['Name'] mit dem übergebenen Inhalt. Die PHP-Funktion trim entfernt eventuell führende und schließende Leerzeichen. Jetzt öffnen wir die Datenbank und lesen alle Mitarbeiter ein, die im Namen den eingegebenen Teilstring enthal- ten. Groß- und Kleinschreibung soll dabei keine Rolle spielen.

Wir müssen die mit dem OciExecute-Befehl erhaltenen Daten jetzt in einer Schleife im Browser aus- geben. Wieder empfiehlt sich die Verwendung einer Tabelle. Betrachten wir dazu den Rest des Pro- gramms:

(19)

// Ausgeben der gelesenen Daten:

if (!($erg = oci_fetch_array($wert))) {

echo "Mitarbeiter mit dem Teilstring im Namen existiert nicht!";

} else {

?>

<!-- Kopfzeile einer Tabelle definieren (mit <th> statt <td>: -->

Ergebnis:

<br>

<table border cellpadding=10>

<tr>

<th>Persnr </th> <th>Name </th>

<th>Ort </th> <th>GebDatum </th>

<th>Gehalt </th> <th>Vorgesetzter? </th>

</tr>

<?php

// In einer Schleife werden die Daten ausgelesen:

do {

?>

<tr>

<!-- Daten werden gleich in die Tabelle uebernommen:-->

<td> <?php echo $erg["PERSNR"] ?> </td>

<td> <?php echo $erg["NAME"] ?> </td>

<td> <?php echo $erg["ORT"] ?> </td>

<td> <?php echo $erg["GEBDATUM"] ?> </td>

<td> <?php echo $erg["GEHALT"] ?> </td>

<td>

<?php echo ($erg["VORGESETZT"] == null) ? "Ja": "Nein"; ?>

</td>

</tr>

<?php

} while ($erg = oci_fetch_array($wert));

echo "</table>";

// Die Datenbank wird jetzt geschlossen:

oci_commit($conn);

oci_free_statement($wert);

oci_close($conn);

} // endif

} // endif kennung } // endif isset

?>

<p><center><a href="index.html">Zurück zur Startseite</a></center></p>

</body>

</html>

Wir überprüfen zunächst, ob es Daten mit den gewünschten Eigenschaften überhaupt gibt. Wenn ja, so bauen wir eine Tabelle auf. Wird in einer Tabelle statt der Spaltenangabe <td> die Angabe <th> ge- schrieben, so interpretiert dies der Browser als Überschriftenzeile. Meist werden diese Spalten dann fett gedruckt und zentriert ausgegeben.

In einer Do-While-Schleife werden die Daten aus der Statement-Variable gelesen. Jeder Aufruf der Funktion oci_fetch_array liefert dabei den nächsten Datensatz. Existiert kein weiterer Datensatz, so liefert oci_fetch_array den Wert false zurück, und die Schleife und damit die Datenausgabe werden beendet. Zum Schluss wird die Datenbankverbindung wie gewohnt korrekt abgebaut.

In der Praxis enthalten viele ausgelesene Daten Null-Werte. Die Datenbank-Null-Werte werden dabei auf PHP-Null-Werte korrekt übertragen. Wir haben dies beim Feld Vorgesetzt in Anspruch genom- men.

Fassen wir das Auslesen von Daten mittels eines Select-Befehls kurz zusammen. Wir benötigen dazu mehrere Schritte:

(20)

ƒ Definieren des Select-Befehls durch Abspeichern in einem String

ƒ Überprüfen des Select-Befehls mittels oci_parse

ƒ Ausführen des Select-Befehls mittels oci_execute

ƒ Auslesen der Ergebniszeilen mittels einer Schleife und oci_fetch_array.

Die ersten drei Punkte gelten für alle SQL-Befehle. Der letzte ist typisch nur für den Select-Befehl. In der Regel hat dieses Auslesen folgendes Aussehen:

while ($erg = oci_fetch_array($wert)) { // Zeile auslesen // Attribute dieser Zeile mit Hilfe von $erg ausgeben

} // end while

Die Variable $wert wird häufig auch als Cursor bezeichnet, und es wird oft der Name $cursor ver- wendet. Dies hat folgende Bewandtnis: Diese Variable $wert ist ein Zeiger (Cursor), der wie ein Fin- ger auf die gerade aktuelle Zeile zeigt.

Cursor $wert:

)

1 Maria Forster Regensburg 05.07.47 6800 Ja 2 Anna Kraus Regensburg 09.07.61 3400 Nein 5 Johanna Koester Nuernberg 07.02.70 3200 Nein 6 Marianne Lambert Landshut 22.05.60 5500 Ja 3 Ursula Rank Straubing 04.09.53 4300 Nein 7 Thomas Noster Regensburg 17.09.58 3800 Nein

Dieser Finger (Cursor) zeigt beim ersten Aufruf der Funktion oci_fetch_array auf die erste Zeile der Relation. Mit jedem weiteren Aufruf von oci_fetch_array wandert dann dieser Finger um eine Zeile weiter. Mittels des assoziativen Feldes wird der Inhalt ausgegeben, auf den gerade dieser Finger zeigt.

Es gibt weitere alternative Möglichkeiten, etwa das Auslesen aller Zeilen in ein Feld mit einem einzi- gen Befehl, um eine Relation auszulesen. Aber auch das Auslesen der Daten aus einem Feld ähnelt der Vorgehensweise bei Cursorn.

Achtung:

Die Funktion oci_num_rows ist für Select-Befehle nur bedingt anwendbar. Diese Funktion liefert die Anzahl der im internen Puffer eingelesenen Zeilen, in der Praxis also nicht die Anzahl aller eingelese- nen Zeilen.

5 Komplexere Datenbankzugriffe

5.1 Zugriff auf Datenbanken über mehrere Skriptseiten hinweg

Verwenden wir beim Einloggen die Funktion oci_connect, so wird die Datenbankverbindung automa- tisch mit dem Verlassen dieser PHP-Skriptseite wieder geschlossen. Wird diese Verbindung in der nächsten Seite wieder benötigt, so muss sie neu aufgebaut werden. Um dieses aufwändige Wiederöff- nen zu vermeiden, existiert die Funktion oci_pconnect. Jetzt wird eine persistente Verbindung herge- stellt. Das Verlassen der PHP-Seite beendet die Verbindung nicht. Wird nun auf einer der nächsten Seiten die gleiche Verbindung wieder angefordert, so wird die bestehende benutzt! Wir wollen diese neue Möglichkeit sogleich verwenden. Betrachten wir folgenden Browserausschnitt:

(21)

In zwei Drop-Down-Boxen werden alle in der Datenbank gespeicherten Kunden und Teile angezeigt.

Der Benutzer wählt je einen Eintrag aus und drückt den Submit-Button. Anschließend werden weiter unten auf der gleichen Seite alle Aufträge dieses Kunden mit diesem Teil ausgegeben.

Wir betrachten nicht den gesamten HTML/PHP-Code, da viele Teile bereits bekannt sind. Stattdessen picken wir die neuen interessanten Teile heraus. Zunächst fordern wir in der Datei auswahlfeld.html Kennung und Passwort an. Mit Klicken auf den Submit-Button wird die Datei auswahlfeld.php aufge- rufen. Hier loggen wir uns in die Oracle-Datenbank ein. Neu ist jetzt, dass wir die Funktion oci_pconnect verwenden:

$conn=oci_pconnect($_POST['Kennung'],$_POST['Passwort'],"rfhs8012_ora9i") or die("Verbindung zur Oracle-DB gescheitert");

Wird dieses Code wiederholt aufgerufen, so erfolgt kein erneutes Einloggen, wenn diese Verbindung bereits besteht. Die Kunden- und Teiledaten werden wie folgt eingelesen:

$sql1 = "Select Nr, Name From Kunde"; // Kundendaten $sql2 = "Select Teilnr, Bezeichnung From Teilestamm"; // Teiledaten $wert1 = oci_parse($conn,$sql1) or die("Parse-Fehler in Rel. Kunde)";

$wert2 = oci_parse($conn,$sql2) or die("Parse-Fehler in Rel. Teiles.)";

oci_execute($wert1,OCI_DEFAULT) or die("Lese-Fehler in Rel. Kunde)";

oci_execute($wert2,OCI_DEFAULT) or die("Lese-Fehler in Rel. Teiles.)";

Zur Ausgabe im Browser haben wir eine Tabelle gewählt, die in der rechten Spalte je eine Auswahl- liste enthält. Betrachten wir nur die erste der beiden Auswahllisten. Die zweite ist analog aufgebaut:

<td align=right> Bitte wählen Sie einen Kunden aus: </td>

<td><!-- Select Box: -->

<select name="Kundnr" size=1> <!-- size=1: Drop Down Box -->

<?php

// Auslesen der Daten fuer die Select-Box in einer Schleife:

do {

echo "<option value=\"$erg1[NR]\"> $erg1[NAME]";

} while ($erg1 = oci_fetch_array($wert1));

?>

</select>

</td>

Die Auswahlliste erhalten wir mit dem Select-Tag. Der Parameter size=1 liefert eine Drop-Down-Box, wie wir sie in obigem Bild erkennen können. In einer Schleife lesen wir nun die erhaltenen Daten aus der Liste und geben diese gleich an die Auswahlliste weiter. Der Option-Tag besitzt den Parameter

(22)

value. Hier kann man einen Wert angeben, der statt der Auswahl weitergegeben wird. Es ist in der Praxis meist nützlich, nicht den Kundennamen, sondern die Kundennummer weiterzureichen. Dies haben wir hier auch angewendet. Im Browserfenster erscheint also der Kundenname, weitergereicht wird jedoch die Kundennummer, genauer: der Wert, der im Value-Parameter angegeben wird. Wir verwenden eine Do-Schleife, da wir mit einem ersten Fetch-Befehl überprüfen wollen, ob überhaupt Daten existieren (der entsprechende Code entspricht dem vorherigen Beispiel und ist hier nicht wie- dergegeben). Und diese erste Fetch-Zeile muss ja auf jeden Fall auch angezeigt werden.

Mit der Auflistung der Teile gehen wir analog vor. Wir zeigen die Teile an, reichen jedoch die Teile-

i auswahlfeld.php müssen wir die Datenbank wieder öffnen. Allerdings

wieder durch eine If-Verzweigung und dem Aufruf der Funktion isset ge-

$sql = "Select A.Auftrnr As Auftrag, Datum, Persnr, Anzahl, Gesamtpreis

;

ler im Select-Befehl");

r Daten selbst erfolgt nach bekanntem Muster und wird nicht nochmals wiedergegeben.

5.2 Fehlerbehandlung

infache Fehlerbehandlung verwendet: Im Fehlerfall wurde abgebro-

ci_execute($wert,OCI_DEFAULT); // keine Fehlermeldungen!

en

hls";

eile beginnt hier mit einem Klammeraffen. In diesem Fall werden eventuelle Fehlermel- r müssen daher auf unseren Fehler selbst reagie- nummer weiter. Ein Submit-Button mit dem Namen Weiter rundet unsere Ausgabe ab. Beim Klick auf diesen Button wird die gleiche Datei (auswahlfeld.php) aufgerufen. Wir kennen dieses Prinzip bereits aus dem vorherigen Beispiel.

Beim erneuten Aufruf der Date

überprüft PHP, ob diese Session mit den gleichen drei Parametern bereits existiert. Wenn ja, so erfolgt kein erneutes Öffnen, die bereits geöffnete Datenbankverbindung wird verwendet. Dies erhöht die Performance erheblich.

Der folgende Code ist

schützt. Hier lesen wir jetzt die Daten aus den Relationen Auftrag und Auftragsposten der Bike-Daten- bank aus:

From Auftrag A, Auftragsposten AP Where A.Auftrnr = AP.Auftrnr

And Kundnr = $_POST[Kundnr]

And Teilenr = $_POST[Teilnr]"

$wert = oci_parse($conn,$sql) or die("Feh

oci_execute($wert,OCI_DEFAULT) or die("Fehler beim Ausfuehren");

Select-Befehl zum Auslesen der gewünschten Daten ist zu beachten, dass wir Aliasnamen verwen- Im

den sollten, wenn wir im Select-Teil Ausdrücke verwenden. Auch die Qualifizierung einer Variable, hier A.Auftrnr, fällt darunter. Wir können nämlich in Oci_result nur erlaubte Bezeichner angeben. Ge- gebenenfalls müssen wir als Parameter statt der Bezeichner die Spaltennummer (beginnend bei 1) verwenden.

Das Lesen de

Wir haben bisher lediglich eine e

chen. Wir haben uns dabei auf die Fehlermeldung des Systems verlassen. Häufig will man aber nicht gleich beenden, und meistens will man auch eigene Fehlermeldungen ausgeben. Betrachten wir etwa obigen Fall. Der Zugriff mittels des komplexen Select-Befehl könnte Fehler verursachen. Beim Aus- führen werden wir dies feststellen. Wir wollen jetzt mit einer eigenen Fehlermeldung reagieren. Den Fehler erhalten wir mittels der Funktion Oci_error. Diese Funktion liefert ein Feld zurück, genauge- nommen wieder ein assoziatives Feld. Die assoziativen Namen lauten code (enthält den Oracle-Code), sqltext (enthält die SQL Fehlermeldung) und message (enthält die verbale Fehlermeldung). Betrachten wir gleich den Programmausschnitt:

@o

$fehler = oci_error($wert); // Fehler in Variable merk

if ($fehler['code'])

r[message] beim Ausfuehren des Select-Befe { echo "Fehler $fehle

die();

} ie erste Z D

dungen dieses Befehls grundsätzlich unterdrückt. Wi

(23)

ren. Dazu lesen wir die Fehlermeldung aus. Ist der Fehlercode ungleich Null, so wird dann die eigene Mitteilung ausgegeben, und anschließend wird die Ausführung beendet.

Statt des Beendens könnten wir natürlich auch auf eine andere Seite springen oder sonst geeignet reagieren. Hier bietet sich natürlich besonders die Möglichkeit in PHP5 an, eine Ausnahmebehandlung

// ...

e($wert,OCI_DEFAULT); // keine Fehlermeldungen!

n

$e)

e->getMessage(), " in Zeile ",

" mit Code ", $e->getCode(), ".</p>";

Ein komplexes Beispiel

d auf die BIKE-Datenbank zugegriffen. Das Schreiben in eine Daten zurückgeliefert und aufbereitet ausgegeben wer-

gegeben. Der zweite Teil wird durch die Funktion isset anfangs versteckt. Hier

hl ein, ebenso Kennung und Passwort.</p>

orm action="select.php" method="post">

td>SQL-Befehl (ohne Semikolon!): </td></tr>

textarea name="Eingabe" rows=10 cols=60 wrap="virtual"><?

'Eingabe']):"" ?>

olgen Eingabefelder für Kennung und Passwort und r Submit-Button -->

vorzunehmen. Ein Beispiel hierfür wäre:

try {

@oci_execut

$fehler = oci_error($wert); // Fehler in Variable merke if ($fehler['code'])

throw new Exception ($fehler['message'], $fehler['code']);

// ...

}

catch (Exception {

echo "<p>Fehler ", $ $e->getLine(),

}

5.3

Bisher haben wir ausschließlich lesen Datenbank ist sogar noch einfacher, da kaum

den müssen. Zuletzt wollen wir jetzt noch ein Beispiel betrachten, das sowohl Lese- als auch Schreib- befehle auf die Datenbank erlaubt. In einem Textfeld geben wir einfach einen DML-Befehl ein. Dieser wird an die Datenbank weitergeleitet. Fehlermeldungen der Datenbank werden bei fehlerhaften Einga- ben zurückgeliefert. Korrekte Befehle werden ausgeführt. Bei Select-Befehlen wird das Ergebnis an- gezeigt, bei Update-, Delete- oder Insert-Befehlen wird die Anzahl der durch diesen Befehl betroffe- nen Zeilen angezeigt.

Wieder liegt unser bereits bekannter Arbeitsvorgang vor. Im ersten Teil werden der SQL-Befehl, Ken- nung und Passwort ein

erfolgen die Ausgaben. Im ersten Teil ist die Verwendung eines Textfeldes neu, im zweiten Teil die Ausgabe beliebiger Select-Befehle bzw. die Ausgabe der Anzahl der geänderten Zeilen. Beginnen wir mit dem ersten Teil, dem Textfeld:

<p>Geben Sie einen SQL-Befe

<f

<table cellpadding=20>

<tr>

<td>

le >

<tab <tr><

<tr><td><

echo isset($_POST['Eingabe'])?trim($_POST[

</textarea> </td></tr>

</table>

</td>

<td>

f <!-- Es

de

</form>

Referenzen

ÄHNLICHE DOKUMENTE

Die radial einstellbare Vorderachse 1 läuft außen an, die seiten- verschiebliche Achse II ebenfalls, wenn diese Einstellung möglich ist, d. wenn die Vorderachse 1 nicht einen

Herausgeber: Berlin Tourismus &amp; Kongress GmbH Fotos: Deutsches Spionagemuseum, asisi F&amp;E GmbH/David Oliveira, Deutsches Currywurst Museum, Stars in Concert/Hannibal

Die Deutsche Bank AG ist dem Einlagensicherungsfonds des Bundes- verbandes deutscher Banken e.V. und der Entschädigungseinrichtung deutscher Banken GmbH angeschlossen. Hierdurch

Funktion: Verwandlung einer physikalischen Größe in ein elektrisches Signal Größe: weniges Millimeter groß (handy) – etwa 30cm (Fernsehmikrofon) Messeinheit: Hertz..

Zum einen müssen die Analysen an sehr vielen Personen durchgeführt werden, um auch Varianten identifizieren zu können, die den Herzinfarkt oder die Koronare Herzerkrankung nur

Da sich häufig nach einem Krankenhausaufent- halt die Medikation der Patien- ten ändert, sich möglicherweise auch weitere medizinische Ver- sorgungsmaßnahmen, wie zum Beispiel

→ Korrektheit der Kanten-Effekte: Falls L die Menge der legendigen Variablen am Ende eines Pfads π sind, dann ist [[ π ]] ♯ L die Menge der am Anfang lebendigen.

Die Unterverzeichnisse von Uebung1 können auch als Grundlage für weitere Projekte verwendet werden – etwa für ein Projekt Uebung2.. Dazu