第四部分:數據庫通訊生命週期

放棄「魔法式」的語法背誦,將資料庫操作還原為物理網路的「建立、傳輸、解構、銷毀」。

一、 標準寫法與機制拆解

1. 建立實體連線 (Connect)

mysqli_connect

底層機制: PHP 嘗試透過 TCP/IP 向資料庫伺服器叩門。如果密碼錯誤或伺服器當機,將回傳 false。必須在此處設立「防禦檢查點」,否則後續操作全數崩潰。

$host = "localhost";
$user = "admin";
$pwd  = "1234";
$db   = "school_db";

// 變數 $conn 代表這條「實體通訊橋樑」
$conn = mysqli_connect($host, $user, $pwd, $db);

// 防禦機制:斷言連線是否成功
if (!$conn) {
    die("連線失敗:" . mysqli_connect_error());
}

2. 傳輸載荷 (Query)

mysqli_query

底層機制: 將 SQL 字串封裝並透過 $conn 橋樑發送給 MySQL 引擎。MySQL 引擎編譯執行後,會在它的記憶體中生成一個「結果集表 (Result Set)」,並將指標回傳給 PHP。

$sql = "SELECT id, name FROM students";

// 將 SQL 透過 $conn 發送,並將回傳的結果集指標存入 $result
$result = mysqli_query($conn, $sql);

// 驗證是否有資料 (空間判定)
if (mysqli_num_rows($result) > 0) {
    // 準備進入解構階段
} else {
    echo "查無資料";
}

3. 數據解構 (Fetch)

mysqli_fetch_assoc

底層機制: PHP 無法直接讀取 MySQL 的二進位結果集。fetch_assoc 是個「提取器」,每次呼叫它,它就會從結果集中拔出「當前的一行」,並將該行轉化為 PHP 的「關聯陣列 (Hash Map)」,隨後指標自動向下移。

// 透過 while 迴圈進行時間軸延展,直到提取器回傳 false
while ($row = mysqli_fetch_assoc($result)) {
    
    // 此時 $row 是一個陣列:['id' => 1, 'name' => 'Alice']
    echo "學號:" . $row['id'];
    echo "姓名:" . $row['name'] . "<br>";

}

4. 資源銷毀 (Close)

mysqli_close

底層機制: 伺服器的 TCP 連線池是有限的(例如最多容許 150 條併發連線)。如果不主動切斷橋樑,遇到高流量時伺服器會因為「耗盡連線數」而癱瘓。

// 釋放結果集佔用的記憶體 (非必須,但為良好習慣)
mysqli_free_result($result);

// 強制切斷與 MySQL 的實體連線
mysqli_close($conn);

echo "資料庫通訊生命週期結束。";

二、 通訊物理模擬器 (Lifecycle Simulator)

PHP 引擎腳本執行緒
PHP 伺服器 (Application Server)
[PHP RAM 記憶體變數]
尚無變數
MySQL 引擎 (Database Server)
[1] ID: 101 | Name: Alice | Score: 95
[2] ID: 102 | Name: Bob | Score: 88
[系統] 實驗室已就緒。點擊「執行下一步」啟動腳本。