AMIGA-Magazin · Ausgabe 10/01 · Kurs: MySQL-Praxis auf dem Amiga (Folge 3)

Aktuelles Heft 10/01

Daten servieren

Im dritten Teil unseres Kurses zeigen wir Ihnen, wie Sie ein Adressbuch programmieren. Dieses soll dann weltweit über das Internet abgerufen und gepflegt werden. Dabei wird auch ein Blick auf die Sicherheit der Daten geworfen.

von Michael Christoph

Serverseitig:
So funktioniert die Abfrage einer MySQl-Datenbank per Apache-Webserver mit PHP-Support.

Zur Verwirklichung unseres Projektes stehen viele verschiedene Möglichkeiten zur Verfügung: CGI, Perl, JavaServlet um nur einige zu nennen. Wir werden hingegen auf PHP zurückgreifen. PHP steht für Hypertext Preprocessor und ist im Amiga-Apache integriert. Damit kann das Beispiel auf dem Amiga entwickelt werden und leicht auf einen nderenRechner übertragen werden. Zum Ausprobieren der Beispiele in diesem Artikel benötigen Sie einen Webserver. Installieren Sie sich dazu am besten den Amiga-Apache (s. Kursteil 1, Ausgabe 8/2001).

Was ist PHP ?

PHP ist eine Scriptsprache zur dynamischen Erstellung von Webseiten. Die Anweisungen können mit dem HTML-Code gemischt oder separat abgelegt werden. Der Syntax orientiert sich an C bzw. Java. Wer dynamische Webseiten erstellen will, kann dies, dank einfacher Datenbankanbindung, sehr leicht mittels PHP realisieren.

Der PHP-Code wird bereits serverseitig von Apache interpretiert und ausgeführt. Nur das dabei erzeugte Resultat gelangt als ganz normaler HTML-Code an den Client. Dadurch werden keine speziellen Anforderungen an den Browser gestellt, wie dies z.B. bei Java der Fall ist (s. »Serverseitig«).

PHP gibt es bereits seit einiger Zeit und findet immer mehr Verwendung. Noch stark verbreitet ist die Version 3.0 (die Dateien haben dann meist die Endung php3), wobei die neueste Version 4.0 ist. Dabei hängt es jedoch von der Konfiguration des (Apache-)Webservers ab, welche Endungen akzeptiert werden! In unseren Beispielen verwenden wir die Datei-Kennung *.php3. Eventuell müssen Sie diese für Ihr System umbenennen.

Der PHP-Code wird innerhalb von

<?php ... ?>

Lokale Datenbank zum Provider transferieren

In der Regel besteht keine Möglichkeit, die lokale Datenbank vom Rechner auf den Server des Internet Service Provider zu kopieren. Der MySQL-Server lässt sich aber mit allen erforderlichen Daten »fernversorgen«. Die einfachste Möglichkeit stellen die in diesem Teil erstellten Internetseiten/Skripte dar, mit denen ein Eintrag erstellt werden kann. Sollen mehrere Datensätze auf einmal gefüllt und womöglich auch noch die Datenbank zuerst angelegt werden, bieten sich direkte SQL-Kommandos an. Über mysqldump lässt sich der komplette Tabellenaufbau mit Inhalt auslesen. Wird die Ausgabe in eine Datei umgeleitet, können Sie diese Datei zeilenweise an den Server zum Ausführen senden. Eine komfortable Möglichkeit hierfür stellt das Programm »phpMyAdmin« dar. Es erlaubt, einzelne SQL-Anweisungen an den Server zu senden oder eine komplette Datei, die dort interpretiert wird. Die Datei sollte nicht zu groß ausfallen, da manche ISP die Ausführzeit solcher Skripte einschränken.
im HTML-Code eingebettet. Ein einfaches Beispiel finden Sie in Listing 1. Tippen Sie den Code ab, und speichern Sie die Datei (z.B. unter dem Namen »php-test.php«) im Verzeichnis Ihres Webservers. Rufen Sie die Seite im Web-Browser mit http://localhost/php-test.php ab. Als Ergebnis wird eine große Tabelle mit der PHP-Konfiguration angezeigt. Werden hingegen nur obrige Zeilen angezeigt, so ist PHP nicht korrekt installiert.

