CakeFest 2024: The Official CakePHP Conference

mysqli_result::fetch_all

mysqli_fetch_all

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

mysqli_result::fetch_all -- mysqli_fetch_all結果のすべての行を連想配列・数値添字配列あるいはその両方の形式で取得する

説明

オブジェクト指向型

public mysqli_result::fetch_all(int $mode = MYSQLI_NUM): array

手続き型

mysqli_fetch_all(mysqli_result $result, int $mode = MYSQLI_NUM): array

すべての結果の行を取得し、その結果セットを 連想配列・数値添字配列あるいはその両方の二次元配列で返します。

注意:

PHP 8.1.0 より前のバージョンでは、 この関数は mysqlnd でのみ利用可能でした。

パラメータ

result

手続き型のみ: mysqli_query()mysqli_store_result()mysqli_use_result()mysqli_stmt_get_result() が返す mysqli_result オブジェクト。

mode

このオプションは、 結果の行データから返す配列の型を指定します。ここで指定可能な値は 定数 MYSQLI_ASSOCMYSQLI_NUM あるいは MYSQLI_BOTH. のいずれかです。

戻り値

結果の行を含む連想配列あるいは数値添字配列の配列を返します。

変更履歴

バージョン 説明
8.1.0 libmysqlclient をリンクしている場合でも、 この関数を使えるようになりました。

例1 mysqli_result::fetch_all() の例

オブジェクト指向型

<?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() - 結果セットの次の行を連想配列・数値添字配列あるいはその両方の形式で取得する
  • mysqli_fetch_column() - 結果セットの次の行から、単一のカラムの値を取得する
  • mysqli_query() - データベース上でクエリを実行する

add a note

User Contributed Notes 5 notes

up
92
jcastro at eftec dot cl
9 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
up
2
darek334 at gazeta dot pl
5 months ago
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...)
?>
up
9
mail2magvay at rambler dot ru
4 years ago
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)
up
9
m dot amiot at otak-arts dot com
12 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
-2
andrey at php dot net
13 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.
To Top