DB_result オブジェクトは、結果セットの行からデータを取得する関数を fetchRow() と fetchInto() の 2 種類提供します。
fetchRow() は、行のデータを返します。 fetchInto() は、指定した変数に行のデータを代入して DB_OK を返します。
これらのメソッドがコールされるたびに、結果ポインタが次の行に移動します。 結果セットの最後に到達した場合には NULL が返されます。
エラーが発生した場合には DB_Error が返されます。
結果セットの取得
<?php
// プログラムの最初で、$db という名前の
// 有効な DB オブジェクトを作成します...
require_once 'DB.php';
$db =& DB::connect('pgsql://usr:pw@localhost/dbnam');
if (PEAR::isError($db)) {
die($db->getMessage());
}
// 何らかのデータを取得します...
$res =& $db->query('SELECT * FROM mytable');
// 各行のデータの取得を、
// 最後の行に到達するまで続けます
while ($res->fetchInto($row)) {
// DB のデフォルトのフェッチモードが DB_FETCHMODE_ORDERED であると仮定します
echo $row[0] . "\n";
}
// あるいは、fetchRow() を使用して同じ処理を行うことも可能です
// while ($row =& $res->fetchRow()) {
// // DB のデフォルトのフェッチモードが DB_FETCHMODE_ORDERED であると仮定します
// echo $row[0] . "\n";
// }
?>
クエリ結果の行から取得されるデータの構造は、 数値添字の配列 (カラム番号をキーとする)・ 連想配列 (カラム名をキーとする)・ オブジェクト (カラム名をプロパティとする) の 3 種類のうちのいずれかとなります。
DB_FETCHMODE_ORDERED (デフォルト)
Array
(
[0] => 28
[1] => hi
)
DB_FETCHMODE_ASSOC
Array
(
[a] => 28
[b] => hi
)
DB_FETCHMODE_OBJECT
stdClass Object
(
[a] => 28
[b] => hi
)
注意: 同名のカラムがクエリ内に複数含まれており (例えば、同名のカラムを持つ複数のテーブルを連結した場合など)、 かつフェッチモードが DB_FETCHMODE_ASSOC あるいは DB_FETCHMODE_OBJECT の場合、その名前が最後に 現れたカラムのデータが返されます。この問題を回避するための 方法は、2 種類あります。
People.Name AS PersonName
のように、クエリでエイリアスを使用する
豆知識: このような問題に遭遇する場合は、たいていデータベーススキーマの 設計に問題があります。データが不必要に重複していたり、 違う種類のデータに同じ名前をつけているなどが考えられます。
フェッチメソッドをコールするたびに毎回フェッチモードを設定することも できますし、 setFetchMode() メソッドを使用して DB インスタンス全体に適用されるデフォルトのフェッチモードを 設定することもできます。
フェッチモードを毎回設定する
<?php
// $db という名前の DB オブジェクトが作成済みであると仮定します...
$res =& $db->query('SELECT * FROM users');
while ($res->fetchInto($row, DB_FETCHMODE_ASSOC)) {
echo $row['id'] . "\n";
}
?>
デフォルトのフェッチモードを変更する
<?php
// $db という名前の DB オブジェクトが作成済みであると仮定します...
$db->setFetchMode(DB_FETCHMODE_ASSOC);
$res =& $db->query('SELECT * FROM users');
while ($res->fetchInto($row)) {
echo $row['id'] . "\n";
}
?>
PEAR DB のフェッチシステムは、ステートメントで追加のパラメータを 指定することもサポートしています。 このため、結果から番号により行を取得することが可能です。 これは、 (例えば、ページングを行う HTML リストを作成する場合のように) 結果全体の部分集合の表示のみを行いたい場合や、 特別な順番でレコードを取得する場合等に特に便利です。
数字で取得する
<?php
// $db という名前の DB オブジェクトが作成済みであると仮定します...
// 取得を開始する行
$from = 50;
// ページ毎の結果の数
$resPage = 10;
// このページで最後に取得した行
$to = $from + $resPage;
foreach (range($from, $to) as $rowNum) {
if (!$res->fetchInto($row, DB_FETCHMODE_ORDERED, $rowNum)) {
break;
}
echo $row[0] . "\n";
}
?>
DB_common オブジェクトでは、データの取得を簡単に行うための メソッドをいくつか提供しています。これは、指定したクエリ文字列を 実行し、返された情報を PHP のデータ形式に取得し、取得結果を開放する という手順を組み合わせて実行するもので、 getOne()、 getRow()、 getCol()、 getAssoc() および getAll() が該当します。
結果セットを使用し終えた後、もしスクリプトをもうしばらく実行させる のであれば、メモリを節約するために結果セットを開放することを 推奨します。これを行うには free() を使用します。
開放する
<?php
// $db という名前の DB オブジェクトが作成済みであると仮定します...
$res =& $db->query('SELECT name, address FROM clients');
while ($res->fetchInto($row)) {
echo $row['name'] . ', ' . $row['address'] . "\n";
}
$res->free();
?>
DB には、クエリの結果セット自身についての有用な情報を 取得するための方法が 4 種類あります。
numRows() は、 SELECT クエリの結果に含まれる行の数を返します。
<?php
// $db という名前の DB オブジェクトが作成済みであると仮定します...
$res =& $db->query('SELECT * FROM phptest');
echo $res->numRows();
?>
numCols() は、 SELECT クエリの結果に含まれるカラムの数を返します。
<?php
// $db という名前の DB オブジェクトが作成済みであると仮定します...
$res =& $db->query('SELECT * FROM phptest');
echo $res->numCols();
?>
affectedRows() は、データを変更するクエリ (INSERT、 UPDATE あるいは DELETE) により変更された行の数を返します。
<?php
// この文は結果オブジェクトを返さないことを覚えておきましょう
$db->query('DELETE * FROM clients');
echo 'I have deleted ' . $db->affectedRows() . ' clients';
?>
tableInfo() は、 SELECT クエリの結果のカラムに関する情報を 連想配列で返します。
<?php
// $db という名前の DB オブジェクトが作成済みであると仮定します...
$res =& $db->query('SELECT * FROM phptest');
print_r($db->tableInfo($res));
// この方法は、 DB 1.6.0 以降で動作します。
// それより前のバージョンでは、下の構文を使用します。
print_r($res->tableInfo());
?>