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

PHP mysql_fetch_array() 多次遍歷結果集:資料指標重置 mysql_data_seek() 實戰

     編輯:MySQL 資料庫相關知識

結果集指標耗盡問題與解決方案

PHP mysql_fetch_array() (及 mysqli_fetch_array()/PDOStatement::fetch()) 內部維護一個資料列指標,首次 while 迴圈結束後指標停在末尾,再次遍歷直接返回 false,無任何輸出。

錯誤現象

// 第一次遍歷
while ($row = mysql_fetch_array($result)) {
    echo $row['name'] . "
"; } // 指標已在結果集末尾 // 第二次遍歷 - 無輸出! while ($row = mysql_fetch_array($result)) { echo $row['name'] . "
"; }

正確做法:mysql_data_seek() 重置指標

// 第一次遍歷
while ($row = mysql_fetch_array($result)) {
    echo $row['name'] . "
"; } // 重置指標到第 0 行 (首行) mysql_data_seek($result, 0); // 第二次遍歷 - 正常輸出 while ($row = mysql_fetch_array($result)) { echo $row['name'] . "
"; }

擴展:mysqli / PDO 寫法

擴展重置指標方法備註
mysqli (物件)$result->data_seek(0);需 MYSQLI_STORE_RESULT (預設)
mysqli (過程)mysqli_data_seek($result, 0);同上
PDOStatement不支援隨機存取需重新 execute() 或預先 fetchAll() 存陣列

效能考量與替代方案

  • 結果集極大時,data_seek 需緩衝完整結果集 (預設行為),記憶體壓力大。
  • 建議:fetchAll() 存入 PHP 陣列,後續多次遍歷操作記憶體陣列,避免重複查詢或緩衝大結果集。
  • 若僅需重複計數,用 SELECT COUNT(*) 獨立查詢更高效。

常見誤區

  1. 以為 mysql_fetch_array 會自動重置 — 不會。
  2. 使用 mysql_result($result, 0) 重置 — 僅移動單行指標,不影響 fetch 迴圈。
  3. 在 while 迴圈中呼叫 mysql_data_seek — 會導致無限迴圈或跳過資料。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved