當前位置: 首頁> 最新文章列表> 用mysqli_result::data_seek 反向讀取結果集,實現MySQL 查詢倒序遍歷的方法

用mysqli_result::data_seek 反向讀取結果集,實現MySQL 查詢倒序遍歷的方法

gitbox 2025-09-17

在日常開發中,我們經常需要從MySQL 數據庫中獲取結果集,並對結果集進行遍歷。默認情況下, mysqli_query返回的結果集是按查詢順序存儲的。如果我們想要結果集,有幾種方式可以實現,其中一個簡單高效的方法是利用PHP 的mysqli_result::data_seek函數。

什麼是mysqli_result::data_seek

mysqli_result::data_seek是PHP 提供的一個方法,它允許開發者將結果集的內部指針移動到指定的行上。其基本用法如下:

 <span><span>mysqli_result::</span><span><span class="hljs-title function_ invoke__">data_seek</span></span><span>(</span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$offset</span></span><span>): </span><span><span class="hljs-keyword">bool</span></span><span>
</span></span>
  • $offset表示目標行的索引,從0開始。

  • 返回值為布爾類型,如果成功返回true ,失敗返回false

使用場景

當我們希望倒序遍歷結果集時,最直接的辦法是從結果集的最後一行開始向前讀取,而不必在SQL 查詢中使用ORDER BY ... DESC 。這樣在某些情況下可以減少對數據庫的壓力,尤其是數據量非常大的時候。

示例代碼

假設我們有一個MySQL 表users ,包含字段idname ,我們想倒序輸出用戶列表:

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-string">"localhost"</span></span><span>, </span><span><span class="hljs-string">"username"</span></span><span>, </span><span><span class="hljs-string">"password"</span></span><span>, </span><span><span class="hljs-string">"database"</span></span><span>);

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;connect_error) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"連接失敗: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;connect_error);
}

</span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"SELECT id, name FROM users"</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-variable">$sql</span></span><span>);

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span>) {
    </span><span><span class="hljs-variable">$num_rows</span></span><span> = </span><span><span class="hljs-variable">$result</span></span><span>-&gt;num_rows;

    </span><span><span class="hljs-comment">// 倒序遍歷結果集</span></span><span>
    </span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$i</span></span><span> = </span><span><span class="hljs-variable">$num_rows</span></span><span> - </span><span><span class="hljs-number">1</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span> &gt;= </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span>--) {
        </span><span><span class="hljs-variable">$result</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">data_seek</span></span><span>(</span><span><span class="hljs-variable">$i</span></span><span>); </span><span><span class="hljs-comment">// 將內部指針移動到第 $i 行</span></span><span>
        </span><span><span class="hljs-variable">$row</span></span><span> = </span><span><span class="hljs-variable">$result</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">fetch_assoc</span></span><span>();
        </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"ID: "</span></span><span> . </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'id'</span></span><span>] . </span><span><span class="hljs-string">", Name: "</span></span><span> . </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'name'</span></span><span>] . </span><span><span class="hljs-string">"\n"</span></span><span>;
    }

    </span><span><span class="hljs-variable">$result</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">free</span></span><span>();
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"查詢失敗: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;error;
}

</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

運行原理

  1. $result->num_rows獲取結果集總行數。

  2. for循環從最後一行$num_rows - 1開始,逐步向前移動。

  3. 使用$result->data_seek($i)定位到指定行。

  4. 調用$result->fetch_assoc()獲取當前行數據。

這種方法不需要修改SQL 查詢順序,而且在某些需要動態控制遍歷順序的場景非常有用。

優點與註意事項

優點

  • 簡單易用,直接在PHP 層面控制遍歷順序。

  • 對小型結果集非常高效。

注意事項

  • 對大型結果集,如果內存消耗過大,仍建議在SQL 層使用ORDER BY進行排序。

  • data_seek僅適用於mysqli_query返回的mysqli_result對象,不適用於非緩衝查詢。

總結

通過mysqli_result::data_seek ,我們可以輕鬆實現結果集的倒序遍歷,無需依賴SQL 的排序功能。它為PHP 開發者提供了更靈活的控制方式,特別適合對查詢結果進行動態處理的場景。