Base di conoscenze
1 000 FAQ, 500 tutorial e video esplicativi. Qui ci sono delle soluzioni!
Risolvere un problema di importazione CSV in una tabella MySQL
Questa guida spiega come risolvere un problema di importazione di un file .csv in una tabella MySQL. L'alternativa proposta consiste nel leggere il file CSV riga per riga con PHP e inserire i dati nel database MySQL.
Funzione "LOAD DATA LOCAL INFILE" disattivata
La funzione LOAD DATA LOCAL INFILE consente di importare un file CSV direttamente in una tabella MySQL. Tuttavia, questa funzionalità viene spesso sfruttata dagli attaccanti per ottenere un accesso non autorizzato ai siti ospitati su server che la accettano.
Al fine di prevenire qualsiasi rischio di sicurezza e proteggere i dati dei clienti, Infomaniak ha disattivato la funzione LOAD DATA LOCAL INFILE. Gli utenti che importano i loro file CSV tramite phpMyAdmin (senza selezionare l'opzione “CSV via LOAD DATA”) non sono interessati.
Ecco un metodo alternativo per importare dati in formato CSV in una tabella MySQL. L'esempio seguente mostra come gestire correttamente gli errori durante l'apertura del file CSV e l'inserimento dei dati nel database.
Questo script utilizza mysqli per connettersi al database e query preparate per inserire i dati. Questo garantisce una migliore sicurezza, una compatibilità ottimale con le versioni recenti di PHP e un'integrazione semplice nel tuo progetto, sia in uno script esistente che in un nuovo file situato nella directory /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();
?>
Ottenere aiuto
Purtroppo non è possibile indicare esattamente in quale punto del script queste righe di codice devono essere inserite.
Se questo metodo crea problemi (ad esempio in caso di importazione simultanea di più file CSV senza messaggio di errore), potrebbe essere causato dalla struttura delle tabelle o dall'indicizzazione dei campi. In tal caso, contatta il tuo webmaster per la verifica.
Consulta anche la documentazione ufficiale PHP relativa alla funzione fgetcsv().
In caso di necessità, partner locali e referenziati da Infomaniak possono occuparsi di queste pratiche: lancia un appalto gratuito; si occupano di tutto, liberandoti dai dettagli tecnici.
Link a questa FAQ:
Questa FAQ è stata utile?