mysqli_result::fetch_assoc

mysqli_fetch_assoc

(PHP 5, PHP 7, PHP 8)

mysqli_result::fetch_assoc -- mysqli_fetch_assoc将结果集的下一行作为关联数组获取

描述

面向对象风格

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

过程式风格

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

从结果集中获取一行数据,并将其作为关联数组返回。对该函数的每次后续调用都将返回结果集中的下一行,如果没有更多行,则返回 null

如果结果集中有两列或多列具有相同的名称,则最后一列将优先并覆盖任何先前的数据。要访问具有相同名称的多列,可以使用 mysqli_fetch_row() 获取数字索引数组,或者在 SQL 查询 select 列表中使用别名来为列指定不同的名称。

注意: 此函数返回的字段名称区分大小写

注意: 此函数将 NULL 字段设置为 PHP null 值。

参数

result

仅过程式风格:由 mysqli_query()mysqli_store_result()mysqli_use_result()mysqli_stmt_get_result() 返回的 mysqli_result 对象。

返回值

返回一个关联数组,表示获取的行,其中数组中的每个键都代表结果集中的一个列的名称,如果结果集中没有更多行,则返回 null,或者在失败时返回 false

示例

示例 #1 mysqli_result::fetch_assoc() 示例

面向对象风格

<?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);

/* 获取关联数组 */
while ($row = $result->fetch_assoc()) {
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");

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

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

/* 获取关联数组 */
while ($row = mysqli_fetch_assoc($result)) {
printf("%s (%s)\n", $row["Name"], $row["CountryCode"]);
}

上面的示例将输出类似于以下内容

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

示例 #2 mysqli_result iteratormysqli_result::fetch_assoc() 用法的比较

mysqli_result 可以使用 foreach 进行迭代。结果集将始终从第一行进行迭代,而不管当前位置。

<?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);
foreach (
$result as $row) {
printf("%s (%s)\n", $row["Name"], $row["CountryCode"]);
}

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

// 不使用迭代器
$result = $mysqli->query($query);
while (
$row = $result->fetch_assoc()) {
printf("%s (%s)\n", $row["Name"], $row["CountryCode"]);
}

上面的示例将输出类似于以下内容

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)

参见

添加注释

用户贡献的注释 6 个注释

Miller
11 年前
我经常喜欢将结果以数组的形式发送到其他地方(尽管请记住,如果您只是计划在脚本的其他部分遍历数组,那么此额外步骤只是浪费时间)。

这是将 mysqli_result 集转换为数组的单行代码。
<?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);
?>

输出
数组
(
[0] => 数组
(
[id] => 1
[field2] => a
[field3] => b
),
[1] => 数组
(
[id] => 2
[field2] => c
[field3] => d
)
)

我使用其他变体来适应这种情况,例如,如果我只选择一个字段
<?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);
?>
输出
数组
(
[0] => a
[1] => c
)

或者,使用主键创建关联数组(代码假设主键是表中的第一个字段)
<?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);
?>
输出
数组
(
[1] => 数组
(
[field2] => a
[field3] => b
),
[2] => 数组
(
[field2] => c
[field3] => d
)
)
james dot phx at gmail dot com
13 年前
重要提示

如果您习惯使用这样的代码

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

对于 mysqli,您必须将其更改为以下内容

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

前者会导致您的脚本一直运行,直到达到 max_execution_time。
Enrique Garcia
1 年前
MariaDB 和 MySQL(>5.4) 之间存在差异,即输入参数(mysqli 对象)是否包含数据或为空(来自上一个查询)。
-MariaDB:您会收到一个异常
致命错误:未捕获的 TypeError:mysqli_fetch_assoc(): 参数 #1 ($result) 必须为 mysqli_result 类型
-MySQL:即使 mysqli 对象中没有数据,您也可以继续执行。
gilles dot falquet at unige dot ch
6 年前
使用 fetch_assoc 而不是 fetch_row 时要小心。如果结果中的两列具有相同的列名,即使它们在查询中以不同的表名作为前缀,也只保留其中一列。这是因为前缀会被删除(无论是 mysql 还是此函数)。

例如,如果查询是

select p1.name, p2.name
from person p1, friend, person p2
where p1.id = friend.person1 and p2.id = friend.person2

fetch_assoc 返回的数组将是以下形式

{'name' => 'bob'}
{'name' => 'anna'}

而不是(如预期)

{'p1.name' => 'bob', 'p2.name' => 'alice'}
{'p1.name' => 'anna', 'p2.name' => 'irla'}
Hesham Mohamed Sediek
9 年前
从查询变量中获取数据时
并尝试在脚本的其他部分再次获取它
从同一个查询变量中,
当您尝试回显所有已获取的数据时,
它将不会回显您在第一次获取中使用的数据
(它将超过您在第一次获取中使用的数据)......

示例
<?php
$connect
= new mysqli("localhost","root","root","elshamy")
or die (
mysqli_error());

$query=$connect->query("SELECT * FROM users ORDER BY id ASC");

$first_fetch=$query->fetch_array(MYSQLI_ASSOC);
echo
$first_fetch['id']."===>".$first_fetch['user_name']."\n--------------------\n";

while(
$row=$query->fetch_array(MYSQLI_ASSOC)){

/*它将超过您在第一次获取中使用的第一个
id 和 user_name 值*/

echo $row['id']." ".$row['user_name']."<br/>";
}
?>

以上示例将回显
1===>userA
------------------------
2===>userB
3===>userC
4===>userD
paul dot allsopp at inseego dot com
7 年前
这里给出的官方示例违反了基本规则,应该进行修正。

while ($row = $result->fetch_assoc())...

...违反了“条件中的赋值”规则。

while (($x = $y->getZ()) !== false) or
while (($x = $y->getZ()) !== null)

...是正确的语法。

条件语句应始终检查布尔值
To Top