1000 FAQ, 500 tutoriales y vídeos explicativos. ¡Aquí sólo hay soluciones!
Resolver un problema de importación CSV en una tabla MySQL
Esta guía explica cómo resolver un problema de importación de archivo .csv en una tabla MySQL. La alternativa propuesta consiste en leer el archivo CSV línea por línea utilizando PHP e insertar los datos en la base de datos MySQL.
Función "load data local infile" desactivada
La función LOAD DATA LOCAL INFILE
permite importar un archivo CSV en una tabla MySQL y, desafortunadamente, es cada vez más utilizada por los piratas para obtener acceso a ciertos sitios alojados en máquinas que aceptan esta función.
Para combatir los actos de malicia y seguir protegiendo tanto como sea posible los datos de los clientes, Infomaniak ha desactivado la función LOAD DATA LOCAL INFILE
. No están afectadas por este cambio las personas que importan sus archivos CSV (siempre y cuando no marquen "CSV via LOAD DATA") a través de phpMyAdmin.
Aquí tienes una alternativa para seguir importando datos en formato CSV a una tabla MySQL, un ejemplo completo (en francés) del código con una gestión correcta de los errores para la apertura del archivo CSV y la inserción de los datos en la base de datos.
Esta versión utiliza mysqli
para conectarse a la base de datos y las consultas preparadas para insertar los datos, ofreciendo así una mejor seguridad y compatibilidad con las versiones recientes de PHP y una facilidad para implementarlo en su script PHP o simplemente en un nuevo archivo PHP de su directorio /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.
";
exit(1);
}
// Fermeture de la connexion à la base de données
$link->close();
?>
Obtener ayuda
Lamentablemente, no es posible indicarte exactamente en qué parte de tu script deben añadirse estas líneas de código.
Si la alternativa propuesta causa problemas al enviar varios archivos CSV para leer y el procedimiento, por ejemplo, finaliza sin devolver un mensaje a pesar de los puntos de gestión de mensajes en el archivo PHP, es posible que las tablas y los campos utilizados estén mal indexados. En ese caso, también contacte a su webmaster.
Consulte la documentación de PHP sobre fgetcsv
.
⚠️ Para obtener ayuda adicional contacte a un socio o lanza una oferta gratuita — también descubre el rol del proveedor de alojamiento.