注意: `mysql_*` 系列函數自 PHP 5.5 棄用、PHP 7.0 移除。本文僅供維護舊代碼參考,新項目請使用 mysqli 或 PDO。
函數簽名對比
| 函數 | 返回值 | 索引類型 | 參數 |
mysql_fetch_row | 數字索引數組 [0]=>val | 僅數字 (0-based) | resource $result |
mysql_fetch_array | 混合/關聯/數字數組 | 可選:MYSQL_NUM/MYSQL_ASSOC/MYSQL_BOTH | resource $result, int $result_type=MYSQL_BOTH |
mysql_fetch_assoc | 關聯索引數組 ['col']=>val | 僅關聯 | resource $result |
mysql_fetch_array 三種模式實戰
$result = mysql_query("SELECT id, name FROM mytable");
// 1. MYSQL_NUM:純數字索引(等同 mysql_fetch_row)
while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
printf("ID: %s Name: %s\n", $row[0], $row[1]);
}
// 2. MYSQL_ASSOC:純關聯索引(等同 mysql_fetch_assoc)
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
printf("ID: %s Name: %s\n", $row["id"], $row["name"]);
}
// 3. MYSQL_BOTH:雙重索引(默認,佔用雙倍記憶體)
while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {
printf("ID: %s Name: %s\n", $row[0], $row["name"]);
}
關鍵行為差異
- 同名列覆蓋:
SELECT t1.id, t2.id FROM ... 只保留最後一列 t2.id。解決:起別名 t1.id AS id1, t2.id AS id2。
- 大小寫敏感:關聯索引鍵名與 SQL 列名大小寫一致。
- 效能真相:
mysql_fetch_array 與 mysql_fetch_row 無顯著效能差異,但提供更豐富訪問方式。MYSQL_BOTH 佔用約 2 倍記憶體,大結果集建議用 MYSQL_ASSOC 或 MYSQL_NUM。
現代替代方案:mysqli / PDO
| API | 對應方法 | 特點 |
| mysqli (面向過程) | mysqli_fetch_array($result, MYSQLI_NUM|ASSOC|BOTH) | 參數常量前綴 MYSQLI_ |
| mysqli (OO) | $result->fetch_array(MYSQLI_ASSOC) | 同款常量 |
| PDO | $stmt->fetch(PDO::FETCH_ASSOC|NUM|BOTH|OBJ) | 統一 fetch 模式常量 |
遷移建議
- 全局搜尋
mysql_ 替換為 mysqli_(面向過程風格改動最小)。
- 連線建立改用
mysqli_connect / new mysqli(),支援預處理語句。
- 啟用
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT) 自動拋出異常。
- 新項目直接用 PDO——資料庫無關、支援命名參數、物件映射更優雅。
理解舊 API 設計意圖,能更快掌握現代 API 的精髓與最佳實踐。
- 上一篇文章: MySQL ORDER BY、GROUP BY、HAVING 深度對比:分組聚合、排序與過濾的正確語義與執行順序
- 下一篇文章: MySQL 查詢優化之索引應用實戰:創建、驗證與雙刃劍效應平衡
Copyright ©
程式碼之家 All Rights Reserved