適用於結構固定、欄位以逗號分隔的純文字檔(CSV)。範例資料:
aaa,bbb,ccc,ddd,eee
fff,ggg,hhh,iii,jjj,kkk
<?php
// load_csv.php
$host = 'localhost';
$user = 'db_user';
$pass = 'db_pass';
$dbname = 'target_db';
$filePath = '/path/to/data.csv'; // 絕對路徑
$table = 'import_table';
$delimiter = ',';
$batchSize = 500; // 批次提交大小
// 1. 建立連線(mysqli 物件導向)
$mysqli = new mysqli($host, $user, $pass, $dbname);
if ($mysqli->connect_errno) {
die("Connect failed: " . $mysqli->connect_error);
}
$mysqli->set_charset('utf8mb4');
// 2. 開啟檔案
$handle = fopen($filePath, 'r');
if (!$handle) {
die("Cannot open file: $filePath");
}
// 3. 準備預處理語句(防注入、效能佳)
$placeholders = str_repeat('?,', 5); // 假設 5 欄位
$placeholders = rtrim($placeholders, ',');
$stmt = $mysqli->prepare("INSERT INTO `$table` (col1,col2,col3,col4,col5) VALUES ($placeholders)");
if (!$stmt) {
die("Prepare failed: " . $mysqli->error);
}
// 綁定參數(動態綁定陣列)
$bindParams = [];
$bindTypes = str_repeat('s', 5); // 全視為字串,或依實際型別調整
$rowCount = 0;
$mysqli->autocommit(false); // 開啟交易
while (($data = fgetcsv($handle, 0, $delimiter)) !== false) {
// 欄位數檢查
if (count($data) !== 5) {
error_log("Skip invalid row: " . implode(',', $data));
continue;
}
// 綁定變數參考
$bindParams = [];
foreach ($data as $i => $val) {
$bindParams[$i] = $val;
}
// 重新綁定(mysqli 需傳參考)
$refs = [];
foreach ($bindParams as $key => $val) {
$refs[$key] = &$bindParams[$key];
}
call_user_func_array([$stmt, 'bind_param'], array_merge([$bindTypes], $refs));
$stmt->execute();
$rowCount++;
// 批次提交
if ($rowCount % $batchSize === 0) {
$mysqli->commit();
$mysqli->autocommit(false);
echo "Committed $rowCount rows...\n";
}
}
$mysqli->commit(); // 提交剩餘
fclose($handle);
$stmt->close();
$mysqli->close();
echo "Import completed. Total rows: $rowCount\n";
?>
explode() 健壯。FILE 權限、檔案在 Server 端):
LOAD DATA INFILE '/path/data.csv'
INTO TABLE import_table
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;
根據資料量與基礎設施選擇最適方案,PHP 腳本適合中小檔、無 Server 檔案存取權限的場景。