Một số mẹo:
-
Không sử dụng ext / mysql không dùng nữa , khi bạn có thể sử dụng ext / mysqli hoặc PDO.
-
Không đọc toàn bộ tệp csv thành một biến PHP. Điều gì xảy ra khi tệp có dung lượng 500MB?
-
Không viết mã PHP tùy chỉnh để phân tích cú pháp dữ liệu csv khi bạn có thể sử dụng hàm nội trang fgetcsv () .
-
Không tạo câu lệnh SQL mới cho mọi hàng trong dữ liệu, khi bạn có thể sử dụng tuyên bố chuẩn bị sẵn .
-
Không nội suy dữ liệu từ một tệp bên ngoài vào các câu lệnh SQL. Điều này có nguy cơ Chèn SQL lỗ hổng bảo mật, giống như khi bạn nội suy đầu vào của người dùng không đáng tin cậy.
-
Không phân tích cú pháp và chèn dữ liệu csv từng hàng, khi bạn có thể sử dụng TẢI THÔNG TIN DỮ LIỆU yêu cầu. Nhanh hơn 20 lần so với việc chèn từng hàng một.
Đây là một giải pháp đơn giản hơn:
<?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";
?>
Tôi đã thử nghiệm điều này với PHP 5.3.26 trên máy Mac, kết nối với MySQL 5.6.14 trên Linux.