首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

PHP 連接 MySQL 實戰:三種資料擷取方法完整範例與效能比較

     編輯:關於SqlServer

場景設定

連接本機 MySQL 伺服器 (`localhost:3306`),帳號 `root`,密碼 `9999`,資料庫 `ok`,資料表 `abc` (欄位 `id`, `name`),完整讀取所有資料並以 HTML 表格/列表輸出。

完整程式碼架構

<?php
// 1. 建立連接 (抑制錯誤訊息由 @ 控制,實際生產建議啟用錯誤處理)
$dbh = @mysqli_connect("localhost", "root", "9999", "ok", 3306);
if (!$dbh) {
    die("連接失敗: " . mysqli_connect_error());
}

// 2. 設定字元集 (避免中文亂碼)
mysqli_set_charset($dbh, "utf8");

// 3. 執行查詢
$sql = "SELECT id, name FROM abc";
$rs = mysqli_query($dbh, $sql);
if (!$rs) {
    die("查詢失敗: " . mysqli_error($dbh));
}

// ========== 方法一:mysqli_fetch_row() 數值索引陣列 ==========
echo "<h3>方法一:mysqli_fetch_row() - 數值索引</h3>";
echo "<table border='1'><tr><th>ID</th><th>Name</th></tr>";
while ($row = mysqli_fetch_row($rs)) {
    echo "<tr><td>{$row[0]}</td><td>{$row[1]}</td></tr>";
}
echo "</table>";

// 重置結果指標以便示範下一方法
mysqli_data_seek($rs, 0);

// ========== 方法二:mysqli_fetch_object() 物件導向存取 ==========
echo "<h3>方法二:mysqli_fetch_object() - 物件屬性</h3>";
while ($row = mysqli_fetch_object($rs)) {
    echo "{$row->id} {$row->name} <br />";
}

// 重置結果指標
mysqli_data_seek($rs, 0);

// ========== 方法三:mysqli_fetch_assoc() 關聯陣列 (推薦) ==========
echo "<h3>方法三:mysqli_fetch_assoc() - 關聯索引 (最佳可讀性)</h3>";
while ($row = mysqli_fetch_assoc($rs)) {
    echo "{$row['id']} {$row['name']} <br />";
}

// 4. 關閉連接
mysqli_close($dbh);
?>

三種方法深度比較

方法 回傳型別 存取方式 記憶體開銷 可讀性/維護性 適用場景
mysqli_fetch_row() 數值索引陣列 `[0 => '1', 1 => 'Alice']` `$row[0]`, `$row[1]` 最低 (無欄位名稱) 差 (依賴欄位順序,易因 `SELECT *` 或結構變更出錯) 極簡腳本、固定結構、極度追求微小效能
mysqli_fetch_object() 物件 `stdClass { id => '1', name => 'Alice' }` `$row->id`, `$row->name` 中等 (物件建立開銷) 良好 (語意清晰) 物件導向代碼風格、需封裝業務邏輯於實體類別
mysqli_fetch_assoc() (推薦) 關聯陣列 `['id' => '1', 'name' => 'Alice']` `$row['id']`, `$row['name']` 中等 (儲存欄位名稱) 最佳 (欄位名稱自文檔化,結構變更不影響存取) 絕大多數業務開發場景
mysqli_fetch_array() 混合陣列 (數值+關聯索引) 兩種皆可 最高 (重複儲存) 一般 需同時相容舊代碼 (數值索引) 與新代碼 (關聯索引)

關鍵最佳實踐提醒

  1. 棄用 `mysql_*` 函數: 原範例使用已移除的 `mysql_*` 擴充 (PHP 7.0+ 移除),**必須改用 `mysqli_*` 或 PDO**。
  2. 預處理語句防注入: 任何含變數的查詢請使用 `mysqli_prepare()` + `bind_param()`。
  3. 錯誤處理: 生產環境關閉 `@` 抑制,啟用 `mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)` 拋出異常。
  4. 釋放資源: 大結果集處理完畢呼叫 `mysqli_free_result($rs)`。
  5. 字元集: 連接後立即 `mysqli_set_charset($dbh, 'utf8mb4')` 支援完整 Unicode (含 Emoji)。

PDO 替代方案 (現代標準)

<?php
$dsn = "mysql:host=localhost;port=3306;dbname=ok;charset=utf8mb4";
$pdo = new PDO($dsn, "root", "9999", [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // 預設關聯陣列
    PDO::ATTR_EMULATE_PREPARES => false, // 使用原生預處理
]);

$stmt = $pdo->query("SELECT id, name FROM abc");
foreach ($stmt as $row) {
    echo "{$row['id']} {$row['name']} <br />";
}
?>

PDO 提供資料庫抽象層,支援多種資料庫、命名參數預處理、異常模式,是新專案首選。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved