HTML-Formulare er­mög­li­chen es Be­nut­ze­rin­nen und Benutzern, Daten direkt über eine Website ein­zu­ge­ben, die an­schlie­ßend in einer Datenbank ge­spei­chert werden können. Sie bilden damit die Schnitt­stel­le zwischen der Website und der Datenbank, sodass Eingaben wie Namen, E-Mail-Adressen oder Kom­men­ta­re sys­te­ma­tisch erfasst und verwaltet werden. In dieser Anleitung zeigen wir, wie Sie mit PHP In­for­ma­tio­nen aus einem HTML-Formular in einer MySQL/MariaDB-Datenbank speichern.

Managed Database Services
Da­ten­ban­ken – Auf´s We­sent­li­che kon­zen­trie­ren
  • IONOS Cloud-Partner: Die Experten für Ihren Datenbank-Betrieb
  • Flexibel: Maß­ge­schnei­der­te Datenbank-Lösungen ganz auf Ihre Be­dürf­nis­se
  • Re­chen­zen­tren in Deutsch­land: Ihre Daten sind sicher

An­for­de­run­gen

Um Daten aus einem HTML-Formular zu­ver­läs­sig in einer MySQL- oder MariaDB-Datenbank zu speichern, benötigen Sie eine Umgebung, die folgende Vor­aus­set­zun­gen erfüllt:

  • Webserver mit PHP-Un­ter­stüt­zung: Ein Apache- oder NGINX-Webserver mit in­stal­lier­tem und ak­ti­vier­tem PHP, damit ser­ver­sei­ti­ge Skripte die For­mu­lar­in­for­ma­tio­nen ver­ar­bei­ten können
  • Grund­kennt­nis­se in PHP und SQL: Grund­le­gen­des PHP- und SQL-Know-how, um die Ver­bin­dung zwischen Formular und Datenbank her­zu­stel­len und die Daten korrekt ein­zu­fü­gen
  • Zugriff auf die Webserver-Kon­fi­gu­ra­ti­on: Zu­griffs­mög­lich­keit auf den Webserver, damit Sie PHP-Skripte ausführen, Da­ten­bank­ta­bel­len anlegen und ggf. Be­rech­ti­gun­gen kon­fi­gu­rie­ren können
Hinweis

Apache, MySQL/MariaDB und PHP sind Teil einer Stan­dard­in­stal­la­ti­on und laufen dort. Wenn Ihr Server mit einer Mi­ni­mal­in­stal­la­ti­on erstellt wurde, müssen Sie Apache, MySQL/MariaDB und PHP in­stal­lie­ren und kon­fi­gu­rie­ren, bevor Sie fort­fah­ren können.

In­for­ma­tio­nen aus einem HTML-Formular in MySQL/MariaDB einfügen – so geht’s

Für dieses Tutorial erstellen wir eine fiktive Website für ein Re­stau­rant. Ziel ist es, den Kundinnen und Kunden die Mög­lich­keit zu geben, Be­wer­tun­gen direkt über die Website abzugeben. Dabei zeigen wir Ihnen, wie HTML-Formulare mit einem PHP-Skript ver­ar­bei­tet und die ein­ge­ge­be­nen Daten in einer MySQL- oder MariaDB-Datenbank ge­spei­chert werden.

Schritt 1: Datenbank erstellen

In einem ersten Schritt erstellen wir eine Datenbank, damit Sie alle In­for­ma­tio­nen aus dem HTML-Formular in der Datenbank ablegen können. Melden Sie sich hierfür zunächst am MySQL/MariaDB-Client der Be­fehls­zei­le an:

mysql -u root -p
bash

Erstellen Sie nun eine Datenbank für die Reviews, indem Sie den SQL-Befehl CREATE DATABASE nutzen:

CREATE DATABASE reviews;
bash

Wechseln Sie an­schlie­ßend zu dieser Datenbank:

USE reviews;
bash

Für unser Beispiel werden wir zur Ver­ein­fa­chung nur eine Tabelle erstellen. Diese Tabelle wird die folgenden drei Felder haben:

  • Ein ID-Feld: Dieses Feld wird auf AUTO_INCREMENT gesetzt. Dieser Parameter sorgt dafür, dass ein Feld bei jedem neuen Datensatz au­to­ma­tisch um eins erhöht wird, sodass jeder Eintrag einen ein­deu­ti­gen Wert erhält.
  • Name der Review-Person: Hierbei wird ein Textfeld mit einer Länge von bis zu 100 Zeichen genutzt.
  • Eine Ster­nen­be­wer­tung: Eine nu­me­ri­sche Bewertung von 1 bis 5, Datentyp TINYINT.
  • Über­prü­fen Sie die Details: Ein Textfeld speichert Details oder Kom­men­ta­re zu den Be­wer­tun­gen und ist mit VARCHAR(4000) so di­men­sio­niert, dass etwa 500 Wörter Platz finden.

Erstellen Sie nun die Tabelle mit CREATE TABLE:

CREATE TABLE user_review (
id MEDIUMINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
reviewer_name VARCHAR(100),
star_rating TINYINT,
details VARCHAR(4000)
);
bash

