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 notes

92
jcastro at eftec dot cl
9 年前
我测试了使用 "fetch all" 与 "while / fetch array",

fetch-all 使用更少的内存(但不是那么多)。

在我的案例中(test1 和 test2):147008,262848 字节(fetch-all)与 147112,262888 字节(fetch-array & while)。

因此,关于内存,在两种情况下都是一样的。

但是,关于性能
我的测试使用 fetch-all 耗时:350 毫秒(最坏情况),而使用 fetch-array 耗时 464 毫秒(最坏情况),或使用 fetch array 和 while 循环最坏情况下慢 35%。

因此,对于返回适量信息的正常代码,使用 fetch-all
a) 更简洁(一行代码)
b) 使用更少的内存(少约 0.01%)
c) 更快。

php 5.6 32 位,windows 8.1 64 位
2
darek334 at gazeta dot pl
10 个月前
注意 fetch_all(MYSQLI_ASSOC ) 返回一个数组,形式为
<?php
array(0 => array(...row...), 1 => array(...row...) .... ), 即使 只有一行...
?>
与 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