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 de fichier .csv dans une table MySQL. L'alternative proposée consiste à lire le fichier CSV ligne par ligne à l'aide de 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 dans une table MySQL et est malheureusement désormais fréquemment utilisée par les pirates pour obtenir l'accès à certains sites hébergés sur des machines acceptant cette fonction.
Pour lutter contre les actes de malveillances et continuer à protéger autant que possible les données des clients, Infomaniak a désactivé la fonction LOAD DATA LOCAL INFILE
. Ne sont pas concernées par cette modification les personnes important leurs fichiers CSV (à condition de ne pas cocher "CSV via LOAD DATA") via phpMyAdmin.
Voici une alternative pour continuer à importer des données au format CSV dans une table MySQL, un exemple complet du code avec une gestion correcte des erreurs pour l'ouverture du fichier CSV et l'insertion des données dans la base de données.
Cette version utilise mysqli
pour se connecter à la base de données et les requêtes préparées pour insérer les données, offrant ainsi une meilleure sécurité et compatibilité avec les versions récentes de PHP et une facilité à l'implémenter dans votre script PHP ou simplement dans un nouveau fichier PHP de votre répertoire /web:
$NomDuFichier = "data.csv";
// Connexion à la base de données MySQL avec mysqli
$link = new mysqli("localhost", "username", "password", "database");
// VĂ©rification de la connexion
if ($link->connect_error) {
die("Échec de la connexion : " . $link->connect_error);
}
// Ouverture du fichier CSV en lecture
if (($handle = fopen($NomDuFichier, "r")) !== FALSE) {
// DĂ©composition de chaque ligne du fichier CSV
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
// Préparation de la requête SQL
$query = "INSERT INTO `test` VALUES (" . str_repeat('?,', count($data) - 1) . "?)";
$stmt = $link->prepare($query);
// Vérification de la préparation de la requête
if ($stmt === FALSE) {
die("Échec de la préparation de la requête : " . $link->error);
}
// Liaison des paramètres
$types = str_repeat('s', count($data)); // Assume que toutes les colonnes sont de type string
$stmt->bind_param($types, ...$data);
// Exécution de la requête
if (!$stmt->execute()) {
die("Échec de l'exécution de la requête : " . $stmt->error);
}
// Fermeture de la déclaration
$stmt->close();
}
// Fermeture du fichier CSV
fclose($handle);
} else {
echo "Erreur : impossible d'ouvrir le fichier.\n";
exit(1);
}
// Fermeture de la connexion à la base de données
$link->close();
?>
Obtenir de l'aide
Il est malheureusement impossible de vous indiquer précisément à quel endroit de votre script ces lignes de code doivent être ajoutées.
⚠️ Pour de l'aide supplémentaire contactez un partenaire ou lancez gratuitement un appel d'offres — découvrez aussi le rôle de l'hébergeur.
Si l'alternative proposée pose problème lorsque vous soumettez plusieurs fichiers CSV à lire et que la procédure p.ex se termine sans renvoi de message malgré les points de gestion des messages dans le fichier PHP, il est possible que les tables et les champs utilisés soient mal indexés et dans ce cas, contactez également votre webmaster.
Consulter la documentation de PHP concernant fgetcsv
: http://php.net/manual/fr/function.fgetcsv.php