Datenbanken 15. Übung 1. PHP-Grundlagen1 PHP ist eine serverseitige, in HTML eingebettete Skriptsprache. PHP-Skripte werden auf dem Server ausgeführt, im Gegensatz z.B. zu JavaScript. Der Programmcode wird in eine HTML-Datei geschrieben, z.B.: <HTML> <HEAD> <TITLE> Mein erster Versuch mit PHP </TITLE> </HEAD> <BODY> <?php echo(“Hello world!“); ?> </BODY> </HTML> Elementare Befehle PHP wird einfach in den HTML-Quellcode geschrieben. Damit der Server weiß, in welcher Datei er nach PHP-Skripten suchen soll, müssen die Dateien die richtige Endung (Extension) haben. Bei PHP3 waren „php3“ und „phtml“ üblich, bei PHP4 ist dagegen „php“ gebräuchlicher. Man kann natürlich den Webserver so konfigurieren, daß er jede beliebige Endung als PHP-Skript identifiziert. Damit der Server darüber hinaus noch weiß, welche Ausdrücke er in der Datei interpretieren soll, müssen jeweils der Anfang und das Ende des PHP-Teils gekennzeichnet werden. Dafür gibt es drei Möglichkeiten: 1. <? echo "Hello world!"; ?> 2. <?php echo "Hello world!"; ?> 3. <script language="php"> echo "Hello world!"; </script> Die erste Möglichkeit ist die kürzeste. Sie ist allerdings nicht XML-konform, so daß später Probleme auf den Programmierer zukommen können, wenn man sie benutzt. Die Sprache PHP ist hauptsächlich von C, aber auch von Java und Perl (die ihrerseits von C beeinflußt wurden) beeinflußt. Eine Anweisung wird immer mit einem „;“ abgeschlossen. Der echo-Befehl Den wichtigsten Befehl wurde oben schon verwendet: der echo-Befehl, der Strings ausgibt. Im obigen Beispiel wird jeweils „Hello world!“ ausgegeben. Der Text, der ausgegeben werden soll, muß 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 das 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, z.B.: $var = 123; echo 'Die Variable $var hat den Wert 123!\n'; echo "Die Variable $var hat den Wert 123!\n"; 1 Datenbanken Das erste echo gibt “Die Variable $var hat den Wert 123!\n“ aus, das zweite hingegen “Die Variable 123 hat den Wert 123!“ mit Zeilenumbruch. Gemeint war wohl “Die Variable $var hat den Wert 123!“, das wird erreicht durch das Setzen eines „\“ vor das Sonderzeichen: echo "Die Variable \$var hat den Wert 123!\n"; Der folgende Ausdruck ist dann ebenfalls korrekt echo "Say \"Hello World\" my friend"; // Gibt aus: „Say "Hello World!" my friend“ Wie man sieht, müssen doppelte Anführungsstriche anders geschrieben werden. Dieses Vorgehen nennt man Quoten oder Quoting. Es ist insbesondere für das Ausgeben von HTML-Quelltext in Verbindung mit echo und print nötig und kann u.U. zu Problemen führen, wenn man vergißt, in allen Teilstrings zu quoten. Buchstaben mit einem vorangestellten BackSlash werden als „escaped characters“ bezeichnet. \n \r \t \\ \$ \“ line feed, neue Zeile carriage return horizontaler Tabulator BackSlash Dollar-zeichen Doppeltes Anführungszeichen Der print-Befehl Neben dem echo- gibt es auch den print-Befehl. Im Endeffekt leisten sie dasselbe: Sie geben Text aus. echo ist ein internes Sprachkonstrukt, während hingegen print eine Ausdruck (Expression) ist. echo kann mehrere Argumente haben, die nicht in Klammern stehen dürfen. print kann nur genau ein Argument haben. Alle folgenden Anweisungen sind zulässig und geben dasselbe aus: $var1 = "Hallo"; $var2 = "Welt!"; echo $var1," ",$var2; echo $var1." ".$var2; print ($var1." ".$var2); $res = print ($var1." ".$var2); Kommentare Es gibt zwei Möglichkeiten der Schreibweise echo “Noch kein Kommentar!“; /* Dies ist ein Kommentar, der über mehrere Zeilen gehen kann */ // Die ist wieder ein Kommentar, der bis zum Zeilenende geht echo “Kein Kommentar mehr!“ Konstanten Konstanten werden mit define() bestimmt, z.B.: <? php define(“Bearbeiter“,“Hans Mustermann“); echo“Ihr aktueller Sachbearbeiter ist “ . Bearbeiter); ?> 2 Datenbanken Blöcke und Kontrolstrukturen Blöcke werden durch „{ ... }“ begrenzt.PHP-Skripte werden durch Kontrollstrukturen (Schleifen und Bedingungen) gesteuert. IF Syntax: if (expr) statement „expr“ ist Platzhalter für die Bedingung und „statement“ für den Befehl, der bei erfüllter Bedingung ausgeführt werden soll. Bsp.: if($a>$b) print “a ist groesser als b“; Falls mehr als ein Befehl vorliegt, muß man die Befehle in geschweiften Klammern einschliessen. ELSE Bsp.: if($a>$b) print “a ist groesser als b“; else print “a ist nicht groesser als b“; ELSEIF Bsp.: if($a>$b) { print “a ist } elseif ($a == { print “a ist } else { print “a ist } groesser als b“; $b) gleich b“; kleiner als b“; Alternative Syntax für IF: IF(): ...ENDIF; Bsp.: <?php if ($a<$b): ?> <h1> A ist kleiner als B</h1> <?php endif; ?> Der HTML-Text wird nur ausgegeben, wenn die Bedingung „A kleiner B“ erfüllt ist. Alterantive Syntax für IF: (?:) Bedingung ? Rückgabewert wenn true:Rückgabewert wenn false) Bsp.: <?php echo ($a < $b ? “A ist kleiner als B“:““); ?> WHILE Grundform: WHILE (expr) statement Alterantive Syntax: WHILE (expr) : statement ... ENDWHILE 1. Bsp.: $i=1; while ($i<=10) 3 Datenbanken { print $i++; // $i wird erst ausgegeben und dann inkrementiert } 2. Bsp.: $i=1; while ($i<=10): print $i; $i++; endwhile; DO ...WHILE Bsp.: $i = 0; do { print $i; } while ($i > 0); // $i wird genau einmal ausgegeben FOR Syntax ist identisch mit der in C: FOR (expr1; expr2; expr3) statement 1. Bsp.: for ($i=1; $i < 10; $i++) { print $i } 2. Bsp.: for ($i=1;;$i++) { if ($i > 10) { break; } print $i } Mit break wird die aktuelle Schleife verlassen. SWITCH Variable Alle Variablen werden durch ein vorangestelltes „$“ gekennnzeichnet. Die Variablen müssen nicht vorher definiert werden. PHP verwendet den Typ, den es für richtig hält. Der Variablentyp kann auch bei der ersten Benutzung festgelegt werden, indem er in Klammern angegeben wird. int, integer real, double, float boolean string array object Integer Double Boolean String Array Object Ein String ist im Prinzip ein Array von Zeichen, z.B. wird mit $string[n] auf das n-te zeichen im String zugegriffen. Bsp.: $a = 1234; // $a ist ein Integer $b = (double) $a; // $b ist ein Double mit dem Wert 1234 $a = O123; // Oktalzahl $a = 0xbad; // Hexadezimalzahl echo floor((0,1+0.7)*10); // Ausgabe ist 7 4 Datenbanken Mit dem Schlüsselwort global können Variable strukturübergreifend benutzt werden, z.B. <?php $a = 100; function show() { global $a; echo(“Der Wert der Variablen \$a ist: “ .$a); } show(); ?> Normalerweise verlieren Variable nach Verlassen eines Strukturblocks, z.B. einer Funktion oder einer Schleife, ihren im Block neu berechneten Wert. Ist dies nicht erwünscht, muß die Variable mit static deklariert werden. <?php function show() { static $var = 100; $var += $var; echo(“Der Wert der Variablen \$var ist:<BR>“ .$var); } show(); show(); ?> Ausgabe. Der Wer der Variablen $var ist: 200 Der Wer der Variablen $var ist: 200 <BR> entspricht dem „new Line“-Zeichen. Dynamische Erzeugung von Variablen. PHP bietet die Möglichkeit eine Variable in einer anderen zu speichern, z.B. <?php $a = “name“; $$a = “lernen“; echo($name); ?> Ausgabe. lernen Im vorliegenden Beispiel wird zuerst der Variablen $a der Wert “name“ zugewiesen. Danach wird eine neue Variable dynamisch erzeugt, indem zwei $-Zeichen ($$) verwendet werden. Der neuen Variablen wird der Wert „lernen“ zugewiesen. Der Variablenname der erzeugten Variablen hat den wert der Variablen $a angenommen, d.h. Die dynamische Variable heißt jetzt $name. Zuweisungen Wenn man der Variablen $a den Wert der Variablen $b zuweisen will, muß man dies mit Hilfe des Gleichheitszeichens machen, z.B. $a = $b; Operatoren Man muß zwischen den arithmetischen- (Zahlen), String- (Text), Bit-, logischen (bool'schen)- und Vergleichs-Operatoren unterscheiden. Arithmetische Operatoren Beispiel Name Ergebnis 5 Datenbanken $a + $b $a - $b $a * $b $a / $b $a % $b Addition Subtraktion Multiplikation Division Modulo Summe von $a und $b Differenz von $a und $b Produkt von $a und $b $a geteilt durch $b Rest der Division von $a und $b String-Operatoren Es gibt nur den Verbindungsoperator „.“. Bsp.: $a = “Hello “; $b = $a . “World!“; // $b = “Hello World!“ Bit-Operatoren Bit-Operatoren ermöglichen das Setzen bestimmter Bits in einer Integervariablen. Beispiel $a & $b $a | $b ~$a Name UND ODER NICHT Ergebnis Bits, die in $a und $b gesetzt sind, werden gesetzt Bits, die in $a oder $b gesetzt sind, werden gesetzt Bits, die in $a gesetzt sind, werden nicht gesetzt, und umgekehrt Logische Operatoren Logische Operatoren bzw. bool’sche Operatoren dienen zum Verknüpfen von mehreren Vergleichen bei einer Bedingung. „true“ ist der Wahrheitswert, seine Verneinung ist „false“. Beispiel $a and $b $a or $b $a xor $b !$a $a && $b $a || $b Name UND ODER Exclusiv-ODER NICHT UND ODER Ergebnis true, wenn $a und $b true sind true, wenn mind. $a oder $b true sind true, wenn genau einer $a oder $b true sind true, wenn $a false ist true, wenn $a und $b true sind true, wenn mind. $a oder $b true sind Vergleichsoperatoren == != > < >= <= Gleich Ungleich Größer Kleiner Größer gleich Kleiner gleich Array Ein Array ist ein n-dimensionale Liste, z.B.: $monat[1] = “Januar“; $monat[2] = “Februar“; $monat[3] = “Maerz“; $monat[4] = “April“; $monat[5] = “Mai“; $monat[6] = “Juni“; $monat[7] = “Juli“; $monat[8] = “August“; $monat[9] = “September“; $monat[10] = “Oktober“; $monat[11] = “November“; $monat[12] = “Dezember“; 6 Datenbanken Falls man neben den Monatsnamen auch die Anzahl der Tage im jeweiligen Monat abspeichern will, braucht man eine zweidimensionale Tabelle: Name Januar Februar Maerz April Mai Juni Juli August September Oktober November Dezember Tage 31 28 31 30 31 30 31 31 30 31 30 31 In PHP nimmt die Tabelle folgende Gestalt an: $$monat[1][“Name“] $$monat[2][“Name“] $$monat[3][“Name“] $$monat[4][“Name“] $$monat[5][“Name“] $$monat[6][“Name“] ... = = = = = = “Januar“; “Februar“; “Maerz“; “April“; “Mai“; “Juni“; $monat[1][“Tage“] $monat[2][“Tage“] $monat[3][“Tage“] $monat[4][“Tage“] $monat[5][“Tage“] $monat[6][“Tage“] = = = = = = 31; 28; 31; 30; 31; 30; Zwei wichtige Eigenschaften besitzen Arrays in PHP: Zum einem werden bei mehreren Dimensionen die Indizes einzeln in eckigen Klammern hinter dem Array-Namen angegeben. Zum anderen kann man für Indizes Werte beliebiger Datentypen verwenden. Dadurch werden sog. assoziative Arrays möglich. foreach-Schleife. foreach arbeitet jedes Element des Arrays nacheinander ab. Der Befehl ermittelt die Anzahl der Elemente des Array und setzt einen internen Zeiger bei jedem Schleifendurchlauf um ein Element weiter. Es stehen zwei Möglichkeiten für den Aufruf der Schleife zur Verfügung: 1. Bsp. <?php $array = array(“1“,“2“,“3“); foreach($array as $element) { $element .= “0“; echo(“$element, “); } ?> Ausgabe: 10, 20, 30, 2. Bsp. <?php $array = array(“1“,“2“,“3“); foreach($array as $key=>$element) { $element .= “0“; $key .= “x“; echo(“Schluessel: $key, Element: $element<BR>“); } ?> Ausgabe. Schluessel: 0x, Element: 10 Schluessel: 1x, Element: 20 Schluessel: 2x, Element: 30 7 Datenbanken include Der Befehl include(“dateiname“); fügt an der angegebenen Stelle den Inhalt der Datei „dateiname“ ein. Die Datei, die eingefügt wird, wird als HTML-Code interpretiert, deshalb muß, wenn in der Datei PHP-Code steht, dies mit <?php anfangen und mit ?> aufhören. Funktionen Funktionen dienen dem Zusammenfassen mehrerer Befehlen zu einem Aufruf. Die Syntax lautet wie folgt: function foo($arg_1, $arg_2, ..., $arg_n) { echo "Example function.\n"; return $retval; } Die Funktion bekommt die Argumente `Arg_1` bis `Arg_n` übergeben und gibt den Wert der Variablen `retval` zurück. Wird kein `return` in der Funktion benutzt, hat man dasselbe Verhalten wie bei einer Prozedur in Pascal. Rückgabewerte müssen nicht abgefragt werden. Ein kleines Beispiel: function my_sqr($num) { return $num * $num; } echo my_sqr(4); my_sqr(4); // liefert das Quadrat von $num zurück // gibt 16 aus // ruft die Funktion auf, es passiert aber nichts Variablenparameter Normalerweise werden in PHP Werteparameter übergeben. Will man jedoch die Änderungen der Parameter in der Funktion auch in der aufrufenden Funktion haben, muß man mit Variablenparametern bzw. Referenzparameternarbeiten. Variablenparameter werden mit einem `&` im Funktionskopf gekennzeichnet. Ein kleines Beispiel: function foo1 ($st) { $st .= 'und etwas mehr.'; mehr.'; } // gleichbedeutend mit $st = $st.'und etwas function foo2 (&$st) { $st .= 'und etwas mehr.'; } $str echo foo1 echo foo2 echo = 'Dies ist ein String, '; $str; // Ausgabe: 'Dies ist ein String, '; ($str); $str; // Ausgabe: 'Dies ist ein String, '; ($str); $str; // Ausgabe: 'Dies ist ein String, und etwas mehr.'; Klassen Syntax: <? php class Name extends Elternname { ... } ?> 8 Datenbanken Nach dem Namen der Klasse folgt, falls die Klasse von einer übergeordneten Klasse abgeleitet ist, das Schlüsselwort extends mit dem Namen der übergeordneten Klasse. Eine Klasse muß aber nicht von einer übergeordneten Klasse abgeleitet sein. Eigenschaften und Methoden. Eigenschaften einer Klasse werden in Variablen gespeichert, die im Block der Klasse angelegt wurden, z.B.: <?php class Name { var $vname; } ?> Eine Methode wird wie eine normale Funktion innerhalb der Klassenstruktur definiert. Methoden greifen auf die Eigenschaften der Klasse zu, indem sie den reservierten Zeiger $this verwenden, z.B.: <?php class Name { var $vname; function xyz($wert) { $this->vname = $wert; } function ausgabe() { return $this->vname; } } ?> Eine spezielle Methode der Klasse ist der Konstruktor, der beim initialisieren der Klasse automatisch aufgerufen wird und den gleichen Namen wie die Klasse besitzt, z.B.: <?php class Name { var $vname; function Name($anfangswert) { $this->vname = $anfangswert; } function wertfestlegen($wert) { $this->vname = $wert; } function ausgabe() { return $this->vname; } } ?> Verwenden der Klasse. Instanzen der Klasse werden mit dem Schlüsselwort new erzeugt: <?php include (“myclass.php“); $objekt1 = new Name(“Juergen“); $objekt2 = new Name(“Liesel“); ?> Vererbung. Bsp.: Die Klasse VorZuName erbt Eigenschaften und Methoden der Klasse Name. 9 Datenbanken <?php class VorZuName extend Name { var $vorname; function VorZuName($vor,$zu) { Name::Name($zu); $this->vorname = $vor; } function wertefestlegen($vor, $zu) { Name::wertefestlegen($zu); $this->vname = $vor; } function ausgabe() { $hilf = Name::ausgabe(); return “$this->vorname $hilf“; } } $meinName = new VorZuName(“Juergen“,“Sauer“); echo($meinName->ausgabe()); ?> PHP und Oracle PHP-Zugriff zur Oracle-DB des Labors DB / KI an der F.H. Regensburg Der Server des Labors DB / KI kann PHP-Skripte an eine Oracle-Datenbank weiterleiten. PHP-Funktionen für Oracle-Datenbanken int ora_bind(int cursor, string PHP_variablenname, string SQL_parametername, int laenge, int typ) gibt nach erfolgreichen Binden true, andernfalls false zurück. Einzelheiten über den Fehler zeigen die Funktionen ora_error() und ora_errorcode(). Diese Funktion bindet die PHP-Variable an einen SQL-Parameter. Der SQL-Parameter muß von der Form „:name“ sein. ora_bind() muß nach ora_parse() und ora_exe() aufgerufen werden. int ora_close(int cursor) gibt nach erfolgreichen Schließen true, andernfalls false zurück. Einzelheiten über den Fehler zeigen die Funktionen ora_error() und ora_errorcode(). Diese Funktion schließt den über ora_open() geöffneten Daten_Cursor. string ora_columnName(int cursor, int feld) gibt den Namen des Feldes feld vom Cursor cursor zurück (d.h. liefert den Namen eines OracleErgebnisfelds). Der zurückgegebene Name ist komplett in Großbuchstaben. string ora_columnsize(int cursor, int feld) gibt den Größe des Feld feld des Cursor cursor zurück. string ora_columntype(int cursor, int column) gibt den Namen des Felds feld vom Cursor cursor zurück. Der zurückgegebene Typ ist eine der folgenden: varchar2, varchar, char, number, long, long raw, rowid, date, cursor. int ora_commit(int conn) gibt bei Erfolg true und bei Auftreten eines Fehlers false zurück. Einzelheiten über den Fehler zeigen die Funktionen ora_error() und ora_errorcode(). Diese Funktion bestätigt eine Oracle-Transaktion. Eine Transaktion ist definiert als Gesamtheit aller Änderungen, seit der letzten Bestätigung, dem letzten Rollback, seit die letzte automatische Bestätigung abgeschaltet wurde oder seit die Verbindung besteht. 10 Datenbanken int ora_commitoff(int conn) gibt bei Erfolg true und bei Auftreten eines Fehlers false zurück. Einzelheiten über den Fehler zeigen die Funktionen ora_error() und ora_errorcode(). Diese Funktion schaltet die automatische Bestätigung nach jedem Aufruf von ora_exec() ab. int ora_commiton(int conn) gibt bei Erfolg true und bei Auftreten eines Fehlers false zurück. Einzelheiten über den Fehler zeigen die Funktionen ora_error() und ora_errorcode(). Diese Funktion schaltet die automatische Bestätigung nach jedem Aufruf von ora_exec() über die angegebenen Verbindung ein. int ora_do(int conn, string abfrage) gibt bei Erfolg true und bei Auftreten eines Fehlers false zurück. Einzelheiten über den Fehler zeigen die Funktionen ora_error() und ora_errorcode(). Diese Funktion ist eine schnelle Kombination von ora_parse(), ora_exec() und ora_fetch(). Sie analysiert eine Anweisung, führt sie aus und ruft dann den ersten Datensatz des Ergebnisses ab. string ora_error(int cursor_oder_verbindung) gibt eine Fehlermeldung der Form XXX-NNNNN zurück. XXX gibt an, wo der Fehler auftritt, NNNNN identifiziert die Fehlermeldung. int ora_errorcode(int cursor_oder_verbindung) gibt den numerischen Fehlercode der zuletzt ausgeführten Anweisung des angegebenen Cursor bzw. der angegebenen Verbindung zuück. int ora_exec(int cursor) gibt bei Erfolg true und bei Auftreten eines Fehlers false zurück. Einzelheiten über den Fehler zeigen die Funktionen ora_error() und ora_errorcode(). int ora_fetch(int cursor) gibt true (Datensatz wurde abgerufen) oder false (keine weiteren Datensätze oder Auftreten eines Fehlers) zurück. Beim Auftreten eines Fehlers sind Einzelheiten mit der Funktion ora_error() ind ora_errorcode() bestimmbar. Wenn es keine Fehler gab, gibt ora_errorcode() 0 zurück. int ora_fetch_into(int cursor, array ergebnis [, int flags]) Mit dieser Funktion kann eine Datensatz in ein Array abgerufen werden mixed ora_getcolumn(int cursor, mixed feld) gibt bei Erfolg true und bei Auftreten eines Fehlers false zurück. Einzelheiten über den Fehler zeigen die Funktionen ora_error() und ora_errorcode(). Die „false“-Überprüfung kann wahr ergeben, wenn gar kein Fehler auftritt (Ergebis NULL, leere Zeichenkette, die Zahl 0, die Zeichenkette “0“). int ora_logoff(int verbindung) gibt bei Erfolg true und bei Auftreten eines Fehlers false zurück. Einzelheiten über den Fehler zeigen die Funktionen ora_error() und ora_errorcode(). Diese Funktion meldet den Benutzer ab und trennt die Verbindung zum Server. int ora_login(string benutzername, string passwort) gibt bei Erfolg true und bei Auftreten eines Fehlers false zurück. Einzelheiten über den Fehler zeigen die Funktionen ora_error() und ora_errorcode(). Die Funktion baut mit benutzername und passwort eine Verbindung zwischen PHP und einer Oracle Datenbank auf. Verbindungen können unter Verwendung von SQL*NET durch Eingabe des TNS-Namens zu benutzername fogendermaßen aufgebaut werden $conn = ora_logon(“benutzername@TNSNAME“,“passwort“); int ora_plogon(string benutzername, string passwort) 11 Datenbanken Diese Funktion baut mit benutzername und passwort eine persistente Verbindung zwischen PHP und einer Oracle Datenbank auf. int ora_numcols(int cursor_ind) gibt die Anzahl der Felder eines Ergebnisses zurück. int ora_numrows(int cursor_ind) gibt die Anzahl der Datensätze eines Ergebnisses zurück int ora_open(int verbindung) gibt bei Erfolg einen Cursor-Index oder bei Auftreten eines Fehlers false zurück. Diese Funktion öffnet einen Oracle-Cursor, der mit verbindung verknüpft ist. int ora_parse(int cursor_ind, string SQLanweisung, int aufschieben) gibt bei Erfolg 0 oder bei Auftreten eines Fehlers Die Funktion analysiert eine SQL-Anweisung oder einen PL/SQL-Block und verknüpft diese(n) mit dem angegebenen Cursor. int ora_rollback(int verbindung) gibt bei Erfolg true und bei Auftreten eines Fehlers false zurück. Einzelheiten über den Fehler zeigen die Funktionen ora_error() und ora_errorcode(). Diese Funktion macht eine Oracle-Transaktion rückgängig. 2. Anwendung http://fbim.fh-regensburg.de/~saj39122/php/PHP_Oracle_Formular.html http://fbim.fh-regensburg.de/~saj39122/meile/rueckerl/index.html http://fbim.fh-regensburg.de/~saj39122/php/grafik/ 12 Datenbanken 1. Aufgabe Es soll eine Funktion geschrieben werden, die das Ergebnis einer SQL-Abfrage tabellarisch darstellt. Die Ausgabe soll im Prinzip die Tabelle, die man beim Aufruf der Abfrage „select * from angestellte;“ am SQL*PLUS-Prompt bekommt, in HTML umsetzen (inkl. Spaltenname). Lösungsrahmen: <?php $db_host $db_user $db_pass $datab = = = = "localhost"; "cr"; "123"; "cr"; function print_result_table($result){ // hier das Richtige schreiben } // Hauptprogramm /* Verbindung zur Datenbank aufbauen */ $db = @mysql_connect($db_host,$db_user,$db_pass) or die(mysql_error()); @mysql_select_db($datab,$db) or die(mysql_error()); /* HTML-Startcode ausgeben */ echo "<html>\n<body>\n"; /* SQL-Abfrage */ $result = @mysql_query("SELECT * FROM angestellte"); print_result_table($result); /* HTML-Endcode ausgeben */ echo "</body>\n</html>\n"; ?> Die Aufgabe soll in mehreren Schritten gelöst werden: 1. Nur in der 1. Zeile die 1. Spalte ausgeben. 2. Mit einer Schleife für alle Zeilen die 1. Spalte ausgeben. 3. Mit einer 2. Schleife alle Spalten ausgeben (vorher in der Dokumentation nachsehen, mit welcher Funktion man die Spaltenanzahl abfragen kann). 4. Als letztes noch die Spaltennamen ausgeben. Lösung 1. Teilschritt Verwendet wurde bei der Lösung mysql_fetch_row(), weil es einfacher ist, mit einer Schleife einen numerischen Index durchzugehen. Das wird im 3. Teilschritt deutlich. function print_result_table($result){ // Tabellenanfang echo "<table>\n"; // Tabellenzeilen-Anfang echo " <tr>\n"; // Zeile aus DB-Anfrage holen $row = mysql_fetch_row($result); // erstes Feld der Zeile ausgeben 13 Datenbanken echo " <td>$row[0]</td>\n"; // Tabellenzeilen-Ende echo " </tr>\n"; // Tabellenende echo "</table>\n"; } 2. Teilschritt function print_result_table($result){ // Tabellenanfang echo "<table>\n"; // Alle Ergebniszeilen durchgehen while ($row = mysql_fetch_row($result)){ // Tabellenzeilen-Anfang echo " <tr>\n"; // erstes Feld der Zeile ausgeben echo " <td>$row[0]</td>\n"; // Tabellenzeilen-Ende echo " </tr>\n"; } // Tabellenende echo "</table>\n"; } 3. Teilschritt Mit int mysql_num_fields(int result) kann man abfragen, wie viele Spalten bei der Abfrage zurückgegeben wurden. Mit einer for-Schleife werden einfach alle Felder ausgegeben. function print_result_table($result){ // Tabellenanfang echo "<table>\n"; // 1. Tabellenzeile Anfang echo " <tr>\n"; for ($i = 0; $i < mysql_num_fields($result); $i++){ echo " <th>".mysql_field_name($result,$i)."</th>\n"; } // 1. Tabellenzeile Ende echo " </tr>\n"; // Alle Ergebniszeilen durchgehen while ($row = mysql_fetch_row($result)){ // Tabellenzeilen-Anfang echo " <tr>\n"; // Alle Spalten durchgehen for ($i = 0; $i < mysql_num_fields($result); $i++){ echo " <td>$row[$i]</td>\n"; } // Tabellenzeilen-Ende echo " </tr>\n"; } // Tabellenende 14 Datenbanken echo "</table>\n"; } 4. Teilschritt Zuletzt muß festgestellt werden, wie die Spalten heißen. Das macht die Funktion string mysql_field_name(int result, int field_index). function print_result_table($result){ // Tabellenanfang echo "<table>\n"; // 1. Tabellenzeile Anfang echo " <tr>\n"; for ($i = 0; $i < mysql_num_fields($result); $i++){ echo " <th>".mysql_field_name($result,$i)."</th>\n"; } // 1. Tabellenzeile Ende echo " </tr>\n"; // Alle Ergebniszeilen durchgehen while ($row = mysql_fetch_row($result)){ // Tabellenzeilen-Anfang echo " <tr>\n"; // Alle Spalten durchgehen for ($i = 0; $i < mysql_num_fields($result); $i++){ echo " <td>$row[$i]</td>\n"; } // Tabellenzeilen-Ende echo " </tr>\n"; } // Tabellenende echo "</table>\n"; } 15