1000 FAQ, 500 tutoriales y vídeos explicativos. ¡Aquí sólo hay soluciones!
Resolver un problema de importación de CSV en una tabla MySQL
Esta guía explica cómo resolver un problema de importación de un 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, lamentablemente, ahora es utilizada con frecuencia por piratas informáticos para obtener acceso a ciertos sitios alojados en máquinas que aceptan esta función.
Para combatir actos maliciosos y seguir protegiendo los datos de los clientes tanto como sea posible, Infomaniak ha desactivado la función LOAD DATA LOCAL INFILE
. Este cambio no afecta a las personas que importan sus archivos CSV (siempre que no se marque "CSV a través de LOAD DATA") a través de phpMyAdmin.
Aquí hay una alternativa para seguir importando datos en formato CSV a una tabla MySQL, un ejemplo completo del código con un manejo correcto 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 declaraciones preparadas para insertar los datos, ofreciendo así una mejor seguridad y compatibilidad con versiones recientes de PHP y facilidad para implementarlo en su script PHP o simplemente en un nuevo archivo PHP en su directorio /web:
$nombreDelArchivo = "data.csv";
// Conectar a la base de datos MySQL usando mysqli
$link = new mysqli("localhost", "username", "password", "database");
// Verificar conexión
if ($link->connect_error) {
die("Error de conexión: " . $link->connect_error);
}
// Abrir el archivo CSV para lectura
if (($handle = fopen($nombreDelArchivo, "r")) !== FALSE) {
// Descomponer cada línea del archivo CSV
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
// Preparar la consulta SQL
$query = "INSERT INTO `test` VALUES (" . str_repeat('?,', count($data) - 1) . "?)";
$stmt = $link->prepare($query);
// Verificar si la preparación de la consulta fue exitosa
if ($stmt === FALSE) {
die("Error en la preparación de la consulta: " . $link->error);
}
// Vincular parámetros
$types = str_repeat('s', count($data)); // Supone que todas las columnas son de tipo cadena
$stmt->bind_param($types, ...$data);
// Ejecutar la consulta
if (!$stmt->execute()) {
die("Error en la ejecución de la consulta: " . $stmt->error);
}
// Cerrar la declaración
$stmt->close();
}
// Cerrar el archivo CSV
fclose($handle);
} else {
echo "Error: no se puede abrir el archivo.\n";
exit(1);
}
// Cerrar la conexión a la base de datos
$link->close();
?>
Obtener ayuda
Desafortunadamente, es imposible indicar exactamente en qué parte de su script deben agregarse estas líneas de código.
⚠️ Para obtener ayuda adicional contactar a un socio o completar una solicitud de propuesta — leer también el rol del proveedor de alojamiento
Si la alternativa propuesta presenta problemas al enviar varios archivos CSV para leer y el proceso, por ejemplo, termina sin devolver un mensaje a pesar de los puntos de manejo de mensajes en el archivo PHP, es posible que las tablas y los campos utilizados estén mal indexados y en ese caso, también contacte a su webmaster.
Consultar la documentación de PHP sobre fgetcsv
: http://php.net/manual/es/function.fgetcsv.php