mysqli_result::fetch_all
mysqli_fetch_all
(PHP 5 >= 5.3.0)
mysqli_result::fetch_all -- mysqli_fetch_all — Выбирает все строки из результирующего набора и помещает их в ассоциативный массив, обычный массив или в оба
Описание
Объектно-ориентированный стиль
Процедурный стиль
mysqli_fetch_all() извлекает все строки из результирующего набора и помещает их в ассоциативный массив, обычный массив или в оба.
Список параметров
-
result
-
Только для процедурного стиля: Идентификатор результата запроса, полученный с помощью mysqli_query(), mysqli_store_result() или mysqli_use_result().
-
resulttype
-
Этот необязательный параметр принимает значение константы, которая указывает на тип массива, в который требуется поместить данные. Возможные значения параметра:
MYSQLI_ASSOC
,MYSQLI_NUM
илиMYSQLI_BOTH
.
Возвращаемые значения
Возвращает массив содержащий ассоциативные или обычные массивы с данными результирующей таблицы.
Только для MySQL Native Driver
Доступно только с расширением mysqlnd.
Так как mysqli_fetch_all() сразу возвращает все строки в виде массива, это может заметно увеличить расходы памяти, нежели несколько запусков функций, вроде mysqli_fetch_array(), которые помещают в массив только одну строку результирующей таблицы. С другой стороны, если требуется многократно переходить от одной строки к другой и выбирать при этом по одной строке, придется каждый раз конструировать новый массив, что тоже не добавит быстродействия. Поэтому, mysqli_fetch_all() нужно использовать только в тех ситуациях, когда весь результирующий набор будет передаваться для обработки в какое-то другое место.
Смотрите также
- mysqli_fetch_array() - Выбирает одну строку из результирующего набора и помещает ее в ассоциативный массив, обычный массив или в оба
- mysqli_query() - Выполняет запрос к базе данных
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Расширения для работы с базами данных
- Расширения для работы с базами данных отдельных производителей
- MySQL Drivers and Plugins
- Улучшенный модуль MySQL
- Функция mysqli_result::$current_field() - Получает смещение указателя по отношению к текущему полю
- Функция mysqli_result::data_seek() - Перемещает указатель результата на выбранную строку
- mysqli_result::fetch_all
- mysqli_result::fetch_array
- Функция mysqli_result::fetch_assoc() - Извлекает результирующий ряд в виде ассоциативного массива
- Функция mysqli_result::fetch_field_direct() - Получение метаданных конкретного поля
- Функция mysqli_result::fetch_field() - Возвращает следующее поле результирующего набора
- Функция mysqli_result::fetch_fields() - Возвращает массив объектов, представляющих поля результирующего набора
- Функция mysqli_result::fetch_object() - Возвращает текущую строку результирующего набора в виде объекта
- Функция mysqli_result::fetch_row() - Получение строки результирующей таблицы в виде массива
- Функция mysqli_result::$field_count() - Получение количества полей в результирующем наборе
- Функция mysqli_result::field_seek() - Установить указатель поля на определенное смещение
- Функция mysqli_result::free() - Освобождает память занятую результатами запроса
- Функция mysqli_result::$lengths() - Возвращает длины полей текущей строки результирующего набора
- Функция mysqli_result::$num_rows() - Получает число рядов в результирующей выборке
Коментарии
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.
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;
}
?>
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)
be careful fetch_all(MYSQLI_ASSOC ) returns an array in the form
<?php
array(0 => array(...row...), 1 => array(...row...) .... ), even if is one row...
?>
not compared to fetch_assoc() which returns one array of the result in form:
<?php
array(...row...)
?>