(PHP 5 >= 5.3.0, PHP 7)

mysqli_result::fetch_all -- mysqli_fetch_all Выбирает все строки из результирующего набора и помещает их в ассоциативный массив, обычный массив или в оба


Объектно-ориентированный стиль

mysqli_result::fetch_all ([ int $resulttype = MYSQLI_NUM ] ) : mixed

Процедурный стиль

mysqli_fetch_all ( mysqli_result $result [, int $resulttype = MYSQLI_NUM ] ) : mixed

mysqli_fetch_all() извлекает все строки из результирующего набора и помещает их в ассоциативный массив, обычный массив или в оба.

Список параметров


Только для процедурного стиля: Идентификатор результата запроса, полученный с помощью mysqli_query(), mysqli_store_result() или mysqli_use_result().


Этот необязательный параметр принимает значение константы, которая указывает на тип массива, в который требуется поместить данные. Возможные значения параметра: MYSQLI_ASSOC, MYSQLI_NUM или MYSQLI_BOTH.

Возвращаемые значения

Возвращает массив содержащий ассоциативные или обычные массивы с данными результирующей таблицы.

Только для MySQL Native Driver

Доступно только с расширением mysqlnd.

Так как mysqli_fetch_all() сразу возвращает все строки в виде массива, это может заметно увеличить расходы памяти, нежели несколько запусков функций, вроде mysqli_fetch_array(), которые помещают в массив только одну строку результирующей таблицы. С другой стороны, если требуется многократно переходить от одной строки к другой и выбирать при этом по одной строке, придется каждый раз конструировать новый массив, что тоже не добавит быстродействия. Поэтому, mysqli_fetch_all() нужно использовать только в тех ситуациях, когда весь результирующий набор будет передаваться для обработки в какое-то другое место.

Смотрите также

  • mysqli_fetch_array() - Выбирает одну строку из результирующего набора и помещает ее в ассоциативный массив, обычный массив или в оба
  • mysqli_query() - Выполняет запрос к базе данных

add a note add a note

User Contributed Notes 8 notes

jcastro at eftec dot cl
5 years ago
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
mail2magvay at rambler dot ru
1 year ago
By the way, this case pretty work's too:

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

if($services && $services->num_rows>0){

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)
m dot amiot at otak-arts dot com
8 years ago
If you really need this function, you can just extend the mysqli_result class with a function like this one.

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);
                for (
$res = array(); $tmp = $this->fetch_array($resulttype);) $res[] = $tmp;

andrey at php dot net
9 years ago
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.
mr dot anthonyvick at gmail dot com
1 year ago
The documentation isn't clear. This function requires the mysqlnd driver.  See Stackoverflow for more information:
cybernet678 at yahoo dot com
4 years ago
It should be noted that this function only works with the mysqlnd package.

With that being said mysqlnd has proven to be very unstable, from experience, which may end up cause php to segfault, unexpectedly.

If you are getting segfaults, you should try using some other mysql package and use mysqli_fetch_row instead.
windix at gmail dot com
9 years ago
If you get an empty set after calling fetch_all(), make sure the result set cursor is reset to the beginning
kevin at metalaxe dot com
11 years ago
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
To Top