logo

额外区块类型 (EBT) - 全新的布局构建器体验❗

额外区块类型 (EBT) - 样式化、可定制的区块类型:幻灯片、标签页、卡片、手风琴等更多类型。内置背景、DOM Box、JavaScript 插件的设置。立即体验布局构建的未来。

演示 EBT 模块 下载 EBT 模块

❗额外段落类型 (EPT) - 全新的 Paragraphs 体验

额外段落类型 (EPT) - 类似的基于 Paragraph 的模块集合。

演示 EPT 模块 滚动

滚动

在 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();
?>