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" disattivata
La funzione LOAD DATA LOCAL INFILE
consente di importare un file CSV in una tabella MySQL e purtroppo viene utilizzata sempre più frequentemente dai pirati per ottenere l'accesso a certi siti ospitati su macchine che accettano questa funzione.
Per combattere gli atti di malizia e continuare a proteggere il più possibile i dati dei clienti, Infomaniak ha disattivato la funzione LOAD DATA LOCAL INFILE
. Non sono interessate da questa modifica le persone che importano i loro file CSV (a condizione di non selezionare "CSV via LOAD DATA") tramite phpMyAdmin.
Ecco un'alternativa per continuare a importare dati in formato CSV in una tabella MySQL, un esempio completo (in francese) del codice con una gestione corretta 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 query preparate per inserire i dati, offrendo così una maggiore sicurezza e compatibilità con le versioni recenti di PHP e una facilità di implementazione nel tuo script PHP o semplicemente in un nuovo file PHP nella tua directory /web:
$NomDuFichier = "data.csv";
// Connexion à la base de données MySQL avec mysqli
$link = new mysqli("localhost", "username", "password", "database");
// Vérification de la connexion
if ($link->connect_error) {
die("Échec de la connexion : " . $link->connect_error);
}
// Ouverture du fichier CSV en lecture
if (($handle = fopen($NomDuFichier, "r")) !== FALSE) {
// Décomposition de chaque ligne du fichier CSV
while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
// Préparation de la requête SQL
$query = "INSERT INTO `test` VALUES (" . str_repeat('?,', count($data) - 1) . "?)";
$stmt = $link->prepare($query);
// Vérification de la préparation de la requête
if ($stmt === FALSE) {
die("Échec de la préparation de la requête : " . $link->error);
}
// Liaison des paramètres
$types = str_repeat('s', count($data)); // Assume que toutes les colonnes sont de type string
$stmt->bind_param($types, ...$data);
// Exécution de la requête
if (!$stmt->execute()) {
die("Échec de l'exécution de la requête : " . $stmt->error);
}
// Fermeture de la déclaration
$stmt->close();
}
// Fermeture du fichier CSV
fclose($handle);
} else {
echo "Erreur : impossible d'ouvrir le fichier.
";
exit(1);
}
// Fermeture de la connexion à la base de données
$link->close();
?>
Ottieni aiuto
Purtroppo, non è possibile indicare esattamente dove nel vostro script devono essere aggiunte queste righe di codice.
Se l'alternativa proposta crea problemi quando inviate più file CSV da leggere e la procedura, ad esempio, si conclude senza inviare un messaggio nonostante i punti di gestione dei messaggi nel file PHP, è possibile che le tabelle e i campi utilizzati siano indicizzati in modo errato. In tal caso, contattate anche il vostro webmaster.
Consulta la documentazione di PHP riguardante fgetcsv
.
⚠️ Per ulteriori assistenza contattate un partner o lanciate gratuitamente una richiesta di offerta — scoprite anche il ruolo dell'hosting provider.