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 file .csv in una tabella MySQL.L'alternativa proposta è 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 ed è ora spesso utilizzato dagli hacker per ottenere l'accesso a determinati siti ospitati su macchine che accettano questa funzione.
Per combattere gli abusi e continuare a proteggere il più possibile i dati dei clienti, Infomaniak ha disattivato la funzione LOAD DATA LOCAL INFILE
Non sono interessati da questa modifica le persone che importano i loro file CSV (a condizione di non selezionare "CSV tramite LOAD DATA") tramite phpMyAdmin.
Ecco un'alternativa per continuare a importare i 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 alle query preparate per inserire i dati, offrendo così una migliore sicurezza e compatibilità con le versioni recenti di PHP e facilità di implementarlo nello script PHP o semplicemente in un nuovo file PHP della 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();
?>
Ottenere aiuto
Sfortunatamente, non è possibile indicare esattamente in quale punto dello script debbano essere aggiunte queste righe di codice.
âš Per ulteriori aiuti Contatta un partner oppure Lanciare gratuitamente una gara d'appalto Scopri anche il Il ruolo dell'host.
Se l'alternativa proposta è un problema quando si inviano più file CSV da leggere e la procedura p.ex termina senza inviare alcun messaggio nonostante i punti di gestione dei messaggi nel file PHP, è possibile che le tabelle e i campi utilizzati siano indicizzati male e in questo caso contattare anche il webmaster.
Consultare la documentazione di PHP relativa fgetcsv
: http://php.net/manual/fr/function.fgetcsv.php