使用mysqli结果获取行数组

smdnsysy  于 2021-06-24  发布在  Mysql
关注(0)|答案(2)|浏览(371)

我需要从result对象获取所有行。我正在尝试构建一个新的数组来容纳所有行。
这是我的密码:

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

t5fffqht1#

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循环的一个语法糖——您不能直接访问这个“数组”的值,这使得这个特性实际上用处不大。

强制性票据。

这个问题已经有十年的历史了,无论是在问题中还是在被接受的答案中,建立联系和执行查询的方式如今都已过时,并受到人们的冷落。
当建立连接时,有几件事要记住。我写了一篇关于如何正确连接mysqli的文章,提供了一个正确的连接示例,强调了以下问题:
必须设置正确的错误报告模式
必须设置正确的字符集
不应使用任何手动错误报告代码(如 die(mysqli_connect_error()) )
一个连接只需要在一个单独的文件中建立一次,然后只需要包含在每个需要数据库交互的脚本中。如果函数中使用了数据库代码,则必须将连接变量作为函数参数传入。
在运行查询时,还要记住以下几点:
当查询中使用单个变量时,必须使用prepared语句而不是 mysqli_query() 因此,一个特殊的函数 mysqli_stmt_get_result() 应该使用,以便使用熟悉的fetch函数来获取结果行。如果此功能不可用,您可能需要在cpanel中勾选一些复选框(寻找一个标记为 mysqlnd ).
考虑到mysqli的prepared语句虽然是必需的,但需要编写大量代码,建议使用mysqli的helper函数,该函数将自动执行大部分工作,并使mysqli prepared语句像常规查询一样平滑。
不应使用任何手动错误报告代码(如 die(mysqli_error()) ). 由于采用了正确的错误模式,mysqli将自动报告所有错误。

1dkrff03

1dkrff032#

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

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

注意到结尾的分号了吗?这意味着下面的块不是在循环中执行的。摆脱它,它应该会起作用。
此外,您可能需要检查查询是否实际工作:

$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);     
if (!$result) {
  printf("Query failed: %s\n", $mysqli->error);
  exit;
}      
while($row = $result->fetch_row()) {
  $rows[]=$row;
}
$result->close();
$sql->close();
return $rows;

相关问题