logo

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

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

演示 EBT 模块 下载 EBT 模块

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

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

演示 EPT 模块 滚动

滚动
01/10/2025, by Ivan

Select 查询总是会返回一个结果集对象,该对象包含零条或多条记录。根据使用场景不同,有多种方式可以从该结果集中获取数据。默认情况下,如果不修改提取模式,记录会被作为对象提取(参见:setFetchMode)。

最常见的情况是通过 foreach() 循环遍历结果集:

// 静态查询:
$result = $connection->query("SELECT field1, field2 FROM {mytable}");
foreach ($result as $record) {
  // 对每条 $record 执行操作
}

// 动态查询
$result = $query->execute();
foreach ($result as $record) {
  // 对每条 $record 执行操作
}

然而,根据你需要的结果不同,还有其他方式来获取记录。

要显式获取下一条记录,可以使用:

$record = $result->fetch();            // 使用默认的提取模式。
$record = $result->fetchObject();  // 作为 stdClass 对象提取。
$record = $result->fetchAssoc();   // 作为关联数组提取。

如果没有下一条记录,会返回 FALSE。通常应避免使用 fetch(),而优先使用 fetchObject() 或 fetchAssoc(),因为后者更具可读性。如果你需要使用 PDO 支持的其他提取模式,请使用 fetch()。

要从结果集中只获取单个字段,可以使用:

$record = $result->fetchField($column_index);

$column_index 的默认值为 0,即第一列。

要统计 DELETE、INSERT 或 UPDATE 返回的行数,可以使用:

$number_of_rows = $result->rowCount();

要统计 SELECT 返回的行数,可以使用:

$number_of_rows = $connection->select('mytable')->countQuery()->execute()->fetchField();

要一次性将所有记录提取到数组中,可以使用以下方法:

// 将所有记录提取为 stdClass 对象的索引数组。
$result->fetchAll();

// 将所有记录提取为以结果中的某个字段为键的关联数组。
$result->fetchAllAssoc($field);

// 将两列结果提取为关联数组,键为第 0 列,值为第 1 列。
$result->fetchAllKeyed();
// 你也可以通过指定列号来选择哪两列
$result->fetchAllKeyed(0,2); // 第 0 列 => 第 2 列
$result->fetchAllKeyed(1,0); // 第 1 列 => 第 0 列
// 如果你需要一个键和值相同的数组(例如生成 'checkboxes' 表单元素),下面的写法完全合法:
$result->fetchAllKeyed(0,0); // 第 0 列 => 第 0 列,例如 [article] => [article]

// 将一列结果提取为一个数组。
$result->fetchCol();
// 可以指定列号,否则默认为第一列
$result->fetchCol($column_index);

请注意,fetchAll() 和 fetchAllAssoc() 默认会按照查询中设置的提取模式(数值数组、关联数组或对象)来提取结果。你可以通过传递常量来更改提取模式。对于 fetchAll(),这是第一个参数。对于 fetchAllAssoc(),这是第二个参数。示例:

// 获取一个以 'id' 字段为键的数组,每条记录为一个数组。
$result->fetchAllAssoc('id', PDO::FETCH_ASSOC);
// 获取一个同时包含数字索引和关联索引的数组。
$result->fetchAll(PDO::FETCH_BOTH);

由于 PHP 支持链式调用返回的对象方法,通常会省略 $result 变量,例如:

// 获取一个 id 到 title 的关联数组。
$examples = $connection->query("SELECT id, title FROM {mytable}")->fetchAllKeyed();

// 从数据库获取单条记录。
$myobj = $connection->query("SELECT * FROM {mytable} WHERE example = :example", [':example' => $example])->fetchObject();

// 从数据库获取单个值。
$myval = $connection->query("SELECT example FROM {mytable} WHERE id = :id", [':id' => $id])->fetchField();

如果你需要一个简单的数组 [1, 2, 3, 4, 5],你将得到类似 [1=>1, 2=>2, 3=>3, 4=>4, 5=>5] 的结构。你可以这样实现:

$ids = $connection->query("SELECT id FROM {example}")->fetchAllKeyed(0,0);