Keywords: main

Subsections

- 5.1 Kommentar des Autors
- 5.2 Kleines Anwendungsbeispiel
  - 5.2.1 Beschreibung
  - 5.2.2 Struktur der Web Seiten
  - 5.2.3 Aufbau der Datenbank
  - 5.2.4 Erklärungen zum HTML Code der einzelnen Seiten

# 5 Fazit

# 5.1 Kommentar des Autors

``Im Prinzip geht alles, ohne Strom geht nichts ....''

Irgendwie paßt dieser Werbespruch der Energieversorger auch auf die in dieser Diplomarbeit analysierten Datenbanken und Web-Interfaces. Als Freeware deklariert und somit kostenlos im Source-Code erhältlich, scheinen sie auf den ersten Blick eine Alternative zu den kommerziellen Produkten zu sein, entpuppen sich aber bei genauerem Hinsehen doch nur als ``Alternative''.

Zum einen fehlen einige von den großen Marken - z.B. Oracle - bekannte Features (Datenbank login, SQL-Befehle wie ALTER TABLE, u.v.m.). Zum anderen laufen die Freeware Produkte einfach noch nicht so stabil wie ihre großen Brüder und Schwestern.

Dennoch haben diese Produkte auch ihre Lebensberechtigung und ihre Einsatzgebiete, für die sie sich bestens eignen.

Wer noch keine Datenbank besitzt, und im Internet einen Produktkatalog, Ersatzteileliste, Bekanntschaftsanzeigen oder sonstige über Datenbanken verwaltbare lineare Daten anbieten will, für den stellen sie die beste Lösung dar. Solange er niemanden einen anderen Zugriff auf seine Datenbank gibt, außer daß er deren Inhalt sehen kann, leisten die beiden getesteten Datenbanken und die entsprechenden Interfaces bestens ihren Dienst. Sobald jedoch mehr als ein bis zwei Administratoren die Verwaltung über haben, oder es sich um sensible Datenbestände handelt, ist es mit der Sicherheit der Daten oft weit her. PostgreSQL stellt hier die einzige Alternative dar, da es die Möglichkeit bietet, einen Zugriff via login auf die Datenbank einzurichten. Leider kann dann über PHP/FI nicht mehr auf die Datenbank zugegriffen werden, außer über den von mir erstellten Patch (Anhang A.3, S. ).

Wer jedoch in seiner Firma schon über eine große Datenmenge auf kommerziellen Systemen verfügt und aus diesen nur einen kleinen Auszug der Öffentlichkeit zur Verfügung stellen will, dem sei von Freeware Systemen abgeraten. Es besteht zwar z.B. mit PHP/FI die Möglichkeit, fast jede bekannte Datenbank ans Internet anzubinden. Aus Kompatibilitätsgründen und Sicherheitsaspekten sollte man jedoch auf die meist vom Hersteller der verwendeten Datenbank Systeme angebotenen Zusätze zurückgreifen.

Ein ganz anderer Gesichtpunkt ist, daß die Übertragung der Daten durch das http Protokoll alles andere als sicher verläuft. Wer also beabsichtigt, sensible Daten mittels http übers Web zu verschicken, dem ist auch nicht zu helfen. Einzige Alternative zum http ist das https Protokoll. Hierbei überträgt der Web-Server die Daten verschlüsselt. Leider unterliegt der zur Zeit sicherste Verschlüsselungsalgorithmus den amerikanischen Exportbestimmungen und ist somit in Deutschland nicht erhältlich.

Ein Ausblick auf die Zukunft läßt jedoch hoffen, daß die Freeware Produkte in kürzester Zeit auch auf diesem Anwendungsgebiet den Kommerziellen in nichts mehr nachstehen werden. Und hoffen wir, daß es den Programmierern endlich gelingt, auch funktionierende ODBC Schnittstellen zu schreiben.

# 5.2 Kleines Anwendungsbeispiel

Abschließend soll noch ein kleines Anwendungsbeispiel zeigen, für welchen Bereich die getestete Software sich am besten eignet.

## 5.2.1 Beschreibung