Schritt 2: User anlegen

Aus Si­cher­heits­grün­den ist es emp­feh­lens­wert, für jede Datenbank einen ein­deu­ti­gen User anzulegen, ins­be­son­de­re wenn von einer Website aus auf diese Datenbank zu­ge­grif­fen wird.

Der folgende MariaDB-Befehl erstellt einen User namens review_site mit dem Passwort JxSLRkdutW und gewährt ihm Zugriff auf die Datenbank mit den Reviews:

GRANT ALL ON reviews.* TO review_site@localhost IDENTIFIED BY 'JxSLRkdutW';
bash

Wenn Sie MySQL nutzen, wird der Befehl GRANT ... IDENTIFIED BY ... in den aktuellen Versionen nicht mehr empfohlen. Statt­des­sen sollte man zuerst den User mit CREATE USER anlegen und dann GRANT verwenden:

CREATE USER 'review_site'@'localhost' IDENTIFIED BY 'JxSLRkdutW';
GRANT ALL PRIVILEGES ON reviews.* TO 'review_site'@'localhost';
FLUSH PRIVILEGES;
bash

Schritt 3: HTML-Formular für die Website erstellen

In einem nächsten Schritt legen wir das Be­wer­tungs­for­mu­lar für die Kun­den­be­wer­tun­gen an. Erstellen Sie hierzu eine Datei namens reviews.html in Ihrem Webspace und öffnen Sie sie zur Be­ar­bei­tung. Um bei­spiels­wei­se die Datei in /var/www/html mit dem Text­edi­tor nano zu erstellen, lautet der Befehl:

sudo nano /var/www/html/reviews.html
bash

Fügen Sie nun folgenden Inhalt in diese Datei ein:

<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="UTF-8">
<title>Restaurantbewertung</title>
</head>
<body>
<p>Wie hat es Ihnen bei uns gefallen?</p>
<form action="addreview.php" method="POST">
Ihr Name: <input type="text" name="reviewer_name"><br><br>
Wie viele Sterne würden Sie uns geben?
<select name="star_rating">
<option value="1">1 Stern</option>
<option value="2">2 Sterne</option>
<option value="3">3 Sterne</option>
<option value="4">4 Sterne</option>
<option value="5">5 Sterne</option>
</select><br><br>
Ihre Bewertung: <br>
<textarea name="details" rows="10" cols="30"></textarea><br><br>
<input type="submit" value="Submit" name="submit">
</form>
</body>
</html>
html

Nach­fol­gend ein paar Dinge, die man über dieses grund­le­gen­de HTML-Formular beachten sollte:

  • Dieses Formular verwendet die POST-Methode, um Daten an das PHP-Skript addreview.php zu übergeben.
  • Der Name für jedes Ein­ga­be­feld wird im nächsten Schritt als PHP-Va­ria­blen­na­me verwendet. In der Regel ist es sinnvoll, für diese Werte den Feldnamen der Da­ten­bank­ta­bel­le zu verwenden.
  • Vertrauen Sie niemals Be­nut­zer­ein­ga­ben. In diesem Beispiel benötigen wir für die Ster­nen­be­wer­tung eine Zahl von 1 bis 5. Wenn wir die Be­nut­ze­rin­nen und Benutzer bitten würden, ihre Ster­nen­be­wer­tung manuell ein­zu­ge­ben, könnten diese mög­li­cher­wei­se eine ungültige Eingabe tätigen. Daher ist es am besten, die User zu bitten, vor­ge­ge­be­ne Werte aus einem Dropdown-Menü aus­zu­wäh­len.

Schritt 4: PHP-Skript anlegen

Im letzten Schritt erstellen wir das PHP-Skript, das die Daten aus dem HTML-Formular in die Datenbank einfügt. Hierzu stellen wir eine Ver­bin­dung zu MySQL oder MariaDB her, fangen Be­nut­zer­ein­ga­ben aus dem Formular ab und speichern diese in der zuvor er­stell­ten Tabelle. Erstellen Sie zunächst eine Datei addreview.php in Ihrem Webspace und öffnen Sie sie zur Be­ar­bei­tung. Hier wird der PHP-Code platziert. Um die Datei in /var/www/html mithilfe von nano anzulegen, lautet der Befehl:

sudo nano /var/www/html/addreview.php
bash

Jedes PHP-Skript muss mit dem öffnenden PHP-Tag beginnen:

<?php
php

Fügen Sie an­schlie­ßend einen MySQL/MariaDB-Ver­bin­dungs­block mit dem Ser­ver­stand­ort (localhost), dem Da­ten­bank­na­men sowie dem Da­ten­bank­be­nut­zer­na­men und dem Passwort hinzu.

$hostname = "localhost";
$username = "review_site";
$password = "JxSLRkdutW";
$db = "reviews";
php

Der folgende Code­ab­schnitt er­mög­licht es, mithilfe der Funktion mysqli_connect eine Ver­bin­dung zur Datenbank her­zu­stel­len. Zudem gibt das Skript einen Fehler aus, wenn diese Ver­bin­dung fehl­schlägt:

$dbconnect = mysqli_connect($hostname, $username, $password, $db);
if (mysqli_connect_errno()) {
die("Database connection failed: " . mysqli_connect_error());
}
php

Im nächsten Schritt holen wir die vom User über das HTML-Formular ein­ge­ge­be­nen Daten ab und speichern sie in PHP-Variablen, sodass wir sie an­schlie­ßend zur Ver­ar­bei­tung und zum Einfügen in die Datenbank verwenden können:

if (isset($_POST['submit'])) {
$reviewer_name = $_POST['reviewer_name'];
$star_rating = $_POST['star_rating'];
$details = $_POST['details'];
php

An­schlie­ßend müssen die vom User ein­ge­ge­be­nen Daten in die Datenbank ge­schrie­ben werden. Dazu erstellen wir eine SQL INSERT-Abfrage, die die Werte aus den PHP-Variablen nimmt und sie in die ent­spre­chen­den Felder der Tabelle user_review einfügt. Um SQL-In­jec­tions zu vermeiden, nutzen wir an dieser Stelle Prepared State­ments:

$stmt = $dbconnect->prepare("INSERT INTO user_review (reviewer_name, star_rating, details) VALUES (?, ?, ?)");
$stmt->bind_param("sis", $reviewer_name, $star_rating, $details);
$stmt->execute();
php

Fügen Sie eine PHP If-Else-Anweisung hinzu, die eine Feh­ler­mel­dung ausgibt, wenn der Prozess fehl­schlägt. Ist der Prozess er­folg­reich, danken Sie dem User für seine Bewertung:

if ($stmt->execute()) {
echo "Danke für Ihre Bewertung.";
} else {
die("Ein Fehler ist aufgetreten.");
}
$stmt->close();
}
php

Zuletzt schließen Sie die öffnende if-Anweisung und fügen einen schlie­ßen­den PHP-Tag hinzu:

}
?>
php
Hinweis

Wenn Sie die Feh­ler­mel­dung „Da­ten­bank­ver­bin­dung fehl­ge­schla­gen: Zugriff für Benutzer’review_site’@‘localhost’ ver­wei­gert (mit Passwort: JA)“ erhalten, können Sie die An­mel­de­infor­ma­tio­nen testen, indem Sie sich von der Kom­man­do­zei­le aus mit dem Befehl bei MySQL/MariaDB anmelden:

Schritt 5: Skript testen

Um das Skript zu testen, besuchen Sie reviews.html in einem Browser und senden dann eine bei­spiel­haf­te Bewertung ab. Melden Sie sich an­schlie­ßend mit dem MySQL/MariaDB-Client auf der Kom­man­do­zei­le in der Review-Datenbank an:

mysql -u root -p reviews
bash

Verwenden Sie SELECT * FROM user_review, um den gesamten Inhalt der Tabelle an­zu­zei­gen:

MariaDB [reviews]> SELECT * FROM user_review;
+----+---------------+-------------+---------------------------------------------------------+
| id | reviewer_name | star_rating | details                                                 |
+----+---------------+-------------+---------------------------------------------------------+
|  1 | Ben           |           5 | Leckere Calzone!                                        |
|  2 | Leslie        |           1 | Calzone ist nicht gut.                                  |
+----+---------------+-------------+---------------------------------------------------------+
2 rows in set (0.00 sec)
bash

Das voll­stän­di­ge PHP-Skript lautet:

<?php
// Datenbankverbindungsdaten
$hostname = "localhost";
$username = "review_site";
$password = "JxSLRkdutW";
$db       = "reviews";
// Verbindung zur Datenbank herstellen
$dbconnect = new mysqli($hostname, $username, $password, $db);
// Verbindung prüfen
if ($dbconnect->connect_error) {
    die("Datenbankverbindung fehlgeschlagen: " . $dbconnect->connect_error);
}
// Nur ausführen, wenn das Formular gesendet wurde
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['submit'])) {
    // Eingaben validieren (Minimalprüfung)
    $reviewer_name = trim($_POST['reviewer_name'] ?? '');
    $star_rating   = intval($_POST['star_rating'] ?? 0);
    $details       = trim($_POST['details'] ?? '');
    // Einfache Validierung
    if ($reviewer_name === '' || $star_rating < 1 || $star_rating > 5 || $details === '') {
        die("Bitte füllen Sie alle Felder korrekt aus.");
    }
    // Prepared Statement erstellen
    $stmt = $dbconnect->prepare("INSERT INTO user_review (reviewer_name, star_rating, details) VALUES (?, ?, ?)");
    
    if ($stmt === false) {
        die("Datenbankfehler: " . $dbconnect->error);
    }
    $stmt->bind_param("sis", $reviewer_name, $star_rating, $details);
    // Statement ausführen
    if ($stmt->execute()) {
        echo "Danke für Ihre Bewertung.";
    } else {
        die("Ein Fehler ist aufgetreten: " . $stmt->error);
    }
    $stmt->close();
}
// Verbindung schließen
$dbconnect->close();
?>
php
Zum Hauptmenü