在PHP 中使用MySQLi 執行數據庫查詢後,我們通常希望能高效、方便地獲取所有的查詢結果。在面向對象的MySQLi 使用方式中, mysqli_result::fetch_all是一種非常簡潔的方法,可以一次性獲取所有結果並以數組形式返回。本文將詳細介紹如何使用fetch_all方法,並分析其使用場景與註意事項。
mysqli_result::fetch_all是mysqli_result類中的一個方法,用於一次性將查詢結果集中的所有行取出。其返回的是一個二維數組,每一行代表一個查詢結果中的記錄。
語法如下:
<span><span><span class="hljs-keyword">array</span></span><span> mysqli_result::</span><span><span class="hljs-title function_ invoke__">fetch_all</span></span><span>(</span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$mode</span></span><span> = MYSQLI_NUM)
</span></span>
$mode參數用於定義返回數組的格式,常用的有:
MYSQLI_NUM :返回數字索引數組。
MYSQLI_ASSOC :返回關聯索引數組(字段名作為鍵)。
MYSQLI_BOTH :同時返回數字和關聯索引。
下面我們通過一個完整的示例演示fetch_all的使用過程。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 數據庫連接配置</span></span><span>
</span><span><span class="hljs-variable">$host</span></span><span> = </span><span><span class="hljs-string">"localhost"</span></span><span>;
</span><span><span class="hljs-variable">$user</span></span><span> = </span><span><span class="hljs-string">"root"</span></span><span>;
</span><span><span class="hljs-variable">$password</span></span><span> = </span><span><span class="hljs-string">""</span></span><span>;
</span><span><span class="hljs-variable">$database</span></span><span> = </span><span><span class="hljs-string">"test_db"</span></span><span>;
</span><span><span class="hljs-comment">// 創建連接</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-variable">$host</span></span><span>, </span><span><span class="hljs-variable">$user</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$database</span></span><span>);
</span><span><span class="hljs-comment">// 檢查連接是否成功</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-comment">// 查詢語句</span></span><span>
</span><span><span class="hljs-variable">$sql</span></span><span> = </span><span><span class="hljs-string">"SELECT id, name, email FROM users"</span></span><span>;
</span><span><span class="hljs-comment">// 執行查詢</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-comment">// 檢查查詢是否成功</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-literal">false</span></span><span>) {
</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>->error);
}
</span><span><span class="hljs-comment">// 使用 fetch_all 獲取所有結果(關聯數組方式)</span></span><span>
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-variable">$result</span></span><span>-></span><span><span class="hljs-title function_ invoke__">fetch_all</span></span><span>(MYSQLI_ASSOC);
</span><span><span class="hljs-comment">// 輸出結果</span></span><span>
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$data</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$row</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">"<br>"</span></span><span>;
</span><span><span class="hljs-keyword">echo</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">"<br>"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Email: "</span></span><span> . </span><span><span class="hljs-variable">$row</span></span><span>[</span><span><span class="hljs-string">'email'</span></span><span>] . </span><span><span class="hljs-string">"<br><br>"</span></span><span>;
}
</span><span><span class="hljs-comment">// 釋放結果集</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-comment">// 關閉連接</span></span><span>
</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>
簡潔:相比while ($row = $result->fetch_assoc())的傳統寫法,代碼更少、更清晰。
效率:一次性將所有數據加載到內存中,適合處理小到中等規模的數據集。
靈活性:支持多種數組格式(數字索引、關聯索引或兩者兼有)。
數據量大時慎用:因為fetch_all會一次性將所有數據加載到內存中,當數據量過大時可能導致內存溢出。
MySQL Native Driver(mysqlnd)要求: fetch_all方法需要啟用mysqlnd(MySQL 原生驅動)。在一些舊的PHP 配置中,如果未啟用mysqlnd,可能會導致此方法不可用。
錯誤處理:建議始終檢查查詢結果是否為false ,以便及時捕捉SQL 執行錯誤。
通過mysqli_result::fetch_all ,PHP 開發者可以更加高效地從數據庫中獲取完整的查詢結果。雖然這種方式簡潔方便,但在使用過程中仍需根據實際數據量和系統資源做出合理選擇。掌握好它的使用場景,將有助於提升你的數據庫操作效率和代碼可讀性。