Base de conocimientos
1 000 FAQ, 500 tutoriales y vídeos explicativos. ¡Aquí sólo hay soluciones!
Resolver un problema de importación de archivos CSV en una tabla MySQL
Esta guía explica cómo solucionar un problema al importar un archivo .csv en una tabla MySQL. La alternativa propuesta consiste en leer el archivo CSV línea por línea con 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 directamente en una tabla MySQL. Sin embargo, esta funcionalidad suele ser utilizada por atacantes para obtener acceso no autorizado a sitios alojados en servidores que la admiten.
Para prevenir cualquier riesgo de seguridad y proteger los datos de los clientes, Infomaniak ha desactivado la función LOAD DATA LOCAL INFILE. Los usuarios que importan sus archivos CSV a través de phpMyAdmin (sin marcar la opción “CSV vía LOAD DATA”) no se ven afectados.
A continuación, se presenta un método alternativo para importar datos en formato CSV a una tabla MySQL. El ejemplo que se muestra a continuación explica cómo gestionar correctamente los errores al abrir el archivo CSV y al insertar los datos en la base de datos.
Este script utiliza mysqli para conectarse a la base de datos y consultas preparadas para insertar los datos. Esto garantiza una mayor seguridad, una compatibilidad óptima con las versiones recientes de PHP y una integración sencilla en su proyecto, ya sea en un script existente o en un nuevo archivo ubicado en el directorio /web:
$fileName = "data.csv";
// Conexión a la base de datos MySQL utilizando mysqli
$link = new mysqli("localhost", "username", "password", "database");
// Comprobación de la conexión a la base de datos
if ($link->connect_error) {
die("Error de conexión: " . $link->connect_error);
}
// Apertura del archivo CSV para lectura
if (($handle = fopen($fileName, "r")) !== FALSE) {
// Lectura de cada línea del archivo CSV
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
// Preparación de la consulta SQL de forma dinámica
$query = "INSERT INTO `test` VALUES (" . str_repeat('?,', count($data) - 1) . "?)";
$stmt = $link->prepare($query);
// Comprobación de si la preparación de la consulta fue exitosa
if ($stmt === FALSE) {
die("Error en la preparación de la consulta: " . $link->error);
}
// Vinculación de parámetros (asumiendo que todas las columnas son cadenas)
$types = str_repeat('s', count($data));
$stmt->bind_param($types, ...$data);
// Ejecución de la consulta
if (!$stmt->execute()) {
die("Error en la ejecución de la consulta: " . $stmt->error);
}
// Cierre de la sentencia
$stmt->close();
}
// Cierre del archivo CSV
fclose($handle);
} else {
echo "Error: no se pudo abrir el archivo.\n";
exit(1);
}
// Cierre de la conexión a la base de datos
$link->close();
?>
Obtener ayuda
Lamentablemente, es imposible indicar con precisión en qué parte del script deben insertarse estas líneas de código.
Si este método presenta problemas (por ejemplo, al importar simultáneamente varios archivos CSV sin mostrar ningún mensaje de error), es posible que el problema esté relacionado con la estructura de las tablas o la indexación de los campos. En este caso, póngase en contacto con su administrador web para que lo revise.
Consulte también la documentación oficial de PHP relativa a la función fgetcsv().
Enlace a esta FAQ: https://faq.infomaniak.com/1312
¿Le ha sido útil esta FAQ?