php 获取带有mysqli结果的行数组

siotufzp  于 2023-03-07  发布在  PHP
关注(0)|答案(2)|浏览(136)

我需要从结果对象中获取所有行。我正在尝试生成一个新的数组来保存所有行。
下面是我的代码:

$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应该是包含所有行的新数组,但我得到了一个空数组。
知道为什么会这样吗?

nxagd54h

nxagd54h1#

您遇到了一个轻微的语法问题,即错误的分号。

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;
fv2wmkja

fv2wmkja2#

最新版本的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循环的语法糖--你不能直接访问这个“数组”的值,这使得这个特性实际上有点用处。

强制性注解。

这个问题已经有十年的历史了,无论是在问题中还是在被接受的答案中,建立连接和执行查询的方式现在都已经过时了。
当建立连接时,有几件事要记住,我写了一篇关于how to connect with mysqli properly的文章,提供了一个正确的连接示例,强调了以下问题:

  • 必须设置正确的错误报告模式
  • 必须设置正确的**字符集
    *无手动错误报告应始终使用代码(如die(mysqli_connect_error())
  • 一个连接只需要在一个单独的文件中建立一次,然后包含在每个需要数据库交互的脚本中。在函数中使用数据库代码的情况下,连接变量必须作为函数参数传递。

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

  • 即使在查询中使用了单个变量,也必须使用prepared statement***而不是mysqli_query()
  • 因此,应该使用一个名为mysqli_stmt_get_result()的特殊函数,以便使用熟悉的fetch函数来获取结果行。如果此函数不可用,您可能需要在cpanel中勾选某个复选框(查找标记为mysqlnd的复选框)。
  • 给定具有mysqli的预准备语句(尽管是强制性的)需要编写大量代码,建议使用helper function for mysqli,其将自动执行大部分工作并使mysqli预准备语句像常规查询一样平滑。
    *没有手动错误报告代码应该永远使用(如die(mysqli_error()))。由于正确的错误模式,mysqli将自动报告所有错误。

相关问题