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'] . "
";
}
// 第一次遍歷
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 (物件) | $result->data_seek(0); | 需 MYSQLI_STORE_RESULT (預設) |
| mysqli (過程) | mysqli_data_seek($result, 0); | 同上 |
| PDOStatement | 不支援隨機存取 | 需重新 execute() 或預先 fetchAll() 存陣列 |
data_seek 需緩衝完整結果集 (預設行為),記憶體壓力大。fetchAll() 存入 PHP 陣列,後續多次遍歷操作記憶體陣列,避免重複查詢或緩衝大結果集。SELECT COUNT(*) 獨立查詢更高效。mysql_fetch_array 會自動重置 — 不會。mysql_result($result, 0) 重置 — 僅移動單行指標,不影響 fetch 迴圈。while 迴圈中呼叫 mysql_data_seek — 會導致無限迴圈或跳過資料。