首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

PHP mysql_fetch_array vs mysql_fetch_row 詳解:關聯/數字索引、結果類型常量與效能真相

     編輯:MySQL 資料庫相關知識

注意: `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_BOTHresource $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

遷移建議

  1. 全局搜尋 mysql_ 替換為 mysqli_(面向過程風格改動最小)。
  2. 連線建立改用 mysqli_connect / new mysqli(),支援預處理語句。
  3. 啟用 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT) 自動拋出異常。
  4. 新項目直接用 PDO——資料庫無關、支援命名參數、物件映射更優雅。

理解舊 API 設計意圖,能更快掌握現代 API 的精髓與最佳實踐。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
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 模式常量