Datenbanken 15. Übung PHP ist eine serverseitige, in HTML eingebettete Scriptsprache. PHP-Scripte werden auf dem Server ausgeführt, im Gegensatz z.B. zu JavaScript. Der Programmcode wird in eine HTML-Datei geschrieben. Elementare Befehle PHP wird einfach in den HTML-Quellcode geschrieben. Damit der Server weiß, in welcher Datei er nach PHP-Scripten 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-Script 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 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, z.B.: $var = 123; echo 'Die Variable $var hat den Wert 123!\n'; echo "Die Variable $var hat den Wert 123!\n"; Das erste echo gibt ,, Die Variable $ var hat den Wert 123!\n `` aus, das zweite hingegen ,,Die Variable 123 hat den Wert 123!`` mit folgendem Zeilenumbruch. 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. 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. 1 Datenbanken 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); 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 ( Vergleichs-Operatoren unterscheiden. bool'schen)- und 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 $ function foo2 (&$st) { 2 st = $ st.'und etwas Datenbanken $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.'; PHP und Oracle Hier werden Funktionen von Oracle und PHP angegeben. 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 Ergebnisfelds). Der zurückgegebene Name ist komplett in Großbuchstaben. Oracle- 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. 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(). 3 Datenbanken 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) 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. 4 Datenbanken 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. 5 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 6 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 7 Datenbanken echo "</table>\n"; } 4. Teilschritt Zuletzt muß festgestellt werden, wie die Spalten heißen. Das macht die Funktion 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"; } 8 string