Inhaltsverzeichnis

 

 

1  Serverseitige Web-Programmierung unter Linux                    1

 

 

2  Die Datenbank mysql                                               1

   2.1  Installation  . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*

 * . . .   1

   2.2  Anlegen einer Datenbank   . . . . . . . . . . . . . . . . . . . . . . .*

 * .   2

   2.3  Anlegen von Tabellen   . . . . . . . . . . . . . . . . . . . . . . . . *

 *. .   2

   2.4  Tabellen mit Daten füllen  . . . . . . . . . . . . . . . . . . . . . . *

 *. .   3

   2.5  erste eine Abfrage   . . . . . . . . . . . . . . . . . . . . . . . . . *

 *. . .   4

   2.6  Ein kleiner Einblick in das Sicherheitssystem von mysql  . . . . . . . *

 *  4

        2.6.1 1. Schritt: Berechtigung zum Verbindungsaufbau  . . . . . . .   4

        2.6.2 2. Schritt: Berechtigungen für die einzelnen Datenbanken   . .   5

        2.6.3 Finalisierung  . . . . . . . . . . . . . . . . . . . . . . . . . *

 *. .   5

 

 

3  php-eine Skriptsprache für das Web                                5

   3.1  das erste PHP Skript . . . . . . . . . . . . . . . . . . . . . . . . . *

 *. .   6

   3.2  einige Strukturelemente von PHP  . . . . . . . . . . . . . . . . . . . *

 *.   6

   3.3  ein einfaches Formular  . . . . . . . . . . . . . . . . . . . . . . . .*

 * . .   6

   3.4  Zugriff auf die Datenbank  . . . . . . . . . . . . . . . . . . . . . . *

 *. .   7

   3.5  Eine erste Abfrage  . . . . . . . . . . . . . . . . . . . . . . . . . .*

 * . .   8

   3.6  Ausgabe der Daten in HTML  . . . . . . . . . . . . . . . . . . . . . . *

 *  8

 

 

 

1    Serverseitige Web-Programmierung unter Linux

 

 

Eine der unter Linux zu freien Verfügung stehenden Datenbank heißt mysql. Die-

ses Datenbankprogramm arbeitet eng mit der Skripsparache php zusammen. Der

Webserver Apache wiederum unterstützt diese Scriptsprache. In diesem Artikel ge*

 *ht

es um das Zusammenspiel dieser drei Komponenten. Die verwendete Distribution

ist SuSe 7.0.

 

 

 

2    Die Datenbank  mysql

 

 

Das Datenbanksystem mysql besitzt eine Multiuser Multithread Architektur. Es

existieren verschiedene Programminterfaces, z.B. für C, C++, php Perl und viele

mehr. mysql gibt es für über 20 verschiedenen Betriebssysteme(z.B. Linux, Win-

dows9x, Windows NT . . . ). Weitere Leistungsmerkmale: ODBC-Standard 2.5, hoch-

optimierte SQL-Funktionen, sehr schnelle Implementation von JOIN's,. . . .

mysql Datenbanken können über 50.000.000 Datensätze enthalten und unterstützen

den Zeichensatz ISO-9959-1 Latin 1.

 

 

 

2.1   Installation

 

Die Installation erfolgt problemlos mit dem Installationstool yast. Die Frage, *

 *ob

die Datenbank beim Starten aktiviert werden soll, ist mit ja zu beantworten. Da-

durch wird beim nächsten Starten des Betriebssystems das Programm mysqld au-

tomatisch gestartet. Für das manuelle Starten, das ist z.B. unmittelbar nach der

Installation notwendig, genügt es, von der shell-Konsole als Superuser mysqld &*

 * als

Hintergrundjob zu starten.

 

 

 

                                    1


 

 

2.2   Anlegen einer Datenbank

 

Das Datenbanksystem mysql kann nun über mehrere Schnittstellen angesprochen

werden. Ich bespreche hier die Kommandozeile, in der hauptsächlich die Admini-

stration durchgeführt wird. Im folgenden wird eine kleine Datenbank implementie*

 *rt.

