滚动
在 Drupal 7 中操作数据库 - 第7课 - 查询结果的处理(fetch)
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(); ?>