获取具有 mysqli 结果的行数组

get array of rows with mysqli result

提问人:Yaniv Golan 提问时间:10/1/2009 最后编辑:DharmanYaniv Golan 更新时间:3/2/2023 访问量:87892

问:

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

这是我的代码:

$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

评论


答:

28赞 cletus 10/1/2009 #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;

评论

0赞 Sliq 9/16/2022
仅供参考,这将获取数字数组中的列,而不是以列名作为键
21赞 Your Common Sense 11/25/2019 #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 id, 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['domain'];
}

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

必备说明。

这个问题已经有十年的历史了,在问题和接受的答案中建立连接和执行查询的方式,如今都已经过时和不受欢迎。

建立联系时,有几件事需要牢记。我写了一篇关于如何正确连接mysqli的文章,该文章提供了一个正确的连接示例,强调了以下问题:

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

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

  • 当在查询中使用单个变量时,必须使用预准备语句而不是mysqli_query()
  • 因此,应使用一个名为 mysqli_stmt_get_result() 的特殊函数,以便使用熟悉的 fetch 函数来获取生成的行。如果此功能不可用,您可能需要在 cpanel 中勾选一些复选框(查找标有 )。mysqlnd
  • 鉴于使用 MySQLI 的预处理语句虽然是强制性的,但需要编写大量代码,建议使用 MySQLI 的辅助函数,该函数将自动执行大部分工作,并使 MySQLI 预准备语句像常规查询一样流畅。
  • 不应使用任何手动错误报告代码(如 )。由于正确的错误模式,mysqli将自动报告所有错误。die(mysqli_error())