Für einen Verein soll eine Mitgliederverwaltung geschrieben werden. Eine der Ta-

belle enhält die persönlichen Daten der Mitglieder. In einer weiteren werden die

verschieden Einträge, die im Laufe einer Mitgliedschaft entstehen, eingetragen.*

 * In

der dritten werden alle für eine Vereinsverwaltung notwendigen Textbausteine ve*

 *r-

waltet. (Der Aufbau einer Tabellenstruktur ist in der Regel ein sehr aufwendiger

Prozess, da die Tabellenstruktur einigen Regeln, die sogenannten Normalformen,

gehorchen soll. Warum diese Tabellenstruktur für dieses Beispiel gewählt wurde,*

 * ist

Gegenstand eines anderen Artikels.)

Der erste Schritt ist es, mysql mitzuteilen, dass es eine neue Datenbank geben *

 *wird.

Diese bekommt den Titel VIT.

Welche Datenbanken kennt das System? Am Datenbankprompt mysql> wird show

Databases; eingeben. (Der abschließende Strichpunkt ist wie bei allen Anfragen *

 *an

die Datenbank unbedingt notwendig). Angezeigt wird:

 

 mysql> show databases;

+----------+

| Database |

+----------+

| BACKUP   |

| Schule1  |

| mysql    |

| test     |

+----------+

4 rows in set (0.57 sec)

 

Create Database VIT; erzeugt die neue Datenbank. Mit dem Befehl use VIT; teilt

man dem Datenbankmanagment mit, dass man mit der Datenbank VIT arbeiten

möchte. Alternativ kann man schon beim Aufruf von mysql den Datenbankname

angeben (mysql VIT).

 

 

 

2.3   Anlegen von Tabellen

 

Eine Datenbank besteht aus Tabellen. Wir werden nun in dieser Datenbank die

notwendigen Tabellen erzeugen. Dies geschieht mit einem Standard SQL Befehl.1

Jedes Mitglied wird in der Datenbank über eine eindeutige Nummer, die Mitgliede*

 *r-

NummerID, identifiziert. Durch die Option auto_increment, wird bei jedem Eintrag

der Wert automatisch um eins erhöht. Die Spalte Land besitzt einen Standardwert,

dieser wird immer bei der Eingabe eines neuen Datensatzes verwendet, wenn kein

Wert angegeben wird. Mit  PRIMARY KEY (MitgliederNummerID) wird die Spalte

MitgliedsnummerID zu einem speziellen Index, dem Primary Key.

 

 

 

CREATE TABLE Mitglieder (

  FamilienName varchar(30),

  VorName varchar(30),

  MitgliederNummerID

          int(5)

          unsigned DEFAULT '0' NOT NULL,

          auto_increment,

  PLZ varchar(7),

__Land_varchar(30)___________

  1Hinweis: jedes SQL Statement endet mit einem Strichpunkt!

                                    2


 

 

          DEFAULT '"Osterreich',

  Ort varchar(40),

  Strasse varchar(60),

  Geburtsdatum date,

  Arbeitsgeber varchar(40),

  PRIMARY KEY (MitgliederNummerID)

);

 

 

Welche Tabellen sind in dieser Datenbank?

 

mysql> Show Tables;

+---------------+

| Tables in VIT |

+---------------+

| Eintraege     |

| Ereignisse    |

| Mitglieder    |

+---------------+

3 rows in set (0.00 sec)

 

Wie sieht die Struktur der Tabelle Mitglieder aus?

 

mysql> describe Mitglieder;

+--------------------+-----------------+------+-----+------------+-------------*

 *---+

| Field            | Type          | Null | Key | Default    | Extra         |

+--------------------+-----------------+------+-----+------------+-------------*

 *---+

| FamilienName      | varchar(30)    | YES  |    | NULL      |              |

| VorName          | varchar(30)    | YES  |    | NULL      |              |

| MitgliederNummerID | int(5) unsigned |     | PRI | 0         | auto_increment*

 * |

| PLZ              | varchar(7)     | YES  |    | NULL      |              |

| Land             | varchar(30)    | YES  |    | "Osterreich |              |

| Ort              | varchar(40)    | YES  |    | NULL      |              |

| Strasse          | varchar(60)    | YES  |    | NULL      |              |

| Geburtsdatum      | date          | YES  |    | NULL      |              |

| Arbeitsgeber      | varchar(40)    | YES  |    | NULL      |              |

+--------------------+-----------------+------+-----+------------+-------------*

 *---+

9 rows in set (0.00 sec)

 

 

 

2.4   Tabellen mit Daten füllen

 

Jede Datenbank lebt von Daten. Üblicherweise hat man am Anfang die einzutra-

genden Daten in irgend einer Form und können als ASCII-Text gespeichert werden.

Dieser kann dann mittels des folgenden Befehls in die entsprechende Tabelle ein*

 *ge-

tragen werden.

 

 

LOAD DATA LOCAL

    INFILE ``Namen.txt''

    INTO TABLE Mitglieder;

 

 

Das Textfile, in unserem Fall Namen.txt, muß nach der folgenden Spezifikation

erstellt werden. Die einzelnen Spalteneinträge sind mit einem Tabulator getrenn*

 *t,

eine Zeile wird mit einem Linefeed abgeschlossen. Ist das Textfile anders aufge*

 *baut,

so ist das Einlesen ebenfalls möglich, die mitgelieferte Doku liefert die notwe*

 *ndige

Info. (MS-Dos verwendet üblicherweise CR-LF als Zeilentrenner!)

Eine zweite Art des Eintragen von Daten ist die Verwendung des SQL Befehls

INSERT.

 

 

INSERT INTO Mitglieder

         VALUES ('Franz','M"uller',1,NULL,

                 '"Osterreich',NULL,NULL,NULL,NULL);

                                    3


 

 

Das interaktive Eingeben von größeren SQL-Befehlen kann schnell zum Problem

werden. In diesem Fall ist es günstig, die notwendige SQL-Zeichenkette in einem

Editor zu bearbeiten und mit einem externen Aufruf von mysql zu verarbeiten. Der

obige Befehl zum Erzeugen der Mitgliedertabelle sei in dem File sql.txt abgespe*

 *i-

chert. Mit  mysql VIT <sql.txt  wird mysql aufgerufen, in die Datenbank VIT

gewechselt und der Inhalt des Files sql.txt ausgeführt.

 

 

 

2.5   erste eine Abfrage

 

Nun sind die Daten in der Tabelle. Mit einem einfachen SELECT-Befehl aus dem

SQL-Befehlssatz kann das überprüft werden.

 

 

mysql> select Vorname, FamilienName from Mitglieder;

+---------+--------------+

| Vorname | FamilienName |

+---------+--------------+

| Franz   | M"uller        |

| Fritz   | Meier         |

| Rosi    | Bauer         |

| Lisi    | Berger        |

+---------+--------------+

4 rows in set (0.00 sec)

 

 

 

2.6   Ein kleiner Einblick in das Sicherheitssystem von mysql

 

Das Sicherheitssystem von mysql wird in der Datenbank mysql verwaltet.

 

mysql> use mysql;

Database changed

mysql> show tables;

+-----------------+

| Tables in mysql |

+-----------------+

| columns_priv    |

| db               |

| func             |

| host             |

| tables_priv     |

| user             |

+-----------------+

6 rows in set (0.00 sec)

 

 

2.6.1  1. Schritt: Berechtigung zum Verbindungsaufbau

 

In der Tabelle host werden die Daten zum Verbindungaufbau gespeichert.

 

 

select * from host;

 

 

Die in dieser Tabelle eingetragene Host/User Kombination gilt für alle Datenban*

 *ken.

Im folgenden Beispiel soll eine User mit dem Namen testuser am localhost mit

dem Passwort testpassword in die Tabelle eingetragen werden.

 

INSERT INTO user (host, user, password)

        VALUES (localhost, 'testuser',password('testpassword'));

 

 

                                    4


 

 

