場景一:CSV 匯入 MySQL (批量導入考試成績、電話簿等)
<?php
// 1. 檔案上傳處理
$fname = $_FILES['MyFile']['name'];
move_uploaded_file($_FILES['MyFile']['tmp_name'], $fname); // 建議用 move_uploaded_file
// 2. 連線資料庫 (請改用 mysqli/PDO 預處理防注入)
$conn = mysqli_connect("localhost", "user", "pass", "dbname");
mysqli_set_charset($conn, "utf8");
// 3. 解析 CSV 逐筆寫入
$handle = fopen($fname, "r");
while (($data = fgetcsv($handle, 10000, ",")) !== FALSE) {
$sql = "INSERT INTO test (code, name, date) VALUES (?, ?, ?)";
$stmt = mysqli_prepare($conn, $sql);
mysqli_stmt_bind_param($stmt, "sss", $data[0], $data[1], $data[2]);
mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt);
}
fclose($handle);
mysqli_close($conn);
?>
<form enctype="multipart/form-data" method="post">
<input type="file" name="MyFile" accept=".csv">
<input type="submit" value="匯入">
</form>
場景二:MySQL 匯出原生 Excel (HTTP 下載 .xls)
<?php
// 設定下載標頭
$filename = "export_" . date("YmdHis") . ".xls";
header("Content-Type: application/vnd.ms-excel; charset=utf-8");
header("Content-Disposition: attachment; filename=$filename");
header("Pragma: no-cache");
header("Expires: 0");
// 連線查詢
$conn = mysqli_connect("localhost", "root", "", "ishop");
mysqli_set_charset($conn, "utf8");
$sql = "SELECT * FROM oi_mall_payment";
$result = mysqli_query($conn, $sql);
// 輸出標題列
for ($i = 0; $i < mysqli_num_fields($result); $i++) {
$meta = mysqli_fetch_field_direct($result, $i);
echo $meta->name . "\t";
}
echo "\n";
// 輸出資料列
while ($row = mysqli_fetch_row($result)) {
foreach ($row as $val) {
echo (isset($val) && $val !== "") ? $val : "NULL";
echo "\t";
}
echo "\n";
}
mysqli_free_result($result);
mysqli_close($conn);
?>
關鍵改進點 (對比原始碼)
| 原始問題 | 改進方案 |
使用已棄用 mysql_* 函式 | 改用 mysqli_* 或 PDO |
| SQL 直接拼接變數 → 注入風險 | 使用**預處理語句** mysqli_prepare + bind_param |
copy() 搬移上傳檔 | 用 move_uploaded_file() (安全檢查) |
$PHP_SELF 未定義常數 | 用 $_SERVER['PHP_SELF'] 或表單 action 留空 |
| 編碼未明確設定 | mysqli_set_charset($conn, "utf8") / UTF-8 BOM |
| Excel 匯出編碼 big5 易亂碼 | 標頭宣告 charset=utf-8,內容輸出 UTF-8 |
現代化建議
- 大量資料匯入:
LOAD DATA INFILE (極速) 或分批次 INSERT + 事務。
- 真正 .xlsx 格式:使用
PhpSpreadsheet 函式庫支援樣式、多工作表、公式。
- 安全性:檔案類型驗證、大小限制、暫存目錄隔離、錯誤日誌記錄。