Enkele tips:
-
Gebruik niet de verouderde ext/mysql , wanneer u ext/mysqli of PDO kunt gebruiken.
-
Lees niet het hele csv-bestand in een PHP-variabele. Wat gebeurt er als het bestand 500 MB is?
-
Schrijf geen aangepaste PHP-code om csv-gegevens te ontleden, wanneer u de ingebouwde functie fgetcsv() .
-
Maak geen nieuwe SQL-instructie voor elke rij in de gegevens, wanneer u voorbereide verklaringen .
-
Interpoleer geen gegevens uit een extern bestand in SQL-instructies. Dit riskeert SQL-injectie kwetsbaarheden, net zoals wanneer u niet-vertrouwde gebruikersinvoer interpoleert.
-
Ontleden en voeg geen csv-gegevens rij voor rij in, wanneer u MySQL's LAAD DATA INFILE opdracht. Het is 20x sneller dan rij voor rij invoegen.
Hier is een eenvoudigere oplossing:
<?php
$databasehost = "localhost";
$databasename = "test";
$databasetable = "sample";
$databaseusername="test";
$databasepassword = "";
$fieldseparator = ",";
$lineseparator = "\n";
$csvfile = "filename.csv";
if(!file_exists($csvfile)) {
die("File not found. Make sure you specified the correct path.");
}
try {
$pdo = new PDO("mysql:host=$databasehost;dbname=$databasename",
$databaseusername, $databasepassword,
array(
PDO::MYSQL_ATTR_LOCAL_INFILE => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
)
);
} catch (PDOException $e) {
die("database connection failed: ".$e->getMessage());
}
$affectedRows = $pdo->exec("
LOAD DATA LOCAL INFILE ".$pdo->quote($csvfile)." INTO TABLE `$databasetable`
FIELDS TERMINATED BY ".$pdo->quote($fieldseparator)."
LINES TERMINATED BY ".$pdo->quote($lineseparator));
echo "Loaded a total of $affectedRows records from this csv file.\n";
?>
Ik heb dit getest met PHP 5.3.26 op een Mac, verbinding makend met MySQL 5.6.14 op Linux.