获取mysqli结果的行数组

Yan*_*lan 7 php mysqli

我正在尝试检查字符串是否与表中某个列中的某个字段匹配.为此,我需要从result对象获取所有行.我正在使用php 5.2.x所以不能使用$rows方法; 相反,我正在尝试构建一个包含所有行的新数组.

这是我的代码:

$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;
Run Code Online (Sandbox Code Playgroud)

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

任何想法为什么会这样?

cle*_*tus 22

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

while($row = $result->fetch_row());
Run Code Online (Sandbox Code Playgroud)

注意结尾的分号?这意味着后续块未在循环中执行.摆脱它,它应该工作.

此外,您可能想要检查查询是否确实有效:

$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;
Run Code Online (Sandbox Code Playgroud)

  • 哦...多么尴尬我不应该工作那么晚(这是凌晨2:30在这里:)谢谢cletus这个解决了:) (6认同)

You*_*nse 10

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

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

$query = "SELECT domain FROM services";
$result = $sql->query($query);     
return $result->fetch_all(MYSQLI_ASSOC);
Run Code Online (Sandbox Code Playgroud)

甚至都在一行中,

return $sql->query("SELECT domain FROM services")->fetch_all(MYSQLI_ASSOC);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

强制性笔记。

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

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

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

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

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