滚动
结果集
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);