1000 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 utilizzando 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 in una tabella MySQL ed è purtroppo ora frequentemente sfruttata dagli hacker per ottenere l'accesso a determinati siti ospitati su macchine che accettano questa funzione.
Per combattere atti di malevolenza e continuare a proteggere i dati dei clienti il più possibile, Infomaniak ha disabilitato la funzione LOAD DATA LOCAL INFILE
. Questa modifica non riguarda le persone che importano i propri file CSV (a condizione che non sia selezionata l'opzione "CSV tramite LOAD DATA") tramite phpMyAdmin.
Ecco un'alternativa per continuare a importare dati in formato CSV in una tabella MySQL, un esempio completo del codice con una corretta gestione degli errori per l'apertura del file CSV e l'inserimento dei dati nel database.
Questa versione utilizza mysqli
per connettersi al database e le istruzioni preparate per inserire i dati, offrendo così una migliore sicurezza e compatibilità con le versioni recenti di PHP e facilità di implementazione nel tuo script PHP o semplicemente in un nuovo file PHP nella tua directory /web:
$nomeDelFile = "data.csv";
// Connessione al database MySQL con mysqli
$link = new mysqli("localhost", "username", "password", "database");
// Verifica della connessione
if ($link->connect_error) {
die("Connessione fallita: " . $link->connect_error);
}
// Apertura del file CSV in lettura
if (($handle = fopen($nomeDelFile, "r")) !== FALSE) {
// Suddivisione di ogni riga del file CSV
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
// Preparazione della query SQL
$query = "INSERT INTO `test` VALUES (" . str_repeat('?,', count($data) - 1) . "?)";
$stmt = $link->prepare($query);
// Verifica che la preparazione della query sia riuscita
if ($stmt === FALSE) {
die("Preparazione della query fallita: " . $link->error);
}
// Associazione dei parametri
$types = str_repeat('s', count($data)); // Si presume che tutte le colonne siano di tipo stringa
$stmt->bind_param($types, ...$data);
// Esecuzione della query
if (!$stmt->execute()) {
die("Esecuzione della query fallita: " . $stmt->error);
}
// Chiusura della dichiarazione
$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 aiuto
Purtroppo, è impossibile specificare esattamente dove nel tuo script queste righe di codice debbano essere aggiunte.
⚠️ Per ulteriore assistenza contattare un partner o compilare una richiesta di offerta — leggi anche il ruolo dell'hosting
Se l'alternativa proposta causa problemi quando invii più file CSV da leggere e la procedura, ad esempio, termina senza restituire un messaggio nonostante i punti di gestione dei messaggi nel file PHP, è possibile che le tabelle e i campi utilizzati siano mal indicizzati e in questo caso, contatta anche il tuo webmaster.
Consulta la documentazione di PHP riguardo a fgetcsv
: http://php.net/manual/it/function.fgetcsv.php