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 archivos .csv en una tabla MySQL.La alternativa propuesta es 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 infilile" desactivada
Función LOAD DATA LOCAL INFILE
permite importar un archivo CSV a una tabla MySQL y, por desgracia, ahora es utilizado con frecuencia por los piratas para obtener acceso a algunos sitios alojados en máquinas que aceptan esta función.
Para luchar contra los actos de maldad y seguir protegiendo los datos de los clientes en la medida de lo posible, Infomaniak ha desactivado la función LOAD DATA LOCAL INFILE
Esta modificación no afecta a las personas que importan sus archivos CSV (a condición de no marcar "CSV vía LOAD DATA") a través de phpMyAdmin.
Aquí está una alternativa para seguir importando datos en formato CSV a una tabla MySQL, un ejemplo completo del código con una correcta gestión de errores para abrir el archivo CSV e insertar 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 mayor 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
Desafortunadamente, no es posible indicar exactamente en qué lugar de su script deben añadirse estas líneas de código.
⚠Para la ayuda suplementaria Póngase en contacto con un socio o Haga una licitación gratuita Averigüe también el rol del hospedador.
Si la alternativa propuesta es problemática cuando envía varios archivos CSV a leer y el procedimiento p.ex termina sin enviar mensajes a pesar de los puntos de gestión de mensajes en el archivo PHP, es posible que las tablas y campos utilizados estén mal indexados y, en este caso, también contacte con su webmaster.
Consultar la documentación de PHP sobre fgetcsv
: http://php.net/manual/fr/function.fgetcsv.php