在日常開發中,我們經常需要從MySQL 數據庫中獲取結果集,並對結果集進行遍歷。默認情況下, mysqli_query返回的結果集是按查詢順序存儲的。如果我們想要結果集,有幾種方式可以實現,其中一個簡單高效的方法是利用PHP 的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 ,包含字段id和name ,我們想倒序輸出用戶列表:
<span><span><span class="hljs-meta"><?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>->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>->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>-></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>->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> >= </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>-></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>-></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>-></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>->error;
}
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>$result->num_rows獲取結果集總行數。
for循環從最後一行$num_rows - 1開始,逐步向前移動。
使用$result->data_seek($i)定位到指定行。
調用$result->fetch_assoc()獲取當前行數據。
這種方法不需要修改SQL 查詢順序,而且在某些需要動態控制遍歷順序的場景非常有用。
優點:
簡單易用,直接在PHP 層面控制遍歷順序。
對小型結果集非常高效。
注意事項:
對大型結果集,如果內存消耗過大,仍建議在SQL 層使用ORDER BY進行排序。
data_seek僅適用於mysqli_query返回的mysqli_result對象,不適用於非緩衝查詢。
通過mysqli_result::data_seek ,我們可以輕鬆實現結果集的倒序遍歷,無需依賴SQL 的排序功能。它為PHP 開發者提供了更靈活的控制方式,特別適合對查詢結果進行動態處理的場景。
相關標籤:
mysqli_result