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"
}