logo

Palette - 让它色彩缤纷🎨

Palette — 可视化页面构建器,无需专业设计背景。

在线演示 下载 Palette

滚动

在 Drupal 7 中操作数据库 - 第7课 - 查询结果的处理(fetch)

14/10/2025, by Ivan

SELECT 查询的执行结果总是返回 0 条或多条记录。对于查询结果的处理,Drupal 提供了多种方式,您可以根据实际需求选择使用。

最常见的方式是通过 foreach() 循环遍历结果:

<?php
$result = db_query("SELECT nid, title FROM {node}");
foreach ($result as $record) {
  // 处理每一条记录
  $node = node_load($record->nid);
}
?>

根据你需要的输出形式,你还可以使用其他方式来获取结果记录。若需逐条显式读取记录,请使用以下方法:

<?php
$record = $result->fetch();          // 使用默认模式(返回对象)
$record = $result->fetchObject();    // 以对象形式返回
$record = $result->fetchAssoc();     // 以关联数组形式返回
?>

如果没有更多记录可供读取,这些方法会返回 FALSE。建议使用 fetchObject()fetchAssoc() 来明确指定返回的结构类型。

此外,还可以通过参数更改 fetch() 的默认模式。如果只需读取某个字段的单个值,可使用:

<?php
$record = $result->fetchField($column_index);
?>

参数 $column_index 默认为 0。

若要获取查询结果的总行数,请使用:

<?php
$number_of_rows = $result->rowCount();
?>

如果希望一次性将所有结果存入数组,可使用以下方法:

<?php
// 将结果作为对象数组返回
$result->fetchAll();

// 将结果作为以字段名为键的关联数组返回
$result->fetchAllAssoc($field);

// 将结果的第二列作为值,第一列作为键的关联数组返回
$result->fetchAllKeyed();
$result->fetchAllKeyed(0, 2); // 结果为 [列0 => 列2]
$result->fetchAllKeyed(1, 0); // 结果为 [列1 => 列0]

// 获取单列值组成的数组
$result->fetchCol();
// 指定列索引(默认为第一列)获取该列所有值
$result->fetchCol($column_index);
?>

请注意,fetchAll()fetchAllAssoc() 的默认行为可通过设置 fetch mode 常量来修改。对于 fetchAll(),模式为第一个参数;对于 fetchAllAssoc(),模式为第二个参数。

由于 PHP 支持方法链调用,因此在某些情况下可以省略中间变量 $result,直接链式调用:

<?php
// 获取 nid 与 title 的关联数组
$nodes = db_query("SELECT nid, title FROM {node}")->fetchAllKeyed();

// 获取单条节点记录
$node = db_query("SELECT * FROM {node} WHERE nid = :nid", array(':nid' => $nid))->fetchObject();

// 获取单个字段值
$title = db_query("SELECT title FROM {node} WHERE nid = :nid", array(':nid' => $nid))->fetchField();
?>