Base di conoscenze
1 000 FAQ, 500 tutorial e video esplicativi. Qui ci sono delle soluzioni!
Risolvere un problema di importazione di file 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" disabilitata
La funzione LOAD DATA LOCAL INFILE consente di importare un file CSV direttamente in una tabella MySQL. Tuttavia, questa funzionalità viene spesso sfruttata dagli aggressori per ottenere un accesso non autorizzato ai siti ospitati su server che la supportano.
Al fine di prevenire qualsiasi rischio per la sicurezza e proteggere i dati dei clienti, Infomaniak ha disattivato la funzione LOAD DATA LOCAL INFILE. Gli utenti che importano i propri file CSV tramite phpMyAdmin (senza selezionare l'opzione “CSV via LOAD DATA”) non sono interessati da questa modifica.
Di seguito è riportato un metodo alternativo per importare dati in formato CSV in una tabella MySQL. L'esempio qui sotto 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. Ciò garantisce una maggiore sicurezza, una compatibilità ottimale con le versioni più recenti di PHP e una semplice integrazione nel tuo progetto, sia in uno script esistente che in un nuovo file situato nella directory /web:
$fileName = "data.csv";
// Connessione al database MySQL utilizzando mysqli
$link = new mysqli("localhost", "username", "password", "database");
// Verifica della connessione al database
if ($link->connect_error) {
die("Connessione fallita: " . $link->connect_error);
}
// Apertura del file CSV in lettura
if (($handle = fopen($fileName, "r")) !== FALSE) {
// Lettura di ogni riga del file CSV
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
// Preparazione dinamica della query SQL
$query = "INSERT INTO `test` VALUES (" . str_repeat('?,', count($data) - 1) . "?)";
$stmt = $link->prepare($query);
// Verifica del successo della preparazione della query
if ($stmt === FALSE) {
die("Preparazione della query fallita: " . $link->error);
}
// Associazione dei parametri (supponendo che tutte le colonne siano stringhe)
$types = str_repeat('s', count($data));
$stmt->bind_param($types, ...$data);
// Esecuzione della query
if (!$stmt->execute()) {
die("Esecuzione della query fallita: " . $stmt->error);
}
// Chiusura dell'istruzione
$stmt->close();
}
// Chiusura del file CSV
fclose($handle);
} else {
echo "Errore: impossibile aprire il file.\n";
exit(1);
}
// Chiusura della connessione al database
$link->close();
?>
Ottenere assistenza
Purtroppo, non è possibile indicare con precisione in quale punto dello script queste righe di codice devono essere inserite.
Se questo metodo dovesse presentare problemi (ad esempio, in caso di importazione simultanea di più file CSV senza messaggi di errore), è possibile che la causa risieda nella struttura delle tabelle o nell'indicizzazione dei campi. In tal caso, contattare il proprio webmaster per una verifica.
Consultare anche la documentazione ufficiale PHP relativa alla funzione fgetcsv().
Link a questa FAQ: https://faq.infomaniak.com/1312
Questa FAQ è stata utile?