Beberapa kiat:
-
Jangan gunakan ext/mysql yang tidak digunakan lagi , ketika Anda dapat menggunakan ext/mysqli atau PDO.
-
Jangan membaca seluruh file csv menjadi variabel PHP. Apa yang terjadi jika file berukuran 500MB?
-
Jangan menulis kode PHP khusus untuk mengurai data csv, jika Anda dapat menggunakan fungsi bawaan fgetcsv() .
-
Jangan membuat pernyataan SQL baru untuk setiap baris dalam data, jika Anda dapat menggunakan pernyataan yang disiapkan .
-
Jangan menginterpolasi data dari file eksternal ke dalam pernyataan SQL. Ini berisiko injeksi SQL kerentanan, seperti saat Anda menginterpolasi input pengguna yang tidak tepercaya.
-
Jangan mengurai dan menyisipkan data csv baris demi baris, saat Anda dapat menggunakan MUAT INFILE DATA memerintah. Ini 20x lebih cepat daripada menyisipkan baris demi baris.
Inilah solusi yang lebih sederhana:
<?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";
?>
Saya menguji ini dengan PHP 5.3.26 di Mac, menghubungkan ke MySQL 5.6.14 di Linux.