Verbindungsaufbau zum MySQL-Server

Die folgenden Beispiele arbeiten alle mit den Tabellen, die im letzten Kursteil vorgestellten wurden. Falls Sie diese noch nicht angelegt haben, sollten Sie das nun tun. Die Beispiele kümmern sich ausschließlich um die Daten in den Tabellen.

Bevor allerdings auch nur ein einziges Byte der Tabellen ausgelesen werden kann, muss eine Verbindung zwischen PHP und dem MySQL-Server hergestellt werden. Diese Aufgabe erledigt die Funktion php_connection(). Als Argumente sind Hostname, User und Passwort mitzugeben. Konnte die Verbindung hergestellt werden, wird eine Verwaltungs-Nummer zurückgeliefert, über die auch mehrere Datenbankverbindungen unterschieden werden könnten. Als nächstes muss noch die Datenbank ausgewählt werden ­ dazu dient der Befehl mysql_select_db(). Anfragen und Aufgaben an die Datenbank werden alle über mysql_query() realisiert. Der Rückgabewert muss unbedingt gespeichert werden, da die folgenden Abfragefunktionen diesen erwarten.

Ein wichtiger Befehl ist noch echo (oder print), der den HTML-Code an den Browser sendet. Anhand der unterschiedlichen Aktionen (erfassen, suchen, löschen), wird weiter auf die einzelnen Befehle im Zusammenhang mit mySQL eingegangen. HTML- bzw. PHP-Grundlagen finden Sie in älteren Ausgaben des Amiga-Magazins [2]. Die Beispiele finden sich auf der Heft-CD zu dieser Ausgabe.

Alle Skripte haben eines gemeinsam: es werden Formulare eingesetzt, damit der Benutzer die Eingabe- und Such-Daten eintragen kann. Auf die Funktionsweise von HTML und Formularen wird hier nicht weiter eingegangen. Informationsquellen finden sie bei SelfHMTL [1]. Die Skripte enthalten sowohl die Eingabemasken, als auch den PHP-Code. In PHP können Befehlsfolgen auch in neuen Funktionen zusammengefasst werden. Diese allgemeinen Funktionen wurden in der Datei »mylibraryconnect.inc.php3 hinterlegt und werden mit include ("dateiname") in das PHP-File eingebunden.

Neue Adressen erfassen

Für die Eingabe und Erfassung der Daten dient »input.php3«. Wurde das Formular ausgefüllt, ist beim wiederholten Aufruf eine entsprechende Variable gesetzt. Da mehrere Aktionen möglich sind, hat jeder Schalter eine eindeutige Kennung. Wird z.B. auf den Schalter Nr oder Name suchen geklickt, so ist $form_person_suchen gesetzt. Danach wird festgestellt, ob eine Nummer oder ein Name eingegeben und eine entsprechende Suche in der Datenbank initiiert wurden (s. Listing 2).

Bei der Rückgabe der Werte müssen diese für den Browser aufbereitet werden. So wird z.B. ä in ä gewandelt. Diese Aufgabe wird durch die PHP-Funktion htmlentities() erledigt. Umgekehrt entfernt stripslashes() evtl. Escapes aus dem String, damit er im Klartext in die Datenbank geschrieben werden kann.

Sicherheit für die Datenbank

