1000 FAQ, 500 Anleitungen und Lernvideos. Hier gibt es nur Lösungen!
Ein Problem beim CSV-Import in eine MySQL-Tabelle lösen
Diese Anleitung erklärt, wie man ein Problem beim Importieren einer .csv-Datei in eine MySQL-Tabelle löst. Die vorgeschlagene Alternative besteht darin, die CSV-Datei zeilenweise mit PHP zu lesen und die Daten in die MySQL-Datenbank einzufügen.
Funktion "load data local infile" deaktiviert
Die Funktion LOAD DATA LOCAL INFILE
ermöglicht es, eine CSV-Datei in eine MySQL-Tabelle zu importieren und wird leider mittlerweile häufig von Hackern ausgenutzt, um auf bestimmte auf Maschinen, die diese Funktion akzeptieren, gehostete Websites zuzugreifen.
Um böswilligen Handlungen entgegenzuwirken und die Kundendaten so gut wie möglich zu schützen, hat Infomaniak die Funktion LOAD DATA LOCAL INFILE
deaktiviert. Diese Änderung betrifft nicht Benutzer, die ihre CSV-Dateien (sofern "CSV via LOAD DATA" nicht angekreuzt ist) über phpMyAdmin importieren.
Hier ist eine Alternative, um weiterhin CSV-Daten in eine MySQL-Tabelle zu importieren, ein vollständiges Beispiel des Codes mit ordnungsgemäßer Fehlerbehandlung beim Öffnen der CSV-Datei und Einfügen der Daten in die Datenbank.
Diese Version verwendet mysqli
, um eine Verbindung zur Datenbank herzustellen, und vorbereitete Anweisungen, um die Daten einzufügen, was eine bessere Sicherheit und Kompatibilität mit aktuellen PHP-Versionen sowie eine einfache Implementierung in Ihr PHP-Skript oder einfach in eine neue PHP-Datei in Ihrem /web-Verzeichnis bietet:
$Dateiname = "data.csv";
// Verbindung zur MySQL-Datenbank mit mysqli herstellen
$link = new mysqli("localhost", "username", "password", "database");
// Überprüfung der Verbindung
if ($link->connect_error) {
die("Verbindung fehlgeschlagen: " . $link->connect_error);
}
// Öffnen der CSV-Datei zum Lesen
if (($handle = fopen($Dateiname, "r")) !== FALSE) {
// Aufteilen jeder Zeile der CSV-Datei
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
// Vorbereitung der SQL-Anfrage
$query = "INSERT INTO `test` VALUES (" . str_repeat('?,', count($data) - 1) . "?)";
$stmt = $link->prepare($query);
// Überprüfung, ob die Anfrage erfolgreich vorbereitet wurde
if ($stmt === FALSE) {
die("Vorbereitung der Anfrage fehlgeschlagen: " . $link->error);
}
// Bindung der Parameter
$types = str_repeat('s', count($data)); // Geht davon aus, dass alle Spalten vom Typ String sind
$stmt->bind_param($types, ...$data);
// Ausführung der Anfrage
if (!$stmt->execute()) {
die("Ausführung der Anfrage fehlgeschlagen: " . $stmt->error);
}
// Schließen der Anweisung
$stmt->close();
}
// Schließen der CSV-Datei
fclose($handle);
} else {
echo "Fehler: Datei konnte nicht geöffnet werden.\n";
exit(1);
}
// Schließen der Verbindung zur Datenbank
$link->close();
?>
Hilfe erhalten
Leider ist es unmöglich, genau anzugeben, wo in Ihrem Skript diese Codezeilen hinzugefügt werden sollten.
⚠️ Für weitere Hilfe einen Partner kontaktieren oder eine Ausschreibung ausfüllen — lesen Sie auch die Rolle des Hosters
Wenn die vorgeschlagene Alternative Probleme verursacht, wenn Sie mehrere CSV-Dateien zum Lesen einreichen und der Prozess beispielsweise ohne Rückmeldung endet, trotz der Punkte zur Nachrichtenbehandlung in der PHP-Datei, ist es möglich, dass die verwendeten Tabellen und Felder schlecht indiziert sind, und in diesem Fall sollten Sie auch Ihren Webmaster kontaktieren.
Siehe die PHP-Dokumentation zu fgetcsv
: http://php.net/manual/de/function.fgetcsv.php