Die Passwörter werden in der Datenbank so abgelegt, wie sie im SQL-String an-

gegeben sind. Da beim Verbindungsaufbau das Passwort verschüsselt übertragen

wird, ist die Funktion password() im SQL String wichtig. 2

 

 

2.6.2  2. Schritt: Berechtigungen für die einzelnen Datenbanken

 

In der Tabelle db werden die Berechtigungen für die einzelnen Tabellen geregelt:

 

 

select * from db;

 

 

Im folgenden Beispiel wird dem Benutzer michi in der Datenbank VIT vom Host

localhost aus das Recht zugewiesen, Abfragen zu stellen (das sind alle SELECT-

Anweisungen); alle anderen Rechte sind, da sie nicht gesetzt sind, defaulmäßig *

 *auf

N gestellt.

 

 

INSERT  INTO db (host, db, user, Select_priv)

         VALUES ('localhost','VIT','michi','Y')

 

 

Ist der Wert in einer Spalte egal, so kann dafür ein einen Platzhalter ( % ) ve*

 *rwendet

werden. (z.B: alle Hosts, jede Datenbank,. . . )

Im folgendem Beispiel werdem dem Benutzer michi das Recht etwas in die Daten-

bank einzufügen gesetzt:

 

 

 update db set Insert_priv ='Y' where user ='michi';

 

 

2.6.3  Finalisierung

 

Damit von der Datenbank diese Werte übernommen werden, ist noch ein weiter

Schritt notwendig: Entweder wird von der bash das Skript

 

mysqladmin -u root -p reload

 

gestartet3, oder von der mysql-Konsole aus

 

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

 

Damit wird das Datenbankmanagment angewiesen, die Berechtigungen neu einzu-

lesen.

 

 

mysqladmin -u root -p reload

 

 

 

3    php-eine Skriptsprache für das Web

 

 

PHP ist ein relativ junge Sprache, die Anfang 1995 von Rasmus Lerdorf für die

Realisierung von Webanwendungen geschaffen wurde. (Die ursprüngliche Bedeutung

der Buchstaben PHP stand für Personal Homepage Tools, heute wird darunter

meist PHP Hypertext Preprozessor verstanden.

PHP ist eine Skriptsprache, die in HTML Code eingebettet ist. Das Script wird v*

 *om

HTML-Server, unter Linux ist dies meist das Programm Apache, verarbeitet. Damit

der Webserver den HTML-Code als PHP-Skript erkennt, und damit vor Absenden

an den Client bearbeitet, bekommt jedes PHP Skript die Endung .php . Der auf di*

 *ese

Art_veränderte_HTML-Code_wird_anschließend dem Client gesendet. Der Client

  2Aus der Sicht von mysql ist das in der Tabelle eingetragene Passwort das wir*

 *kliche Passwort.

  3Die verwendeten Optionen bedeuten: -u verwende den nachfolgenden Benutzer, -*

 *p frage nach

dem Passwort.Achtung: das root Passwort ist das der Datenbank, nicht das des Li*

 *nuxsystems.

                                    5


 

 

erhält reinen HTML-Code. Damit ist es möglich auf Datenbanken zuzugreifen, ohne

dass der Client erfährt, in welcher Form dies geschehen ist.

PHP stellt zur Zeit etwa 1200 Funktionen zu Verfügung; es kann sowohl prozedural

als auch objektorientiert programmiert werden. Neben den Funktionen, die sowieso

von jeder Skriptsprache erwartet werden, sind hervorzuheben: HTTP-Funktionen,

Mail-Funktionen, Unterstüzung bei der Abfrage von LDAP-Servern, SessonHand-

ling, Unterstützung von Cookies und ODBC.

 

 

 

3.1   das erste PHP Skript

 

PHP wird im HTML Text eingebettet, daher beginnt jedes Skript mit den einlei-

tenden HTML Tags. PHP Skript wird in <?......?> eingeschlossen. Jeder Befehl

endet mit einem Strichpunkt. Kommentare werden wie in C bzw. C++ geschrieben.

Hier das traditionelle Einsteigebeispiel Hallo Welt.

 

 

<html>

<body>

<?   /* Hier beginnt der PHP Code*/

echo ("Hallo Welt");

?>

</body>

</html>

 

 

 

3.2   einige Strukturelemente von PHP

 

Variable beginnen mit einem $. Sie brauchen nicht deklariert werden. Ihren Typ

erhalten sie bei der ersten Wertzuweisung. Groß- Kleinschreibung ist nicht von *

 *Be-

deutung. Grundsätzlich sind die Variablen nur im lokalen Kontext sichtbar, jedo*

 *ch

können sie explizit sichtbar gemacht werden.

 

$meinWert=2;

 

Arrays beginnen ebenfalls mit einen $. Der Index wird in eckigen Klammern ange-

geben und beginnt immer mit 0.

 

$Feld[2]=2;

 

Eine andere Form der Array sind die assoziativen Arrays (Hash), bei ihnen wird

statt des numerischen Index eine eindeutige Zeichenkette zur Identifizierung he*

 *ran-

gezogen.

 

$Feld[Strasse]="Apfelweg";

 

Für Abfragen stehen die bekannten if, elseif, else und endif zur Verfügung.

Für die Auswahl von mehreren Alternativen gibt es das switch case Konstrukt.

Bei den Schleifen gibt es die üblichen while-Konstrukte, die unter C bekannte f*

 *or

Schleife wird durch ein foreach ergänzt (nur in PHP4).

 

 

 

3.3   ein einfaches Formular

 

HTML-Formulare stellen eine einfache Art dar, Daten vom Client zum Server zu

übertragen. Jede im Formular angegebene Bezeichnung wird im PHP-Skript au-

tomatisch zu einer Variablen. Im folgenden soll ein Formular erzeugt werden, das

die Eingabe in ein Textfeld ermöglicht. Die Daten werden mit der Methode GET

übertragen. Wird auf den Submitbutton gedrückt, soll das Skript f2.php (In dies*

 *em

Beispiel ist das aufzurufende Skript gleich dem aufgerufenen.) ausgeführt werde*

 *n.

                                    6


 

 

<html>

<body>

<form method=get action=f2.php>

 

 

Diese Sequenz erstellt das Texteingabefeld mit dem Namen Familiennamen und der

Länge 45.

 

<input type=text name="Familienname" size = 45>

 

Mit der Erstellung des Submitbutton ist das HTML Formular fertig.

 

 

<input type=submit name ="submit" value =senden>

</form>

 

 

Nach einem Zeilenumbruch (<br>) beginnt das PHP Skript. Der Client ruft das

Skript erneut auf und übergibt dabei dem Skript in der Variablen $Familienname

den im Textfeld eingetragenen String. Der echo-Befehl des Skripts gibt diesen W*

 *ert

aus. Der Rest des Skripts beendet den HTML-Code.

 

 

<br>

<? echo $Familienname;

?>

</body>

</html>

 

 

 

3.4   Zugriff auf die Datenbank

 

Um auf die Datenbank zugreifen zu können, sind folgende Informationen notwendig:

 

   o Auf welchem Server liegt die Datenbank?

 

     Es ist nicht notwendig, dass der Webserver und der Rechner der Datenbank

     ident sein müssen. Es ist notwendig entweder die IP-Adresse oder den Namen

     des Rechners zu wissen.4

 

   o Wie heißt die Benutzerkennung unter dem der Datenbankzugriff erfolgen soll?

 

     Diese Benutzerkennung ist nicht mit der des Betriebssystems ident; der Be-

     nutzer root der Datenbank ist daher nicht der gleiche, wie der Benutzer ro*

 *ot

     des Betriebssystems.

 

   o Das Passwort der dazugehörigen Benutzerkennung.

 

     Da das Skript am Server zuerst ausgeführt wird, gehen diese Daten (Benut-

     zerkennung und Passwort) nicht an den Client weiter. (Es sein, der Program-

     mierer sieht dies ausdrüklich vor.)

 

   o Den Namen der Datenbank mit gearbeitet werden soll.

 

Das folgende PHP-Skript verwendet die Funktion mysql_connect um die Verbin-

dung zum Datenbanksystem herzustellen. $link_id liefert einen Handle zurück,

falls die Verbindung hergestellt werden konnte. Dieser Handle wird für die weit*

 *eren

Datenbankaktivitäten benötigt.

 

<html><body>

<?

 $MySQL_Host  = "localhost";

 $MySQL_User  = "michi";

_$MySQL_Passw_=_"12345";_____

  4Im Fall des selben Rechners wird der Name localhost verwendet

 

 

 

                                    7


 

 

 

 

    // mit der Datenbank verbinden

 $link_id = mysql_connect("$MySQL_Host",

                      "$MySQL_User",

                      "$MySQL_Passw"

                     );

 if (! $link_id )

   echo "<br> Die Verbindung zur Datenbank

        konnte nicht hergestellt werden <br>";

 else

   echo "<br> Die Verbindung zur Datenbank

        ist hergestellt <br>";

?>

 </html></body>

 

 

 

3.5   Eine erste Abfrage

 

Nachdem die Verbindung zur Datenbank erstellt wurde, ist der Zugriff auf die Da*

 *ten

möglich. Dazu sind folgende Voraussetzungen notwendig:

 

   o Ein Verbindungshandle, wie im vorigen Kapitel beschrieben

 

   o den Namen der Datenbank, die die Daten liefern soll.

 

   o Eine SQL Zeichenkette, für die Abfrage der Daten aus der Datenbank.

 

Das folgende Skript stellt die Verbindung zur Datenbank VIT her, und übergibt

dieser den SQL-String. Rückgabewert ist ein Handle, mit dessen Hilfe, die aus d*

 *er

Datenbank gewonnenen Werte dem Skript übergeben werden können.

 

 

<html><body>

<?

  $MySQL_Host  = "localhost";

  $MySQL_User  = "michi";

  $MySQL_Passw = "12345";

  $DataBase    = "VIT";

  $SQL         = "Select FamilienName from Mitglieder;";

 

 

  // mit der Datenbank verbinden

  $link_id =mysql_connect("$MySQL_Host",

                         "$MySQL_User",

                         "$MySQL_Passw "

                        );

 

 

  // Abfrage durchf"uhren

  $res = mysql_db_query ($DataBase,$SQL);

 

 

  if (! $res )

   echo "<br> Die Abfrage

         konnte nicht durhcgef"uhrt werden <br>";

  else

   echo "<br> Die Abfrage war erfolgreich <br>";

?>

</html></body>

 

 

 

3.6   Ausgabe der Daten in HTML

 

Die Ausgabe einer Tabelle beginnt mit

 

  echo "<table border>";

                                    8


 

 

Um für den Tabellekopf die Spaltennamen ausgeben zu können, werden in einer

Schleife alle Spaltennamen durchlaufen. (mysql_num_fields($res) gibt an wieviele

Spalten die Abfrage hat;  mysql_field_name($res,$i) gibt den Namen an der

Position $i an.)

 

 

 echo "<tr>";

 for ($i = 0; $i < mysql_num_fields($res); $i++)

    {

      echo "<th>";

      echo  mysql_field_name($res,$i);

      echo "</th>";

    }

 echo "</tr>";

 

 

Verwendet wird mysql_fetch_row ($res) um einen kompletten Datensatz zu be-

kommen. Jeder Aufruf dieser Funktion erhöht automatisch den Datensatzzeiger.

Solange es Daten gibt, wird das Array $zeile gefüllt, gibt es keine Daten mehr,

wird der Wert false zurückgegeben.

 

 while ($zeile = mysql_fetch_row ($res) )

   {

      echo "<tr>";         //eine Zeile beginnt

      for ($i = 0; $i < mysql_num_fields($res); $i++)

           echo "<td>". $zeile[$i]."</td>";

      echo "</tr>\n";     // eine Zeile endet

   }

 

Fehlt nur mehr der Befehl zum Beenden der Tabelle:

 

  echo "</table border>";

 

 

 

                                    9