PDOStatement::fetchAll ([ int $fetch_style [, mixed $fetch_argument [, array $ctor_args = array() ]]] ) : array

返回一个包含结果集中所有行的数组
(PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)

参数说明:

fetch_style

控制返回数组的内容,默认为 PDO::FETCH_BOTH
1. PDO::FETCH_ASSOC: 返回一个索引为结果集列名的数组,即关联数组
2. PDO::FETCH_BOTH (默认): 返回一个索引为结果集列名和以 0 开始的数组,即关联数组+索引数组
3. PDO::FETCH_NUM: 返回一个索引为以 0 开始的结果集列号的数组,即索引数组
4. PDO::FETCH_OBJ: 返回一个属性名对应结果集列名的匿名对象,即对象

fetch_argument

根据 fetch_style 参数的值,此参数有不同的意义:
1. PDO::FETCH_COLUMN: 返回指定以 0 开始索引的列
2. PDO::FETCH_CLASS: 返回指定类的实例,映射每行的列到类中对应的属性名
3. PDO::FETCH_FUNC: 将每行的列作为参数传递给指定的函数,并返回调用函数后的结果

ctor_args

当 fetch_style 参数为 PDO::FETCH_CLASS 时自定义类的构造函数的参数

返回值

PDOStatement::fetchAll() 返回一个包含结果集中所有剩余行的数组。此数组的每一行要么是一个列值的数组,要么是属性对应每个列名的一个对象。

使用此方法会返回所有结果集,如果查询获取的数据量太大,将导致占用大量网络资源以及内存,所以建议不要取回所有数据后用 PHP 操作,而是在 SQL 中使用 WHERE 和 ORDER BY 自子句来限定返回的结果。

DEMO

#1 将结果集转为数组

<?php
$sth = $dbh->prepare("SELECT name, colour FROM fruit");
$sth->execute();

/* 获取结果集中所有剩余的行 */
print("Fetch all of the remaining rows in the result set:\n");
$result = $sth->fetchAll();   // PDO::FETCH_BOTH (默认): 返回一个索引为结果集列名和以 0 开始的数组,即关联数组+索引数组
print_r($result);

输出

Fetch all of the remaining rows in the result set:
Array
(
    [0] => Array
        (
            [NAME] => pear
            [0] => pear
            [COLOUR] => green
            [1] => green
        )

    [1] => Array
        (
            [NAME] => watermelon
            [0] => watermelon
            [COLOUR] => pink
            [1] => pink
        )

)

#2 获取结果集中单独一列的所有值

尽管 SQL 语句自身返回多列,我们可以使用以下方式只返回某一列

<?php
$sth = $dbh->prepare("SELECT name, colour FROM fruit");
$sth->execute();

/* 获取第一列所有值 */
$result = $sth->fetchAll(PDO::FETCH_COLUMN, 0);
var_dump($result);

输出

Array(3)
(
    [0] =>
    string(5) => apple
    [1] =>
    string(4) => pear
    [2] =>
    string(10) => watermelon
)

#3 对某一列的值进行分组,返回一个根据结果集中指定列的值分组的关联数组

<?php
$insert = $dbh->prepare("INSERT INTO fruit(name, colour) VALUES (?, ?)");
$insert->execute(array('apple', 'green'));
$insert->execute(array('pear', 'yellow'));

$sth = $dbh->prepare("SELECT name, colour FROM fruit");
$sth->execute();

/* 根据第一列分组  */
var_dump($sth->fetchAll(PDO::FETCH_COLUMN|PDO::FETCH_GROUP));

输出

array(3) {
  ["apple"]=>
  array(2) {
    [0]=>
    string(5) "green"
    [1]=>
    string(3) "red"
  }
  ["pear"]=>
  array(2) {
    [0]=>
    string(5) "green"
    [1]=>
    string(6) "yellow"
  }
  ["watermelon"]=>
  array(1) {
    [0]=>
    string(5) "green"
  }
}

#4 每行调用一次函数

<?php
function fruit($name, $colour) {
    return "{$name}: {$colour}";
}

$sth = $dbh->prepare("SELECT name, colour FROM fruit");
$sth->execute();

$result = $sth->fetchAll(PDO::FETCH_FUNC, "fruit");  // fruit 为函数名
var_dump($result);

输出

array(3) {
  [0]=>
  string(12) "apple: green"
  [1]=>
  string(12) "pear: yellow"
  [2]=>
  string(16) "watermelon: pink"
}