Titelbild
Username: Passwort:   Bei jedem Besuch automatisch einloggen
  registrieren  Passwort vergessen?
Tutorials

MySQL - Tutorial


Inhaltsverzeichnis

  1. Allgemeiner Hinweis
  2. Einleitung
  3. phpMyAdmin
  4. eine Tabelle erstellen über phpMyAdmin
  5. Verbindung herstellen
  6. Daten einfügen - INSERT
  7. Daten abfragen - SELECT
  8. Abschlussbemerkungen


1. Allgemeiner Hinweis

Solltet ihr Fragen zu einem der folgenden Abschnitte haben, scheut euch nicht diese zu stellen. Meine email-Adresse findet ihr unter .kontakt. Ich werde versuchen sie dann so gut ich kann zu beantworten.

zurück zum Inhalt

Hier klicken >>

2. Einleitung

MySQL ist eine Datenbank. Datenbanken dienen dazu große Mengen an Daten in ihnen abzulegen, um sie so dauerhaft zu speichern.

Mit PHP alleine ist es uns zwar möglich, Daten in Variablen abzulegen und mit diesen zu rechnen, oder sie ausgeben zu lassen. Wechseln wir von einer Seite unserer Homepage zu einer anderen können wir diese Daten auch in der URL mit übergeben (z.B.: http://pasdan.pa.funpic.de/gb/gaestebuch.php?seite=1), jedoch gehen sie spätestens dann verloren, wenn wir das Browserfenster schließen oder unsere Homepage verlassen.
In vielen Fällen möchten wir aber, dass diese Daten auch beim nächsten Besuch unserer Seite noch existieren oder wir möchten Informationen für alle Besucher unserer Seite gleichermaßen zur Verfügung stellen. Wenn wir z.B. eine Userverwaltung eingerichtet haben, Besucher sich also mit Namen und Passwort auf unserer Seite anmelden können, muss es möglich sein diese Informationen auch abzuspeichern, damit wir die Eingaben eines Besuchers mit den Daten auf unserem Server vergleichen können. Der Inhalt von z.B. Gästebüchern muss ebenfalls abgespeichert werden, damit er jedem Besucher unserer Seite angezeigt werden kann. Außerdem müssen neue Gästebucheinträge natürlich auch in den Datenbestand aufgenommen werden.
In allen diesen Fällen kommen Datenbanken zum Einsatz. In diesem Tutorial beschränke ich mich auf die Beschreibung von MySQL in Verbindung mit PHP. D.h. wir führen mit Hilfe von PHP-Funktionen MySQL-Anweisungen aus, die dafür sorgen, dass wir Daten in die Datenbank einfügen, aus ihr lesen und löschen und Datensätze, die bereits in ihr enthalten sind verändern können.

Eigentlich sind Datenbanken nur Container für Tabellen, die wir in ihnen ablegen. Diese nehmen dann unsere eigentlichen Daten auf.

Um MySQL nutzen zu können, muss euer Anbieter das natürlich bereitstellen. Im Tutorial über XAMPP könnt ihr nachlesen, wie ihr auf eurem Rechner zu Hause MySQL zum Laufen bekommt. In diesem Tutorial gehe ich davon aus, dass ihr XAMPP installiert habt. Bei eurem Hoster müsstet ihr eine MySQL-Datenbank über den Member-Bereich einrichten könnnen. Der Datenbankname dürfte dann euren Accountnamen entsprechen und das Passwort könnt ihr bei der Einrichtung im Memberbereich frei wählen. Wenn ihr das gemacht habt, dürften sich die folgenden Schritte eigentlich kaum noch von den hier beschriebenen unterscheiden, vorausgesetzt euer Hoster hat phpMyAdmin installiert, so dass ihr das nutzen könnt.

zurück zum Inhalt

3. phpMyAdmin

Wenn ihr XAMPP, wie im gleichnamigen Tutorial beschrieben, eingerichtet habt, erreicht ihr durch Eingabe von localhost in die Adressleiste eures Browsers die XAMP-Startseite. Unter dem Punkt Tools findet ihr den Link phpMyAdmin auf den ihr klickt. Ihr erreicht die phpMyAdmin-Hauptseite. Für den Fall, dass ihr von einer phpMyAdmin-Seite zu dieser Seite zurückkehren möchtet, könnt ihr auf das kleine Haus-Icon (home) im oberen Bereich der linken Spalte klicken.

Klickt auf den Punkt Rechte. Ihr gelangt zu einer Benutzerübersicht, darunter findet ihr den Link Neuen Benutzer hinzufügen. Das wollen wir tun ;)!
Unser neuer Benutzer soll "testuser" heißen, das Drop-Down-Menu hinter "Host" stellen wir auf "lokal". Dadurch erscheint im folgenden Textfeld "localhost". Das Passwort ist natürlich absolut sicher und lautet "testpw". Im Feld "Datenbank für Benutzer" wählen wir den Punkt "Erstelle eine Datenbank mit gleichem Namen und gewähre alle Rechte". Unten rechts auf der Seite können wir nun auf den Button "OK" klicken. Wir haben eine Datenbank eingerichtet und können zur phpMyAdmin-Hauptseite zurückkehren :)!

