mysqli_result::fetch_all
mysqli_fetch_all
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
mysqli_result::fetch_all -- mysqli_fetch_all — Fetch all result rows as an associative array, a numeric array, or both
说明
面向对象风格
$mode
= MYSQLI_NUM
): array过程化风格
Returns a two-dimensional array of all result rows as an associative array, a numeric array, or both.
注意:
Prior to PHP 8.1.0, available only with mysqlnd.
参数
-
result
-
仅以过程化样式:由 mysqli_query()、mysqli_store_result()、 mysqli_use_result()、mysqli_stmt_get_result() 返回的 mysqli_result 对象。
-
mode
-
This optional parameter is a constant indicating what type of array should be produced from the current row data. The possible values for this parameter are the constants
MYSQLI_ASSOC
,MYSQLI_NUM
, orMYSQLI_BOTH
.
返回值
Returns an array of associative or numeric arrays holding result rows.
更新日志
版本 | 说明 |
---|---|
8.1.0 | Now also available when linking against libmysqlclient. |
范例
示例 #1 mysqli_result::fetch_all() example
面向对象风格
<?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)
参见
- mysqli_fetch_array() - Fetch the next row of a result set as an associative, a numeric array, or both
- mysqli_fetch_column() - Fetch a single column from the next row of a result set
- mysqli_query() - 对数据库执行一次查询

User Contributed Notes 4 notes
I tested using "fetch all" versus "while / fetch array" and :
fetch-all uses less memory (but not for so much).
In my case (test1 and test2): 147008,262848 bytes (fetch-all) versus 147112,262888 bytes (fetch-array & while.
So, about the memory, in both cases are the same.
However, about the performance
My test takes :350ms (worst case) using fetch-all, while it takes 464ms (worst case) using fetch-array, or about 35% worst using fetch array and a while cycle.
So, using fetch-all, for a normal code that returns a moderate amount of information is :
a) cleaner (a single line of code)
b) uses less memory (about 0.01% less)
c) faster.
php 5.6 32bits, windows 8.1 64bits
By the way, this case pretty work's too:
$services = $mysqli->query("SELECT * FROM table1");
if($services && $services->num_rows>0){
$services->fetch_all(MYSQLI_ASSOC);
}
foreach($services as $service){
echo $service; //work properly, cause it implements Iterator
}
That's mean in this case $services is a valid array (or empty array)
If you really need this function, you can just extend the mysqli_result class with a function like this one.
<?php
public function fetch_all($resulttype = MYSQLI_NUM)
{
if (method_exists('mysqli_result', 'fetch_all')) # Compatibility layer with PHP < 5.3
$res = parent::fetch_all($resulttype);
else
for ($res = array(); $tmp = $this->fetch_array($resulttype);) $res[] = $tmp;
return $res;
}
?>
Return value changed in 5.3.3 - between 5.3.0 and 5.3.2 (incl.) when the result set was empty NULL was returned. 5.3.3+ returns an empty array.
Also, mysqli_fetch_all works only for buffered result sets, which are the default for mysqli_query. MYSQLI_USE_RESULT will be supported in 5.3.4+
However, it makes little sense to use it this way, materialising unbuffered sets. In this case choose STORE_RESULT, and fetch_all won't copy the data, but reference it, as it is stored already in mysqlnd.
备份地址:http://www.lvesu.com/blog/php/mysqli-result.fetch-all.php