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&auml;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