1 000 FAQ, 500 tutoriels et vidéos explicatives. Ici, il n'y a que des solutions !
Résoudre un problème d'importation CSV dans une table MySQL
Ce guide explique comment résoudre un problème d’importation d’un fichier .csv
dans une table MySQL
. L’alternative proposée consiste à lire le fichier CSV ligne par ligne avec PHP
et à insérer les données dans la base de données MySQL
.
Fonction "LOAD DATA LOCAL INFILE" désactivée
La fonction LOAD DATA LOCAL INFILE
permet d’importer un fichier CSV directement dans une table MySQL
. Cependant, cette fonctionnalité est souvent exploitée par des attaquants pour obtenir un accès non autorisé à des sites hébergés sur des serveurs qui l’acceptent.
Afin de prévenir tout risque de sécurité et de protéger les données des clients, Infomaniak a désactivé la fonction LOAD DATA LOCAL INFILE
. Les utilisateurs qui importent leurs fichiers CSV via phpMyAdmin (sans cocher l’option “CSV via LOAD DATA”) ne sont pas concernés.
Voici une méthode alternative pour importer des données au format CSV dans une table MySQL
. L’exemple ci-dessous montre comment gérer correctement les erreurs lors de l’ouverture du fichier CSV et de l’insertion des données dans la base de données.
Ce script utilise mysqli
pour se connecter à la base et des requêtes préparées pour insérer les données. Cela garantit une meilleure sécurité, une compatibilité optimale avec les versions récentes de PHP
et une intégration simple dans votre projet, que ce soit dans un script existant ou un nouveau fichier situé dans le répertoire /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();
?>
Obtenir de l’aide
Il est malheureusement impossible d’indiquer précisément à quel endroit du script ces lignes de code doivent être insérées.
Si cette méthode pose problème (par exemple en cas d’import simultané de plusieurs fichiers CSV sans message d’erreur), il est possible que la structure des tables ou l’indexation des champs soit en cause. Dans ce cas, contactez votre webmaster pour vérification.
Consultez également la documentation officielle PHP relative à la fonction fgetcsv()
.
Simplifiez-vous la vie ! En cas de besoin, des partenaires locaux et certifiés par Infomaniak peuvent prendre en charge ces démarches. Lancez un appel d’offres gratuit — ils s’occupent de tout, vous libérant des aspects techniques.