MySQL für Einsteiger: die Datenbank hinter der Galerie
Sie laden ein Foto namens laub.jpg in die Kategorie „Herbst“ Ihrer Galerie hoch. Die Datei landet in einem Ordner auf dem Webspace, so weit ist das einfach. Woher weiß die Galerie aber eine Woche später, dass genau dieses Bild zu „Herbst“ gehört, welche Bildunterschrift es trägt und dass es vor nebel.jpg erscheinen soll? Diese Buchführung übernimmt eine Datenbank, bei fast jedem Webhoster eine MySQL-Datenbank oder ihre enge Verwandte MariaDB. Diese Seite erklärt MySQL für Einsteiger an genau diesem Fall: einer Bildergalerie, die Sie selbst betreiben.
MySQL für Einsteiger: ein Karteikasten neben dem Fotoordner
Stellen Sie sich MySQL nicht als Schrank vor, in dem die Fotos liegen, sondern als Karteikasten, der daneben steht. Jede Karteikarte ist eine Zeile in einer Tabelle, und jede Angabe auf der Karte hat ihr festes Feld, die Spalte. Eine Galerie braucht mindestens zwei solcher Kästen: einen für die Kategorien und einen für die Bilder. Die Karte eines Bildes schreibt den Namen der Kategorie nicht aus, sie notiert nur deren Nummer. Benennen Sie „Herbst“ später in „Herbst 2026“ um, ändert sich eine einzige Karte, und alle 40 Fotos dieser Kategorie hängen trotzdem richtig daran.
So könnten drei Karten im Kasten für die Bilder aussehen. Die Kategorie „Herbst“ trägt in ihrem eigenen Kasten die Nummer 3 und den Ordnernamen herbst:
id
kategorie_id
dateiname
beschreibung
17
3
laub.jpg
Laub auf dem Waldweg
18
3
nebel.jpg
Morgennebel über der Wiese
19
3
pilze.jpg
Steinpilze am Stamm
Die Nummer in der Spalte id vergibt MySQL selbst, aufsteigend bei jeder neuen Zeile. Gelöschte Nummern werden in der Regel nicht neu verteilt: Entfernen Sie Bild 18, bekommt das nächste Foto trotzdem die 20. Fachleute nennen so eine Spalte Primärschlüssel, weil sie jede Zeile eindeutig macht. Die Spalte kategorie_id ist dagegen ein Verweis auf eine Zeile im anderen Kasten. Aus solchen Verweisen entsteht das, was man eine relationale Datenbank nennt.
Wie Karteikasten und Ordner beim Aufruf der Kategorie zusammenspielen, zeigt das Diagramm. PHP fragt MySQL nach allen Zeilen mit der Kategorienummer 3, sortiert nach id. Für jede Zeile, die zurückkommt, holt die Galerie die passende Datei aus dem Ordner bilder/herbst/. In der Datenbank liegt also nie das Foto selbst, nur der Hinweis, wo es zu finden ist.
Die Datenbank führt das Verzeichnis, die Fotos liegen als Dateien im Ordner. Das ist MySQL für Einsteiger in einem Bild.
Wie viel Platz die Datenbank braucht
Viele Tarife nennen zwei Grenzen, den Speicherplatz für den Webspace und eine Größe für MySQL-Datenbanken. Für eine Galerie zählt fast nur die erste. Rechnen wir mit 2.000 Handyfotos zu je rund 3 MB. Im Ordner bilder/ belegen sie zusammen etwa 6 GB, dazu kommen die verkleinerten Kopien für Vorschau und große Ansicht. Eine Zeile im Kasten für die Bilder enthält dagegen nur ein paar Nummern, den Dateinamen und eine kurze Beschreibung, meist ein paar hundert Byte. Selbst mit Index und Verwaltungsdaten bleiben 2.000 Zeilen grob unter einem Megabyte. Die Datenbank ist damit mehrere tausend Mal kleiner als die Fotos, die sie verwaltet.
Daraus folgen zwei Regeln für die Praxis. Enthält Ihr Tarif eine Datenbank mit 100 MB oder mehr, reicht sie für jede private Galerie auf Jahre, beim Vergleich zählt eher der Webspace. Beim Sichern ist der Export der Datenbank in Sekunden erledigt, während das Herunterladen des Ordners bilder/ per FTP dauert: 6 GB brauchen bei einer Leitung mit 16 Mbit/s gut 50 Minuten. Getrennt aufbewahren sollten Sie die beiden trotzdem nie. Eine Datenbank ohne die Fotos verweist auf Dateien, die fehlen, und Fotos ohne die Datenbank haben ihre Beschreibungen und ihre Reihenfolge verloren.
Wer mit MySQL spricht und wer nicht
Besucher Ihrer Galerie haben nie direkten Kontakt mit dem Datenbank-Server. Ihr Browser fragt beim Webserver eine Adresse an, etwa bildergalerie.php?kid=3. Erst PHP auf dem Server formuliert daraus eine Frage in der Sprache SQL und schickt sie an MySQL. Die Antwort ist eine kleine Ergebnistabelle, aus der PHP das HTML mit den Vorschaubildern baut. Genau so fragt das Bildergalerie-Script beim Aufruf einer Kategorie: SELECT id, dateiname, beschreibung, kategorie_id FROM bilder WHERE kategorie_id = 3 ORDER BY id; Die Abfrage lässt sich Wort für Wort lesen:
SELECT id, dateiname, beschreibung, kategorie_id: Gefragt sind nur diese vier Spalten der passenden Zeilen. Mit SELECT * kämen alle, etwa auch der Zeitpunkt des Uploads, den die Seite nicht braucht.
FROM bilder: Gesucht wird im Kasten für die Bilder, nicht in dem für die Kategorien.
WHERE kategorie_id = 3: Nur Karten mit dem Verweis auf „Herbst“ kommen in Frage, alle anderen bleiben im Kasten.
ORDER BY id: Die Treffer kommen in der Reihenfolge, in der sie angelegt wurden. Genau so stehen später die Vorschaubilder im Raster.
Wer MySQL für Einsteiger erklärt, sollte mit dieser Rollenverteilung beginnen: Der Besucher spricht mit PHP, PHP spricht mit der Datenbank. Damit MySQL überhaupt antwortet, meldet sich PHP vorher mit eigenen Zugangsdaten an: dem Datenbank-Server, dem Namen der Datenbank, einem Benutzer und dessen Passwort. Dieses Konto hat nichts mit Ihrem Login für die Verwaltung der Galerie zu tun und auch nichts mit Ihrem FTP-Zugang. Es gehört allein der Datenbank, und Sie legen es im Kundenmenü Ihres Hosters an.
Vier typische Stolpersteine am Anfang
Viele Kurse zu MySQL für Einsteiger beginnen mit SQL-Befehlen. Die meisten Anfängerprobleme haben aber weniger mit SQL zu tun als mit Namen und Zuständigkeiten. Diese vier Fälle tauchen immer wieder auf, und jeder hat ein eindeutiges Erkennungszeichen:
Falscher Server eingetragen: Viele tragen die Adresse ihrer Website ein. Gemeint ist aber der Datenbank-Server, meist localhost. Manche Hoster nennen im Kundenmenü einen eigenen Rechnernamen, dann gilt dieser.
Benutzer und Datenbank verwechselt: Bei manchen Hostern sehen beide Namen fast gleich aus, weil sie aus der Kundennummer gebildet werden. Lehnt der Server die Anmeldung ab, stimmt meist Benutzer oder Passwort nicht. Meldet er, die Datenbank gebe es nicht, ist der Name falsch oder dem Benutzer fehlt die Berechtigung.
Tabellennamen schon belegt: Teilen sich zwei Programme eine Datenbank, können ihre Tabellen gleich heißen. Viele Anwendungen setzen deshalb ein Kürzel vor jeden Namen. Erlaubt Ihr Tarif nur eine Datenbank, prüfen Sie vorher, welche Tabellen dort schon liegen.
Zeile gelöscht, Datei noch da: Wer eine Bildzeile direkt in der Datenbank löscht, entfernt nur die Karteikarte. Das Foto bleibt im Ordner liegen und belegt weiter Platz, nur zeigt es niemand mehr an.
Der vierte Fall erklärt, warum Programme mit eigener Verwaltung fast immer der bessere Weg zum Löschen sind. Sie räumen Datei, Kopien und Zeile gemeinsam weg. Direkt in MySQL zu arbeiten lohnt sich vor allem zum Nachsehen, und für Änderungen erst nach einer Sicherung.
So nutzt das Bildergalerie-Script MySQL
Wie das in einer echten Anwendung aussieht, zeigt das Bildergalerie-Script. Es braucht MySQL ab Version 5.7 oder MariaDB ab 10.2 und legt bei der Installation genau fünf Tabellen an. Die Fotos selbst liegen als normale Dateien unter bilder/, die Vorschaubilder unter bilder/tn/. In MySQL steht nur, welche Datei zu welcher Kategorie gehört und welche Beschreibung sie hat.
Tabelle
Was darin steht
kategorie
Name, Ordnername und Beschreibung jeder Kategorie
bilder
je Foto eine Zeile mit Dateiname, Kategorienummer, Zeitpunkt des Uploads, hochladendem Konto und Beschreibung
einstellung
16 Einstellungen als Paare aus Name und Wert, etwa maxwidth mit 200
admin
die Konten für die Verwaltung, das Passwort nur als Hash
admin_log
das Systemprotokoll mit Anmeldungen und Änderungen
Die Beispieltabelle weiter oben entspricht also ziemlich genau dem Original. Eine Besonderheit hat die kategorie_id 0: Sie steht für Bilder direkt im Hauptverzeichnis bilder/, für die es keine Zeile in kategorie gibt. Weil die Galerie mit ORDER BY id sortiert, erscheinen Bilder und Kategorien in der Reihenfolge, in der sie angelegt wurden. Eine eigene Sortierspalte gibt es nicht. Ein Tabellenpräfix ebenfalls nicht, deshalb verlangt der Installer eine Datenbank ohne Tabellen dieser fünf Namen. Findet er eine davon, bricht er mit dem Hinweis ab, dass es bereits Tabellen der Bildergalerie gibt, und überschreibt nichts.
Manches an diesem Aufbau weicht vom Lehrbuch ab und erklärt Verhalten, das Einsteiger sonst überrascht:
Ja und Nein als 1 und 2: Die Tabelle einstellung speichert Schalter als 1 (Ja) und 2 (Nein), nicht als 1 und 0. Eine 0 in phpMyAdmin ist dort ein ungültiger Wert.
Kein Dateiname doppelt: Ein Schlüssel über Kategorie und Dateiname verhindert zwei gleichnamige Bilder in einer Kategorie. Die Upload-Seite weicht vorher selbst aus und speichert das zweite Foto als name-2.jpg.
Keine Fremdschlüssel: Ob eine Kategorie existiert, prüft nicht MySQL, sondern der PHP-Code. Löschen Sie eine Kategorie in der Verwaltung, entfernt das Script erst den Ordner und die Vorschaubilder, dann die Zeilen in bilder und zuletzt die Kategorie selbst.
Engine und Zeichensatz: Neue Installationen nutzen InnoDB und utf8mb4. Galerien aus Versionen vor 3.15 laufen mit MyISAM und latin1 unverändert weiter.
Prepared Statements: In der oben gezeigten Abfrage steht im Code statt der 3 ein Platzhalter. Werte aus Adressen und Formularen gelangen nur als Parameter hinein, das verhindert SQL-Injection.
Zwischenspeicher: Ergebnisse häufiger Abfragen legt die Galerie im Ordner cache/ ab, beim Standardwert bis zu 350 Sekunden. Änderungen in der Verwaltung leeren ihn sofort, Änderungen direkt in MySQL zeigt die Galerie erst nach Ablauf dieser Zeit.
Mit fünf kleinen Tabellen ist die Galerie ein gutes Übungsobjekt für die ersten eigenen Abfragen. Wenn Sie sich die Tabellen in phpMyAdmin selbst ansehen möchten, können Sie das Bildergalerie-Script kostenlos herunterladen und nach der Installation einen Blick hineinwerfen.
Häufige Fragen beim ersten Kontakt mit der Datenbank
Zum Schluss die Fragen, die bei MySQL für Einsteiger am häufigsten kommen.
Was ist der Unterschied zwischen MySQL und MariaDB?
MariaDB ist eine Abspaltung von MySQL, gegründet von einem der ursprünglichen MySQL-Entwickler. Für eine Galerie verhalten sich beide gleich, und viele Hoster nennen ihre MariaDB im Kundenmenü weiterhin „MySQL-Datenbank“. Entscheidend ist die Versionsnummer: Das Bildergalerie-Script verlangt MySQL ab 5.7 oder MariaDB ab 10.2. Welche Version läuft, zeigt phpMyAdmin auf seiner Startseite.
Wie sieht eine einfache SQL-Abfrage zum Ausprobieren aus?
Ein guter Anfang ist SELECT COUNT(*) FROM bilder;, die Antwort ist die Zahl aller Fotos Ihrer Galerie. Mit SELECT dateiname FROM bilder WHERE kategorie_id = 3 ORDER BY id; listen Sie die Dateinamen einer Kategorie in Galerie-Reihenfolge. Abfragen mit SELECT lesen nur und ändern nichts. Befehle mit UPDATE oder DELETE sollten Sie erst nach einem Export der Datenbank ausführen, denn ein Rückgängig gibt es nicht.
Welchen Zeichensatz sollte meine Datenbank verwenden?
Für neue Tabellen utf8mb4. Er speichert jedes Zeichen, auch Emojis, während das ältere utf8 in MySQL bei vier Byte langen Zeichen aussteigt. Beim Bildergalerie-Script nimmt Ihnen der Installer die Wahl ab und legt alle Tabellen mit utf8mb4 an, die Voreinstellung der Datenbank spielt keine Rolle. Eine ältere Galerie mit latin1-Tabellen zeigt Umlaute trotzdem richtig, weil die Verbindung immer mit utf8mb4 läuft.
Wo kann ich gefahrlos üben, ohne die Galerie zu gefährden?
Am sichersten auf einer Kopie. Exportieren Sie die Datenbank in phpMyAdmin und spielen Sie den Export in eine zweite, leere Datenbank ein, sofern Ihr Tarif mehrere erlaubt. Dort dürfen auch UPDATE und DELETE schiefgehen. In der echten Datenbank bleiben Sie bei SELECT, das liest nur. Eine eigene Datenbank nur für die Galerie hat außerdem den Vorteil, dass Sie sie getrennt von anderen Anwendungen sichern können.
Verwandte Themen
MySQL ist ein Baustein unter mehreren. Diese Beiträge zeigen die Datenbank im Zusammenhang und den Weg zur laufenden Galerie: