(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)
PDOStatement->fetchAll — 全ての結果行を含む配列を返す
PDOStatement::fetch() に文章化されているような 返される配列の内容を制御します。
結果セットから単一カラムの全ての値を含む配列を返す場合、 PDO::FETCH_COLUMN を指定します。 column-index パラメータにどのカラムを返すかを 指定することができます。
結果セットから単一カラムの一意な値のみ取得する場合、 PDO::FETCH_UNIQUE をビット OR した PDO::FETCH_COLUMN を指定します。
指定したカラムの値によってグループ化した連想配列を返す場合、 PDO::FETCH_GROUP をビット OR した PDO::FETCH_COLUMN を指定します。
この引数は、fetch_style の値によって意味が異なります。
PDO::FETCH_COLUMN: ここで指定した、 0 から始まる番号のカラムを返します。
PDO::FETCH_CLASS: ここで指定したクラスのインスタンスを返します。各行のカラムがクラスのプロパティ名にマッピングされます。
PDO::FETCH_FUNC: ここで指定した関数をコールした結果を返します。各行のカラムを関数コール時のパラメータとします。
fetch_style が PDO::FETCH_CLASS のときに使う、独自のクラスコンストラクタへの引数。
PDOStatement::fetchAll() は、 結果セットに残っている全ての行を含む配列を返します。 この配列は、カラム値の配列 もしくは各カラム名に対応するプロパティを持つオブジェクトをして 各行を表します。
大きな結果セットをフェッチするためにこのメソッドを使用することは、 システムとネットワークリソースに大量の要求を行うことになります。 PHP で全てのデータ処理と操作を行うよりも、データベースサーバ側で 結果セットを操作することを検討してください。例えば、PHP で処理を行う前に SQL で WHERE 句や ORDER BY 句を使用し、結果を制限することです。
例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
)
)
例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 単一カラムによる全ての値のグループ化
以下の例は、どのように結果セット中の特定のカラムの値によって グループ化された連想配列を返すかを例示しています。 その配列は 3 つのキーを有します。値 apple、 pear は異なる 2 つの異なる色を有する配列として返され、 一方 watermelon は 1 つの色のみ有する配列として返されます。
<?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 各結果用のクラスのインスタンス作成
次の例は、 PDO::FETCH_CLASS の振る舞いを示すものです。
<?php
class 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"
}
}
例5 各結果に対する関数コール
次の例は、 PDO::FETCH_FUNC の振る舞いを示すものです。
<?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");
var_dump($result);
?>
上の例の出力は、 たとえば以下のようになります。
array(3) {
[0]=>
string(12) "apple: green"
[1]=>
string(12) "pear: yellow"
[2]=>
string(16) "watermelon: pink"
}