首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

PHP 匯入/匯出 MySQL 與 Excel 互轉完整代碼:CSV 中介與原生 Excel 輸出

     編輯:MySQL 資料庫相關知識

場景一: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 函式庫支援樣式、多工作表、公式。
  • 安全性:檔案類型驗證、大小限制、暫存目錄隔離、錯誤日誌記錄。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved