PHP Conference Japan 2024

mysqli_result::fetch_all

mysqli_fetch_all

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

mysqli_result::fetch_all -- mysqli_fetch_all將所有結果列擷取為關聯式陣列、數字索引陣列或兩者兼具

說明

物件導向風格

public mysqli_result::fetch_all(int $mode = MYSQLI_NUM): array

程序風格

mysqli_fetch_all(mysqli_result $result, int $mode = MYSQLI_NUM): array

將所有結果列以關聯式陣列、數字索引陣列或兩者兼具的二維陣列形式返回。

注意事項:

在 PHP 8.1.0 之前,僅適用於 mysqlnd

參數

result

僅程序風格:由 mysqli_query()mysqli_store_result()mysqli_use_result()mysqli_stmt_get_result() 返回的 mysqli_result 物件。

mode

此可選參數是一個常數,指示應該從目前的列資料產生哪種類型的陣列。此參數的可能值為常數 MYSQLI_ASSOCMYSQLI_NUMMYSQLI_BOTH

返回值

返回一個包含結果列的關聯式或數字索引陣列。

更新日誌

版本 說明
8.1.0 現在連結 libmysqlclient 時也可用。

範例

範例 #1 mysqli_result::fetch_all() 範例

物件導向風格

<?php

mysqli_report
(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$result = $mysqli->query("SELECT Name, CountryCode FROM City ORDER BY ID LIMIT 3");

$rows = $result->fetch_all(MYSQLI_ASSOC);
foreach (
$rows as $row) {
printf("%s (%s)\n", $row["Name"], $row["CountryCode"]);
}

程序風格

<?php

mysqli_report
(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = mysqli_connect("localhost", "my_user", "my_password", "world");

$result = mysqli_query($mysqli, "SELECT Name, CountryCode FROM City ORDER BY ID LIMIT 3");

$rows = mysqli_fetch_all($result, MYSQLI_ASSOC);
foreach (
$rows as $row) {
printf("%s (%s)\n", $row["Name"], $row["CountryCode"]);
}

以上範例將輸出

Kabul (AFG)
Qandahar (AFG)
Herat (AFG)

另請參閱

新增註解

使用者貢獻的註解 5 則註解

92
jcastro at eftec dot cl
9 年前
我測試了使用「擷取全部」與「while / 擷取陣列」,並且

擷取全部使用較少的記憶體(但沒有少很多)。

在我的例子中(測試 1 和測試 2):147008,262848 位元組(擷取全部)對比 147112,262888 位元組(擷取陣列和 while 迴圈)。

因此,關於記憶體,兩種情況下都相同。

然而,關於效能
我的測試使用擷取全部需要 350 毫秒(最差情況),而使用擷取陣列需要 464 毫秒(最差情況),或者使用擷取陣列和 while 迴圈的效能差約 35%。

因此,對於返回中等資訊量的程式碼,使用擷取全部是
a) 更簡潔(單行程式碼)
b) 使用較少記憶體(減少約 0.01%)
c) 更快。

php 5.6 32 位元,Windows 8.1 64 位元
2
darek334 at gazeta dot pl
1 年前
小心 fetch_all(MYSQLI_ASSOC) 會以以下形式返回一個陣列
<?php
array(0 => array(...row...), 1 => array(...row...) .... ), 即使只有一列...
?>
與 fetch_assoc() 不同,fetch_assoc() 只會返回結果集中的一列,以陣列形式呈現
<?php
array(...row...)
?>
9
mail2magvay at rambler dot ru
5 年前
順帶一提,這種情況也適用

$services = $mysqli->query("SELECT * FROM table1");

if($services && $services->num_rows>0){
$services->fetch_all(MYSQLI_ASSOC);
}

foreach($services as $service){
echo $service; // 正常運作,因為它實作了 Iterator
}

這表示在這種情況下,$services 是一個有效的陣列(或空陣列)
7
m dot amiot at otak-arts dot com
12 年前
如果您真的需要這個函式,您可以用像這樣的函式來擴展 mysqli_result 類別。

<?php
public function fetch_all($resulttype = MYSQLI_NUM)
{
if (
method_exists('mysqli_result', 'fetch_all')) # 與 PHP < 5.3 的相容性層
$res = parent::fetch_all($resulttype);
else
for (
$res = array(); $tmp = $this->fetch_array($resulttype);) $res[] = $tmp;

return
$res;
}
?>
-3
andrey at php dot net
14 年前
在 5.3.3 版中更改了返回值 - 在 5.3.0 和 5.3.2(含)之間,當結果集為空時,返回 NULL。5.3.3+ 返回一個空陣列。
此外,mysqli_fetch_all 僅適用於緩衝的結果集,這是 mysqli_query 的預設值。MYSQLI_USE_RESULT 將在 5.3.4+ 中受到支援
然而,以這種方式使用它,實例化未緩衝的集合,意義不大。在這種情況下,選擇 STORE_RESULT,fetch_all 不會複製數據,而是引用它,因為它已經存儲在 mysqlnd 中。
To Top