1000 FAQ, 500 Anleitungen und Lernvideos. Hier gibt es nur Lösungen!
Ein CSV-Importproblem in einer MySQL-Tabelle lösen
Dieser Leitfaden erklärt, wie Sie ein Problem beim Importieren einer Datei .csv
in eine Tabelle MySQL
beheben. Die vorgeschlagene Alternative besteht darin, die CSV-Datei zeilenweise mit PHP
zu lesen und die Daten in die Datenbank MySQL
einzufügen.
Funktion "LOAD DATA LOCAL INFILE" deaktiviert
Die Funktion LOAD DATA LOCAL INFILE
ermöglicht das Importieren einer CSV-Datei direkt in eine Tabelle MySQL
. Diese Funktion wird jedoch häufig von Angreifern genutzt, um unbefugten Zugriff auf Websites zu erhalten, die auf Servern gehostet werden, die diese Funktion zulassen.
Um Sicherheitsrisiken zu vermeiden und die Daten der Kunden zu schützen, hat Infomaniak die Funktion LOAD DATA LOCAL INFILE
deaktiviert. Benutzer, die ihre CSV-Dateien über phpMyAdmin importieren (ohne die Option „CSV via LOAD DATA“ zu aktivieren), sind nicht betroffen.
Hier ist eine alternative Methode zum Importieren von CSV-Daten in eine Tabelle MySQL
. Das folgende Beispiel zeigt, wie Fehler beim Öffnen der CSV-Datei und beim Einfügen der Daten in die Datenbank korrekt behandelt werden.
Dieses Skript verwendet mysqli
, um eine Verbindung zur Datenbank herzustellen, und vorbereitete Abfragen zum Einfügen der Daten. Dies gewährleistet eine bessere Sicherheit, optimale Kompatibilität mit den neuesten Versionen von PHP
und eine einfache Integration in Ihr Projekt, sei es in einem bestehenden Skript oder einer neuen Datei im Verzeichnis /web:
$fileName = "data.csv";
// Connect to MySQL database using mysqli
$link = new mysqli("localhost", "username", "password", "database");
// Check database connection
if ($link->connect_error) {
die("Connection failed: " . $link->connect_error);
}
// Open the CSV file for reading
if (($handle = fopen($fileName, "r")) !== FALSE) {
// Read each line of the CSV file
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
// Prepare the SQL query dynamically
$query = "INSERT INTO `test` VALUES (" . str_repeat('?,', count($data) - 1) . "?)";
$stmt = $link->prepare($query);
// Check if query preparation was successful
if ($stmt === FALSE) {
die("Query preparation failed: " . $link->error);
}
// Bind parameters (assuming all columns are strings)
$types = str_repeat('s', count($data));
$stmt->bind_param($types, ...$data);
// Execute the query
if (!$stmt->execute()) {
die("Query execution failed: " . $stmt->error);
}
// Close the statement
$stmt->close();
}
// Close the CSV file
fclose($handle);
} else {
echo "Error: unable to open the file.\n";
exit(1);
}
// Close the database connection
$link->close();
?>
Hilfe erhalten
Leider ist es nicht möglich, genau anzugeben, an welcher Stelle des Skripts diese Codezeilen eingefügt werden müssen.
Falls diese Methode Probleme verursacht (z. B. beim gleichzeitigen Import mehrerer CSV-Dateien ohne Fehlermeldung), könnte die Struktur der Tabellen oder die Indizierung der Felder die Ursache sein. In diesem Fall wenden Sie sich an Ihren Webmaster zur Überprüfung.
Konsultieren Sie auch die offizielle PHP-Dokumentation zur Funktion fgetcsv()
.
Erleichtern Sie sich das Leben! Bei Bedarf können lokal ansässige und von Infomaniak zertifizierte Partner diese Schritte übernehmen. Starten Sie eine kostenlose Ausschreibung — sie kümmern sich um alles und entlasten Sie von den technischen Aspekten.