Hans, ein leidenschaftlicher Modellauto Sammler, möchte seine doppelten Exemplare gerne über das Internet an den Mann/Frau bringen. Da sich sein Angebot immer wieder ändert, die Eigenschaft der Modellautos als Ware jedoch nicht, richtet ihm ein Bekannter bei seinem Bürgernetzverein eine Datenbank und ein Web-Interface ein. Somit kann er sein Angebot jederzeit ändern, ohne die entsprechenden HTML Seiten neu zu schreiben.
Als Datenbank hat er nun PostgreSQL gewählt; somit kann er - durch Vergabe eines Passwortes - schon einmal ausschließen, daß die anderen Mitglieder des Vereins an den Daten von Hans herumspielen.
Für die Anbindung an das Internet wählte er PHP/FI; dies hat er noch ein wenig bearbeitet und alle nicht verwendeten Funktionen im Source-Code auskommentiert. Somit kann der Web-Server des Vereins durch bestimmte PHP/FI Funktionen keinen Schaden nehmen.

## 5.2.2 Struktur der Web Seiten

Über einen Homepage kommt der Surfer auf eine durch Frames zweigeteilte Seite. In der oberen Hälfte findet er den Katalog mit den Autos, von denen er die gewünschten Modelle mittels Mausklick der Bestellung auf der unteren Hälfte hinzufügen kann. Hierbei ist die Framegröße durch den Surfer beliebig veränderbar.
Über die Homepage aus ist es Hans außerdem möglich, auf eine (über . htaccess) Passwort geschützte Web-Seite zu gelangen, über die er seine Datenbankeinträge verwalten kann (der Einfachheit halber nur das Einfügen von Datensätzen; Löschen und Ändern geht analog).

## 5.2.3 Aufbau der Datenbank

Der Aufbau der Datenbank ist entsprechend dem Produkt sehr einfach. Sie enthält die wichtigsten Eigenschaften der Modellautos als Ware. Tabelle 5.1 (S. ) zeigt den Aufbau der Tabelle 'liste' in der Datenbank 'auto'.

Tabelle 5.1: Aufbau der Tabelle 'liste'
Field | Type | Length
bestnr | varchar | 10
bez | varchar | 100
color | varchar | 50
prize | varchar | 6
image | varchar | 30

Zur Vermeidung von doppelten Bestellnummern, wurde noch das Feld 'bestnr' indiziert.
Damit nun aber nicht jeder auf die Datenbank zugreifen kann, wurde sie zudem noch mit einem Passwort versehen. Dazu wurde in der Datei ./data/pg_hba.conf (Kapitel 3.2.2.1, S. ) im Installationsverzeichnis von PostgreSQL folgende Zeile eingefügt:
`host auto 127.0.0.1 255.255.255.255 password hans`

## 5.2.4 Erklärungen zum HTML Code der einzelnen Seiten

Abbildung 5.1 (S. ) zeigt die Homepage, deren HTML Code nicht weiter erleutert werden muß.

Abbildung 5.1: Homepage von Hans - Unser kleines Warenhaus

Abbildung 5.2 und 5.3 (S. bzw. S. ) zeigen das Framefenster; die Produktliste bzw. die Bestellung vergrößert.

Abbildung: Produktkatalog (obere Framehälfte vergrößert)

Abbildung: Bestellformular (untere Framehälfte vergrößert)

Betrachten wir zuerst das obere Framefenster - den Produktkatalog.

`<?
$sock = pg_sconnect("localhost","5432","auto","hans","dampf");
if ($sock == 0)
{ echo "FEHLER: $pg_ErrorMessage($sock) <br>"; }
else
{
>
<html>
`

pg_sconnect öffnet eine Verbindung zur Datenbank 'auto' auf dem 'localhost' über Port '5432' unter dem Benutzernamen 'hans' mit dem Passwort 'dampf'. Ist dies erfolgreich, so wird mit normalem HTML Code fortgefahren.

`
<script language="JavaScript">
<!-
function bestellen(art,desc,color,prize,pieces)
{
parent.bestellung.document.bestellung.artikel.value =
parent.bestellung.document.bestellung.artikel.value +
"n"+art+ desc+color+prize+" "+pieces;
}
// ->
</script>
`

Die Funktion bestellen in JavaScript schreibt beim Aufruf die ihm übergebenen Parameter als Text in das Bestellformular in der unteren Framehälfte. Dabei geht sie wie folgt vor:
Vom Hauptframe ( parent) nimmt sie den untergeordneten Frame ( bestellung); von diesem document wird der Wert der Textarea ( artikel) im Formular ( bestellung) gesetzt.

