Importieren einer CSV-Datei mit PHP PDO in eine MySQL-Datenbank

Vor dem Importieren der CSV-Datei musst du folgendes vorbereiten:

  • Eine Datenbanktabelle, in die die Daten aus der Datei importiert werden.
  • Eine CSV-Datei mit Daten, die mit der Anzahl der Spalten und den Datentypen der Datenbanktabelle übereinstimmen.
  • Einen Datenbank Benutzer der FILE- und INSERT-Berechtigungen besitzt.

Gehen wir davon aus dass wir diese Datenbank Struktur benötigen:

Datenbank-Struktur für die CSV-Datei

Verwende dafür das folgende SQL Skript:

CREATE TABLE IF NOT EXISTS `php-pdo`.`csv-import` ( 
  `id` BIGINT(20) NOT NULL , 
  `post_date` DATETIME NOT NULL , 
  `post_title` TEXT NOT NULL , 
  `post_excerpt` TEXT NOT NULL , 
  `post_status` VARCHAR(20) NOT NULL 
) ENGINE = InnoDB;

Der Inhalt deiner CSV-Datei sollte dann wie folgt aussehen:

id;post_date;post_title;post_excerpt;post_status
"1";"2022-03-22 07:36:18";"Titel Nummer 1";"Beschreibung Nummer 1";"publish"
"2";"2022-03-25 08:01:07";"Titel Nummer 2";"Beschreibung Nummer 2";"private"
"3";"2022-04-02 14:55:12";"Titel Nummer 3";"Beschreibung Nummer 3";"publish"
"4";"2022-04-18 22:43:28";"Titel Nummer 4";"Beschreibung Nummer 4";"publish"
"5";"2022-04-26 11:15:56";"Titel Nummer 5";"Beschreibung Nummer 5";"private"

Achte darauf dass deine Spalten in der Datenbank Tabelle mit der Struktur aus deiner CSV-Datei übereinstimmt. Andernfalls wird der Import nicht funktionieren und in einen Fehler laufen.

Wenn alles passt, machen wir uns an das PHP Skript.
Wie man eine PDO Datenbankverbindung aufbaut, habe ich in diesem Artikel schon mal erklärt: PDO Datenbankverbindung aufbauen.

Das selbe Schema verwenden wir auch bei unserem CSV-Datei Import:

Hinweis: Verwende grundsätzlich absolute Pfade wenn du auf deine Datei verlinkst.

Erstelle eine PHP Datei mit einem Namen deiner Wahl. Ich nehme in meinem Beispiel import.php. Dort fügst du im Anschluss folgenden Code ein:

<?php

$username = "DEIN_BENUTZERNAMEN";
$password = "DEIN_PASSWORT";
$db = "php-pdo"; // DB Name
$table = "csv-import"; // DB Tabelle
$update = true; // true = DB vor neuem Import leeren | false = nur neue Datensätze werden hinzugefügt, bestehende nicht geändert

$iSeparator = ";";
$iEscapedBy = "";
$iEnclosedBy = '"';
$lSeparator = "\n";

$file = "import.csv";

if (file_exists($file)) {

    try {
        $pdo = new PDO("mysql:host=localhost;dbname=$db", $username, $password,
            array(
                PDO::MYSQL_ATTR_LOCAL_INFILE => true,
                PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
            )
        );
    } catch (PDOException $e) {
        die( "Verbindung fehlgeschlagen: " . $e->getMessage() );
    }
	
	if ($update != false) {
		$pdo->exec("TRUNCATE TABLE `$table`");
	}

    $rows = $pdo->exec(
        "LOAD DATA LOCAL INFILE "
        . $pdo->quote($file)
        . " INTO TABLE `$table` FIELDS TERMINATED BY "
        . $pdo->quote($iSeparator)
        . " ESCAPED BY "
        . $pdo->quote($iEscapedBy)
        . " ENCLOSED BY "
        . $pdo->quote($iEnclosedBy)
        . " LINES TERMINATED BY "
        . $pdo->quote($lSeparator)
        . " IGNORE 1 LINES"
    );

    $pdo = null;

    echo '<div class="ergebnis">' . $rows . ' Zeilen erfolgreich in die Datenbank übernommen.</div>';

} else {
    die( 'Keine CSV Datei gefunden. Bist du sicher dass der Pfad stimmt und die Datei vorhanden ist?' );
}

Wenn du alles richtig gemacht hast, sind nach dem Ausführen der PHP Datei, die Inhalte deiner CSV-Datei erfolgreich in die Datenbank importiert worden.

Setzt du den Wert bei Update auf true wird die Datenbank Tabelle zuerst geleert und alle Daten neu importiert. Bei false werden nur neue Daten importiert und die alten bleiben unverändert.

* Werbung/Affiliate Link

Schreibe einen Kommentar

Erforderliche Felder sind entsprechend markiert.

Wird nicht veröffentlicht.