Hauptmenü

Untermenü

PHP/MySQL - Praxistutorial 1 - Die Datenbank

1. Die Abschnitte

2. Nacktes SQL

Da ihr sehr oft und sehr schnell in die Situation kommen könnt, Datenbanken direkt manipulieren zu müssen, werden wir unsere diesmal per Hand erstellen, also ohne PHP. Dabei ist es egal, ob ihr das von der Kommandozeile aus macht, oder über ein graphisches Frontend wie PHPMyAdmin oder HeidiSQL.

3. Datenbank anlegen

Ich hoffe also, ihr habt euer Testsystem so eingerichtet, dass ihr über die entsprechenden Rechte verfügt. Also legen wir zuerst eine Datenbank an. Gebt im Programm (bzw. Frontend) eurer Wahl folgendes ein.


DROP DATABASE IF EXISTS foltershop;
CREATE DATABASE IF NOT EXISTS foltershop;

Erläuterung

Da ich euch hier einfach ein paar Dinge zeigen möchte, gehen wir in diesem Fall auf Nummer sicher. Zuerst wollen wir die Datenbank foltershop löschen (DROP DATABASE), wenn sie schon existiert (IF EXISTS). Normalerweise sollte man damit extrem vorsichtig sein, denn wenn einer von euch einen Sado-Maso-Shop betreibt, so sind jetzt alle Daten weg!

Danach erstellen wir die Datenbank aufs Neue. Der Zusatz IF NOT EXISTS ist in diesem Fall überflüssig, da wir sie ja vorher schon gelöscht haben. Wer also die Daten seines SM-Shops behalten will, sollte die erste Abfrage nicht absetzen sondern nur diese, da wir damit verhindern, dass eine Fehlermeldung kommt, wenn sie schon vorhanden ist.

Anschließend wählen wir die Datenbank aus, um danach weitere Anpassungen vornehmen zu können.


USE foltershop;

4. Tabellen erstellen

Vorgehensweise

Hier sind wir mal ein wenig großzügig und gehen einfach davon aus, dass die entsprechenden Tabellen noch nicht existieren. Sollte dem dennoch der Fall sein, bekommt ihr eine Fehlermeldung à la Table tabellenname already exists. Man kann daher auch bei Tabellen auf IF/IF NOT EXISTS prüfen und gegebenenfalls mit DROP TABLE... arbeiten.

Tabelle Kunde


CREATE TABLE kunde
(
  id INT NOT NULL AUTO_INCREMENT,
  doktor VARCHAR (128),
  telefon VARCHAR (64),
  fax VARCHAR (64),
  strasse VARCHAR (128),
  plz VARCHAR (10),
  ort VARCHAR (64),
  PRIMARY KEY (id)
);

Erläuterung

Das Feld id wird wie schon beschrieben als Primärschlüssel definiert, mit denen wir die einzelnen Datensätze eindeutig identifizieren können. Aber warum wurden die restlichen Felder als varchar angelegt? Telefon- und Faxnummern sind Zahlen und Postleitzahlen auch, also wieso legen wir den Datentyp nicht auf INT fest? Das hat mehrere Gründe. Alle Eingaben für diese Felder können mit einer Null (0) anfangen und die wird beim Typ INT am Anfang abgeschnitten.

Nun, diejenigen, die schon ein wenig weiter sind, könnten jetzt einwenden, dass man das folgendermaßen umgehen kann.


plz INT ZEROFILL

Das stimmt, aber was ist bei folgender Situation. Einer der Kunden kommt aus Liechtenstein (ich hatte tatsächlich einen, daher kenne ich das Problem). Und dort schreiben die ihre Postleitzahlen so: FL-9492! Nicht nur das, die regen sich auch regelmäßig darüber auf, bei deutschen Online-Formularen ihre PLZ nicht eingeben zu können. Da wird dann immer wieder eine angebliche Warnmeldung ausgegeben, weil irgendein Programmierer nur auf fünf Zahlen prüft. Hinzu kommt ein weiteres Problem. Je nach Länge des Integer-Wertes wird das Feld mit so vielen Nullen aufgefüllt, wie benötigt. Bei einem UNSIGNED ZEROFILL stände dann zum Beispiel ein "0000012345" in der Datenbank.

Bei den Telefon- und Faxnummern gibt es ein ähnliches Problem. Im Normalfall übernehmt ihr bereits bestehende Daten und ich habe es noch nie(!) erlebt, dass die so abgespeichert wurden: 0221234522. Nein, meistens sehen die aus: 0221/2345-22 und sollen auch so bleiben, damit sie besser lesbar sind.

Die Werte für VARCHAR sind eigentlich willkürlich festgelegt. Ich versuche abzuschätzen, wie viel Zeichen wohl der längste Eintrag für jedes Datenfeld haben könnte, und verdopple den dann soweit, dass ein Binärwert herauskommt (2 hoch 6 = 64). Allerdings ist das auch wieder Blödsinn, da man ja mit 0 anfängt und dementsprechend VARCHAR (63) schreiben sollte. Ich habe irgendwann mal vor Jahren irgendwo gelesen, dass es einen Bug in irgendeiner MySQL-Version gäbe, der bei Werten wie 63 oder 127 Ärger macht. Also bin ich dabei geblieben. Es folgen nun die weiteren Tabellen.

Tabelle Produkt


CREATE TABLE produkt
(
  id INT NOT NULL AUTO_INCREMENT,
  produkt VARCHAR (128),
  preis FLOAT,
  nummer VARCHAR (32),
  PRIMARY KEY (id)
);

HINWEIS!

Die Spalte nummer steht für die Artikelnummer. Lasst euch aber um Gottes Willen nicht dazu verleiten, für dieses Datenfeld ein INT als Typ anzugeben, auch wenn euer Kunde hoch und heilig verspricht, dass seine Artikelnummern nur aus Zahlen bestehen. Ich habe es schon einige Male erlebt, dass diese Aussage nicht stimmt, auch wenn die Stein und Bein schwören, dass dem so sei. Irgendwo in deren Datenbank lümmelt sich immer ein besonderer Artikel herum, der anstelle der normalen Bezeichnung "23512" ein "23512A", hat weil es eine Spezialanfertigung ist. Also legt hier ein VARCHAR fest.

Tabelle Hersteller


CREATE TABLE hersteller
(
  id INT NOT NULL AUTO_INCREMENT,
  zulieferer VARCHAR (128),
  telefon VARCHAR (64),
  fax VARCHAR (64),
  strasse VARCHAR (128),
  plz VARCHAR (10),
  ort VARCHAR (64),
  PRIMARY KEY (id)
);

5. Die Daten

Ist eigentlich nur reine Tipparbeit, daher findet ihr im Ordner files eine Datei namens dump.sql. Damit könnt ihr die Datensätze schnell einpflegen. Am Einfachsten über "Copy & Paste".

zurück zum vorherigen Abschnitt weiter zum nächsten Abschnitt