【问题标题】:get array of rows with mysqli result获取具有 mysqli 结果的行数组
【发布时间】:2026-01-24 09:40:01
【问题描述】:

我需要从结果对象中获取所有行。我正在尝试构建一个包含所有行的新数组。

这是我的代码:

$sql = new mysqli($config['host'],$config['user'],$config['pass'],$config['db_name']);
if (mysqli_connect_errno())
{
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
$query = "SELECT domain FROM services";
$result = $sql->query($query);           
while($row = $result->fetch_row());
{
    $rows[]=$row;
}
$result->close();
$sql->close();
return $rows;

$rows 应该是包含所有行的新数组,但我得到一个空数组。

任何想法为什么会发生这种情况?

【问题讨论】:

    标签: php mysqli


    【解决方案1】:

    你有一个轻微的语法问题,即错误的分号。

    while($row = $result->fetch_row());
    

    注意到末尾的分号了吗?这意味着后面的块没有在循环中执行。摆脱它,它应该可以工作。

    另外,您可能希望 mysqli 报告它遇到的所有问题:

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    $sql = new mysqli($config['host'], $config['user'], $config['pass'], $config['db_name']);
    
    $query = "SELECT domain FROM services";
    $result = $sql->query($query);
    $rows = [];
    while($row = $result->fetch_row()) {
        $rows[] = $row;
    }
    return $rows;
    

    【讨论】:

    • 哦...我不应该那么晚工作真是太尴尬了(这里是凌晨 2:30 :) 谢谢 cletus 解决了 :)
    【解决方案2】:

    最新版本的 mysqli 有一些改进可以简化这样的任务。

    首先,有一个有用的函数可以返回一个包含查询返回的所有行的数组,mysqli_fetch_all()
    这意味着如果您需要一个简单的枚举数组,代码会简单得多:

    $query = "SELECT domain FROM services";
    $result = $sql->query($query);     
    return $result->fetch_all(MYSQLI_ASSOC);
    

    甚至都在一行中,

    return $sql->query("SELECT domain FROM services")->fetch_all(MYSQLI_ASSOC);
    

    但是,如果您需要使用某些列来索引结果数组,您仍然需要这样的 while 循环:

    $query = "SELECT domain FROM services";
    $result = $sql->query($query);
    $data = [];
    while($row = $result->fetch_assoc()) {
      $data[$row['id']]=$row;
    }
    

    请注意,您应该始终在填充数组之前对其进行初始化,因为这样的变量可能已经存在。

    另外,mysqli_result 类现在是可遍历的。这意味着您可以立即在 foreach 循环中使用它,就好像它是一个包含数据库中所有行的数组:

    $query = "SELECT domain FROM services";
    $result = $sql->query($query);
    foreach($result as $row) {
        echo $row['name'];
    }
    

    但它实际上只是 while 循环的语法糖——你不能直接访问这个“数组”的值,这使得这个特性实际上有点用处。

    强制性说明。

    这个问题已有十年之久,在问题和接受的答案中建立联系和执行查询的方式如今已过时且不受欢迎。

    建立连接后,需要牢记几件事。我在how to connect with mysqli properly 上写了一篇文章,提供了一个正确的连接示例,强调以下问题:

    • 必须设置正确的错误报告模式
    • 必须设置正确的字符集
    • 不得使用手动错误报告代码(如die(mysqli_connect_error())
    • 连接只能建立一次,在一个单独的文件中,然后只包含在每个需要数据库交互的脚本中。如果函数中使用了数据库代码,则必须将连接变量作为函数参数传入。

    在运行查询时,还需要牢记以下几点:

    • 即使在查询中使用了单个变量,也必须使用prepared statement 必须代替mysqli_query()
    • 因此,应使用名为mysqli_stmt_get_result() 的特殊函数,以便使用熟悉的提取函数来获取结果行。如果此功能不可用,您可能需要在 cpanel 中勾选某个复选框(查找标记为 mysqlnd 的复选框)。
    • 给定一个带有 mysqli 的预处理语句,虽然是强制性的,但需要编写大量代码,建议使用helper function for mysqli,它会自动执行大部分工作并使 mysqli 预处理语句像常规查询一样流畅。
    • 不得使用手动错误报告代码(如die(mysqli_error()))。由于正确的错误模式,mysqli 将自动报告所有错误。

    【讨论】: