導入 - 結果 -- クエリ結果からデータを取得する
説明
クエリの結果から行を取得する
DB_result
オブジェクトは、結果セットの行からデータを取得する関数を
fetchRow() と
fetchInto()
の 2 種類提供します。
fetchRow() は、行のデータを返します。
fetchInto() は、指定した変数に行のデータを代入して
DB_OK を返します。
これらのメソッドがコールされるたびに、結果ポインタが次の行に移動します。
結果セットの最後に到達した場合には NULL が返されます。
エラーが発生した場合には DB_Error が返されます。
例 39-1結果セットの取得
<?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
のように、クエリでエイリアスを使用する
|
|
フェッチモードを DB_FETCHMODE_ORDERED に変更する
|
豆知識: このような問題に遭遇する場合は、たいていデータベーススキーマの
設計に問題があります。データが不必要に重複していたり、
違う種類のデータに同じ名前をつけているなどが考えられます。
形式を設定する
フェッチメソッドをコールするたびに毎回フェッチモードを設定することも
できますし、
setFetchMode() メソッドを使用して
DB インスタンス全体に適用されるデフォルトのフェッチモードを
設定することもできます。
例 39-2フェッチモードを毎回設定する
<?php
// $db という名前の DB オブジェクトが作成済みであると仮定します...
$res =& $db->query('SELECT * FROM users');
while ($res->fetchInto($row, DB_FETCHMODE_ASSOC)) {
echo $row['id'] . "\n";
}
?>
|
|
例 39-3デフォルトのフェッチモードを変更する
<?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 リストを作成する場合のように)
結果全体の部分集合の表示のみを行いたい場合や、
特別な順番でレコードを取得する場合等に特に便利です。
例 39-4数字で取得する
<?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";
}
?>
|
|
結果セットを解放する
結果セットを使用し終えた後、もしスクリプトをもうしばらく実行させる
のであれば、メモリを節約するために結果セットを開放することを
推奨します。これを行うには
free() を使用します。
例 39-5開放する
<?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 種類あります。