早期教學常使用已棄用的 mysql_* 函式,現代 PHP 應改用 mysqli 或 PDO。本文以 mysqli 物件導向風格,示範資料庫連線、建立資料表、預處理寫入與錯誤處理的標準流程,並說明為何不應再使用舊 API。
<?php
// 1. 連線設定(建議從環境變數或設定檔讀取)
$host = '127.0.0.1';
$user = 'root';
$pass = 'your_strong_password';
$dbname = 'testdb';
$port = 3306;
// 2. 建立連線
$mysqli = new mysqli($host, $user, $pass, $dbname, $port);
if ($mysqli->connect_errno) {
// 生產環境請記錄日誌,不要直接輸出給使用者
error_log("MySQL 連線失敗: {$mysqli->connect_error}");
exit('資料庫連線失敗,請稍後再試');
}
// 3. 設定字元集(防止中文亂碼)
$mysqli->set_charset('utf8mb4');
// 4. 建立資料表(使用 IF NOT EXISTS 避免重複執行報錯)
$sql = <<query($sql)) {
error_log("建表失敗: {$mysqli->error}");
exit('建立資料表失敗');
}
// 5. 使用預處理寫入資料(防止 SQL 注入)
$stmt = $mysqli->prepare("INSERT INTO `Persons` (`FirstName`, `LastName`, `Age`) VALUES (?, ?, ?)");
$stmt->bind_param('ssi', $first, $last, $age);
$data = [
['John', 'Doe', 28],
['Jane', 'Smith', 32],
['Bob', 'Johnson', 45],
];
foreach ($data as [$first, $last, $age]) {
if (!$stmt->execute()) {
error_log("寫入失敗: {$stmt->error}");
}
}
$stmt->close();
echo "成功寫入 {$mysqli->affected_rows} 筆資料。";
// 6. 關閉連線(腳本結束會自動關閉,顯式關閉較好)
$mysqli->close();
?>
new mysqli() 回傳物件,即使連線失敗也會回傳物件,必須檢查 connect_errno。set_charset('utf8mb4') 必須在查詢前呼叫,確保儲存/讀取 emoji 等 4-byte 字元正常。prepare() → bind_param() → execute() 三步驟,將資料與 SQL 邏輯分離,徹底防禦注入。'ssi' 對應 string, string, integer,必須與欄位型別一致。mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT) 直接拋出例外;生產環境建議自訂錯誤處理器記錄日誌。| 項目 | mysql_* (PHP 5.5 棄用, 7.0 移除) | mysqli / PDO |
|---|---|---|
| 支援狀態 | 已移除 | 核心內建,持續維護 |
| 預處理 | 不支援 | 完整支援 |
| 物件導向 | 無 | 完整支援 |
| 多重查詢 | 不支援 | 支援 multi_query() |
| 交易控制 | 不支援 | 支援 begin_transaction() 等 |
| 準備好的語句 | 無 | 支援 |
$mysqli->begin_transaction();
try {
$stmt = $mysqli->prepare("INSERT INTO `Persons` (`FirstName`, `LastName`, `Age`) VALUES (?, ?, ?)");
$stmt->bind_param('ssi', $first, $last, $age);
foreach ($largeDataset as $row) {
[$first, $last, $age] = $row;
$stmt->execute();
}
$mysqli->commit();
echo "交易提交成功,共 {$stmt->affected_rows} 筆";
} catch (Exception $e) {
$mysqli->rollback();
error_log("交易回滾: {$e->getMessage()}");
}
$stmt->close();
掌握 mysqli 核心 API、預處理模式與錯誤處理,是 PHP 後端開發的基本功。新專案請直接使用 mysqli 或 PDO,勿再參考舊式 mysql_* 範例。