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 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 se utiliza a menudo por los atacantes para obtener acceso no autorizado a sitios alojados en servidores que la aceptan.
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 via LOAD DATA”) no están afectados.
Aquí hay un método alternativo para importar datos en formato CSV en una tabla MySQL
. El ejemplo a continuación muestra cómo manejar 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 mejor seguridad, 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";
// Connect to MySQL database using mysqli
$link = new mysqli("localhost", "username", "password", "database");
// Check database connection
if ($link->connect_error) {
die("Connection failed: " . $link->connect_error);
}
// Open the CSV file for reading
if (($handle = fopen($fileName, "r")) !== FALSE) {
// Read each line of the CSV file
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
// Prepare the SQL query dynamically
$query = "INSERT INTO `test` VALUES (" . str_repeat('?,', count($data) - 1) . "?)";
$stmt = $link->prepare($query);
// Check if query preparation was successful
if ($stmt === FALSE) {
die("Query preparation failed: " . $link->error);
}
// Bind parameters (assuming all columns are strings)
$types = str_repeat('s', count($data));
$stmt->bind_param($types, ...$data);
// Execute the query
if (!$stmt->execute()) {
die("Query execution failed: " . $stmt->error);
}
// Close the statement
$stmt->close();
}
// Close the CSV file
fclose($handle);
} else {
echo "Error: unable to open the file.\n";
exit(1);
}
// Close the database connection
$link->close();
?>
Obtener ayuda
Desafortunadamente, no es posible 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, en caso de importación simultánea de varios archivos CSV sin mensaje de error), es posible que la estructura de las tablas o la indexación de los campos sea la causa. En este caso, póngase en contacto con su webmaster para su verificación.
Consulte también la documentación oficial de PHP relativa a la función fgetcsv()
.
¡Simplifíquese la vida! En caso de necesidad, socios locales y certificados por Infomaniak pueden encargarse de estos trámites. Lance una solicitud de oferta gratuita — ellos se encargan de todo, liberándolo de los aspectos técnicos.