Wenn das Script-Paket für die Adress-Datenbank beim Internet Service Provider installiert wird, kann jeder über das Internet darauf zugreifen. Voraussetzung ist die Kenntnis der genauen URL für die Webseiten zur Eintragung, Änderung und Abfrage. Diese Hürde ist für viele Script-Kiddies recht schnell genommen, denn »Suchmaschinen-Roboter« durchkämmen das Internet automatisch nach neuen Seiten und nehmen diese in ihren Katalog auf.
Der einfachste Schutzmechanismus stellt eine Abrufsperre des kompletten Verzeichnis per .htaccess dar. Ist diese Datei im Verzeichnis für die Adress-Datenbank-Seiten vorhanden, zeigt der Browser beim ersten Zugriff auf ein File in diesem Directory eine Passwortabfrage an. Der Browser speichert diese Daten i.d.R., so dass zukünftige Zugriffe ohne Passwortabfrage erfolgen.
Diese Passwortabfrage könnte auch durch ein einfaches Formular erfolgen. Damit lassen sich z.B. das Input- und Delete-Skript schützen, während jeder über die find-Funktion Einträge suchen darf. Diese Vorgehensweise ist dann sinnvoll, wenn jeder die Daten abfragen darf (z.B. News), aber nur der Administrator oder eine betreffende Gruppe die Daten verändern dürfen.
Allerdings kann man u.U. immer noch per FTP auf den Inhalt des Verzeichnis zugreifen. Das ist deshalb kritisch, da in mylibraryconnect.inc.php3 das Passwort für die Datenbank im Klartext hinterlegt ist! Es reicht allerdings aus, diese Datei gegen diese lesenden Zugriffe zu schützen. Man setzt die Rechte so, dass die Datei nur vom Webserver gelesen werden kann. Sie ist dann gegen Zugriffe aus dem Internet gesichert und anonyme FTP-Zugriffe (oder auch per http) können nicht mehr auf sie zugreifen.

Wird ein neuer Eintrag erfasst, werden die Daten per INSERT INTO person ... in die Datenbank geschrieben. Danach werden die Eingabefelder gelöscht, damit sofort die nächsten Daten erfasst werden können. Um E-Mail-Adressen oder Fotos der Person zuzuordnen, muss diese erst gesucht und angezeigt werden. Danach verbindet das Skript über EMail-Adresse verknüpfen oder Foto verknüpfen den Eintrag mit der Person. Das Foto wird an den Server hochgeladen und dort von unserem Skript auf Dateiebene ausgelesen und die Daten direkt in die Datenbank geschrieben (Listing 3).

Danach wird durch mysql_insert_id() ermittelt, welche Bild-Nr der neue Eintrag erhalten hat. Diese Nummer ist notwendig, damit wir in der Personen-Datenbank die Verknüpfung herstellen können. Die entsprechenden Befehle entnehmen Sie Listing 4.

Vorhandene Adressen ändern und löschen

Das Skript in »input. php3« hat eine Doppelfunktion, es liest die Daten nicht nur ein, sondern ändert auch gleichzeitig bestehende Datensätze. Dazu wird nach der Personen-Nummer oder dessen Namen gesucht. Die angezeigten Daten können verändert und mit dem Befehl zum Aktualisieren wieder in die Datenbank zurückgeschrieben werden. Das erfolgt serverseitig mit der Anweisung UPDATE person ...". Die Einträge für E-Mail-Adressen und Fotos lassen sich mit dieser Routine nicht bearbeiten!

Um einen Eintrag aus der Adress-Datenbank zu löschen, wurde das Skript »delet.php3« entwickelt. Es wird zuerst der komplette Datenbank-Inhalt angezeigt. Jede Zeile enthält eine zusätzliche Spalte mit dem Löschen-Knopf. Wird dieser gedrückt, wird die betreffende Zeile aus der Datenbank gelöscht. Diese Variante ist nur solange praktikabel, wie die Datenmenge klein und überschaubar ist. Bei mehreren hundert Einträgen, muss dagegen eine Suchmaske verwendet werden. Das einfachste ist das Löschen einer E-Mail-Adresse, da hierbei weiter nichts passiert. Wird dagegen eine Person gelöscht, werden zuerst alle seine E-Mail-Adressen gelöscht:

$result = mysql_query ("DELETE FROM email WHERE person_iNr = $formNr");

und erst danach der eigentliche Personen-Eintrag:

$result = mysql_query ("DELETE FROM person WHERE iNr = $formNr");

Die Reihenfolge spielt hierbei keine Rolle, solange nicht später auf einen Eintrag der bereits gelöschten Datenbank (z.B. Personen-Nummer) zurückgegriffen wird. Da aber durchaus mehrere Client gleichzeitig auf eine Datenbank zugreifen können, ist es in der Praxis vorteilhaft, von innen nach außen zu löschen. Also werden zuerst alle abhängigen Datensätze (email) und erst zum Schluss die übergeordnete Datenbank (person) aus der Datenbank entfernt. Das Foto kann nur direkt gelöscht werden und nicht beim Löschen einer Person. Dabei müssen allerdings alle Personensätze korrigiert werden, die auf das Foto verwiesen haben. Denn sonst weisen die Personen auf nicht mehr existierende Fotos.

