PHP Conference Japan 2024

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() 用法的比较

可以使用 foreach 迭代 mysqli_result。无论当前位置如何,结果集始终从第一行开始迭代。

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

参见

添加注释

用户贡献的注释 3 条注释

87
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
)
)
28
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 达成。
1
Enrique Garcia
1 年前
MariaDB 和 MySQL(>5.4) 之间存在差异,无论输入参数 (mysqli 对象) 是否有数据或为空(它来自之前的查询)。
- MariaDB:您会收到异常
致命错误:未捕获的 TypeError:mysqli_fetch_assoc(): 参数 #1 ($result) 必须是 mysqli_result 类型
- MySQL:即使 mysqli 对象中没有数据,您也可以继续。
To Top