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 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 tramite 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();
?>
Ottieni assistenza
Purtroppo, non è possibile indicare esattamente in quale punto del script queste righe di codice devono essere inserite.
Se questo metodo presenta problemi (ad esempio in caso di importazione simultanea di più file CSV senza messaggio di errore), potrebbe essere colpa della struttura delle tabelle o dell'indicizzazione dei campi. In tal caso, contatta il tuo webmaster per la verifica.
Consulta anche la documentazione ufficiale PHP relativa alla funzione fgetcsv()
.
Semplificati la vita! In caso di necessità , partner locali e certificati da Infomaniak possono occuparsi di queste procedure. Avvia una richiesta di offerta gratuita — loro si occupano di tutto, liberandoti dagli aspetti tecnici.