mysqli_result::fetch_all

mysqli_fetch_all

(PHP 5 >= 5.3.0, PHP 7)

mysqli_result::fetch_all -- mysqli_fetch_allFetches all result rows as an associative array, a numeric array, or both

Descrierea

Stil obiect-orientat

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

Stil procedural

mixed mysqli_fetch_all ( mysqli_result $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.

Parametri

result

Numai stilul procedural: Un identificator al setului de rezultate întors de mysqli_query(), mysqli_store_result() sau 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.

Valorile întoarse

Returns an array of associative or numeric arrays holding result rows.

Doar driver-ul original al MySQL

Disponibil numai cu 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.

A se vedea și

add a note add a note

User Contributed Notes 6 notes

up
35
jcastro at eftec dot cl
1 year 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
up
14
m dot amiot at otak-arts dot com
4 years ago
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;
        }
?>
up
1
andrey at php dot net
5 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.
up
0
cybernet678 at yahoo dot com
2 months 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.
up
-16
windix at gmail dot com
5 years ago
If you get an empty set after calling fetch_all(), make sure the result set cursor is reset to the beginning
up
-29
kevin at metalaxe dot com
7 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