Daten in eine MySQL-Datenbank mit PHP einfügen
Erfahren Sie, wie Sie mit PHP Daten in eine MySQL-Datenbank einfügen – mit einfachen Abfragen und sicheren Prepared Statements.
Das Einfügen von Daten ist die Art und Weise, wie eine PHP-Anwendung in eine MySQL-Datenbank schreibt — einen neuen Benutzer speichert, eine Bestellung protokolliert oder einen Kommentar erfasst. Jeder solche Schreibvorgang ist eine SQL-INSERT INTO-Anweisung, die PHP über eine offene Datenbankverbindung sendet. Dieser Artikel führt durch den gesamten Ablauf mit der mysqli-Erweiterung und zeigt dann die sicherere, moderne Methode mit Prepared Statements, die Sie in echten Projekten verwenden sollten.
Was Sie lernen werden
- Wie man eine Verbindung öffnet und ein einfaches
INSERTausführt - Warum das Zusammensetzen von Werten in SQL gefährlich ist und wie Prepared Statements das Problem lösen
- Wie man die automatisch generierte ID der gerade eingefügten Zeile ausliest
- Wie man mehrere Zeilen effizient einfügt
Voraussetzungen
Bevor wir beginnen, sollten Sie Folgendes haben:
- Einen Webserver mit PHP (7.4+) und der installierten
mysqli-Erweiterung - Eine laufende MySQL- (oder MariaDB-)Datenbank
- Ein Datenbankverwaltungstool wie phpMyAdmin oder Kommandozeilenzugang
Die folgenden Beispiele setzen eine users-Tabelle voraus. Sie können diese so erstellen:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
email VARCHAR(100)
);Wenn Sie neu im Erstellen von Tabellen sind, lesen Sie Eine MySQL-Tabelle erstellen.
Schritt 1: Eine Verbindung herstellen
Der erste Schritt ist die Verbindung zur Datenbank mit mysqli_connect(), die vier Argumente entgegennimmt: den Server-Host, den Benutzernamen, das Passwort und den Datenbanknamen. Sie gibt ein Verbindungsobjekt zurück, das Sie für jede Abfrage wiederverwenden.
<?php
$server = "localhost";
$username = "root";
$password = "password";
$database = "database_name";
$conn = mysqli_connect($server, $username, $password, $database);
// Always check the connection before continuing.
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";
?>mysqli_connect_error() gibt einen lesbaren Grund zurück, wenn die Verbindung fehlschlägt — ein falsches Passwort, ein nicht erreichbarer Host oder eine fehlende Datenbank — sodass Sie nicht im Dunkeln tappen.
Schritt 2: Ein einfaches INSERT ausführen
Wenn die Verbindung bereit ist, können Sie eine INSERT-Abfrage mit mysqli_query() ausführen. Sie nimmt die Verbindung und den SQL-String entgegen und gibt bei Erfolg true oder bei Fehler false zurück.
<?php
$sql = "INSERT INTO users (first_name, last_name, email)
VALUES ('John', 'Doe', '[email protected]')";
if (mysqli_query($conn, $sql)) {
echo "New record created successfully";
} else {
echo "Error: " . mysqli_error($conn);
}
?>Dies funktioniert für fest codierte Werte, aber sobald ein Teil der Abfrage aus Benutzereingaben stammt, wird es unsicher. Ein Wert wie O'Reilly (mit einem Apostroph) bricht das SQL, und ein bösartiger Wert kann Ihre Abfrage vollständig umschreiben — das ist SQL Injection. Bauen Sie niemals Abfragen durch das Zusammenfügen von Benutzereingaben in einen String.
Schritt 3: Sicher einfügen mit Prepared Statements
Ein Prepared Statement sendet das SQL-Gerüst und die Daten getrennt. Platzhalter (?) markieren, wohin die Werte gehen, und mysqli_stmt_bind_param() bindet jeden Wert mit seinem Typ (s für string, i für integer, d für double, b für blob). MySQL behandelt gebundene Werte strikt als Daten, sodass Injection unmöglich ist und das Quoting für Sie übernommen wird.
<?php
// 1. Prepare the statement with placeholders.
$stmt = mysqli_prepare(
$conn,
"INSERT INTO users (first_name, last_name, email) VALUES (?, ?, ?)"
);
// 2. Bind the input values: three strings -> "sss".
$first_name = "Jane";
$last_name = "Smith";
$email = "[email protected]";
mysqli_stmt_bind_param($stmt, "sss", $first_name, $last_name, $email);
// 3. Execute, then clean up.
if (mysqli_stmt_execute($stmt)) {
echo "New record created successfully";
} else {
echo "Error: " . mysqli_stmt_error($stmt);
}
mysqli_stmt_close($stmt);
?>Dies ist der Ansatz, den Sie in jeder echten Anwendung verwenden sollten. Einen tieferen Einblick finden Sie unter PHP MySQL Prepared Statements.
Die eingefügte ID abrufen
Wenn eine Tabelle einen AUTO_INCREMENT-Primärschlüssel hat, weist MySQL der neuen Zeile automatisch eine id zu. Lesen Sie diese mit mysqli_insert_id() zurück — nützlich, wenn Sie die ID für eine Folgeabfrage benötigen oder sie an den Benutzer zurückgeben möchten.
<?php
mysqli_query($conn, "INSERT INTO users (first_name, last_name, email)
VALUES ('Amy', 'Lee', '[email protected]')");
$new_id = mysqli_insert_id($conn);
echo "Inserted row has ID: " . $new_id;
?>Weitere Details finden Sie unter Die zuletzt eingefügte ID abrufen, einschließlich des Verhaltens mit Prepared Statements.
Mehrere Zeilen einfügen
Um mehrere Zeilen auf einmal hinzuzufügen, listen Sie mehrere Wertemengen in einer einzigen Anweisung auf. Ein Datenbankaufruf ist deutlich schneller als das Ausführen von INSERT in einer Schleife.
<?php
$sql = "INSERT INTO users (first_name, last_name, email) VALUES
('John', 'Doe', '[email protected]'),
('Jane', 'Smith', '[email protected]'),
('Amy', 'Lee', '[email protected]')";
if (mysqli_query($conn, $sql)) {
echo mysqli_affected_rows($conn) . " records inserted";
} else {
echo "Error: " . mysqli_error($conn);
}
?>Für das massenhafte Einfügen von Benutzerdaten binden Sie Werte in einer Schleife auf ein Prepared Statement — siehe Mehrere Zeilen einfügen.
Schritt 4: Die Verbindung schließen
Wenn Sie fertig sind, schließen Sie die Verbindung mit mysqli_close(), um Ressourcen freizugeben. PHP schließt Verbindungen automatisch am Ende einer Anfrage, aber das explizite Schließen ist eine gute Praxis in langlebigen Skripten.
<?php
mysqli_close($conn);
?>Häufige Fallstricke
- Das Ergebnis nicht prüfen.
mysqli_query()gibt bei einem Fehlerfalsezurück; prüfen Sie immermysqli_error(), damit ein stiller Fehler nicht wie ein Erfolg aussieht. - Nicht escapte Apostrophe. Namen wie
O'Brienbrechen eine per String-Verkettung aufgebaute Abfrage. Prepared Statements beseitigen das Problem vollständig. - Nicht übereinstimmende Spaltenanzahl. Die Anzahl der Spalten muss mit der Anzahl der Werte übereinstimmen, sonst lehnt MySQL die Anweisung ab.
- Falscher Bind-Typ. Ein Integer als
"s"zu binden funktioniert meistens, aber Fehlanpassungen (z.B. einen string an einei-Spalte binden) können Daten still korrumpieren.
Fazit
Sie wissen jetzt, wie Sie Daten von PHP aus in MySQL einfügen: eine Verbindung öffnen, ein INSERT ausführen und die Verbindung schließen. Für alles, was über fest codierte Testwerte hinausgeht, verwenden Sie Prepared Statements, um vor SQL Injection sicher zu sein. Als Nächstes lernen Sie, wie Sie Ihre Daten mit Daten auswählen wieder auslesen.