`
<?
$result = pg_Exec($sock, "select * from liste order by bestnr");
if (!$result)
{ echo "Fehler: $pg_ErrorMessage <br>"; }
else
{
$rows = pg_numRows($result);
$index1 = 0;
while ($index1 < $rows)
{
$col[0] = pg_result($result, $index1, "bestnr");
$col[1] = pg_result($result, $index1, "bez");
$col[2] = pg_result($result, $index1, "color");
$col[3] = pg_result($result, $index1, "prize");
$col[4] = pg_result($result, $index1, "image");
>
`

pg_Exec holt jetzt aus der vorher geöffneten Datenbank die entsprechenden Datensätze gemäß der übergebenen SQL Sequenz. pg_numRows zählt anschließend die zurückgelieferten Datensätze. In der jetzt folgenden while Schleife werden die Daten im HTML Format aufbereitet (dies kann je nach gewünschtem Layout anders ausfallen); dazu werden zur leichteren Weiterverarbeitung die Spaltenwerte der Datenbank dem Array col zugewiesen.

Weil es Modellautos in verschiedenen Farben gibt, stehen die verfügbaren Farben alle durch Kommas getrennt in der Variablen $col[2]. Um nun die Farben einzeln zu bekommen - nicht alle in einer Variablen - wird die PHP/FI Funktion strtok() zu Hilfe genommen; stellvertretend für die verschiedenen Layoutvariationen steht das hier aufgeführte Listing.

`
$tok = strtok($col[2],",");
while ($tok)
{
>
<! Ausgabe der Farben in HTML >
<? echo $tok;><br>
<?
$tok = strtok(",");
}
>
<?
$index1 = $index1 + 1;
}
>
`

strtok($col[2],",") liest aus der Variablen $col[2] alle Zeichen bis zum ersten Komma. strtok(",") liest weiter bis zum nächsten Komma. Dies wird innerhalb der while Schleife solange wiederholt, bis die Variable $col[2] ausgelesen wurde.
Mit der Weiterschaltung von $index1 wird die im vorangegangenen Listing begonnene while Schleife beendet.

Die untere Framehälfte - das Bestellformular - ist genauso einfach wie sinnvoll aufgebaut. Es besteht lediglich aus einem HTML Formular, welches die erforderlichen Elemente für eine Bestellung enthält (z.B. Name und Anschrift des Bestellers). Abgeschickt wird es dann mit Hilfe der mailto Methode.

`
<form action="mailto:xyz" method="post" enctype="text/plain" name="bestellung">
</form>
`

Abbildung 5.4 (S. ) zeigt ein einfaches Eingabeformular um neue Artikel in die Datenbank aufzunehmen.

Abbildung 5.4: Dateneingabeformular

Der Aufbau des HTML Codes der Seite ist ``rekursiv''. Dies bedeutet, daß sich die Seite zur Übernahme des eingegebenen Artikels in die Datenbank selbst aufruft. Hierfür übergibt sie sich selbst ein Flag, welches über ihre auszuführende Funktion bestimmt.
Ist dieses Flag nicht gesetzt, dann erscheint auf dem Browser nur das Eingabeformular. Beim Aufruf der Seite mit gesetztem Flag, werden die übergebenen Werte in die Datenbank eingefügt. Nachfolgendes Listing soll dies verdeutlichen.

`
<?
$sock = pg_sConnect("localhost","5432","auto","hans","dampf");
if (!$sock)
{ echo "FEHLER: $pg_ErrorMessage($sock) <br>"; }
else
{
if ($action == "insert")
{
$ins_result = pg_Exec($sock, "insert into liste values ('$bestnr','$bez',
'$color','$prize','$image')");
if (!$ins_result)
{ echo "FEHLER: $pg_ErrorMessage($sock) <br>"; }
else
{
echo "Folgender Artikel <br>
$bestnr , $bez , $prize , $color , $image <br>
angelegt !!!!! <br>";>
</a>
<?
}
}
else
{
/* Ausgabe des Eingabeformulars*/
>
`

Zuerst wird wieder eine Verbindung mit der Datenbank hergestellt. Danach wird das Flag $action ausgewertet. Ist es gesetzt, so werden die Werte der übergebenen Variablen von pg_Exec in die Datenbank eingefügt.