Adressen suchen

Das Beispiel-Skript »find.php3« realisiert die Suche nach Einträgen. Die meiste Logik verbirgt sich in diesem Programm. Es ist vorgesehen, nach Nummer, Familienname und E-Mail-Adresse zu suchen. Aber es besteht noch zusätzlich die Möglichkeit, die Datenbank nach Familienname und E-Mail-Adresse gleichzeitig zu durchforsten. Dabei kommt keine genaue Suche zu Stande, sondern es wird alles gefunden, was den Suchbegriff auch nur teilweise enthält:

$search .= " sFamilienname LIKE ¸%$formFamilienna me%`";

Dazu könnten mit if-else-Konstrukten verschiedene Suchanfragen zusammengestellt werden. Da diese aber zum großen Teil immer identisch sind, wird bei der gemeinsamen Suche die Suchanfrage »dynamisch« gebildet. Zur Kontrolle wird dieser auch mit der Anzahl Treffern als erstes angezeigt. Zu jedem Treffer wird neben der Personen-Nummer und dem Familiennamen auch eine E-Mail-Adresse angezeigt. Sind mehrere E-Mail-Adressen vorhanden, wird für jede ein eigener Block incl. der Personendaten generiert. Ist ein Foto hinterlegt, wird es auch angezeigt. Dazu wird das Konstrukt in Listing 5 verwendet.

Homepages zu Thema PHP:
Seite URL
PHP-Manual deutsch http://www.php.net/manual/de/
FAQ zu PHP http://www.koehntopp.de/php
PHP-Center http://www.php-center.de
PHP-Homepage http://www.php-homepage.de
Dabei wird in IMG SRC= nicht ein Verweis auf das Bild eingetragen, sondern die eigentlichen Bilddaten selber mitgeliefert. Das Script »showfoto.php3« erwartet als einzigen Parameter die Bild-Nummer. Diese wird in der Datenbank gesucht und die Daten durch einen einfachen print() gesendet. Damit der Browser die Daten nicht als Text interpretiert, wird zusätzlich mit der Anweisung header() der Dateityp vorausgeschickt. Damit header() funktioniert, darf vorher noch kein einziges Byte an den Browser gesendet werden! Achtung: HTML-Kommentare sind ganz normaler Text, der erst vom Browser interpretiert bzw. ignoriert wird. Sie gelten damit als Sendedaten. Die Anzahl gefundener Treffer liefert mysql_num_ ¡rows() ­ ein Beispiel: Mit

while($row = mysql_fetch_object())

kann ein Satz nach dem anderen ausgelesen werden. Dabei wird der Feldname verwendet: $row->sFamilienname. Alternativ ist auch der Einsatz von mysql_fetch_row() denkbar. Dann liegen die Daten allerdings als Array vor ($row[0]. Die Anzahl an Einträgen liefert mysql_num_fields(). Die Beispiele zu diesem Kursteil sind kommentiert und sollten somit leicht verständlich sein. Die unterschiedlichen Techniken zeigen, wie auf die Daten zugegriffen werden kann. Sie bieten aber einen großen Raum für Erweiterungsmöglichkeiten und laden zur persönlichen Anpassung ein. Das vorgestellte Beispiel soll lediglich als Grundgerüst dienen.

Literatur:
[1] Stefan Münz und Wolfgang Nefzger, HTML-4-Handbuch, Franzis Verlag, ISBN 3-7723-7514-6, WWW: http://www.franzis.de
[2] Martin Steigerwald, Pures Vergnügen Amiga-Magazin 10/2000,Seite 22

 


Hauptseite © 2001 All Rights Reserved. Alle Rechte vorbehalten Franzis' Verlag GmbH
Veröffentlichung und Vervielfältigung nur mit schriftlicher Genehmigung des Verlags

Kommentare, Fragen, Korrekturen und Kritik bitte an Webmaster AMIGA schicken.
Zuletzt aktualisiert am 23. Oktober 2001, Michael Christoph.