Php/docs/pdostatement.fetchall
PDOStatement::fetchAll
(PHP 5 >= 5.1.0, PHP 7, PECL pdo >= 0.1.0)
PDOStatement::fetchAll — 返回一个包含结果集中所有行的数组
说明
PDOStatement::fetchAll
([ int $fetch_style
[, mixed $fetch_argument
[, array $ctor_args
= array()
]]] ) : array
参数
fetch_style
控制返回数组的内容如同 PDOStatement::fetch() 文档中记载的一样。默认为
PDO::ATTR_DEFAULT_FETCH_MODE
的值( 其缺省值为PDO::FETCH_BOTH
)想要返回一个包含结果集中单独一列所有值的数组,需要指定
PDO::FETCH_COLUMN
。通过指定column-index
参数获取想要的列。想要获取结果集中单独一列的唯一值,需要将
PDO::FETCH_COLUMN
和PDO::FETCH_UNIQUE
按位或。想要返回一个根据指定列把值分组后的关联数组,需要将
PDO::FETCH_COLUMN
和PDO::FETCH_GROUP
按位或。fetch_argument
根据
fetch_style
参数的值,此参数有不同的意义:PDO::FETCH_COLUMN
:返回指定以0开始索引的列。PDO::FETCH_CLASS
:返回指定类的实例,映射每行的列到类中对应的属性名。PDO::FETCH_FUNC
:将每行的列作为参数传递给指定的函数,并返回调用函数后的结果。
ctor_args
当
fetch_style
参数为PDO::FETCH_CLASS
时,自定义类的构造函数的参数。
返回值
PDOStatement::fetchAll() 返回一个包含结果集中所有剩余行的数组。此数组的每一行要么是一个列值的数组,要么是属性对应每个列名的一个对象。
使用此方法获取大结果集将导致系统负担加重且可能占用大量网络资源。与其取回所有数据后用PHP来操作,倒不如考虑使用数据库服务来处理结果集。例如,在取回数据并通过PHP处理前,在 SQL 中使用 WHERE 和 ORDER BY 子句来限定结果。
范例
Example #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();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 ) )
Example #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 )
Example #3 根据单独的一列把所有值分组
下面例子演示了如何返回一个根据结果集中指定列的值分组的关联数组。该数组包含三个键:返回的 apple
和 pear
数组包含了两种不同的颜色,而返回的 watermelon
数组仅包含一种颜色。
<?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" } }
Example #4 每行结果实例化一个类
下面列子演示了 PDO::FETCH_CLASS
获取风格的行为。
<?phpclass fruit { public $name; public $colour;}$sth = $dbh->prepare("SELECT name, colour FROM fruit");$sth->execute();$result = $sth->fetchAll(PDO::FETCH_CLASS, "fruit");var_dump($result);?>
以上例程的输出类似于:
array(3) { [0]=> object(fruit)#1 (2) { ["name"]=> string(5) "apple" ["colour"]=> string(5) "green" } [1]=> object(fruit)#2 (2) { ["name"]=> string(4) "pear" ["colour"]=> string(6) "yellow" } [2]=> object(fruit)#3 (2) { ["name"]=> string(10) "watermelon" ["colour"]=> string(4) "pink" } }
Example #5 每行调用一次函数
下面列子演示了 PDO::FETCH_FUNC
获取风格的行为。
<?phpfunction fruit($name, $colour) { return "{$name}: {$colour}";}$sth = $dbh->prepare("SELECT name, colour FROM fruit");$sth->execute();$result = $sth->fetchAll(PDO::FETCH_FUNC, "fruit");var_dump($result);?>
以上例程的输出类似于:
array(3) { [0]=> string(12) "apple: green" [1]=> string(12) "pear: yellow" [2]=> string(16) "watermelon: pink" }
参见
- PDO::query() - 执行 SQL 语句,以 PDOStatement 对象形式返回结果集
- PDOStatement::fetch() - 从结果集中获取下一行
- PDOStatement::fetchColumn() - 从结果集中的下一行返回单独的一列。
- PDO::prepare() - 准备要执行的语句,并返回语句对象
- PDOStatement::setFetchMode() - 为语句设置默认的获取模式。