請:
- 不要使用過時的EXT/MySQL的,當你可以使用轉/庫MySQLi或PDO。
- 不要將整個csv文件讀取到PHP變量中。當文件爲500MB時會發生什麼?
- 當您可以使用內建函數fgetcsv()時,不要編寫自定義PHP代碼來解析csv數據。
- 當您可以使用預準備語句時,不要爲數據中的每一行創建新的SQL語句。
- 不要將來自外部文件的數據插入到SQL語句中。這會影響SQL注入漏洞,就像插入不可信用戶輸入時一樣。
- 當您可以使用MySQL的LOAD DATA INFILE命令時,不要逐行解析和插入csv數據。它比逐行插入要快20倍。
這裏有一個簡單的解決方案:
<?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";
?>
請仔細閱讀[stackoverflow.com/help/how-to-ask](http://stackoverflow.com/help/how-to-ask)和編輯您的帖子以獲取更多信息,示例代碼以及迄今爲止採取的步驟。這些信息會使人更有可能幫助你。 – abarisone