Bemerkung: Ihr könnt natürlich einen beliebigen Namen und ein anderes Passwort wählen, allerdings müsst ihr dann darauf achten, dass ihr das dann später auch entsprechend ersetzt.

zurück zum Inhalt

4. eine Tabelle erstellen mit phpMyAdmin

Auf der Hauptseite klicken wir auf den Link "Datenbanken", der uns auf eine Seite mit gleichnamiger Tabelle führt, in der auch unsere neue Datenbank "testuser" aufgeführt ist. Ein klick auf darauf führt zu einer Seite in der wir eine "Neue Tabelle in Datenbank testuser erstellen" können. Wie bereits in der Einleitung erwähnt, dienen die Tabellen dazu unsere Daten aufzunehmen.

Anscheinend können wir für eine Tabelle einen "Namen" vergeben und die Anzahl der "Felder" bestimmen. Um dies tun zu könnnen, müssen wir uns natürlich ersteinmal überlegen, was unsere erste Tabelle aufnehmen soll. Ich bin mal so frei und entscheide mich für ein Gästebuch. Der Name unserer Tabelle soll also "gaestebuch" lauten ;).
Aber was hat das nun mit den Felder auf sich? Felder können einen Datensatz aufnehmen, also z.B. das Datum, eine Email-Adresse, den Eintrag in das Gästebuch, den Namen des Users, usw. Also überlegen wir, wieviele Felder wir für unser Gästebuch brauchen:

  • name
  • datum
  • eintrag

Das soll hier erstmal reichen. Außerdem brauchen wir ein weiteres Feld, dass einen eindeutigen index (id) erhalten soll. Über dieses Feld wollen wir die Einträge später bei der Ausgabe sortieren. Wir haben also insgesamt 4 Felder.
Also tragen wir unter "Name" "gaestebuch" ein und unter "Anzahl der Felder" "4" und bestätigen mit "OK".

Auf der nächsten Seite sollen wir jetzt anscheinend ganz viele Werte eintragen. Die Werte für die Spalte "Feld" hatten wir uns ja bereits überlegt. Wir tragen (von oben nach unten) ein: "id", "name", "datum", "eintrag".
Der Typ von "id" soll "INT" sein, außerdem stellen wir "Atribute" auf "unsigned" und "Extras" auf "auto_increment". Zudem setzten wir den Radiobutton auf das Feld "Primärschlüssel" (hier müsst ihr evtl. nach rechts scrollen, da euer Monitor evtl. zu klein ist um die gesamte Seitenbreite direkt darzustellen). Damit hätten wir die erste Zeile komplett, alle Felder die jetzt noch leer sind, interessieren uns hier nicht. Aber was bedeuten die Werte, für die wir uns entschieden haben? "INT" in Verbindung mit dem Attribut "unsigned" gibt an, dass dass Feld (in diesem Fall "id") nur positive ganze Zahlen aufnehmen kann. "INT" steht hier für Integer. "auto_increment" sorgt dafür, dass bei jedem neu eingefügten Datensatz, der aktuelle Wert von "id" um 1 hochgezählt wird. Da wir unsere Gästebucheinträge ja nach diesem Wert sortieren möchten, stellen wir so sicher, dass höhere "id"-Werte, neueren Gästebucheinträgen entsprechen. "Primary Key" definiert die Zeile "id" als Primärschlüssel, d.h. der Wert unter "id" für jeden Eintrag unseres Gästebuchs ist in der Tabelle eindeutig und bezieht sich somit exakt auf eine Datensatz der Tabelle.
Für die Zeile "name" nehmen wir folgende Einstellungen vor

  • Typ = VARCHAR
  • Länge/Set = 20

"VARCHAR" steht für einen String variabler Länge. In diesem Fall soll dieser maximal 20 Zeichen lang sein, was für die Angabe eines Namens reichen sollte.
In der Zeile "datum" wählen wir "DATETIME" als Typ. Hier speichern wir, wann ein Besucher seinen Beitrag ins Gästebuch gemacht hat.
Für die Zeile "eintrag" wählen wir "TEXT" als Typ.
Nun speichern wir die Tabelle mit einem Klick auf den Button "Speichern".

Natürlich hätten wir auch einen entsprechenden SQL-Befehl für das Erstellen der Tabelle benutzen können. Diesen sehen wir auf der nächsten Seite:

CREATE TABLE `test`.`gaestebuch` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
  `name` VARCHAR( 20 ) NOT NULL ,
  `datum` DATETIME NOT NULL ,
  `eintrag` TEXT NOT NULL
) ENGINE = MYISAM

Allerdings ist es mit phpMyAdmin deutlich komfortabler und man kann auch mal ein bisschen rumexperimentieren, ohne ständig neuen Code schreiben zu müssen.

zurück zum Inhalt

5. Verbindung herstellen

Um jetzt mit PHP auf die Datenbank zuzugreifen, müssen wir zunächst eine Verbindung zum Server herstellen und und dann unsere Datenbank auswählen. Das geschieht mit folgenden Befehlen:

<?php
  // Verbindung zum Server
  mysql_connect('localhost', 'testuser', 'testpw') OR
    die("Verbindung zum Server fehlgeschlagen. Fehlermeldung:".mysql_error());
  //Verbindung zur Datenbank
  mysql_select_db('testuser') OR
    die("Konnte Datenbank nicht benutzen, Fehlermeldung: ".mysql_error());
?>

Ich lagere diesen Code immer in zwei Dateien aus. In eine, in der ich Konstanten definiere und in eine andere, die die Verbindung zur Datenbank herstellt.

Datei: consts.php:

<?php
  define('MYSQL_HOST', 'localhost');
  define('MYSQL_USER', 'testuser');
  define('MYSQL_PASS', 'testpw');
  define('MYSQL_DATABASE', 'testuser');
?>

Datei: db_con.php

<?php
  include("consts.php");
  mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS) OR
    die("Verbindung zum Server fehlgeschlagen. Fehlermeldung:".mysql_error());
  mysql_select_db(MYSQL_DATABASE) OR
    die("Konnte Datenbank nicht benutzen, Fehlermeldung: ".mysql_error());
?>

Natürlich muss man in der Datei db_con.php die Datei consts.php einbinden. So wird das Ganze meiner Meinung nach aber ein bisschen übersichtlicher und immer, wenn man eine Datenbankverbindung in einer Datei braucht, kann man die Datei db_con.php dort einbinden. die() gibt übrigens, ähnlich wie echo eine Meldung im Browser aus. Allerdings bricht PHP nach die() die Ausführung ab und versucht nicht mehr den Rest der Datei auszuliefern. Hier nutzen wir das, um im Falle eines Verbindungsfehlers zum Server oder zur Datenbank eine Fehlermeldung auszugeben.

Für diejenigen, die die Beispiele dieses Tutorials bei ihrem Anbieter im Internet ausprobieren wollen, hier noch folgender Hinweis: Es kann sein, dass "localhost" nicht der passende Wert für euren Host ist. Wenn euer Anbieter Datenbanken auf einem externen Server verwaltet, muss die Adresse dieses Servers hier angegeben werden, also z.B. "testuser.test-host.de". Nähere Informationen dazu bekommt ihr bestimmt in den FAQs auf der Seite eures Hosters.

