連接本機 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() |
混合陣列 (數值+關聯索引) | 兩種皆可 | 最高 (重複儲存) | 一般 | 需同時相容舊代碼 (數值索引) 與新代碼 (關聯索引) |
<?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 提供資料庫抽象層,支援多種資料庫、命名參數預處理、異常模式,是新專案首選。