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