PHP Conference Japan 2024

mysqli_result::fetch_assoc

mysqli_fetch_assoc

(PHP 5, PHP 7, PHP 8)

mysqli_result::fetch_assoc -- mysqli_fetch_assocRuft die nächste Zeile einer Ergebnismenge als assoziatives Array ab

Beschreibung

Objektorientierter Stil

public mysqli_result::fetch_assoc(): array|null|false

Prozeduraler Stil

mysqli_fetch_assoc(mysqli_result $result): array|null|false

Ruft eine Zeile der Daten aus der Ergebnismenge ab und gibt sie als assoziatives Array zurück. Bei jedem weiteren Aufruf dieser Funktion wird die jeweils nächste Zeile der Ergebnismenge zurückgegeben oder null, wenn es keine weitere Zeile gibt.

Wenn zwei oder mehr Spalten des Ergebnisses den gleichen Namen haben, hat die letzte Spalte Vorrang und überschreibt alle vorherigen Daten. Um auf mehrere Spalten mit demselben Namen zuzugreifen, kann die Funktion mysqli_fetch_row() verwendet werden, mit der ein numerisch indiziertes Array abgerufen wird, oder es können Aliase in der Select-Liste der SQL-Abfrage verwendet werden, um den Spalten unterschiedliche Namen zu geben.

Hinweis: Bei den Spaltennamen, die von dieser Funktion zurückgegeben werden, wird zwischen Groß- und Kleinschreibung unterschieden.

Hinweis: Diese Funktion setzt NULL-Felder auf den PHP-Wert null.

Parameter-Liste

result

Nur bei prozeduralem Aufruf: Ein von mysqli_query(), mysqli_store_result(), mysqli_use_result() oder mysqli_stmt_get_result() zurückgegebenes mysqli_result-Objekt.

Rückgabewerte

Gibt ein assoziatives Array zurück, das die abgerufene Zeile enthält, wobei jeder Schlüssel des Arrays den Namen einer der Spalten der Ergebnismenge darstellt, oder null, wenn es in der Ergebnismenge keine weitere Zeile gibt. Bei einem Fehler wird false zurückgegeben.

Beispiele

Beispiel #1 mysqli_result::fetch_assoc()-Beispiel

Objektorientierter Stil

<?php

mysqli_report
(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$query = "SELECT Name, CountryCode FROM City ORDER BY ID DESC";

$result = $mysqli->query($query);

/* Abrufen eines assoziativen Arrays */
while ($row = $result->fetch_assoc()) {
printf("%s (%s)\n", $row["Name"], $row["CountryCode"]);
}

Prozeduraler Stil

<?php

mysqli_report
(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "SELECT Name, CountryCode FROM City ORDER BY ID DESC";

$result = mysqli_query($mysqli, $query);

/* Abrufen eines assoziativen Arrays */
while ($row = mysqli_fetch_assoc($result)) {
printf("%s (%s)\n", $row["Name"], $row["CountryCode"]);
}

Oben gezeigte Beispiele erzeugen eine ähnliche Ausgabe wie:

Pueblo (USA)
Arvada (USA)
Cape Coral (USA)
Green Bay (USA)
Santa Clara (USA)

Beispiel #2 Vergleich der Verwendung von mysqli_result iterator und mysqli_result::fetch_assoc()

mysqli_result kann mit foreach iteriert werden. Die Ergebnismenge wird immer ab der ersten Zeile durchlaufen, unabhängig von der aktuellen Position.

<?php

mysqli_report
(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$query = 'SELECT Name, CountryCode FROM City ORDER BY ID DESC';

// Mit Iterator
$result = $mysqli->query($query);
foreach (
$result as $row) {
printf("%s (%s)\n", $row["Name"], $row["CountryCode"]);
}

echo
"\n==================\n";

// Ohne Iterator
$result = $mysqli->query($query);
while (
$row = $result->fetch_assoc()) {
printf("%s (%s)\n", $row["Name"], $row["CountryCode"]);
}

Das oben gezeigte Beispiel erzeugt eine ähnliche Ausgabe wie:

Pueblo (USA)
Arvada (USA)
Cape Coral (USA)
Green Bay (USA)
Santa Clara (USA)

==================
Pueblo (USA)
Arvada (USA)
Cape Coral (USA)
Green Bay (USA)
Santa Clara (USA)

Siehe auch

add a note

User Contributed Notes 3 notes

up
87
Miller
11 years ago
I often like to have my results sent elsewhere in the format of an array (although keep in mind that if you just plan on traversing through the array in another part of the script, this extra step is just a waste of time).

This is my one-liner for transforming a mysqli_result set into an array.
<?php
$sql
= new MySQLi($host, $username, $password, $database);

$result = $sql->query("SELECT * FROM `$table`;");
for (
$set = array (); $row = $result->fetch_assoc(); $set[] = $row);
print_r($set);
?>

Outputs:
Array
(
[0] => Array
(
[id] => 1
[field2] => a
[field3] => b
),
[1] => Array
(
[id] => 2
[field2] => c
[field3] => d
)
)

I use other variations to adapt to the situation, i.e. if I am selecting only one field:
<?php
$sql
= new MySQLi($host, $username, $password, $database);
$result = $sql->query("SELECT `field2` FROM `$table`;");
for (
$set = array (); $row = $result->fetch_assoc(); $set[] = $row['field2']);
print_r($set);
?>
Outputs:
Array
(
[0] => a
[1] => c
)

Or, to make the array associative with the primary index (code assumes primary index is the first field in the table):
<?php
$sql
= new MySQLi($host, $username, $password, $database);
$result = $sql->query("SELECT * FROM `$table`;");
for (
$set = array (); $row = $result->fetch_assoc(); $set[array_shift($row)] = $row);
print_r($set);
?>
Outputs:
Array
(
[1] => Array
(
[field2] => a
[field3] => b
),
[2] => Array
(
[field2] => c
[field3] => d
)
)
up
28
james dot phx at gmail dot com
13 years ago
IMPORTANT NOTE:

If you were used to using code like this:

<?php
while(false !== ($row = mysql_fetch_assoc($result)))
{
//...
}
?>

You must change it to this for mysqli:

<?php
while(null !== ($row = mysqli_fetch_assoc($result)))
{
//...
}
?>

The former will cause your script to run until max_execution_time is reached.
up
1
Enrique Garcia
1 year ago
There is a difference between MariaDB and MySQL(>5.4) whether the input parameter (mysqli object) has data or is empty (it comes from a previus query).
-MariaDB: you get an exception:
Fatal error: Uncaught TypeError: mysqli_fetch_assoc(): Argument #1 ($result) must be of type mysqli_result
-MySQL: you can continue, in spite of not having data in the mysqli object.
To Top