PHP mysql 擴展(及 mysqli/PDO)提供三種獲取行的函數,其關係可總結為:
| 函數 | 返回結構 | 等價於 | 適用場景 |
|---|---|---|---|
mysql_fetch_assoc() | 關聯數組 ['col' => 'val'] | mysql_fetch_array($res, MYSQL_ASSOC) | 業務代碼推薦,語義清晰 |
mysql_fetch_row() | 數字索引數組 [0 => 'val'] | mysql_fetch_array($res, MYSQL_NUM) | 性能敏感、列順序固定 |
mysql_fetch_array() | 雙重結構 ['col' => 'val', 0 => 'val'] | MYSQL_BOTH (預設) | 兼容舊代碼、調試輸出 |
mysql_fetch_object() | 對象 $obj->col | — | OOP 風格、實體映射 |
fetch_row 最快、記憶體最少(無鍵名字符串開銷)fetch_assoc 次之,鍵名來自字段名fetch_array(MYSQL_BOTH) 最慢、佔用雙倍鍵名記憶體,**生產環境避免使用預設值**<?php
// mysqli
$stmt = $mysqli->prepare('SELECT id, name FROM users WHERE status = ?');
$stmt->bind_param('i', 1);
$stmt->execute();
$res = $stmt->get_result();
while ($row = $res->fetch_assoc()) { ... } // 推薦
// $row = $res->fetch_row();
// $row = $res->fetch_array(MYSQLI_ASSOC);
// PDO
$stmt = $pdo->prepare('SELECT id, name FROM users WHERE status = ?');
$stmt->execute([1]);
$stmt->setFetchMode(PDO::FETCH_ASSOC); // 預設模式
while ($row = $stmt->fetch()) { ... }
MYSQL_BOTH/PDO::FETCH_BOTHFETCH_ASSOC / fetch_assoc(),代碼可讀性最高yield $stmt->fetch() 避免一次性載入所有行$res->free() / $stmt->closeCursor()原文一句話總結精準:mysql_fetch_assoc和mysql_fetch_row的功能加起來就是mysql_fetch_array(預設模式)。