Nun wollen wir aber anfangen unser Gästebuch zu erstellen und fangen mit dem Formular an, also der Seite auf der der Besucher sich eintragen und die bereits gemachten Einträge einsehen kann. Wir nennen die Datei gaestebuch.php:

<html>
<head>
  <title>Mein Gästebuch</title>
</head>
<body>
  <?php
    include("db_con.php");
    /* hier müssen wir noch die bereits gemachten Gästebucheinträge anzeigen */
  ?>
  Eintrag hinzufügen:<br><br>
  <form action="eintragen.php" method="POST">
    Name:<br>
    <input type="text" name="besucher"><br>
    Eintrag:<br>
    <textarea rows="15" cols="25" name="eintrag"></textarea><br>
    <input type="submit" value="eintragen">
  </form>
</body>
</html>

Da hier ja auch die bereits gemachten Einträge angezeigt werden sollen, müssen wir die Datei db_con.php einbinden, da sie ja dafür sorgt, dass wir uns mit unserer Datenbank verbinden können. Die Erstellung eines Formulars haben wir uns ja schon im PHP-Tutorial angeguckt. Mit "textarea" erzeugen wir einen Textbereich, in diesem Fall besteht dieser aus 15 Zeilen und 25 Spalten.
Die Datei eintragen.php (Wert des action-Attributs des Formulars) erstellen wir im folgenden Abschnitt.

Wenn wir das ausführen, passiert natürlich erstmal nur recht wenig. Wenn aber nur unser Formular angezeigt wird und keine Fehlermeldung, ist das schon ein gutes Zeichen, denn das heißt, dass die Verbindung mit der Datenbank steht.

zurück zum Inhalt

6. Daten einfügen - INSERT

Nun wollen wir uns angucken, wie wir einen Eintrag in unsere Gästebuch-Tabelle einfügen können. Dafür erstellen wir die Datei eintragen.php und füllen sie mit folgendem Inhalt:

<html>
<head>
  <title>Mein Gästebuch</title>
</head>
<body>
  <?php
    include("db_con.php");
    /* hier kommt der Code rein */
  ?>
  <a href="./gaestebuch.php">Danke für deinen Eintrag. Klicke hier um zum Gästebuch zurückzukommen... </a>
</body>
</html>

Wieder brauchen wir eine Verbindung zur Datenbank, daher müssen wir die Datei db_con.php auch wieder einbinden. Sonst passiert eigentlich noch nicht viel. Wir erzeugen nur einen Link, der den Besucher wieder zurück zum Gästebuch leitet.

Um Daten in unsere Datenbank zu bekommen, gibt es den SQL-Befehl INSERT. Wir müssen dabei den Namen der Tabelle, die Namen der Felder und die Werte angeben, die wir einfügen wollen. In SQL sieht das so aus:

INSERT INTO tabellenname (feld1, feld2, ...) VALUES ('wert4feld1', 'wert4feld2',...)

Um diesen Befehl in unserem Beispiel und in Verbindung mit PHP zu nutzen, gehen wir wie folgt vor:

<?php
  $eintrag = "
    INSERT INTO
      gaestebuch (name, datum, eintrag)
    VALUES
      ('".$_POST["besucher"]."', NOW(), '".$_POST["eintrag"]."')";
  mysql_query($eintrag) OR die(mysql_error());
?>

Wir weisen einer Variabelen den Wert des SQL-Befehls zu und lassen diesen dann mit der PHP-Funktion mysql_query() ausführen. NOW() ist dabei eine SQL-Funktion, die das aktuelle Datum und die aktuelle Zeit zurückgibt. Wir haben dem Feld "datum" ja den Typ "DATETIME" gegeben, also ist diese Funktion genau das was wir brauchen ;). Im Falle eines Fehlers geben wir mit die(mysql_error()) einfach wieder einen Fehler aus und beenden die PHP-Bemühungen, die gesamte Datei auszuliefern.

Wir hätten den SQL-Befehl auch direkt als String (also in "...") an die Funktion mysql_query() übergeben können. Natürlich hätten wir ihn auch in einer Zeile schreiben können, allerdings erleichtern ein paar Zeilenumbrüche und Einrückungen das Lesen von Quellcode ungemein ;).

Diesen Code fügen wir nun an die Stelle des Kommentar im oberen Code ein und erhalten:

<html>
<head>
  <title>Mein Gästebuch</title>
</head>
<body>
  <?php
    include("db_con.php");
    $eintrag = "
      INSERT INTO
        gaestebuch (name, datum, eintrag)
      VALUES
        ('".$_POST["besucher"]."', NOW(), '".$_POST["eintrag"]."')";
    mysql_query($eintrag) OR die(mysql_error());
  ?>
  <a href="./gaestebuch.php">Danke für deinen Eintrag. Klicke hier um zum Gästebuch zurückzukommen... </a>
</body>
</html>

So, das war's schon. Bitte achtet darauf, dass ich die $_POST-Variablen aus dem String "ausgeklammert" habe, das soll heißen, ich habe sie mit dem "."-Operator in den SQL-Befehlsstring eingefügt. Das ist anfänglich sicherlich fehleranfällig, aber man gewöhnt sich ziemlich schnell daran. Hier noch mal ein kleiner Auszug, damit ihr seht was ich meine:

  ...
VALUES
  ( '".$_POST["besucher"] ."', NOW(), '".$_POST["eintrag"] ."')";

Um zu gucken, ob euer Eintrag auch erfolgreich ins Gästebuch eingetragen wurde, könnt ihr in phpMyAdmin die Datenbank "testuser" anklicken und dort die Tabelle "gaestebuch" auswählen. Im oberen Bereich der Seite seht ihr dann unter anderem den Reiter "Anzeigen". Über diesen könnt ihr euch alle Einträge in der ausgewählten Tabelle angucken. Bei mir sieht das z.B. so aus:

phpMyAdmin

zurück zum Inhalt

7. Daten abfragen - SELECT

Haben wir also einen Eintrag hinzugefügt und klicken auf "Danke für deinen Eintrag. Klicke hier um zum Gästebuch zurückzukommen..." müssen wir feststellen, dass unser neuer Eintrag noch nicht im Gästebuch erscheint. Das kann ja auch noch nicht so sein, da wir den entsprechenden Code noch in unsere gaestebuch.php einfügen müssen.

Wir brauchen also einen SQL-Befehl der uns den Inhalt der Tabelle gaestebuch anzeigt. Dieser Befehl heißt SELECT. Wir müssen SELECT außerdem mitgeben, wie die Tabelle heißt und welche Felder er aus ihr herausholen soll. Allgemein sieht das also so aus:

SELECT feld1, feld2, ... FROM tabellenname

Bauen wir das also wieder in unser Beispiel ein:

<?php
  $abfrage = "
    SELECT
      name, datum, eintrag
    FROM
      gaestebuch
    ORDER BY
      id DESC";
  $ergebnis = mysql_query($abfrage) OR die(mysql_error());
?>

Nach dieser MySQL-Anfrage haben wir in der Variable $ergbnis das Ergbnis unserer Abfrage gespeichert, d.h. alle Einträge unseres Gästebuchs. Das Feld "id" will ich in dieser Ergebnismenge nicht haben, es dient ja nur dazu das Ergbnis zu sortieren. Das gelingt uns, wie ihr euch wahrscheinlich schon gedacht habt, mit dem Zusatz "ORDER BY id DESC". Das Ergebnis soll also die "id"s absteigend sortiert ("DESC" - im Gegensatz zu aufsteigend "ASC") enthalten. Wenn wir also in der Ergebnismenge auf das erste Ergebnis zugreifen, erhalten wir den aktuellsten Eintrag. Vielleicht ist euch aufgefallen, dass man genau so gut nach dem "datum" sortieren könnte. Das ist natürlich richtig, allerdings wird der Primärschlüssels "id" sehr häufig verwendet und macht direkt deutlich, dass es sich dabei um einen eindeutigen Index handelt. Daher habe ich ihn auch in diesem einfachen Beispiel benutzt. Ihr müsstet in der "id"-losen Abfrage nur "id" durch "datum" ersetzen.

Wie kommen wir aber nun an die einzelnen Datensätze heran? Dafür bietet PHP einige Funktionen, von denen ich nur eine vorstelle: mysql_fetch_assoc(). Diese Funktion liefert ein assoziatives Array, das den geholten Datensatz enthält. D.h., die Arraypositionen sind mit den Feldnamen adressierbar. Will man nun alle Datensätze des Ergebnisses erreichen, kann man sich zu nutze machen, das mysql_fetch_assoc() false liefert, wenn kein Datensatz (mehr) vorhanden ist. Wir können also eine while-Schleife benutzen, um alle Elemente zu erhalten. Da wir die Ausgabe in unserem Gästebuch auch schön formatiert haben möchten, müssen wir Informationen zur Formatierung innerhalb des Schleifenrumpfes mit angeben. Diese Art des Seitenaufbaus nennt man dynamisch:

<?php
  while($zeile = mysql_fetch_assoc($ergebnis)){
    echo "<u>".$zeile["name"]." (".$zeile["datum"]."):<br></u>";
    echo $zeile["eintrag"]."<hr>";
    echo "<div style=\"margin-bottom:50px;\"></div>";
  }
?>

Nach jedem Schleifendurchlauf wird der Variablen $zeile also ein neues Array zugewiesen, das die aktuelle Zeile der Tabelle enthält. Innerhalb der Schleife kann man dann mittels "zeile["feldname"]" auf die einzelnen Positionen zurückgreifen. Fassen wir also unsere Ergebnisse in der Datei gaestebuch.php zusammen:

<html>
<head>
  <title>Mein Gästebuch</title>
</head>
<body>
  <?php
    include("db_con.php");
    $abfrage = "
      SELECT
        name, datum, eintrag
      FROM
        gaestebuch
      ORDER BY
        id DESC";
    $ergebnis = mysql_query($abfrage) OR die(mysql_error());
    while($zeile = mysql_fetch_assoc($ergebnis)){
      echo "<u>".$zeile["name"]." (".$zeile["datum"]."):<br></u>";
      echo $zeile["eintrag"]."<hr>";
      echo "<div style=\"margin-bottom:50px;\"></div>";
    }
  ?>
  Eintrag hinzufügen:<br><br>
  <form action="eintragen.php" method="POST">
    Name:<br>
    <input type="text" name="besucher"><br>
    Eintrag:<br>
    <textarea rows="15" cols="25" name="eintrag"></textarea><br>
    <input type="submit" value="eintragen">
  </form>
</body>
</html>

Aussehen sollte das in eurem Browser dann in etwa so:

gaestebuch

zurück zum Inhalt

8. Abschlussbemerkungen

Zunächst einmal möchte ich darauf hinweisen, dass man dieses Beispiel-Gästebuch nicht einfach auf seine Homepage einbauen sollte. Zunächst sollte man sich ein bisschen über Sicherheit Gedanken machen und ein wenig im Internet recherchieren. Ich habe vor dieses Tutorial weiterzuschreiben, vielleicht werde ich auch noch einige Dinge zum Thema Sicherheit erwähnen. Ihr solltet beachten, dass ihr Benutzereingaben nicht ungeprüft in eine Datenbank schreiben solltet, wie das hier der Fall ist. SQL-Injection ist in diesem Zusammenhang ein wichtiges Stichwort. Ihr findet Informationen darüber im gleichnamigen Wikipedia-Artikel und selbst bei Youtube gibt es inzwischen Videos, die das Ausnutzen dieser Sicherheitslücke demonstrieren.

Natürlich ist es in MySQL auch möglich Daten zu ändern oder zu löschen.
Der hier vorgestellte SELECT-Befehl kann auch komplexere Abfragen starten, z.B. alle Gästebucheinträge ausgeben, die älter als ein bestimmtes Datum sind, oder nur die $x aktuellsten Datensätze.

Wer will kann sich die Beispieldateien hier runterladen. Das Paket enthält die Dateien consts.php, db_con.php, gaestebuch.php und eintragen.php.

zurück zum Inhalt

Wenn euch das Tutorial gefallen hat, könnt ihr es gerne weiter

(zuletzt geändert: 19.03.2011 - Twitter eingebaut)

© 2007-2017 Daniel Pasqua
kontakt inhalt info