java script xsl zaehler
Transcrição
java script xsl zaehler
2. WWW-Dienst im Internet Inhalt: HTTP, allgemeiner syntaktischer Aufbau Standardablauf der Kommunikation und wichtige Methoden des http-Protokolls http-Nutzung durch einen Web-Browser Aufbau von Web-Applikationen unter Nutzung von HTTP, HTML, DOM, XML Javascript 3-Tier-Architekturen von Web-Applikationen Kurze Einführung zu PHP 4-Tier-Architekturen PHP und Datenbankzugriff Peter Sobe Internettechnologien 1 HTTP (1) Der syntaktische Aufbau der HTTP Nachrichten ist hier durch ein s.g. Syntaxdiagramm beschrieben das nach der Backus-Naur-Form aufgebaut ist. generic-message = start-line *(message-header CRLF) CRLF [ message-body ] start-line = Request-Line | Status-Line Die Nachricht beginnt immer mit einer Startzeile. Schickt der Nutzer eine Anforderung (Request), ist es eine Request-Zeile. Antwortet der Server ist es eine Status-Zeile. Danach können mehrere so genannte Nachrichten-Header kommen. Der Stern bedeutet Wiederholung, aber beinhaltet auch die Möglichkeit, dass keine Nachrichten-Header vorhanden sind. Peter Sobe Internettechnologien 2 HTTP (2) Die Folge der Header muss durch ENTER (CR- und LF-Zeichen) abgeschlossen sein. Dann folgt unbedingt eine Leerzeile repräsentiert durch CRLF. Danach kann ein Nachrichten-Körper (body) kommen oder nicht. Aufbau einer Anforderung (Request) Diese beginnt mit der Anforderungszeile. Danach können im Header-Teil allgemeine Header, Anforderungs-Header oder EntityHeader vorhanden sein. Request Peter Sobe = Request-Line *(( general-header | request-header | entity-header ) CRLF) CRLF [ message-body ] Internettechnologien 3 HTTP (3) Die Anforderungszeile (Request-Line) besteht aus drei Teilen, die durch Leerzeichen (SP) getrennt sind. Der erste Teil ist die Methode (z.B. GET), der zweite Teil die Anforderungs-URI (z.B. /beispiel.html), und der dritte Teil die http-Version (in der Regel HTTP/1.0) Request-Line = Method SP Request-URI SP HTTP-Version CRLF Method = "OPTIONS" | "GET" | "HEAD" | "POST" | "PUT" | "DELETE" | "TRACE" | "CONNECT" Request-URI = "*" | absoluteURI | abs_path | authority Beispiele: GET /beispiel.html HTTP/1.0 OPTIONS * HTTP/1.0 Peter Sobe Internettechnologien 4 HTTP (4) Der Stern"*" heißt, dass sich die Anforderung nicht auf eine bestimmte Ressource bezieht. Mit OPTIONS werden vom Server die unterstützten Methoden erfragt, ohne sich auf ein gespeichertes Dokument zu beziehen. Die GET-Methode dagegen fordert das Dokument beispiel.html an. Das /-Zeichen bezeichnet das Wurzelverzeichnis des Webservers. Die Angabe der Methode muss in Großbuchstaben erfolgen. In den obigen Beispielen ist weder ein Header- noch ein Body-Teil vorhanden, aber der Anforderungszeile muss unbedingt eine Leerzeile folgen. Aufbau einer Antwort (Response) Der Aufbau ist analog zur Anforderung. Nur ist die erste Zeile jetzt eine Status-Zeile und im Header-Teil stehen statt den Anforderungs-Headern die Antwort-Header. Peter Sobe Internettechnologien 5 HTTP (5) Aufbau einer Antwort (Response) Der Aufbau ist analog zur Anforderung. Nur ist die erste Zeile jetzt eine Status-Zeile und im Header-Teil stehen statt den Anforderungs-Headern die Antwort-Header. Response = Status-Line *(( general-header | response-header | entity-header ) CRLF) CRLF [ message-body ] Die Status-Zeile (Status -Line) besteht aus drei Teilen, die durch Leerzeichen (SP) getrennt sind. Der erste Teil ist die unterstützte http-Version, der zweite Teil enthält den Status-Code (z.B. 200), und der dritte Teil die Texterklärung zum Code (z.B. OK). Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF Peter Sobe Internettechnologien 6 HTTP (6) Das WWW-Konsortium hat im http-Standard festgelegt, dass die drei Methoden OPTIONS, GET und HEAD auf jeden Fall durch einen Webserver zu unterstützen sind, aber auch künftige Erweiterungen der Methoden möglich sind. Typischerweise ist die Methode POST zur Übertragung von Eingabedaten auf Webseiten zugelassen Es sind auch einige Methoden, wie SEARCH, LOCK usw. vorhanden, die nicht im Standard aufgeführt sind. Im Standard enthalten, aber oft nicht implementiert oder abgeschaltet: PUT und DELETE Peter Sobe Internettechnologien 7 HTTP (7) GET- Methode Die GET-Methode ist die am häufigsten eingesetzte Methode bei einer Client-Anforderung. Damit wird ein Dokument beim Webserver zum Herunterladen angefordert. Der Name des Dokumentes und eventuell sein Pfad müssen in der Request-URI angegeben sein. Beispiel: GET /beispiel.html HTTP/1.0 Das /-Zeichen steht für die Wurzel des Publikationsverzeichnisses des Webservers. Im Wurzelverzeichnis wird die Datei beispiel.html angefordert. Peter Sobe Internettechnologien 8 HTTP (8) GET- Methode, Antwort: Nach der Leerzeile ist der Inhalt des body zu sehen, d.h. der Inhalt des angeforderten Dokumentes in HTML. Allgemeiner Header: Date Response-Header: Server, Accept-Ranges und ETag. Entity-Header: Content-Type, Content-Length und Last-Modified. Sie beziehen sich auf das gesendete Dokument. ETag enthält einen serverseitig eindeutigen Identifizierer für das Dokument. Peter Sobe Internettechnologien 9 HTTP (9) HEAD- Methode Die HEAD-Methode arbeitet fast identisch zur GET-Methode, nur dass das angeforderte Dokument vom Server nicht gesendet wird. Die Header werden wie bei GET in der Antwort gesetzt und erlauben damit eine Identifikation des Dokumentes. Beispiel: HEAD /xml1.xml HTTP/1.0. Ergebnis siehe Bild. Im Content-Type-Header ist text/xml angegeben. Peter Sobe Internettechnologien 10 HTTP (10) OPTIONS- und TRACE-Methoden Die OPTIONS-Methode dient zur Anzeige der durch den Webserver unterstützten Methoden. Beispiel: OPTIONS * HTTP/1.0. Die TRACE-Methode dient nur zur Feststellung, ob der Webserver arbeitet und ansprechbar ist. Seine Antwort ist das Zurücksenden der Anforderung im body. Es werden einige wichtige Header gesetzt. Das Bild unten zeigt die Server-Antwort auf die Anforderung Beispiel: TRACE / HTTP/1.0. Peter Sobe Internettechnologien 11 HTTP (11) POST-, PUT- und DELETE-Methoden POST-Methode - Übertragung von Datenpaketen vom Client zum Server. Hauptsächlich wird sie eingesetzt, wenn ein angefordertes HTML-Dokument Formularelemente für Nutzereingaben enthält. Die eingegebenen Daten werden dann an ein serverseitig vorhandenes Programm (Script) zur Weiterverarbeitung gesendet (serverseitiges Scripting). PUT-Methode - Übertragung von kompletten Dokumenten vom Client zum Server. Diese werden unter dem angegebenen Namen durch den Webserver im angegebenen Verzeichnis abgelegt. Es muss ein authentifizierter Zugriff erfolgen und Kennwort und Passwort mit übermittelt werden. Die hochzuladende Datei muss im body angeben werden. DELETE-Methode löscht die angegebene Datei aus dem Verzeichnis; authentifizierter Zugriff wird vorausgesetzt. Peter Sobe Internettechnologien 12 HTTP und Darstellung XML Dokumente HTTP überträgt auch XML! Durch die XML-Unterstützung der Browser wird die XMLDatei so dargestellt, dass die Elementhierarchie des Dokumentes sichtbar wird. Siehe Bild rechts. Ist in die XML-Datei eine XSL-Datei eingebunden, wird diese auch ausgeführt, sodass man das transformierte Dokument sieht. Umwandlung auch über CSS möglich. Peter Sobe Internettechnologien 13 Kontrollfragen • Ist es vorstellbar, dass ein Webserver auch für andere Dienste im Internet verwendbar wäre? Begründen Sie Ihre Antwort aus der Kenntnis des Kommunikationsmodells! • Sie fordern mit einem MS Internet Explorer über http eine EXCEL-Datei von einem Webserver an! Welche Abläufe erwarten Sie auf dem Client-Rechner? • Welche praktische Bedeutung kommt den EntityHeadern Content-Type und Content-Length zu? Peter Sobe Internettechnologien 14 Web-Applikationen unter Nutzung von http Web-Browser Javascript Ajax-Engine HTTP, HTMLDokumente Externe Skripte und Daten CGI XML WebServer PHP Ajax-Engine Peter Sobe Internettechnologien 15 HTML Kodierungssprache für Webseiten, aus SGML entworfen. HTML-Dokument wird im message-body durch HTTP übertragen Beispiel: <HTML> <HEAD><TITLE>DOM</TITLE></HEAD> <BODY BGCOLOR="yellow"> <H2>Demonstration DOM</H2> <P> <IMG SRC="Comp2.gif" /> Bild 4.1 </P> <P><I>Ende</I> </P> </BODY> </HTML> Peter Sobe Internettechnologien 16 HTML Elemente: <TITLE>DOM</TITLE> Attribute: <IMG SRC="Comp2.gif" /> Kombination Element mit Attributen: <BODY BGCOLOR="yellow"> … </BODY> Die Elemente werden durch Tags eingefasst. und werden hierarchisch ineinander gesetzt Darstellung als Baum mit Elementen auf gleicher Ebene und unter/übergeordneten Elementen möglich. → DOM Document Object Model eines HTML-Dokuments Peter Sobe Internettechnologien 17 DOM (1) Elemente-Beziehungen im letzten Beispiel: HTML HTML BODY TITLE H2 P DOM Demonstration DOM IMG BGCOLOR P SRC Comp2.gif I Bild der Gruppe Ende Peter Sobe Elementknoten Elementwert Attributknoten Attributwert Internettechnologien 18 DOM (2) DOM dient z.B. in Javascript zum Zugriff auf Elemente der dargestellten Webseite. Beispiel aus jspage.html (siehe Übung am 21.3. und 23.3.2011): Im Skript: Im HTML-Dokument: <script type="text/javascript"> <!— function primzahl() { var zahl = document.Formular.Eingabe.value; … --> </script> … Peter Sobe <body> … <form name="Formular" action=""> <input type="text„ name="Eingabe"="3"> … </form> </body> Internettechnologien 19 XML Ein XML-Dokument für das Beispiel „Musiksammlung“: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE musiksammlung SYSTEM "musiksammlung.dtd"> <musiksammlung eigentuemer="Max Meier"> <album> <interpret>Kraftwerk</interpret> <albumtitel>Electric Cafe</albumtitel> <songs> <song>Boing Boom Tschak</song> <song>Techno Pop</song> <song>Musique Non-Stop</song> <song>Der Telefon-Anruf</song> <song>Sex Objekt</song> <song>Electric Cafe</song> </songs> </album> <album> <saenger>Helge Schneider</saenger> <albumtitel>Guten Tach</albumtitel> <songs > <song>Ansage </song> <song>Ladiladiho</song> <song>Der viereckige Hai</song> </songs> </album> </musiksammlung> Internettechnologien Peter Sobe Das Dokument zeigt deutlich den hierarchischen Aufbau ausgehend vom Wurzel-Element MUSIKSAMMLUNG und den vorhandenen Subelementen. 20 XML-DTD DTD für das Beispiel „Musiksammlung“: <?xml version="1.0" encoding="UTF-8"?> <!ELEMENT musiksammlung (album)*> <!ATTLIST musiksammlung eigentuemer CDATA #REQUIRED > <!ELEMENT album ((interpret|saenger|saengerin|band), albumtitel, songs) > <!ELEMENT songs (song)* > <!ELEMENT interpret (#PCDATA) > <!ELEMENT saenger (#PCDATA) > <!ELEMENT saengerin (#PCDATA) > <!ELEMENT band (#PCDATA) > <!ELEMENT albumtitel (#PCDATA) > <!ELEMENT song (#PCDATA) > Peter Sobe Internettechnologien 21 XML Daten – Formatierte Anzeige im Browser (1) für das Beispiel „Musiksammlung“: Browser zeigen typischerweise die Struktur des XMLDokuments durch Einrückungen an! Eine grafisch formatierte Darstellung ist durch CSS Formatierung möglich. Peter Sobe Internettechnologien 22 XML Daten – Formatierte Anzeige im Browser (2) für das Beispiel „Musiksammlung“ mit CSS-Formatierung: Inhalt von ‘musiksammlung.css‘ musiksammlung { position:absolute; top:10px; left:10px; font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:14px; background-color:#FFECFF; padding:0px; } album { position:relative; top:10px; left:20px; font-family:Tahoma,Arial,Helvetica,sans-serif; font-size:14px; background-color:#FFECEF; padding:15px; } albumtitel { …. Peter Sobe Internettechnologien 23 XML-Sprachen (1) Genereller Ansatz: Peter Sobe Internettechnologien 24 XML-Sprachen (2) Durch die ständige Weiterentwicklung der XML-Technologien sind bereits für viele verschiedene Anwendungsgebiete neue wichtige XML-Sprachen definiert worden. Voice Extensible Markup Language (VoiceXML): Auszeichnungssprache für akustische Ausgabeplattformen. Mathematical Markup Language (MathML): Darstellung mathematischer Ausdrücke, Strukturierung des Dokumentes Die Synchronized Multimedia Integration Language (SMIL) Vokabular für Multimediapräsentationen im WWW. Scalable Vector Graphics (SVG): Vokabular für die Präsentation von zweidimensionalen Vektorgraphiken, in die auch Rastergraphiken eingebunden werden können. Peter Sobe Internettechnologien 25 XML-Sprachen (3) Fortsetzung: XML-Schema (XS): anstelle einer DTD wird eine XMLbasierte Beschreibung der Dokumentstruktur einer XMLSyntax beschrieben (siehe Beispiel zu Musiksammlung) Geography Markup Language (GML): zum Austausch raumbezogener Objekte im Bereich der Geodaten WSDL, SOAP: XML-basierte Beschreibungen und Schnittstellen; werden für Webservices benutzt Peter Sobe Internettechnologien 26 XML-Sprachen (4) Transformation zwischen verschiedenen XML-Sprachen: Peter Sobe Internettechnologien 27 XML-Schema (1) Ein XML-Schema kann anstelle einer DTD benutzt werden und ist selbst ein XML-Dokument. Beispiel zur Musiksammlung: <?xml version="1.0" encoding="utf-8"?> <xs:schema … xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="musiksammlung"> <xs:complexType> <xs:sequence minOccurs="0" maxOccurs="unbounded"> <xs:element ref="album" /> </xs:sequence> <xs:attribute name="eigentuemer" type="xs:string" use="required" /> </xs:complexType> </xs:element> album musiksammlung Dieser Teil beschreibt, dass eine Musiksammlung aus mehreren Alben (0 bis unbegrenzt) besteht. Peter Sobe Internettechnologien 28 XML-Schema (2) Beispiel zur Musiksammlung (Fortsetzung): <xs:element name="album"> <xs:complexType> <xs:sequence> <xs:choice> <xs:element ref="interpret" /> <xs:element ref="saenger" /> <xs:element ref="saengerin" /> <xs:element ref="band" /> </xs:choice> <xs:element ref="albumtitel" /> <xs:element ref="songs" /> </xs:sequence> </xs:complexType> interpret </xs:element> … album albumtitel saenger songs saengerin band Peter Sobe Internettechnologien 29 XML-Schema (3) Beispiel zur Musiksammlung (Fortsetzung): <xs:element name="songs"> <xs:complexType> <xs:sequence minOccurs="0" maxOccurs="unbounded"> <xs:element ref="song" /> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="interpret" type="xs:string" /> <xs:element name="saenger" type="xs:string" /> <xs:element name="saengerin" type="xs:string" /> <xs:element name="band" type="xs:string" /> <xs:element name="albumtitel" type="xs:string" /> <xs:element name="song" type="xs:string" /> songs </xs:schema> song Peter Sobe Internettechnologien 30 SVG (1) Vektorgrafikstandard Scalable Vector Graphics (SVG) (W3C 2003a) zur Visualisierung von grafischen Daten. SVG ist XML-basiert und unterstützt Vektordaten und zusätzlich die Einbettung von Rasterbildern, Audiound Videodaten. Eigenschaften: Auszeichnung für zweidimensionale Geometrieobjekte (Elemente mit geometriespezifischen Attributen) Operationen wie Transformationen, Gruppierung, Clipping und Filterung Formatierung der Elemente über CSS Ereignisbehandlung über Skripte mit Zugriff auf DOM. Peter Sobe Internettechnologien 31 SVG (2) Eine SVG-Grafik ist ein XML-Dokument, dessen Syntax gemäß eines XML-Schemas www.w3.org/2000/svg aufgebaut ist. Struktur: <svg xmlns="http://www.w3.org/2000/svg" width="444" height="666"> <title>Ein Bild</title> <desc>Hier eine Beschreibung zum Bild</desc> <!-- hier folgen die Grafikelemente --> </svg> Ein SVG-Bild kann als externe Referenz in eine Webseite aufgenommen werden, oder auch in die Webseite eingebettet werden. Peter Sobe Internettechnologien 32 SVG (3) Elemente beschreiben grafische Primitive, wie z.B. Linie: <line x1="90" y1="150" x2="310" y2="150" style="stroke:black; stroke-width:2px;" /> Kreis:<circle cx="50" cy="50" r="15" fill="yellow" stroke="black" /> Ellipse: <ellipse cx="200" cy="50" rx="20" ry="40" style="fill:green;" /> Rechteck: <rect x="0" y="0" width="100" height="100" style="fill:blue;" /> Text: <text x="100" y="50">Guten Morgen</text> Für die Attribute sind verschiedene Maßeinheiten möglich: px – Pixel (default), cm – Zentimeter, mm – Millimeter, … Peter Sobe Internettechnologien 33 SVG (4) Elemente (Fortsetzung): Polyline und Polygon: <polyline fill="lightgray" stroke="red" stroke-width=„2px" points=" 176 10, 26 160, 326 160, 176 10" /> <polygon fill="darkblue" points="176 10, 26 160, 326 160" /> …beide Elemente beschreiben ein Dreieck Verschachtelung: <svg …> <rect x="0" y="0" width="200" height="200" style="fill:red;" /> <svg x=„20" y=„20" width="160" height="160"> <rect x="0" y="0" width="100" height="100" style="fill:blue;" /> </svg> </svg> Peter Sobe Internettechnologien 34 SVG (5) Ein Beispiel mit Verschachtelung: <svg xmlns="http://www.w3.org/2000/svg" width="400" height="400"> <title>Beispielbild</title> <desc>Ein einfaches SVG Bild</desc> <rect x="50" y="50" width="300" height="300" style="fill:red;" /> <svg x="50" y="50" width="300" height="300"> <circle cx="150" cy="150" r="100" style="fill:blue;" /> </svg> </svg> Peter Sobe Internettechnologien 35 SVG (6) SVG wird durch eine Reihe Vektorzeichenprogramme unterstützt, d.h. zum Erstellen von Grafiken ist primär keine Kenntnis des XML-Formats nötig. SVG-XML-Struktur dann wichtig wenn grafische Inhalte automatisiert erzeugt werden sollen, z.B. bei der Programmierung einer SVG-Ausgabe Wenn auf SVG-Inhalte durch Skripte zugegriffen werden soll Bei der Transformation von anderen XML-Daten in SVG, z.B. Anzeige von Geodaten Peter Sobe Internettechnologien 36 MathML Durch MathML wird das äußere Erscheinungsbild mathematischer Ausdrücke kodiert (presentation). Zusätzlich kann die Bedeutung eines Ausdrucks kodiert werden (content). Beispiel: (x+2)3 Presentation markup: Content markup: <math> <msup> <mrow> <mo>(</mo> <mrow> <mi>x</mi> <mo>+</mo><mn>2</mn> </mrow> <mo>)</mo> </mrow> <mn>3</mn> </msup> </math> <math> <apply> <power/> <apply> <plus/> <ci>x</ci> <cn>2</cn> </apply> <cn>3</cn> </apply> </math> Peter Sobe Internettechnologien 37 Javascript Javascript wurde 1995 im Netscape-Browser eingeführt und wird inzwischen von den meisten Browsern unterstützt. Allgemeines: Skripte werden mit der HTML/XHTML-Seite übertragen und deren Ausführung durch verschiedene Ereignisse angestoßen Diese Skripting-Erweiterung bleibt im Rahmen einer 2-Tier Architektur. Javascript erlaubt dynamische Effekte bei Darstellung der Webseiten. Java bzw. C- ähnliche Sprache – prozedural und objektorientiert Peter Sobe Internettechnologien 38 Javascript Javascript wurde 1995 im Netscape-Browser eingeführt und wird inzwischen von den meisten Browsern unterstützt. Allgemeines: Skripte werden mit der HTML/XHTML-Seite übertragen und deren Ausführung durch verschiedene Ereignisse angestoßen Diese Skripting-Erweiterung bleibt im Rahmen einer 2-Tier Architektur. Javascript erlaubt dynamische Effekte bei Darstellung der Webseiten. Java bzw. C- ähnliche Sprache – prozedural und objektorientiert Peter Sobe Internettechnologien 39 Javascript-Minimalbeispiel <html> <head> <title>Eine Seite mit Javascript</title> <script type=“text/javascript“> alert(“Hier spricht das Javascript!“); </script> </head> <body> … </body> </html> Peter Sobe Internettechnologien 40 Javascript - Variablen <html> <head> <title>Eine Seite mit Javascript</title> <script type="text/javascript"> function fun() { var x; Variablen sind mittels x=42; „var“ zu deklarieren. alert("Die magische Zahl ist "+x); keine Typ-Angabe nötig } </script> </head> <body > <form name="Formular" action=""> <input type="button" value="Action!" onclick="fun()"/> </form> </body> </html> Peter Sobe Internettechnologien 41 Javascript - Variablen <html> <head> <title>Eine Seite mit Javascript</title> <script type="text/javascript"> function fun() { var x; Zeichenketten können x=42; per “+“ zusammenvar Nachricht = "Die magische Zahl"; ; gebaut werden alert( Nachricht+" ist "+x); } </script> </head> <body > <form name="Formular" action=""> <input type="button" value="Action!" onclick="fun()"/> </form> </body> </html> Peter Sobe Internettechnologien 42 Javascript - Alternative function fun() { var x; x=eingabe.text; var Nachricht; if (x==42) { Nachricht = "Die magische Zahl"; } else { Nachricht =“Die gewoehnliche Zahl“; } alert( Nachricht+" ist "+x); } Alternativen mittels if (bedingung) else Bedingungen mit Relationen<,>,==,<=,>= Logische Verknüpfungen: && (UND), || (ODER), ! (NEGATION) Peter Sobe Internettechnologien 43 Javascript – Zyklus (1) function fun() { var x; x=document.eingabe.value; var Nachricht; var i = 0; while (i <=x) { alert(“Der “+ i +“ te Durchgang!“); i=i+1; } } Zyklen mittels while(…) {…} oder do {… } while(…); möglich. Peter Sobe Internettechnologien 44 Javascript – Zyklus (2) function fun() { var x; x=document.eingabe.value; var Nachricht; var i = 0; for(i=0; i<=x; i++) { alert(“Der “+ i +“ te Durchgang!“); } } For-Schleifen vorzugsweise dann, wenn vorab bekannt ist, wieviele Durchläufe erfolgen sollen. Peter Sobe Internettechnologien 45 Javascript – Zyklus (3) Für while-, do-while- und for-Schleifen kann per break – vorzeitig aus der Wiederholung ausgetreten werden continue – der aktuelle Schleifendurchlauf beendet werden und mit dem nächsten Durchlauf fortgesetzt werden. Beispiel: <script type=“text/javascript“> Es werden die var i=0; Listenpunkte von 1 bis 19 while(i<10000) erzeugt, mit Ausnahme von 7 und 13 { if (i==20) break; i++; if (i==7 || i==13) continue; document.write(“<li>Listenpunkt“+i+“</li><br/>“); } </script> Peter Sobe Internettechnologien 46 Javascript – Funktionen Ohne Parameter und Rückgabewert: function fun() { // hier der Code } Mit Parametern und Rückgabewert: function calculate(a, b) { var c = a * (1 + (b / 100)); return c; } Peter Sobe Internettechnologien 47 Javascript – Felder (1) Vereinbaren der Felder: var werte= new Array(100); var 3dpos = new Array(2); ... for (i=0;i<=100;i++) { werte[i]=i*2; } 3dpos[0]=x; 3dpos[1]=y; 3dpos[2]=z; Die Feldelemente werden beginnend mit 0 nummeriert. Wenn n Elemente vereinbart werden, dann besitzt das Feld n+1 Elemente (von Index 0 bis n). Das ist ein Unterschied gegenüber C. len = werte.length(); // gibt Anzahl Elemente zurueck, hier speziell 101 Peter Sobe Internettechnologien 48 Javascript – Felder (2) Mehrdimensionale Felder var 3dpositions = new Arrray(5); for (i=0;i<3dpositions.length;i++) 3dpositions[i] = new Array(2); for (i=0;i<=5;i++) { 3dpos[i][0]=x[i]; 3dpos[i][1]=y[i]; 3dpos[i][2]=z[i]; } Peter Sobe Internettechnologien 49 Javascript – Felder (3) Verschiedene Varianten zum Anlegen von Feldern: über die Anzahl der Elemente var 3dpos = new Array(2); über die Initialisierung der Elemente Objektname = new Array(Element0, Element1, ..., element_n); MeineKinder = new Array(„Max", „Moritz", „Hensel", „Gretel"); Ohne Länge MeineVorlesungen = new Array(); //Elemente entstehen durch ihre Referenzierung … meineVorlesungen[0]="Internettechnologien"; meineVorlesungen[1]="Parallele Programmierung"; meineVorlesungen[2]="Informatik für Chemiker"; Peter Sobe Internettechnologien 50 Javascript – Felder (4) Assoziative Felder Elemente können über ihren Inhalt referenziert werden Beispiel aus selfhtml.org: <script type="text/javascript"> var Mitarbeiter = new Array(); Mitarbeiter[0] = new Object(); Mitarbeiter[0]["Name"] = "Müller"; Mitarbeiter[0]["Vorname"] = „Fred"; Mitarbeiter[0]["Wohnort"] = "Dresden"; Mitarbeiter[1] = new Object(); Mitarbeiter[1]["Name"] = "Schulze"; Mitarbeiter[1]["Vorname"] = „Maria"; Mitarbeiter[1]["Wohnort"] = "Berlin"; Peter Sobe Internettechnologien 51 Javascript – Felder (5) Assoziative Felder (Fortsetzung) Beispiel aus selfhtml.org: for (var i = 0; i < Mitarbeiter.length; i++) { document.write("<dl><dt>Mitarbeiter " + (i + 1) + "<\/dt>"); for (var Eigenschaft in Mitarbeiter[i]) document.write("<dd>" + Eigenschaft + ": " + Mitarbeiter[i][Eigenschaft] + "<\/dd>"); document.write("<\/dl>"); } </script> Peter Sobe Internettechnologien 52 Javascript –Einbindung der Funktionen Im Javascript-Element werden eine oder mehrere Funktionen definiert. <script type=“text/javascript“> var z=0; // global variable function1() { alert(“z=“+z); } function2() { z=z+1;} </script> Es können auch mehrere Javascript-Elemente in einem Dokument eingebunden werden. Das wird gern benutzt, wenn Skripte aus externen Quelldateien eingebunden werden. <script type="text/javascript" src="../jsclasses/myjsfunctions.js" ></script> <script type="text/javascript"> function test(){ … } </script> Peter Sobe Internettechnologien 53 Javascript –Aufruf der Funktionen (1) Als Beispiel wurden drei Funktionen definiert, die nun auf unterschiedliche Art aufgerufen werden. Bei Laden der Webseite: <body onload=“test()“> … </body> Bei Button-Klick: <input type=“button“ value=“OK“ onclick=“function1()“> Bei Formular-Aktionen: <form id=“Formular1“ action=““ method=“post“ onsubmit=“function1()“ onreset=“function2()“> <input id=“werteingabe“ type=“text“ size=“5“> <input type=“submit“> value=“ Berechnen“/> <input type=“reset“> value=“ Abbruch“/> </form> Peter Sobe Internettechnologien 54 Javascript –Aufruf der Funktionen (2) Zeitgesteuerter Aufruf (Zeitwert in Millisekunden): <body onload=“settimeout(test(),1000)“> … </body> Aufruf der Funktionen untereinander: function1() { // do something function2(); } Generelles Konzept: Ein Eventhandler reagiert auf Ereignisse, die von HTML-Elementen mit entsprechenden Attributen (onclick, onload usw.) ausgelöst werden. In den Ereignis-Attributen kann direkt Javascript-Code notiert werden, oder der Aufruf von Funktionen innerhalb eines Javascript-Elements ausgelöst werden. Attribute (Auswahl): onclick für button, onchange für text, textarea, onmouseover, onload/onunload für HTML-Seiten(body) Peter Sobe Internettechnologien 55 Javascript –Aufruf der Funktionen (3) Inline-Skripte: Diese Skripte stehen innerhalb des Body und werden mit den Laden des HTML-Dokuments ausgeführt. Sie erzeugen oftmals Elemente der Webseite (auf automatisierte Art und Weise). * Listenpunkt 1 * Listenpunkt 2 * Listenpunkt 3 * Listenpunkt 4 * Listenpunkt 5 * Listenpunkt 6 * Listenpunkt 7 * Listenpunkt 8 * Listenpunkt 9 <html><head><title>Test</title></head> <body> <script type="text/javascript"> var i; document.write("<ul>"); for (i = 1; i != 10; i++) document.write("<li> Listenpunkt " + i + "</li>"); document.write("</ul>"); </script> … Peter Sobe Internettechnologien 56 Javascript –Aufruf der Funktionen (4) Inline-Skripte (Fortsetzung): Wenn document.write(“ …"); nicht erlaubt ist, können bereits bestehende Elemente gefüllt oder erweitert werden. <div id="platzhalter1"></div> <div id="platzhalter2"></div> <div id="platzhalter3"></div> <div id="platzhalter4"></div> <div id="platzhalter5"></div> <script type="text/javascript"> var i; for (i=1;i!=6;i++) { document.getElementById("platzhalter"+i).innerHTML="<p><font color='blue' size='4'>Listenpunkt"+i+"</font></p>"; alert("platzhalter"+i); } </script> Peter Sobe Internettechnologien 57 Javascript – DOM-Referenzierung (1) Knoten Attribute Vater/Kind-Knoten Siblings (Geschwisterknoten) Vater Kinder Geschwister Peter Sobe Internettechnologien 58 Javascript – DOM-Referenzierung (2) Werte über DOM-Referenz var z = document.Formular1.Eingabe.value; Funktioniert nur eingeschränkt! var e = document.getElementById(“element-id“); Über e können Werte ausgelesen und gesetzt werden. eingabe = e.value; e.value=“Standardwert“; Peter Sobe Internettechnologien 59 Javascript – DOM-Referenzierung (3) Lesen und Setzten von Attributen: var e = document.getElementById(“element-id“); Über e können Attribute ausgelesen und gesetzt werden. a = e.getAttribute(“attr-name“); e.setAttribute(“attr-name“, “attr-value“); Verkürzte Schreibweise: document.getElementById(“element-id“).setAttribute(“attr-name“, “attr-value“); Peter Sobe Internettechnologien 60 Javascript – DOM-Referenzierung (4) Javascript-Funktionen zum Zugriff auf Dokumenteigenschaften Zugriff aus Kind-Knoten: firstChild, lastChild Beispiel aus SelfHTML.org <body> <ul><li>erster Punkt</li> <li>zweiter Punkt</li> </ul> <script type="text/javascript"> var ErsterPunkt = document.getElementsByTagName("ul")[0].firstChild; document.write(ErsterPunkt.firstChild.data); </script> </body> Peter Sobe Internettechnologien 61 Javascript – DOM-Referenzierung (5) Zugriff auf Geschwister-Knoten: nextSibling (auch previousSibling) Beispiel aus SelfHTML.org <body> <ul><li>erster Punkt</li> <li>zweiter Punkt</li> </ul> <script type="text/javascript"> document.write("Das ul-Element hat folgende Knoten unter sich:<br>"); var Knoten = document.getElementsByTagName("ul")[0].firstChild; while (Knoten != null) { document.write("Einen Knoten mit dem Namen <b>" + Knoten.nodeName + "<\/b><br>"); Knoten = Knoten.nextSibling; } </script> </body> Peter Sobe Internettechnologien 62 Javascript – DOM-Referenzierung (6) Test, ob Kind-Knoten vorhanden: hasChildNodes() gibt true oder false zurück, je nach dem ob das referenzierte Element Kindknoten besitzt oder nicht Element: nodeName Knoten = document.getElementById("dasScript"); var Knoten = document.body.firstChild; document.write("Dieses Script-Element hat folgende Knotennamen: <b>" + Knoten.nodeName + "</b>"); Peter Sobe Internettechnologien 63 Javascript – DOM-Referenzierung (7) nodeType <html><head><title>Test</title> </head><body> <p align="center">ein kleiner Text</p> <script type="text/javascript"> var Element = document.getElementsByTagName("p")[0]; var Ausrichtung = Element.getAttributeNode("align"); alert(Ausrichtung.nodeType); </script> </body> </html> Knotentypen können Elementknoten (Kodierung 1), Attributknoten (2), Textknoten (3) und weitere sein Peter Sobe Internettechnologien 64 Javascript – DOM-Referenzierung (8) nodeValue <script type="text/javascript"> function TextAendern () { document.getElementById("derText").firstChild.nodeValue = document.Formular.neuerText.value; } </script> parentNode </head><body> <ul> <li>ein Punkt</li><li>ein zweiter</li></ul> <script type="text/javascript"> alert(document.getElementsByTagName("li")[0].parentNode.parentNode.tagNa me); </script> </body> Peter Sobe Internettechnologien 65 Javascript – Dynamische Effekte per DOM (1) InsertBefore <html><head><title>Test</title></head> <body> <p id="derText">Text <i id="derKursiveText">und mit kursivem Text</i></p> <script type="text/javascript"> var neuB = document.createElement("b"); var neuBText = document.createTextNode("mit fettem Text "); neuB.appendChild(neuBText); document.getElementById("derText").insertBefore(neuB, document.getElementById("derKursiveText")); </script> </body></html> Peter Sobe Internettechnologien 66 Javascript – Dynamische Effekte per DOM (2) Einfügen neuer Knoten per appendChild() <html><head><title>Test</title></head> <body> <ol id="Liste"> <li>Element</li> </ol> <script type="text/javascript"> document.getElementById("Liste").removeChild(document.getElementById("Liste").firs tChild); for (var i = 0; i < 10; i++) { var newLI = document.createElement("li"); var liNr = i + 1; var newLIText = document.createTextNode("Das ist Listeneintrag Nummer " + liNr); document.getElementById("Liste").appendChild(newLI); document.getElementsByTagName("li")[i].appendChild(newLIText); } </script> </body></html> Peter Sobe Internettechnologien 67 Javascript – Dynamische Effekte per DOM (3) zum Entfernen von DOM-Knoten: RemoveChild() innerHTML <html><head><title>Test</title> <script type="text/javascript"> var Neu = "neuer <b>fetter<\/b> Text"; function Aendern () { document.all.meinAbsatz.innerHTML = Neu; } </script> </head><body> <p id="meinAbsatz">Text</p> <a href="javascript:Aendern()">Anderer Text</a> </body></html> Peter Sobe Internettechnologien 68 Javascript – Objektorientiert Programmieren (1) Javascript kennt keine Klassen (im Gegensatz zu Java und C++); dennoch ist objektorientiertes Programmieren möglich Einige Aspekte: Variablen und Funktionen erzeugen intern Objekte z.B. erzeugen Funktionen s.g. Funktionsobjekte Javascript-Objekte sind assoziative Arrays mit Attributen und Methoden als Array-Elemente Man kann einem Javascript-Objekt zur Laufzeit neue Methoden zuweisen Vererbung über prototypische Objekte Peter Sobe Internettechnologien 69 Javascript – Objektorientiert Programmieren (2) Beispiel einer „Klasse“ mit zwei Instanzen function Klasse() { this.funktion1 = eingabe; this.funktion2 = ausgabe; } function eingabe() { … } function ausgabe() { … } obj1 = new Klasse(); obj2 = new Klasse(); obj1.fuktion1(); obj2.funktion1(); obj1.funktion2(); … Peter Sobe Eine Klasse entsteht über ein Funktionsobjekt, dem man über this weitere Funktionen zuweist. Internettechnologien 70 Javascript – Objektorientiert Programmieren (3) Vererbung: function Basisklasse() { this.attribute = “wert“; this.basisfunktion = b; } function b() { … } Function AbgeleiteteKlasse() {…} AbgeleiteteKlasse.prototyp = new Basisklasse(); obj1 = new AbgeleiteteKlasse(); obj1.basisfunktion(); … Peter Sobe Internettechnologien Vererbung kann über das Attribut „prototyp“ erzeugt werden. 71 Javascript in XHTML Das Javascript ist ein normales Element im DOM Vergleichsoperatoren <,>,<=,=> innerhalb des Skriptes werden als Tag-Kennzeichen gewertet (Problem!). Mit Kommentar: <script type=“text/javascript“> /*<![CDATA[*/ function calculate(a) { var c = 1; for (i=1;i<=a; i++) c= c*i; return c; } /*]]>*/ </script> Peter Sobe Internettechnologien Erklärung: Zeichen <,>,&, … sind innerhalb Elementen nicht erlaubt. XML-Parser übergeht Bereiche, die durch <![CDATA[ …. ]]> eingefasst sind. 72 3-Tier-Architekturen 3-Tier Architekturen Bislang betrachtet: 2-Tier Architekturen Javascript Javascript Webbrowser Webbrowser Javascript Javascript HTML, XML, +eingebettete Formate server-seitiges Scripting Webserver Peter Sobe Webserver Internettechnologien PHP 73 3.1 Server side scripting CGI Using Common Gateway Interface (CGI) < html> <head> <title>Test</title> <br> Hallo PHP </body> </html> browser client server HTTP web-server PHP as CGI program Common Gateway Interface (CGI) <?php $str=“Hallo PHP” If ($var==$res) echo $str; ?> DB (MySQL) PHP as CGI program Prof.Dr.Grossmann 74 CGI und Server-APIs • CGI can be considered as a first step towards a real 3-Tierarchitecture. The server was in the position now, to call preprepared (CGI-) programs from a fixed directory (cgi-bin). There exists some so called environment variables, which could be used as parameters for communication between server and programs. • Drawbacks: Using the CGI method it was necessary to allocate memeory to run time as well as to load a program and to start this as a process, including parameter transfer and synchronization. This is very time consuming. • Solution: The Web server were equipped with integrated interpretermoduls for a script language, so the drawbacks could be avoided and this operates very fast during run time. This was called Sever Application Programming Interface. Prof.Dr.Grossmann 75 CGI und Server-APIs < html> <head> <title>Test</title> <br> Hallo PHP </body> </html> browser client server PHP (module) .php <?php $str=“Hallo PHP” If ($var==$res) echo $str; ?> DB (MySQL) Apache web-server PHP as Prof.Dr.Grossmann integrated Apache module 76 server-seitige Verarbeitung During the last years some of such products have been developed. Microsoft called this ISAPI and Netscape NSAPI. Without a special name the web server Apachi was developed with an integrated PHP-module as virtual machine for UNIX-platfoms (shown in the slide bevor). Since last year this product is also available for Windows 2000 platforms. Using the ISAPI technology Microsoft develped its product Active Server Pages (ASP). This ASP uses the web server IIS (Windows NT, Windows 2000) together with an integrated module for the script language Visual Basic Script. Now this product is also available with the script language Jscript, the MS Java version. Prof.Dr.Grossmann 77 Active Server Pages ASP Active Server Pages HTTP-Response client HTTP-Request Build-InObjects Script-engine Component A ADO Component B WWW Server ADO – ActiveX Data Objects, u.a. ADODB Objekt für Datenbanken Prof.Dr.Grossmann DB DB 78 ASP – Request Object • The Request-object provides properties and methods, which are necessary to get , analyze and process of data transmitted from the client to the server. • The Request-object consists of (list is not complete): - the Form-collection (to get Forms-data with method POST) - the Query-String-collection (to get Forms-data with method GET) - the ServerVariables-collection (to get data from HTTP-Header) - the Cookies-collection (to read cookies) - the TotalBytes- and BinaryRead-properties (to handle file uploads) Prof.Dr.Grossmann Internettechnologien 79 ASP – Request Object / Form Collection The Form-collection reads data from a form in an document, if the submission will be done by method=POST. Attributes: REQUEST.Form.Count you get the number of fields in the form REQUEST.Form("name“) you get the value of field which nameparameter is name If there are fields in the form, which can have more than one value, then you have to use: REQUEST.Form.Count ("name“) to get the number of values of the name-field in the form REQUEST.Form("name“)(index) to get the value with the number index of field Source Code: form1.htm and form-1.asp Prof.Dr.Grossmann Internettechnologien 80 ASP – Request Object / Form Collection Example script form-1.asp: <% ... n=Request.Form("Name") f=Request.Form("fname") a=Request.Form("sex") ....... if n & f = "" then Response.Write "<i>Unfortenately we have no complete data!" else if a="male" then ca="Mr. " else ca="Mrs. " end if Response.Write "<i><b>Dear " & ca & n & "</b> , " &" your box is now available!</i><br>" Prof.Dr.Grossmann Internettechnologien 81 ASP – Request Object / Query String Collection The QueryString-collection reads data from a form in an document, if the submission will be done by method=GET. With REQUEST.QueryString.Count you get the number of fields in the form REQUEST.QueryString("name“) you get the value of field which name- parameter is name If there are fields in the form, which can have more than one value, then you have to use: REQUEST.QueryString.Count ("name“) to get the number of values of the name-field in the form REQUEST.QueryString("name“)(index) to get the value with the number index of field Source Code: form2.htm and form-2.asp ! Prof.Dr.Grossmann Internettechnologien 82 ASP – Request Object /File Upload The Request object provides two additional properties respectively methods TotalBytes and BinaryRead() to assist the file uploading. But this is ony possible, if the submission will be done by method=POST. Unfortunately these two properties could not be used together with the Formcollection. The Form-tag must have the additional parameter: “enctype=“multipart/form-data“ REQUEST.TotalBytes you get the number of bytes in the file, but including header information REQUEST. BinaryRead(1) you get the content of the file (see example) Source code: file-upload.asp ! Prof.Dr.Grossmann Internettechnologien 83 ASP – Request Object / Server Variables Server Variables Collection The Request object provides with the ServerVariables-collection a tool for the access of special variables, which contains information from the HTTP-Server. A script that lists all available Server variables: <table border=0> <% for each var in Request.ServerVariables content = Request.ServerVariables(var) if content = "" then content = "<b>(undefined)</b>“ %><TR> <TD class="varname"><%=var%></TD> <TD class="varcontent"><%=content%></TD></TR><% next %> </table> Prof.Dr.Grossmann Internettechnologien 84 ASP – Request / Response Object The Request - and the Response-object both provide with the Cookie-collection a tool to write (Response) and to read (Request) cookies to and from the client side computer. The cookies can be used, to identfy a user. Please note, because cookies will be transferred in the HTTPheader and not with the body, must this be done before the body of the document. Write a cookie: RESPONSE.Cookies( “cookie-name“ ) = “cookie-value“ cookie-name and cookie-value can be chosen freely. RESPONSE.Cookies( “cookie-name“ ).expires = CDate(“14.5.2003“) sets a deadline for the cookie. Source code: cookies-1.asp Prof.Dr.Grossmann Internettechnologien 85 ASP – Request / Response Object It is possible to write and to read cookies with more fields. Write cookie with more fields: RESPONSE.Cookies( “c-name“ )(“field-name-1“ ) = “value-1“ RESPONSE.Cookies( “c-name“ )(“field-name-2“ ) = “value-2“ To delete a cookie, it is necessary to write an expires-date of the past: RESPONSE.Cookies( “cookie-name“ ).expires = CDate(“14.5.2002“) Read cookie: content= REQUEST.Cookies( “cookie-name“ ) Prof.Dr.Grossmann Internettechnologien 86 ASP – Response Object The Response-object is responsible for the communication from the server to the client. We have already used extensively the Write-method of the Responseobject, see scripts for example form-1.asp, file-upload.asp aso. The write-method transfers text (HTML-text!) in the BODY of a document. A further method we have studied with the Cookies-collection. With RESPONSE.Cookies(“.....“) = “.....“ a new cookie will be set (written). There are some other important properties/methods: • Expires, AddHeader, Status, IsClientConnected, Flush, Redirect, Buffer Prof.Dr.Grossmann Internettechnologien 87 Einführung PHP (1) Bei 3-Tier-Anwendungen enthalten die abgeforderten Dokumente Skriptteile, die in einer Skriptsprache, wie z.B. PHP, Perl, VBScript kodiert sind. Erkennt der Server solche Skripte, übergibt er diese an ein integriertes Modul, das diese interpretiert. Die Skripte erzeugen in der Regel HTML-Texte oder anderen Inhalt, die in das HTMLDokument ausgegeben werden. Erst danach wird das Dokument vom Server zum Browser übertragen. Der Server erkennt enthaltene Skripte am Dateityp, der dann anstelle htm oder html, php ist. Dabei ist es auch möglich, dass das gesamte Dokument nur aus Skript besteht. Ist der Dateityp htm oder html, so müssen Skriptteile, die serverseitig abgearbeitet werden, durch spezielle Tags, die in der XML-Technologie als Verarbeitungsanweisungen (processing instructions) bezeichnet werden, gekennzeichnet werden. Diese genügen der Syntax: <?ziel ….?> z.B. <?xml …?>, <?xml-stylesheet …?>, <?php …?>. Peter Sobe Internettechnologien 88 Einführung PHP (2) PHP gehört zur C-Sprachfamilie, d.h. die Syntax ist weitgehend an C bzw. C++ angepasst PHP wurde 1994 von Rasmus Lerdorf als Tool zur Programmierung seiner Homepage entwickelt. PHP ist eine serverseitige Skriptsprache zur Entwicklung von dynamischen Webseiten. PHP dient u.a. dem Zugriff auf serverseitige Datenbanken. (PHP und MySQL) Peter Sobe Internettechnologien 89 Einführung PHP (3) Andere PHP-Dateien können dann statisch oder dynamisch über die PHP-Anweisungen require(…); bzw. include(); eingebunden werden. statische Einbindung: erfolgt über die PHP-Anweisung require(″Pfad/Dateiname″); z.B. require(″Skripte/Bibliothek1/Ausgabe.php″); Bei der statischen Einbindung wird der Text vor der Ausführung durch den Interpreter an diese Stelle eingefügt. dynamische Einbindung: erfolgt über die PHP-Anweisung include(″Pfad/Dateiname″); z.B. include(″Skripte/Bibliothek1/Ausgabe.php″); Bei der dynamischen Einbindung wird der Text erst während der Ausführung durch den Interpreter an dieser Stelle wie eine Funktion ausgeführt. Damit ist es möglich, durch Verwendung einer return-Anweisung ein Ergebnis, dass durch dieses Skript erzeugt wurde, an das Dokument zu übergeben. Peter Sobe Internettechnologien 90 Einführung PHP (4) Unterschiede gegenüber C/C++: Die Bezeichnungen von Variablen immer mit dem Zeichen $ beginnen. Variable müssen nicht deklariert werden, ihr Typ (integer, single, string, array, object, … ) wird mit der ersten Zuweisung festgelegt. Da es im Gegensatz zu C einen impliziten Typ String gibt, sind auch String-Operatoren, wie z.B. ″.″ für die Verkettung von Zeichenketten, definiert. Da keine Deklarationen existieren, ist eine Funktion isset(…) vorhanden, um die erfolgte Zuweisung zu einer angegebenen Variablen festzustellen. Mit der Funktion unset(…) kann man eine Variable löschen. Peter Sobe Internettechnologien 91 Einführung PHP (5) Die PHP-Version sowie weitere Details der PHP-Installation lassen sich auf einer Plattform durch die PHP-Funktion phpinfo() anzeigen. <?php phpinfo(); ?> Peter Sobe Internettechnologien 92 Einführung PHP (6) PHP-Kommentare sind identisch zu C-Kommentaren, d.h. ein Kommentar, der bis zum Zeilenende wirkt, wird durch // eingeleitet. Ein mehrzeiliger Kommentar beginnt mit der Zeichenkombination /* und endet mit der Zeichenkombination */. → wie in Javascript PHP-Ausgabe von Daten Die Ausgabe von Inhalten, die durch ein Skript erzeugt wurden, in ein HTML-Dokument ist sehr wichtig. Für die Ausgabe stehen zwei Funktionen echo; und print(); zur Verfügung. Ausgabe von HTML-Code: Sollen z.B. Werte auf neue Zeilen ausgegeben werden, so können in echo innerhalb von Zeichenketten auch HTML-Tags, wie z.B. <br /> (neue Zeile) ausgegeben werden. Peter Sobe Internettechnologien 93 Einführung PHP (7) Beispiel für Ausgabe und Kommentare: <?php //Hier steht ein einzeiliger Kommentar echo 'Das Skript enthält 2 Kommentare, ', " einen 'einzeiligen' und einen \"mehrzeiligen\" Kommentar!"; /* Die echo-Anweisung kann eine Liste von Werten, die durch Komma getrennt sind ausgeben. String-Werte werden in " oder in ' eingeschlossen, durch Wechsel zwischen " und ' können innere Zeichenketten gebildet werden. Soll in einer Zeichenkette das gleiche Begrenzungszeichen verwendet werden, muss \" oder \' kodiert werden. */ /* Hier steht ein mehrzeiliger Kommentar, gleichzeitig ist damit das Skript beendet */ ?> Peter Sobe Internettechnologien 94 Einführung PHP (8) Unterschied zwischen echo und print(): print() ist eine Funktion, die einen Funktionswert zurückgibt. Ist print() erfolgreich, so wird der Wert 1 zurück gegeben, sonst 0. Dieser Wert kann einer Variablen zugewiesen werden, und später abgefragt werden. Ein Wert 0 wird zurück gegeben, wenn z.B. der Nutzer die Verbindung zum Webserver unterbrochen hat. PHP-Variable: PHP-Variable werden durch einen Bezeichner gekennzeichnet, der mit einem $-Zeichen beginnt, z.B. $test, $_zahl_1. Es gibt auch reservierte Variable, wie z.B. $_POST. Es wird unterschieden zwischen lokalen Variablen und globalen Variablen. Peter Sobe Internettechnologien 95 Einführung PHP (9) Lokale Variable Lokale Variable gelten in dem Block, in dem sie benutzt werden. Als Block gilt dabei ein Tag <?php …?> oder eine Funktion, deren Körper in {…} eingeschlossen ist. Eine Verbundanweisung, wie z.B. if ($x>0) {……} gilt nicht als Block. globale Variable Superglobale Variable, wie z.B. $_REQUEST gelten überall. Wenn Variable, die in einem Block definiert sind, auch in anderen Blöcken (innere Blöcke oder parallele Blöcke) gelten sollen, müssen sie in diesen Blöcken als global gekennzeichnet werden. Das geschieht, indem das Wort global vor die Variable geschrieben wird: z.B. global $zahl; Peter Sobe Internettechnologien 96 Einführung PHP (10) dynamische Variable Dynamische Variable sind Variable, deren Wert (als Zeichenkette) der Name einer weiteren Variablen ist. Damit besteht die Möglichkeit, quasi eine Adress-Ebene über die Werte-Ebene zu legen. Die dynamischen Variablen sind eine Art Zeiger auf weitere Werte, die die Variablen haben, deren Namen als Wert der dynamischen Variablen vorhanden ist. Der Substitutionsmechanismus wird ausgelöst, indem vor die dynamische Variable noch $-Zeichen gesetzt wird, d.h. es stehen dann zwei $-Zeichen nebeneinander. Beispiel: $Variable=“normaler Wert“; $dynVar=“Variable“; echo $$dynVar;//es wird “normaler Wert“ ausgegeben! Peter Sobe Internettechnologien 97 PHP – Arbeit mit Variablen Funktionen zur Arbeit mit Variablen (Auswahl) isset($Variable) Der Rückgabewert ist 1, falls die Variable schon angelegt wurde, sonst 0. empty($Variable) Der Rückgabewert ist 1, falls die Variable $Variable einen Wert 0 oder als Wert die leere Zeichenkette besitzt, sonst 0. unset($Variable) Diese Funktion löscht die Variable $Variable. gettype($Variable) Der Rückgabewert ist eine Zeichenkette: „integer“, falls die Variable $Variable eine ganze Zahl ist, „string“, falls die Variable $Variable eine Zeichenkette ist, „double“, falls die Variable $Variable eine Gleitkommazahl ist, „array“, falls die Variable $Variable ein Feld (array) ist, „object“, falls die Variable $Variable ein Objekt ist, „unknown type“, falls die Variable einen Wert unbekannten Typs hat. Peter Sobe Internettechnologien 98 PHP - Konstanten Konstante Konstante werden im Script direkt kodiert: Beispiele: -36, 1.4142, 234.5e-4, ″Wort″, ΄neu΄ Werden bestimmte Konstante im Script häufig benutzt, ist es zweckmäßig, diese unter einem Namen zu vereinbaren: define(″pi″, ″3.141593″); Der vereinbarte Name wird ohne $-Zeichen benutzt. Den Wert einer Konstanten kann durch Zuweisung nicht geändert werden. Es gibt einige vordefinierte Konstanten, wie PHP_VERSION, PHP_OS, NULL, TRUE, FALSE usw. Peter Sobe Internettechnologien 99 PHP – Operatoren und Zuweisungen PHP benutzt bis auf wenige Ausnahmen die gleichen Operatoren, mit der gleichen Priorität wie die Sprache C. Das betrifft auch die Zuweisungen. Operationen mit Zeichenketten Ausnahme bilden hier die Zuweisungen von Zeichenketten, da hier im Gegensatz zu C der Typ string existiert. Viele Operationen mit Zeichenketten werden aber auch wie in C über Standardfunktionen ausgeführt. Wichtige String-Funktionen sind: int strlen(string str); … gibt die Länge eines Strings zurück int strcmp(string str1, string str2); … vergleicht zwei Strings, Rückgabe 0 bei Gleichheit int strpos (string haystack, string needle, int [offset]); … sucht den Teilstring needle in haystack und gibt Position innerhalb haystack zurück string strrev (string str); … kehrt einen String um string substr (string string, int pos, int [len]); …gibt eine Teilzeichenkette zurück Peter Sobe Internettechnologien 100 PHP – Operatoren und Zuweisungen Zusammenketten einzelner Strings: Durch den Punkt-Operator wird ein zweiter String an einen ersten String angehangen. $zielstring = $string1.$string2; Beispiel: $name=‘Max‘.‘Mustermann‘; // erzeugt MaxMustermann Formatiertes Anhängen von Variablenwerten an Strings: Variablenwerte werden in Strings konvertiert und an linksseitigen String angehangen. $outstring = "e=".e(&$anz) ."<br />Anzahl Iterationen: ".$anz; Peter Sobe Internettechnologien 101 PHP – Operatoren und Zuweisungen Operationen mit Datums- und Zeitwerten Datum und Zeit sind keine zugelassenen Typen in PHP (auch nicht in C). Praktisch wird aber häufig in Algorithmen die Manipulation von solchen Werten benötigt. In PHP ist dazu eine Reihe von Standardfunktionen vorhanden. Wichtige Funktionen sind: date(), jdmonthname(), jddayofweek(), getdate(), checkdate(), mktime(), time(), gettimeofday(). Ausschnitt aus statement_date.php <? echo "<br /><b>heutiges Datum auslesen und zerlegen</b><br />"; $d=getdate(); echo "<br />Wochentag: ".$d['weekday']; echo "<br /><br />Datum: ".$d['mday'].".".$d['month'].".".$d['year']; echo "<br /><br />Zeit: ".$d['hours'].".".$d['minutes']." Uhr"; ?> Peter Sobe Internettechnologien 102 PHP – Steuerfluss Zum imperativen Paradigma einer Programmiersprache gehören unverzichtbar neben der Sequenz von Zuweisungen, einige so genannte Kontrollstrukturen. Damit sind gemeint: Alternativen (if-Anweisungen) Mehrfachalternativen (switch-Anweisungen) kopfgesteuerte Zyklen (while-Anweisungen) fußgesteuerte Zyklen (do-while-Anweisungen) Zählzyklen (for-Anweisungen) Diese Kontrollstrukturen sind syntaktisch und semantisch vollkommen identisch zur Sprache C in PHP übernommen worden. Zusätzlich gibt es noch einen for-each-Zyklus. Hier deshalb nur kurz die Syntax der einzelnen Kontrollstrukturen. Peter Sobe Internettechnologien 103 PHP – Steuerfluss: Alternativen if (Bedingung) true-Anweisung; else false-Anweisung; Der else-Teil kann fehlen. Statt einzelner Anweisungen können auch Anweisungsblöcke, eingefaßt in {} durch if-else gesteuert werden. Beispiele: statement_else.php, statement_endif.php Mehrfachalternativen: switch(Fallvariable) { case Wert1: Anweisungen-Fall-1; break; case Wert2: Anweisungen-Fall-2; break; … case Wertn: Anweisungen-Fall-n; break; default: Anweisungen-Fall-sonst; } Peter Sobe Bei switch-case werden mehrere Anweisungen je Fall nicht in {} eingefaßt. Internettechnologien 104 PHP – Steuerfluss: Zyklen (1) kopfgesteuerte Zyklen (while-Anweisungen) while (Bedingung) { Anweisungen-Zyklus; } fußgesteuerte Zyklen (do-while-Anweisungen) do { Anweisungen-Zyklus; } while (Bedingung) Beispiel: Peter Sobe <?php $counter = 0; $test = 6; do { echo "Aktueller Zähler: $counter<br>"; $counter++; } while ($counter <= $test) ?> Internettechnologien 105 PHP – Steuerfluss: Zyklen (2) Zählzyklen (for-Anweisungen) for (LV=aw; Lauf-Bedingung; LV-verändern) { Anweisungen-Zyklus; } Mit der Lauf-Bedingung wird der Abbruch des Zyklus festgestellt (Endwert erreicht?). Mit LV-verändern wird die Schrittweite für LV realisiert. Peter Sobe Internettechnologien 106 PHP – Steuerfluss: Zyklen (3) for-each-Zyklen foreach (Feldname as Variable) { Anweisungen-Zyklus; } Mit dieser Zyklusanweisung können z.B. bequem Feldelemente aus einem array ausgelesen werden, ohne dass deren Anzahl bekannt ist. Beispiel: statement_foreach.php Peter Sobe Internettechnologien 107 PHP – Felder (1) PHP erlaubt Felder (Arrays) als gereihte Elemente, auf deren Werte über einen Index oder über einen Schlüssel (Namen) zugegriffen werden kann. Variante 1: indizierte oder numerische Felder –Zugriff auf Elemente über Index Variante 2: assoziative Felder – Zugriff auf Elemente über Variableninhalt Dem PHP-Variablenkonzept folgend, muss ein Feld nicht deklariert werden, sondern das Feld entsteht dynamisch durch Zuweisungen zur Laufzeit. Abweichend zu üblichen Programmiersprachen müssen die Elemente von PHP-Feldern nicht den gleichen Datentyp besitzen. Peter Sobe Internettechnologien 108 PHP – Felder (2) Indizierte Felder: Zuweisungen an Elemente können wie folgt kodiert werden: Beispiel: $Person[]=″Lehmann″; $Person[]=″Kurz″; $Person[]=″Schulz″; $Person[]=″Bernhardt″; Die Reihenfolge der Zuweisungen legt dann den Index fest. In die Indexklammern hätte man auch den Index von 0 beginnend eintragen können. Beim späteren Zugriff auf die Werte der Feldelemente muss aber der Index angegeben werden. Eine weitere Möglichkeit der Zuweisung von Werten besteht mit der array-Funktion: Beispiel: $Person=array(″Lehmann″, ″Kurz″,″Schulz″,″Bernhardt″); Peter Sobe Internettechnologien 109 PHP – Assoziative Felder (1) Die Zuweisungen an Elemente können folgendermaßen kodiert werden: $Person[″Direktor″]=″Lehmann″; $Person[″Abteilungsleiter″]=″Kurz″; $Person[″Programmierer″]=″Schulz″; $Person[″Verkäufer″]=″Bernhardt″; Anstelle des Index wird ein Schlüssel (key) angegeben und danach der Wert (value) des Feldelementes. Beim späteren Zugriff auf die Werte der Feldelemente muss der Schlüssel angegeben werden. Peter Sobe Internettechnologien 110 PHP - Assoziative Felder (2) Eine weitere Möglichkeit der Zuweisung von Werten besteht mit der array-Funktion, hier aber unter Angabe der Schlüssel-WertPaare. Beispiel: $Person=array(″Direktor″=> ″Lehmann″, ″Abteilungsleiter″=>″Kurz″, ″Programmierer″=>″Schulz″, ″Verkäufer″=>″Bernhardt″); Beispiele: Arrays/array_simple.php, Arrays/array_assoziative.php Peter Sobe Internettechnologien 111 PHP – Zugriff auf Feldelemente Beim späteren Zugriff auf die Werte der Feldelemente muss entweder der Index (bei indizierten Feldern) oder der Schlüssel (bei assoziativen Feldern) angegeben werden. Eine andere Möglichkeit des Zugriffs besteht über die Anwendung der each()-Funktion. Beispiel: while ($Jeder=each($Person)) echo ″<br />″.$Jeder[″value″].″ arbeitet als ″.$Jeder[″key″]; Peter Sobe Internettechnologien 112 PHP – mehrdimensionale Felder Die Zuweisungen an Elemente können folgendermaßen kodiert werden: $mitarbeiter = array("M1" => array("Clemens", "Krause"), "M2" => array("Janine","Bünning"), "M3" => array("Carolin","Scholz"), "M4" => array("Carolin","Schröder") ); D.h. der Mitarbeiter M1 hat zwei Elemente (Spalten). Das erste Element (Index 0) ist der Vorname und das zweite der Nachname. Der Zugriff wäre damit: echo "<br />Vorname=".$mitarbeiter[M1][0]; echo "<br />Nachname=".$mitarbeiter[M1][1]; Beispiel: Arrays/array_multi.php Peter Sobe Internettechnologien 113 PHP – Formatierte Ausgabe (1) Mit der Funktion printf() können analog zur Programmiersprache C formatierte Zeichenketten und Variableninhalte geformt werden. Syntax: printf(String formatstring, mixed [args] …); Im Formatstring kann ein konstanter String angegeben werden, der mit einer variablen Anzahl von Umwandlungsangaben angereichert ist. Für jede Umwandlungsangabe wird der Wert einer Variablen eingesetzt. Die Variablen sind als weitere Argumente (args) in der Reihenfolge ihrer Umwandlungsangaben angegeben. Beispiel: printf(“Seit dem letzten Aufruf der Webseite sind %d Tage vergangen\n“, $delta_tage); Umwandlungsangabe Peter Sobe Variable Internettechnologien 114 PHP – Formatierte Ausgabe (2) Beispiel: printf(“<p> Das Datum ist: %02d. %02d. %04d </p>\n“, tag,mon,jahr); Die Umwandlungsangaben sind hier %02d, %02d und %04d. Am Platz von %02d, %02d, %04d werden die Werte von tag, mon, jahr als 2- bzw. 4-stellige Dezimalzahlen ausgebeben. Im Beispiel werden führende Nullen vorangestellt (wegen 02d anstatt 2d). Ausgabe: Das Datum ist: 24. 02. 2011 Peter Sobe Internettechnologien 115 PHP – Formatierte Ausgabe (3) printf Umwandlungen: Umwandlungszeichen Argument; Umwandlung in d,i int; dezimal mit Vorzeichen. o int; oktal ohne Vorzeichen (ohne führende Null). x,X int; hexadezimal ohne Vorzeichen (ohne führendes 0x oder 0X) u int; dezimal ohne Vorzeichen. c int; int einzelnes Zeichen, nach Umwandlung in unsigned char. s char*; aus einer Zeichenkette werden Zeichen ausgegeben f double; dezimal als [-]mmm.ddd, wobei die Genauigkeit die Anzahl der d festlegt. Voreinstellung ist 6; bei 0 entfällt der Dezimalpunkt. e,E double; dezimal als [-]m.dddddde±xx oder [-]m.ddddddE±xx, wobei die Genauigkeit die Anzahl der d festlegt. Voreinstellung ist 6; bei 0 entfällt der Dezimalpunkt. g,G double; %e oder %E wird verwendet, wenn der Exponent kleiner als -4 oder nicht kleiner als die Genauigkeit ist; sonst wird %f benutzt. Null und Dezimalpunkt am Ende werden nicht ausgegeben. Peter Sobe Internettechnologien 116 PHP – Funktionen (1) PHP benutzt im Wesentlichen das Funktionskonzept der Sprache C. Häufig wiederkehrende Anweisungsfolgen können als Funktion zusammengefasst werden und unter dem Funktionsnamen aufgerufen werden. Es wird unterschieden zwischen Definition und Aufruf der Funktion. Funktionen sind parametrisierbar (Call-by-Value- und Call-byReference-Parameter sind möglich) Ein Rückkehrwert kann (muss nicht) erzeugt werden. Im Gegensatz zu allen derzeit genutzten Programmiersprachen lässt PHP Seiteneffekte bei Funktionen zu. Peter Sobe Internettechnologien 117 PHP – Funktionen (2) Da PHP kein explizites Typkonzept hat, wird auch in der Kopfzeile der Funktionsdefinition anstelle des Typs des Rückkehrwertes nur function geschrieben. Durch eine innere return-Anweisung liegt dann implizit der Typ fest. Damit ist der syntaktische Rahmen wie folgt zu kodieren: Definition: function fname($par1, $par2,…,&$p1,&$p2,…) { lokale Deklarationen; Anweisungen; [return Ausdruck;] Call-by} Call-by-Value Reference Aufruf: [$wert =] fname($pa1,$pa2, …,&$po1,&$po2); Peter Sobe Internettechnologien 118 PHP – Funktionen (3) Eine Funktion bildet einen eigenen Gültigkeitsbereich für Variable, die im Teil lokale Deklarationen angegeben sind oder Parameter darstellen. In der Kopfzeile sind die Parameter angegeben, wobei die Parameterliste auch leer sein kann. Sind Parameter über ein vorangestelltes & gekennzeichnet, so sind das Ergebnisparameter (call by reference). Die return-Anweisung kann auch fehlen, dann gibt es keinen Rückgabewert. Es können auch rekursive Funktionen kodiert werden. Peter Sobe Internettechnologien 119 PHP – Funktionen (4) PHP-Beispiel einer Funktion: Funktion e mit einem Referenzparameter function e(&$a) {$s=1.0; $p=1.0; $f=1.0; $a=0;$i=1; while ($p>0.0000001) { $f=$f*$i; $p=1.0/$f; $s=$s+$p; $i=$i+1; $a=$a+1; } return $s; } 1 e i! i 0 Aufruf der Funktion e mit einem Adressargument: echo "e=".e(&$anz) ."<br />Anzahl Iterationen: ".$anz; Peter Sobe Internettechnologien 120 PHP – Formularverarbeitung (1) Die superglobalen Variablen $_GET bzw. $_POST enthalten als Feld Informationen, die auf der Clientseite in Formularelemente, wie INPUT-Elemente, RADIO-, CHECK-Felder usw. eingetragen wurden und serverseitig abrufbar sind. Die Namen der superglobalen Variablen weisen dabei auf die Übertragungsart hin. Ist man nicht sicher, welche Methode, GET oder POST verwendet wurde, sollte anstelle dieser, die superglobale Variable $_REQUEST verwendet werden. Die superglobalen Variablen $_GET, $_POST, $_COOKIE, $_SERVER, $_FILES, $_ENV, $_REQUEST sind assoziative Felder. Peter Sobe Internettechnologien 121 PHP – Formularverarbeitung (2) Formular in php <FORM method="POST" action=“auswertung.php" > <INPUT NAME="fname" TYPE="text" VALUE=“”> <INPUT NAME="Name" TYPE="text" VALUE=""> <INPUT NAME="sex" TYPE="radio" VALUE="male" CHECKED> <INPUT NAME="sex" TYPE="radio" VALUE="femal"> <INPUT NAME="user" TYPE="text" VALUE=""> <INPUT NAME="psw" TYPE="password" VALUE=""> </FORM> auswertung.php … $fn=$_POST['fname'] ; $n=$_POST['Name'] ; $s=$_POST['sex'] ; $u=$_POST['user'] ; $p=$_POST['psw'] ; … Peter Sobe Internettechnologien 122 PHP – Formularverarbeitung (3) Im assoziativen Feld muss der Name des betreffenden Formularelementes (Wert des Name-Attributes) als Index angegeben werden. Angenommen es existiert im Formular ein Inputfeld: <INPUT type=″text″ name=″Vorname″ /> so kann im Skript mit dem PHP-Ausdruck $_POST['Vorname'] der eingetragene Wert übernommen werden. Sollte die Herkunft des Wertes über GET, POST oder COOKIE keine Rolle spielen, ist zweckmäßigerweise die superglobale Variable $_REQUEST für die Übernahme zu verwenden. Ob ein Werteeintrag erfolgte, kann mit der PHP-Funktion isset() getestet werden. Beispiel: $_REQUEST['Vorname'] Peter Sobe Internettechnologien 123 PHP – Dateiarbeit (1) Das Dateikonzept von PHP hat auch große Ähnlichkeit mit dem Dateikonzept der Sprache C. Die meisten Funktionen zum Öffnen, zum Schließen, zum Lesen und zum Schreiben sind identisch. mehr als 50 Funktionen für Dateiarbeit verfügbar. Hier werden nur die wichtigsten Funktionen behandelt. Unterschiede gegenüber Unix bei der Arbeit mit Verzeichnissen. Durch PHP kann auf Serverseite auch auf Pfade zugegriffen werden kann, die außerhalb des Publikationsverzeichnisses des Webservers liegen. Peter Sobe Internettechnologien 124 PHP – Dateiarbeit (2) Das Schema der Arbeit mit Dateien besteht aus folgenden Schritten: Datei öffnen mit fopen() , es wird ein Handle (Adresse) angelegt; evtl. wird eine nicht existierende Datei zum Schreiben angelegt; wenn Fehler auftreten werden diese behandelt treten keine Fehler auf, werden zum Lesen geöffnete Dateien bis zur Erkennung des Datei-Ende (EOF) gelesen, z.B. mit fread() ; zum Schreiben geöffnete Dateien werden solange wie notwendig geschrieben, z.B. mit fwrite() Datei schließen mit fclose() Vor dem Öffnen der Datei kann geprüft werden, ob die Datei existiert oder es können auch Operationen mit dem Verzeichnis vorgenommen werden. Peter Sobe Internettechnologien 125 PHP – Dateiarbeit (3) file_exists() Eine Datei kann mit dieser Funktion auf Vorhandensein geprüft werden. Als Argument ist der Pfad einschließlich Dateinamen anzugeben. Im Erfolgsfall gibt die Funktion true zurück. is_file() Eine Datei kann mit dieser Funktion auf die Eigenschaft reguläre Datei geprüft werden, also z.B. kein Verzeichnis. Als Argument ist der Pfad einschließlich Dateinamen anzugeben. Im Erfolgsfall gibt die Funktion true zurück. is_readable() / is_writeable() Eine Datei kann mit diesen Funktionen auf Vorhandensein des Leserechts /Schreibrechts geprüft werden. Als Argument ist der Pfad einschließlich Dateinamen anzugeben. Im Erfolgsfall gibt die Funktion true zurück. Beispiel: file_check.php Peter Sobe Internettechnologien 126 PHP – Dateiarbeit (4) Eine Formatierte Datei- Eingabe wird durch die PHP-Funktionen fscanf() erreicht: mixed fscanf(ressorce handle, string formatstring [, string var 1] ) Die gelesenen Variablen können dem zurückgegebenen Array oder den Parametern nach formatstring entnommen werden. Beispiel: <?php $handle= fopen(“meinedatei.txt“,“r“); while ( $info = fscanf($handle, “%s \t %s \n“, )) { list($wert1, $wert2)= $info; // verarbeite wert1 und wert2 } fclose ($handle); ?> Peter Sobe Internettechnologien 127 PHP – Dateiarbeit (5) Datei-Management: copy, rename, unlink (Löschen) Verzeichnis-Zugriff: mkdir, chdir, rmdir, opendir, readdir, rewinddir oder Nutzung der Klasse dir Schnittstelle und Verhalten der Funktionen weitestgehend nach Clib-Schnittstelle Verzeichnis auflisten (klassisch): $verzeichisname = "/"; $verzeichnis = opendir($verzeichnisname); while($dateiname = readdir($verzeichnis)) printf("%s <br/>\n",$dateiname); closedir($verzeichnis); Peter Sobe Internettechnologien 128 PHP – Dateiarbeit (6) Verzeichnisarbeit bei Benutzung der Dir-Klasse: $verzeichnis = dir("/"); while($dateiname=verzeichnis->read()) printf("%s <br/>\n",$dateiname); $verzeichnis->close($verzeichnis); Peter Sobe Internettechnologien 129 PHP – Cookies (1) Client (Browser) Cookies zur Client-seitigen Speicherung von Informationen Webserver PHP Dateien als Speicherform der HTML-Seiten, PHP-Skripte, eingebetteten Inhalte Peter Sobe Dateien und Datenbanken zur Server-seitigen Speicherung von Informationen Internettechnologien 130 PHP – Cookies (2) Aufbau eines Cookies Die nachfolgende Tabelle gibt den schematischen Aufbau eines Cookie wieder. Funktion Beschreibung name Name des Cookies value die zu speichernden Daten expires Verfallsdatum des Cookies path legt fest welcher Pfad das abgelegte Cookie wieder lesen darf domain legt die Domain fest, die dieses Cookie auslesen kann secure beschränkt den Cookie auf SSL-Verbindungen Der Nutzinhalt eines Cookies ist die Name-Wert-Angabe. In der Regel besteht ein Cookie aber aus mehreren Name-Wert-Paaren, die dann beim Auslesen die Elemente eines assoziativen Feldes bilden. In PHP heißt das assoziative Feld $_COOKIE. Peter Sobe Internettechnologien 131 PHP – Cookies (3) PHP-Funktionen zum Umgang mit Cookies Sind die Namen bekannt, z.B. Name1, so erhält man mit $_COOKIE[Name1] den zugeordneten Wert. Sind die Cookie-Namen nicht bekannt, so lassen sich alle Inhalte über eine foreach-Schleife auslesen, wie es das Skript-Beispiel zeigt. <?php // Durch den Web-Server generierter Cookie-Inhalt echo "\n<b> \$_COOKIE - Inhalt (Elemente zeilenweise):\n"; foreach ($_COOKIE as $k => $v) { echo "<br> $k = $v\n"; }; echo "</b>" ?> Demonstration: cookie-1.php Peter Sobe Internettechnologien 132 PHP – Cookies (4) PHP-Funktionen zum Umgang mit Cookies (Fortsetzung) Das Verfallsdatum ist in Sekunden nach dem 1.1.1970 anzugeben. Den aktuellen Zeitstempel holt man sich dabei zweckmäßigerweise durch den Aufruf der time()-Funktion und addiert das Verfallsintervall in Sekunden. Die Anzahl der Cookies, d.h. der vorhandenen Name-Wert-Paare lässt sich durch die PHP-Funktion count() ermitteln. Der Aufruf count($_COOKIE) liefert die Anzahl der Cookies. Mit der Funktion array_keys() lassen sich die Namen der Name-WertPaare ermitteln, wobei der Index des Paares in einer foreach-Schleife definiert werden muss. Der erste Index ist 0. Der Aufruf in der Schleife muss array_keys($_COOKIE) sein. Beispiel-Skript: cookie-5.php zur Verwendung dieser PHP-Funktionen. Peter Sobe Internettechnologien 133 PHP – Cookies (5) PHP-Funktionen zum Umgang mit Cookies (Fortsetzung) Funktion setcookie() zum Erzeugen von Cookies. Die Argumente des Aufrufs entsprechen dabei der Reihenfolge der Parameter in der angegebenen Tabelle. Syntax: setcookie( name, wert, expires, path, domain, secure); Beispiel: setcookie(“user”, “unbekannt”, time()+3600*24); Der Aufruf von setcookie() muss dabei, zeitlich vor allen Ausgaben der Cookie Namen und Values erfolgen, damit das Cookie sichtbar ist! Beispiel: cookies-2.php umseitig Peter Sobe Internettechnologien 134 PHP – Cookies (6) Beispiel für das Setzen von Cookies: <?php #Hier wird Cookie-Inhalt erzeugt setcookie("Nutzer","Mustermann",time()+3600); setcookie("Profil","Standard",time()+3600); setcookie("Login","geheim",time()+3600); echo "<b>Auslesen von übertragenen Cookie-Inhalten:</b><br/>\n"; echo "\n<b> \$_COOKIE - Inhalt (Elemente zeilenweise):\n"; foreach ($_COOKIE as $k => $v) { echo "<br> $k = $v\n"; }; echo "</b>" ?> Peter Sobe Internettechnologien 135 PHP – Cookies (7) Verändern von Cookie-Inhalten in PHP Zum Verändern von Cookie-Inhalten müssen die Namen der NameWert-Paare bekannt sein. Es ist dann nur ein neuer Aufruf von setcookie() mit dem Namen und dem neuen Inhalt zu kodieren. Für den expires-Parameter ist eine 0 (keine Änderung!) anzugeben. Angenommen, es ist der Inhalt des Cookie Login in „Niemand“ zu verändern. Dann genügt ein Aufruf setcookie( „Login“, „Niemand“, 0); Beispiel-Skript cookies-3.php zur Erzeugung von Cookies Peter Sobe Internettechnologien 136 PHP – Cookies (8) Löschen von Cookie-Inhalten: Dazu müssen die Namen der Name-Wert-Paare bekannt sein. Es ist dann nur ein neuer Aufruf von setcookie() mit dem Namen und einer leeren Zeichenkette für den Inhalt zu kodieren. Für den expires-Parameter ist time() anzugeben. Damit wird das Verfallsdatum auf „jetzt“ gesetzt, was einem Löschen des betreffenden Cookies entspricht! Angenommen, es ist das Cookie Login zu löschen. Dann genügt ein Aufruf setcookie( „Login“, „“, time()); Beispiel-Skript cookies-4.php zur Erzeugung von Cookies Peter Sobe Internettechnologien 137 PHP – Sessions (1) Was ist eine Session? Als Session wird eine Abfolge von Kommunikationen eines Nutzers mit einer bestimmten Web-Applikation bezeichnet, die der Nutzer von einem bestimmten Web-Server anfordert. Diese Anforderungen gehören logisch zusammen, bilden also so genannte Transaktionen, die über eine Zustandsverwaltung der Web-Applikation realisiert werden müssen. Ein Web-Server erkennt eine Folge von httpAnforderungen eines bestimmten Nutzers nicht als zusammen gehörig, da http ein zustandsloses Protokoll ist. E-Shops, z.B. erfordern typischerweise Transaktionen und müssen deshalb eine Session-Verwaltung vorsehen Peter Sobe Internettechnologien 138 PHP – Sessions (2) Grundsätzliche Technologien einer Session-Verwaltung Die Session-Verwaltung muss grundsätzlich Sessions unterschiedlicher Nutzer auseinander halten können, d.h. über einen geeigneten Mechanismus müssen solche parallele Sessions gegeneinander isoliert sein. Die Isolation stellt die wichtigste Eigenschaft einer Transaktion dar. Zur Unterscheidung von Sessions werden so genannte Session-ID’s eingeführt. Diese werden serverseitig so erzeugt, dass sie eine Session eineindeutig identifizieren können und möglichst nicht manipulierbar sind. PHP unterscheidet für eine Session 3 Zustände: - Status normal (Code 0) - Status abgebrochen (Code 1) - Status Zeitüberschreitung (Code 2) Peter Sobe Internettechnologien 139 PHP – Sessions (3) Zur Arbeit mit diesen Zuständen stehen folgende Funktionen zur Verfügung: connection_status(): Gibt alle Statuswerte zurück. connection_aborted(): Stellt fest, ob die Verbindung unterbrochen wurde (->true). connection_timeout(): Stellt fest, ob es zu einem Abbruch infolge einer Zeitüberschreitung kam (->true). ignore_user_abort(): Verhindert, dass Nutzer die Verbindung unterbrechen. set_time_limit(sekunden): Setzt die Zeitbegrenzung in Sekunden. Peter Sobe Internettechnologien 140 PHP – Sessions (4) Folgende Technologien haben sich als grundsätzlich geeignet herausgestellt und werden in realen Systemen auch benutzt. Dabei haben diese Technologien unterschiedliche Vor- und Nachteile: Speicherung des Status in versteckten Feldern Speicherung des Status in der URI Nutzung von Cookies Speicherung in einer Datei Speicherung in einer Datenbank Die ersten drei Technologien nutzen clientseitige Unterstützung, während die letzten nur auf serverseitigen Abläufen basieren. Serverseitige Technologien sind unabhängig von Browsern und weniger anfällig für Angriffe. Ohne die Unterstützung clientseitiger Technologien, bleibt nur die Möglichkeit einer Nutzerauthentifikation mit Login und Passwort. Wechselt der Nutzer häufig den Rechner, nützen auch Cookies nichts, es bleiben nur serverseitige Technologien. Peter Sobe Internettechnologien 141 PHP – Sessions (5) Sessions mit versteckten Feldern: Neben der Session-ID sind häufig auch noch bestimmte, nutzerabhängige Einstellungen zwischen Webseiten und zwischen Aktionen einer Transaktion zu übertragen. Die Übertragung in versteckten Feldern ist sehr ressourcensparend aber an Formulare gebunden, die die Bewegung des Nutzers zwischen den Skripten begleiten. Eine Session-ID kann z.B. wie folgt erzeugt werden: <?php if (!$session) {$session=md5(uniqid(rand());} ?> Dann wird diese Variable als Wert eines versteckten Feldes eingesetzt: Peter Sobe Internettechnologien 142 PHP – Sessions (6) Sessions mit versteckten Feldern (Fortsetzung): Dann wird diese Variable als Wert eines versteckten Feldes eingesetzt: <INPUT type=“hidden“ value=“<?php echo $session; ?>” name=”session” /> Auf der nächsten Seite wird dieselbe Sequenz erneut eingefügt. Wird ein verstecktes Feld übergeben, erzeugt PHP automatisch eine Variable mit dem Namen und dem Inhalt des Feldes. Die Übergabe auf das nächste Skript erfolgt mit dem Form-Tag: <FORM method=“POST“ action=“naechster.php“> …. hier stehen die versteckten Felder <INPUT type=“submit“ value=“Weiter“ /> </FORM> Peter Sobe Internettechnologien 143 PHP – Sessions (7) Sessions mit Cookies verwalten Cookies sind das einfachste Mittel, Sessions zu verwalten. Dabei wird zu Beginn der Session eine Session-ID erzeugt und im Cookie gespeichert. Im unten angegebenen Beispiel wird diese aus einer Kombination aus IP-Nummer und Zufallszahl erzeugt und MD5-verschlüsselt <?php if (!$sessionid) { mt_srand((double)microtime()*1000000); $sessionid = md5(str_replace(".","",$REMOTE_ADDR)+ mt_rand(100000,999999)); setcookie("sessionid", $sessionid); } ?> Im Beispiel session_cookie.php (Ordner Sessions) wurde dieses Scriptteil in ein kleines HTML-Dokument eingebettet. Peter Sobe Internettechnologien 144 PHP – Sessions (8) PHP-Funktionen zur Session-Verwaltung PHP stellt Funktionen zur komfortablen Session-Verwaltung zur Verfügung. Die in PHP verwendeten Session-Funktionen basieren auf Cookies bzw. alternativ auf der Weitergabe von Session-Daten über die URL. session_start … startet eine Session und sollte vor der ersten HTML Ausgabe aufgerufen werden. session_destroy … beendet die Sitzung explizit. Die Sitzung endet auch (implizit) mit dem Schließen des Webbrowsers. session_name … setzt den Namen einer Session oder gibt diesen zurück. Das ist dann auch der Name des für die Session benutzten Cookies oder des weitergegebenen Parameters session_id … setzt eine eindeutige id für die Session oder gibt sie zurück Peter Sobe Internettechnologien 145 PHP – Sessions (9) PHP-Funktionen zur Session-Verwaltung (Fortsetzung) session_register … registriert eine Variable innerhalb der aktuellen Sitzung. Die Variable und ihr Wert steht dann in allen Skripten über die gesamte Dauer der session zur Verfügung. session_unregister … entregistriert eine Variable. session_is_registered … gibt an, ob eine Variable innerhalb der session registeriert ist session_encode / session_decode … serialisiert Session-Daten und registrierte Variablen session_save_path … setzt den Pfad zum Speichern einer Sitzung oder gibt ihn zurück. Session-Daten werden nach Beenden eines Skripts gespeichert. Peter Sobe Internettechnologien 146 PHP – Sessions (10) Ein Minimal-Beispiel zu PHP-Sessions: Skript 1: <?php session_start(); $zaehler=0; session_register(zaehler); ?> <html><head><title>Web 1</title></head> <body><a href=“skript2.php?<?=sid?>“>skript2.php</a><br/> </body></html> Die Variable $zaehler steht über die gesamte Dauer der session zur Verfügung. Webseite 2: <?php session_start(); echo “Zaehler= $zaehler“; ?> Peter Sobe Internettechnologien 147 Datenbankzugriff Internet-Anwendungen mit Datenbankzugriff sind s.g. 4-TierArchitekturen: Clientebene Tier 1 Präsentationsebene www.webpage.com (HTML) Text Ebene des Webservers Tier 2 Verteilungsebene Ebene der Anwendungslogik (serverseitige Skripte) Tier 3 Webserver serverseitiges Script-Programm Datenbankebene Tier 4 Persistenzebene Danbankmanagementsystem (DBMS) Internet Information Server oder Apache Peter Sobe Active Server Pages oder PHP Internettechnologien MS access, SQL Server oder MySQL 148 PHP-Datenbankzugriff (1) Verbinden mit einem Datenbanksystem: Als erster Schritt muss immer mit einem Datenbanksystem Verbindung aufgenommen werden. Das Datenbanksystem (hier MySQL) kann auf dem gleichen Rechner wie der Webserver laufen, oft aber auch auf seperaten Rechnern, für die eine IPAdresse anzugeben ist. Beispiel: $host=“localhost“; // in diesem Fall ein lokales Datenbanksystem $user=“httpd“; $passwort = ““; $verbindung = mysq_connect($host, $user,$passwort); if ($verbindung) { echo “<p>mit Datenbanksystem verbunden </p>\n“;} else {echo “<p>Fehler beim Verbinden mit Datenbanksystem </p>\n“;} Peter Sobe Internettechnologien 149 PHP-Datenbankzugriff (2) Verbinden mit einem Datenbanksystem: Die Funktion mysql_connect stellt die Verbindung mit einem MySQL-Datenbanksystem her. int mysql_connect(string [hostname [:port] [:/path/to/socket]], string [username], string [passwort]); Bei erfolgreichem Verbinden wird ein Link-Identifier zurückgegeben, der in allen Funktionen zur Arbeit mit der Datenbank angegeben werden muss. Trennen von einem Datenbanksystem: int mysql_close(int [link_identifier]); Informationen zu Fehlern ausgeben: int mysql_errno (int [link_identifier]); Peter Sobe Internettechnologien 150 PHP-Datenbankzugriff (3) Ein Datenbanksystem kann eine Reihe verschiedener Datenbanken verwalten. Jede Datenbank organisiert die Daten selbst möglicherweise in mehreren Tabellen. Auswählen einer Datenbank: $dbname=“opticalproducts“; if (mysql_select_db($dbname, $verbindung )) { echo “<p>Datenbank erfolgreich ausgewählt</p>\n“;} else {echo “<p>Fehler beim Auswählen der Datenbank </p>\n“;} … Syntax und Interface: int mysql_select(string database_name, int [link_identifier]); Peter Sobe Internettechnologien 151 PHP-Datenbankzugriff (4) Wenn für eine Verbindung eine Datenbank ausgewählt wurde, können Zugriffe auf die Datenbank erfolgen. Beispiel: Zeilen (rows) abrufen und als HTML ausgeben $sql = “SELECT * FROM opticalproducts“; $ergebnis = mysql_query($sql, $verbindung); if ($ergebnis) { echo “<table>“; while ($zeile = mysql_fetch_row($ergebnis)) { echo “<tr>“; for ($i=0; $i<mysql_num_fields($ergebnis);$i++) echo “<td>. $zeile[$i].</td>“; echo “</tr>“; } echo </table> mysql_free_result($ergebnis); } else { echo “Fehler bei Abfrage“; } Peter Sobe Internettechnologien 152 PHP-Datenbankzugriff (5) Datenbankzugriffsfunktionen: int mysql_query(string SQL_anfrage, int [link_identifier]); Die Anfrage wird als String in der SQL-Syntax übergeben (SQL: Structured Query Language) Die Funktion liefert einen Verweis auf ein Ergebnis (Null wenn Anfrage nicht erfolgreich war). Das Ergebnis besteht aus keiner, einer, oder mehreren Zeilen, die schrittweise abgefragt werden können. int mysql_num_rows(int ergebnis); … gibt die Anzahl der Zeilen im Ergebnis zurück. array mysql_fetchrow(int ergebnis); … wählt die jeweils nächste Zeile im Abfrageergebnis aus. Als Rückgabe wird ein Array erzeugt, das die einzelnen Werte der Zeile enthält. Peter Sobe Internettechnologien 153 PHP-Datenbankzugriff (6) Datenbankzugriffsfunktionen (Fortsetzung): mysql_free_result(int ergebnis); … schließt die Ergebnismenge und gibt die Ressourcen frei mysql_fetch_row() gibt immer die nächste Zeile zurück. Es ist aber auch möglich, spezielle Zeile auzuwählen: mysql_data_seek(int ergebnis, int row_number); Nach mysql_data_seek() gibt der nächste mysql_fetch_row()Aufruf die durch row_number bezeichnete Zeile des Abfrageergebnisses aus. Peter Sobe Internettechnologien 154 PHP-Datenbankzugriff (7) Varianten des Zugriffs auf Abfrageergebnisse: Bislang bekannt: array mysql_fetchrow(int ergebnis) … liefert ein numerisches Array a zurück, das über die Indizes 0 bis mysql_num_fields($a)-1 angesprochen werden kann array mysql_fetch_array(int ergebnis, int [erg_type]) liefert als Standard ein assoziatives Array zurück. Die Funktion kann durch erg_type=MYSQL_ASSOC oder erg_type=MYSQL_NUM zwischen der Ausgabe eines assoziativen oder numerischen Arrays umschalten. Beispiel umseitig: Peter Sobe Internettechnologien 155 PHP-Datenbankzugriff (8) Beispiel zu mysql_fetch_array(int ergebnis, int [erg_type]) … $ergebnis = mysql_query(“SELECT * FROM pruefungsergs“); while($zeile = mysql_fetch_array($ergebnis ,MYSQL_ASSOC)) { while(list($index,$wert) = each($zeile)) echo “$index : $wert “; echo “<br/>“; } Matrnr Name Vorname Note Bei einer 111222 Meier Max 2.3 Tabelle laut … 111225 Schulze Iris 1.7 würde man erhalten: Matrnr : 111222 Name : Meier Vorname : Max Note : 2.3 Matrnr : 111225 Name : Schulze Vorname : Iris Note : 1.7 Peter Sobe Internettechnologien 156 PHP-Datenbankzugriff (9) Eine weitere Variante ist die zeilenweise Ausgabe des Abfrageergebnisses als Objekt: object mysql_fetch_object(int result, int [result_typ]) Beispiel aufbauend auf letzter Tabelle: echo “<table>“; while( $zeile=mysql_fetch_object($ergebnis)) { echo “<tr>“; echo “<td>“. $zeile->Matrnr . “ </td> <td>“. $zeile->Note . “</td>“; echo “</tr> \n“; } echo “</table>“; Ausgabe: 111222 2.3 111225 1.7 Peter Sobe Internettechnologien 157 PHP-Datenbankzugriff (10) Einfügen von Daten: $sql=“INSERT INTO pruefungsergs (Matrnr, Name, Vorname, Note) VALUES=(111228, ‘Lehmann‘, ‘Friedrich‘, 1.0)“; if (mysql_query($sql, $verbindung) ) echo mysql_affected_rows() . “Datensätze eingefügt.“; else echo “Fehler: keine Daten eingefügt“; Einfügen erfolgt über entsprechende SQL-Anweisung typisch sind Formulare, die Daten aus $_POST- Feldelementen in eine Datenbank einfügen. Peter Sobe Internettechnologien 158 Exkurs: Relationale DB und SQL (1) Tabellen = Relationen Zeilen = Tupel Tabellenname Attribut Wetter Ortsnr Ortsname Temperatur Luftdruck 1 Dresden 22 1012 2 Leipzig 20 1010 3 Berlin 25 998 … … … … Peter Sobe Wert mit einem speziellen Datentyp, der je Attribut definiert ist Tupel, auch Datensatz oder Zeile 159 Exkurs: Relationale DB und SQL (2) Datenbanken bestehen typischerweise aus mehreren Tabellen = mehrere Relationen → Mengenorientierte Operationen – Relationenalgebra Die Ausgabe ist immer wieder eine Relation, d.h. eine Tabelle Peter Sobe Internettechnologien 160 Exkurs: Relationale DB und SQL (3) Verkauf Produkte Verk. Nr. ProduktID Anzahl Kunde-ID 1 T 4 42 2 A 2 42 3 K 1 20 4 A 3 20 5 G 1 17 6 T 8 17 Kunden 7 B 4 20 Kunde-ID Name Adresse … … … … 17 Peter 33200 Feldstadt Am Markt 5 20 Kurt 33221 Bachhagen, Hauptstr. 23 42 Heidi 33333 Wiesenhain, Am Waldrand 1 Entwurf durch Menschen mit etwas Kenntnis des Diskursbereichs, auch ein regelbasierter Entwurf ist möglich Peter Sobe Produkt-ID Name Preis T Tomate 0.20 A Apfelsaft 1.40 K Katzenfutter 2.30 G Gurke 0.55 B Bier 0.78 161 Exkurs: Relationale DB und SQL (4) Mengenorientierte Operationen: Projektion – Auswahl spezieller Spalten Selektion – Auswahl von Zeilen nach Bedingungen Verbund (Join) – Kombination zweier Tabellen zu einer durch ein Verbundprädikat Differenz – Entfernen von Zeilen einer Tabelle, die auch in einer zweiten enthalten sind Durchschnitt – Ausgabe nur von den Zeilen, die in zwei Ausgangstabellen enthalten sind Peter Sobe Internettechnologien 162 Exkurs: Relationale DB und SQL (5) SQL-Anfrage-Grundstruktur SELECT merkmale FROM tabelle [WHERE bedingung] Projektion – Auswahl spezieller Spalten SELECT Name, Preis FROM Produkte Selektion – Auswahl von Zeilen nach Bedingungen SELECT * FROM Produkte WHERE Preis>1.00 Peter Sobe Internettechnologien ProduktID Name Preis T Tomate 0.20 A Apfelsaft 1.40 K Katzenfutter 2.30 G Gurke 0.55 B Bier 0.78 ProduktID Name Preis T Tomate 0.20 A Apfelsaft 1.40 K Katzenfutter 2.30 G Gurke 0.55 B Bier 0.78 163 Exkurs: Relationale DB und SQL (6) SQL-Anfragen Verbund (Join) – Kombination zweier Tabellen zu einer durch ein Verbundprädikat SELECT * FROM Verkauf AS v JOIN Produkte AS p WHERE v.Produkt-ID = p. Produkt-ID Verkauf Produkte Verk.Nr. Produkt-ID Anzahl Kunde-ID Name Preis 1 T 4 42 Tomate 0.20 2 A 2 42 Apfelsaft 1.40 3 K 1 20 Katzenfutter 2.30 4 A 3 20 Apfelsaft 1.40 5 G 1 17 Gurke 0.55 6 T 8 17 Tomate 0.20 7 B 4 20 Bier 0.78 Peter Sobe Internettechnologien 164 PHP- Umgang mit Datenbanken (1) Weitere Funktionen zum Umgang mit Datenbanken (Erzeugen, Löschen) und Tabellen (Erzeugen, Löschen) … Zum Beispiel zum Erzeugen einer neuen Datenbank $dbname=“blumendb“; if (mysql_create_db($dbname, $verbindung)) { … } oder auch über eine SQL-Anweisung: $sql = “CREATE DATABASE $dbname“; if (mysql_query($sql, $verbindung)) { …. } Löschen per mysql_dropdb() oder per SQL-Anweisung “DROP DATABASE $dbname“ Peter Sobe Internettechnologien 165 PHP-Umgang mit Datenbanken (2) Erzeugen einer neuen Tabelle nur per SQL-Anweisung: $tablename=“blumentab“; $sql = “CREATE TABLE $tablename (nummer INT, name VARCHAR (50), gattung_nr INT)“; if (mysql_query($sql, $verbindung)) { …. } Beim Erzeugen muss das Tabellenformat vorgegeben werden. Löschen kann nur über eine SQL-Anweisung erfolgen (keine PHPFunktion): $tablename=“blumentab“; $sql = “DROP TABLE $tablename“; if (mysql_query($sql, $verbindung)) { …. } Peter Sobe Internettechnologien 166 ODBC (1) Open Data Base Connectivity Der Zugriff auf eine relationale Datenbank erfolgt auf einer Windows-Plattform in der Regel über die Standardschnittstelle Open Data Base Connectivity (ODBC). Mit Hilfe von ODBC kann der Zugriff eines Client auf einen Datenbank-Server erfolgen, wenn der Zugriff in der Sprache SQL kodiert ist. Dabei kann auch der Server zu verschiedenen DBMSProdukten gehören. In der ODBC-Schnittstelle werden die konkreten Verbindungsinformationen abgelegt. Diese werden in eine dsnDatei geschrieben (dsn – Data Source Name). Dazu gehören vor allem die Treiber für das jeweilige DBMS. Aber auch der Name und die Pfadangaben der Datenbank werden dazu mit benötigt. Peter Sobe Internettechnologien 167 ODBC (2) Prinzipielle Architektur einer ODBC-Schnittstelle ODBC-Schnittstelle Applikation ODBC ODBC Applikation (Client) Manager Treiber (Server) Im Prinzip kann so auf jede DB zugegriffen werden, für die ein ODBC Treiber verfügbar ist. Peter Sobe Internettechnologien 168 ODBC (3) Einrichten einer ODBC-Schnittstelle: Auf einer Windows-Plattform erreicht man den ODBCDatenquellen-Administrator (Manager) über das Menü Systemsteuerung -> Verwaltung. Durch einen Doppelklick auf Datenquellen (ODBC) wird der ODBC-Datenquellen-Administrator geöffnet. Im Fenster ist das Register System-DSN auszuwählen und die Schaltfläche „Hinzufügen“ zu betätigen. Eine System-DSN ist immer zu wählen, wenn ein Zugriff über ein Rechnernetz erfolgt. Befindet sich Client und Server auf einem Rechner, ist das Register Benutzer-DSN auszuwählen. Im Fenster „Neue Datenquelle erstellen“ ist der entsprechende DB-Treiber (zum Beispiel MS-ACCESS) auswählen und Taste „Fertigstellen“ betätigen. Peter Sobe Internettechnologien 169 ODBC (4) Einrichten einer ODBC-Schnittstelle in Bildern: Auswahl Treiber Benennung der Schnittstelle und Verbindung mit einer Datenbank, hier db_bsp.mdb Peter Sobe Internettechnologien 170 ODBC (5) Einrichten einer ODBC-Schnittstelle in Bildern: Übersicht über Datenquellen Peter Sobe Internettechnologien 171 PHP und ODBC (1) Verbinden mit einer ODBC-Datenquelle per PHP: $dsn = “dat“; $user = “administrator“; Datenquellenname aus Systemsteuerung $pw = ““; $verbindung = odbc_connect($dsn,$user,$pw); $sql = “SELECT * FROM orte“; $ergebnis = odbc_exec($verbindung, $sql); odbc_result_all($ergebnis); odbc_result_all() holt das odbc_free_result($ergebnis); gesamte Ergebnis der odbc_close($verbindung); Peter Sobe Internettechnologien Abfrage und gibt es formatiert als HTMLTabelle aus 172 PHP und ODBC (2) Schrittweises Auslesen einer ODBC-Datenquelle per PHP: … In $ergebnis wird ein $verbindung = odbc_connect($dsn,$user,$pw); Verweis auf alle $sql = “SELECT * FROM orte“; Ergebnisse, sowie $ergebnis = odbc_exec($verbindung, $sql); ein Zeiger auf die echo “<table>“ jeweils nächste Ergebniszeile while( odbc_fetch_into($ergebnis, $daten) ) gespeichert { echo “<tr>“; for ($i=0;$i<count($daten);$i++) odbc_fetch_into() holt echo “<td>“.$daten[$i].“</td>“; eine Ergebniszeile und echo “</tr>\n“; speichert sie als Array. } Beim folgenden Aufruf echo “</table>“; wird jeweils die nächste odbc_free_result($ergebnis); Ergebniszeile geholt Peter Sobe Internettechnologien 173 PHP und ODBC (3) Weitere nützliche Funktionen für den ODBC-PHP Zugriff int odbc_fetch_row(int result_id, int [row_number]) … holt die jeweils nächste Ergebniszeile , oder eine spezielle Zeile int odbc_num_fields(int result_id) … gibt Anzahl der Spalten zurück string odbc_field_name(int result_id, int field_number) … gibt die Feldbezeichnung des durch field_number indizierten Elements zurück string odbc_result(int result_id, mixed field) … gibt den Wert eines bestimmten Elements zurück, das entweder durch die Spaltennummer oder die Bezeichnung der Spalte ausgewählt wird Peter Sobe Internettechnologien 174 PHP und ODBC (4) ODBC-PHP Zugriff: Einfügen neuer Daten … erfolgt über eine SQL-Anweisung, die per odbc_exec() übergeben wird. Beispiel für Einfügen aus einem assoziativen Feld (feld): $dsn=“dat“; $user=“administrator“; $pw = ““; $verbindung=odbc_connect($dsn,$user,$pw); $sql = “INSERT INTO orte VALUES(“; while (list($key,$value) = each(feld)) { if (!value) $feld[$key]= “NULL“) else if ($typ[$key] == “VARCHAR“) $feld[$key] = “ ‘ “.$feld[$key]. “ ‘ “; } $sql = $sql . implode($feld,“, “).“)“; $ergebnis = odbc_exec($verbindung, $sql); … Peter Sobe Internettechnologien Alle value aus den assoziativen Array werden als kommagetrennte Parameter innerhalb VALUES(…) eingebaut. 175 Kontrollfragen • Was verstehen Sie unter einer 4-Tier-Architektur? • Wo z.B. wird eine solche Architektur eingesetzt? • Welche Vorteile bieten Datenbanken gegenüber Dateien? • Was verstehen Sie unter ODBC? • Welche Vorteile bietet ODBC? Peter Sobe Internettechnologien 176