©
Ce document utilise Manuel du site Web PHP chinois Libérer
(PHP 5 >= 5.3.0)
mysqli_result::fetch_all -- mysqli_fetch_all — Fetches all result rows as an associative array, a numeric array, or both
面向对象风格
$resulttype
= MYSQLI_NUM
] )过程化风格
$result
[, int $resulttype
= MYSQLI_NUM
] )mysqli_fetch_all() fetches all result rows and returns the result set as an associative array, a numeric array, or both.
result
仅以过程化样式:由 mysqli_query() , mysqli_store_result() 或 mysqli_use_result() 返回的结果集标识。
resulttype
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
, or MYSQLI_BOTH
.
Returns an array of associative or numeric arrays holding result rows.
仅可用于 mysqlnd。
As mysqli_fetch_all() returns all the rows as an array in a single step, it may consume more memory than some similar functions such as mysqli_fetch_array() , which only returns one row at a time from the result set. Further, if you need to iterate over the result set, you will need a looping construct that will further impact performance. For these reasons mysqli_fetch_all() should only be used in those situations where the fetched result set will be sent to another layer for processing.
[#1] jcastro at eftec dot cl [2015-02-09 02:26:37]
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
[#2] m dot amiot at otak-arts dot com [2012-03-20 10:27:48]
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;
}
?>
[#3] windix at gmail dot com [2010-08-25 19:01:20]
If you get an empty set after calling fetch_all(), make sure the result set cursor is reset to the beginning
[#4] andrey at php dot net [2010-08-10 07:38:19]
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.
[#5] kevin at metalaxe dot com [2009-01-06 13:18:19]
If you are getting the following error:
Fatal error: Call to undefined method mysqli_result::fetch_all()
Be sure you didn't miss this line after the procedural call about it requiring mysqlnd