Die folgenden Ausführungen beziehen sich noch auf eine ältere Version von phpMyAdmin, so dass die Screenshots vom "echten" Bild abweichen.
Zuerst sollte man folgendes prüfen:
Diese Bedingung sollte man unbedingt einhalten, denn der mySQL-Server ist recht speicherhungrig, man sollte ihm also ruhig 256 MB oder mehr gönnen.
Ist die Speicherausrüstung des Servers ausreichend, kann es los gehen:
Man meldet sich als sysadm am Server an und geht unter "Verwalten" - "Dienste" auf den Punkt "MySQL - Server EINschalten". Danach muss wie immer "AKTIVIERT" werden und fertig ist man. Ein Neustart des Servers ist nicht nötig.
Der mySQL - Server wird von nun an auch bei jedem Serverstart automatisch mit gestartet.
Auf dem c't/ODS-Schulserver ist man fein raus. Alles ist vorbereitet, man kann die Datenbank sofort nutzen. Trotzdem kann etwas Wissen zur Einrichtung nicht schaden.
Im Verzeichnis /var/mysql befinden sich alle vorbereiteten Datenbanktabellen. Sollte das Einschalten nicht so richtig klappen, dann liegt es meist an dieser Stelle. Von Hand kann man die gesamte Struktur als root mit dem Befehl:
neu anlegen.
Das Ergebnis ist die Struktur unter /var/mysql/mysql mit folgenden Tabellen:
Neben dem Administrationstool "mysqladmin", welches direkt an einer Serverkonsole einsetzbar ist, kann man mySQL sehr komfortabel mit einem beliebigen Browser vom Client aus mittels "phpMyAdmin" verwalten.
Jetzt kann es losgehen: Im Browser trägt man folgende Adresse (Achtung: Gross- und Kleinschreibweise beachten!) ein:
http://arktur/phpMyAdmin
Jetzt erscheint die Passwortabfrage:
Abbildung 8.2-1: Anmeldung in phpMyAdmin
Hier trägt man als User "root" und als Passwort "arktur" ein und schon ist man drin:
Abbildung 8.2-2: phpMyAdmin im Browser
*MySQL* unterscheidet nicht zwischen einzelnen Benutzern sondern zwischen der Kombination aus Benutzer und Host. Diese Kombination ergibt eine eindeutige ID. Das Sicherheitssystem regelt hierbei genaustens welcher Benutzer von welchem Host welche Rechte auf welcher Datenbank besitzt. Diese Einstellungen werden in drei Tabellen abgelegt: user host db Die jeweiligen Tabellen sind wie folgt aufgebaut:
Beinhaltet alle Host/User Kombinationen, welche den MySQL-Server connecten dürfen. Alle Berechtigungen die ein Benutzer in dieser Tabelle enthält gelten für alle! Datenbanken, sofern keine erweiterten Berechtigungen für den jeweiligen Benutzer in der Tabelle 'db' definiert wurden. Man kann diese Berechtigungen auch als grundlegende Einstellungen ansehen und ein entsprechendes, datanbankabhängiges Feintunig in der Tabelle 'db' festlegen.
Der Tabellenaufbau für 'user':
Field | Type | Key | Default |
Host | char(60) | PRI | "" |
User | char(16) | PRI | "" |
Password | char(16) | - | "" |
Select_priv | enum('N','Y') | - | N |
Insert_priv | enum('N','Y') | - | N |
Update_priv | enum('N','Y') | - | N |
Delete_priv | enum('N','Y') | - | N |
Create_priv | enum('N','Y') | - | N |
Drop_priv | enum('N','Y') | - | N |
Reload_priv | enum('N','Y') | - | N |
Shutdown_priv | enum('N','Y') | - | N |
Process_priv | enum('N','Y') | - | N |
File_priv | enum('N','Y') | - | N |
In dieser Tabelle wird definiert welche Datenbank der jeweilige Host/Benutzer mit welchen Berechtigungen verwenden darf. Sie stellt wie bereits erwähnt das Feintuning dar.
Der Tabellenaufbau von 'db':
Field | Type | Key | Default |
Host | char(60) | PRI | "" |
Db | char(64) | PRI | "" |
User | char(16) | PRI | "" |
Select_priv | enum('N','Y') | - | N |
Insert_priv | enum('N','Y') | - | N |
Update_priv | enum('N','Y') | - | N |
Delete_priv | enum('N','Y') | - | N |
Create_priv | enum('N','Y') | - | N |
Drop_priv | enum('N','Y') | - | N |
Die host-Tabelle ist in großen Netzwerken als 'Nachschlage'-Tabelle für leere Host-Einträge in der 'db'-Tabelle sinnvoll. Möchte man daß ein Benutzer von jedem Host in dem Netzwerk auf den DB-Server zugreifen kann, sollte man den Host-Eintrag in der 'db'-Tabelle auslassen und alle Host des Netzwerkes in der 'host'-Tabelle eintragen.
Der Tabellenaufbau von 'host':
Field | Type | Key | Default |
Host | char(60) | PRI | "" |
Db | char(64) | PRI | "" |
Select_priv | enum('N','Y') | - | N |
Insert_priv | enum('N','Y') | - | N |
Update_priv | enum('N','Y') | - | N |
Delete_priv | enum('N','Y') | - | N |
Create_priv | enum('N','Y') | - | N |
Drop_priv | enum('N','Y') | - | N |
Die HOST und DB Spalten können Strings mit Wildcards '%' und '_' beinhalten. Wird für diese Spalten kein Wert eingetragen entspricht dies dem Wert '%'.
Ein HOST kann sein: localhost, ein Hostname, eine IP-Nummer oder ein String mit Wildcards. Ein leerer HOST-Eintrag in der 'db'-Tabelle bedeutet kein Host aus der 'host'-Tabelle. Ein leerer HOST-Eintag in der 'host'- oder 'user'-Tabelle bedeutet kein Host.
Die Spalte DB beinhaltet den Namen einer Datenbank oder einer SQL Regexp. Ein leerer Benutzereintrag bedeutet kein Benutzer. In dieser Spalte können keine Wildcards verwendet werden.
Die Berechtigungen der 'user'-Tabelle werden ge-OR-d mit den Berechtigungen aus der 'db'-Tabelle. Dies Bedeutet, daß ein Superuser nur in der Tabelle 'user' mit allen Berechtigungen festgelegt auf 'Y' eingetragen werden muß.
Wenn man sich nun den Aufbau der Tabellen näher betrachtet, wird man feststellen, daß die 'user'-Tabelle zusätzlich zu den Zugriffsberechtigungen auf die jeweilige Datenbank auch administrative Berechtigungen regelt. Dadurch sollte klar sein, daß diese Tabelle die grundlegenden Berechtigungen regelt.
Achtung:
Datenbanken bestehen aus mindestens einer Tabelle.
Jeder Datensatz der Datenbank ist exakt eine Zeile in einer Tabelle.
Einzelne
Datensätze können gelesen, (neue) hinzugefügt, aktualisiert oder gelöscht werden.
All diese Aktionen heißen: Abfragen.
An Hand einer Klassenliste erklärt es sich am besten:
Die Datenbank nennen wir: test und die darin enthaltene Tabelle: klassen
ID | Name | Vorname | Klasse | Bemerkung |
---|---|---|---|---|
1 | Meier | Max | 7a | |
2 | Meyer | Mary | 7a | |
3 | Witz | Willy | 8b |
Zuerst wird die Datenbank geöffnet:
USE test;
Will man nun alle Nachnamen auslesen, so gibt man den folgenden SQL - Befehl ein:
SELECT Name FROM klassen;Sollen Name und Vorname der Schüler gelesen werden, so lautet der Befehl:
SELECT Name,Vorname FROM klassen;Wenn man die ganze Zeile auslesen will, so reicht der Befehl:
SELECT * FROM klassen;Die auszulesenden Datensätze können automatisch bestimmt werden. Der Befehl:
SELECT * FROM klassen WHERE Klasse=7a;gibt nur die Schülerdaten der Schüler aus, die in der Klasse 7a sind.
Sortiert werden können diese Datensätze dann mit foglendem Befehl:
SELECT * FROM klassen WHERE Klasse=7a ORDER BY Name;
Neue Datensätze werden mit folgendem Befehl hinzugefügt:
INSERT klassen (Name,Vorname,Klasse,Bemerkung) VALUES ('Mittig','Mario','10c','');Vorhandene Datensätze können mit
UPDATE klassen SET klasse='6b',Bemerkung='nicht versetzt' WHERE ID=2;
überschrieben werden.
Die oben genannten SQL - Befehle sollen nun mit PHP vom Webserver aus verwendet werden.
<script language='php'> $verbindung = @mysql_connect("localhost","theo",""); if (!$verbindung) { echo "Keine Verbindung zum Datenbanksystem!\n"; exit; } $abfrage = "SELECT Name,Vorname from klassen"; $erg = mysql_db_query("test",$abfrage,$verbindung); while (list($Name,$Vorname) = mysql_fetch_row($erg)) { echo "$Vorname $Name<BR>\n"; } mysql_close($verbindung); </script> |
$verbindung = @mysql_connect("localhost","theo","");localhost heißt, das Webserver (Apache) und Datenbank (mySQL) auf einem Rechner liegen. Ansonsten muss hier der Name angegeben werden.
if (!$verbindung) { echo "Keine Verbindung zum Datenbanksystem!\n"; exit; }
$abfrage = "SELECT Name,Vorname from klassen";Diese Abfragevariable wird an den Datenbank-Server geschickt. Das Resultat wird in einer weiteren Variablen aufgefangen.
$erg = mysql_db_query("test",$abfrage,$verbindung);Die erste Variable gibt die Datenbank an, die abgefragt wird. Die zweite enthält den SQL - Befehl, die dritte dann die Verbindung, die mit mysql_connect geschaffen wurde.
Bei einem INSERT, UPDATE oder DELETE Befehl wäre nur zu testen, ob $erg wahr ist, also ob die Abfrage geklappt hat.
list($Name,$Vorname) = mysql_fetch_row($erg);Der Befehl mysql_fetch_row($erg) gibt genau die erste mögliche Zeile aus. Danach wird der Zeiger auf die nächste Zeile gesetzt usw.
Will man alle Zeilen ausgeben, empfiehlt sich eine Schleife:
while (list($Name,$Vorname) = mysql_fetch_row($erg)) { echo "$Vorname $Name<BR>\n"; }Die Ergebnisse werden also zeilenweise zu HTML - Quelltext gewandelt.
mysql_close($verbindung);
.
© Reiner Klaproth, 28.12.2001
vielen Dank an Uwe Schoffer für die Beschreibung