获取mysqli结果的行数组

时间:2009-09-30 23:59:37

标签: php mysqli

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

这是我的代码:

$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应该是包含所有行的新数组,但我得到一个空数组。

为什么会发生这种情况?

2 个答案:

答案 0 :(得分:20)

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

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;

答案 1 :(得分:2)

最新版本的mysqli进行了一些改进,可以简化此类任务。

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

$query = "SELECT domain FROM services";
$result = $sql->query($query);     
return $result->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循环的语法糖-您不能直接访问此“数组”值的值,这实际上使此功能用处不大。

强制性注释。

这个问题已经有十年历史了,如今,无论是在问题还是在接受的答案中,建立连接和执行查询的方式都已被淘汰和皱眉。

建立连接时,需要牢记几件事。我写了article,其中提供了正确的连接示例,着重强调以下问题:

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

执行查询时,请记住以下几点:

  • 在查询中至少使用单个变量时,必须使用prepared statement 代替mysqli_query()
  • 请勿使用任何手动错误报告代码(例如die(mysqli_error()))。由于使用了正确的错误模式,mysqli将自动报告所有错误。