Flere tips:
-
Brug ikke den forældede ext/mysql , når du kan bruge ext/mysqli eller PDO.
-
Læs ikke hele csv-filen ind i en PHP-variabel. Hvad sker der, når filen er 500 MB?
-
Skriv ikke tilpasset PHP-kode til at parse csv-data, når du kan bruge den indbyggede funktion fgetcsv() .
-
Opret ikke en ny SQL-sætning for hver række i dataene, når du kan bruge udarbejdede erklæringer .
-
Interpoler ikke data fra en ekstern fil til SQL-sætninger. Dette risikerer SQL-injektion sårbarheder, ligesom når du interpolerer upålidelige brugerinput.
-
Undlad at parse og indsætte csv-data række for række, når du kan bruge MySQL's INDLÆS DATAINFIL kommando. Det er 20 gange hurtigere end at indsætte række for række.
Her er en enklere løsning:
<?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";
?>
Jeg testede dette med PHP 5.3.26 på en Mac og oprettede forbindelse til MySQL 5.6.14 på Linux.