導入 - 結果

導入 - 結果 -- クエリ結果からデータを取得する

説明

クエリの結果から行を取得する

DB_result オブジェクトは、結果セットの行からデータを取得する関数を fetchRow() fetchInto() の 2 種類提供します。

fetchRow() は、行のデータを返します。 fetchInto() は、指定した変数に行のデータを代入して DB_OK を返します。

これらのメソッドがコールされるたびに、結果ポインタが次の行に移動します。 結果セットの最後に到達した場合には NULL が返されます。

エラーが発生した場合には DB_Error が返されます。

取得した行の形式

クエリ結果の行から取得されるデータの構造は、 数値添字の配列 (カラム番号をキーとする)・ 連想配列 (カラム名をキーとする)・ オブジェクト (カラム名をプロパティとする) の 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 インスタンス全体に適用されるデフォルトのフェッチモードを 設定することもできます。

数字で行を取得する

PEAR DB のフェッチシステムは、ステートメントで追加のパラメータを 指定することもサポートしています。 このため、結果から番号により行を取得することが可能です。 これは、 (例えば、ページングを行う HTML リストを作成する場合のように) 結果全体の部分集合の表示のみを行いたい場合や、 特別な順番でレコードを取得する場合等に特に便利です。

結果セット全体を取得する

DB_common オブジェクトでは、データの取得を簡単に行うための メソッドをいくつか提供しています。これは、指定したクエリ文字列を 実行し、返された情報を PHP のデータ形式に取得し、取得結果を開放する という手順を組み合わせて実行するもので、 getOne() getRow() getCol() getAssoc() および getAll() が該当します。

結果セットを解放する

結果セットを使用し終えた後、もしスクリプトをもうしばらく実行させる のであれば、メモリを節約するために結果セットを開放することを 推奨します。これを行うには free() を使用します。

クエリ結果から更に情報を取得する

DB には、クエリの結果セット自身についての有用な情報を 取得するための方法が 4 種類あります。

例 39-6 numRows() は、 SELECT クエリの結果に含まれる行の数を返します。

<?php
// $db という名前の DB オブジェクトが作成済みであると仮定します...
$res =& $db->query('SELECT * FROM phptest');
echo $res->numRows();
?>

例 39-7 numCols() は、 SELECT クエリの結果に含まれるカラムの数を返します。

<?php
// $db という名前の DB オブジェクトが作成済みであると仮定します...
$res =& $db->query('SELECT * FROM phptest');
echo $res->numCols();
?>

例 39-8 affectedRows() は、データを変更するクエリ (INSERTUPDATE あるいは DELETE) により変更された行の数を返します。

<?php
// この文は結果オブジェクトを返さないことを覚えておきましょう
$db->query('DELETE * FROM clients');
echo 'I have deleted ' . $db->affectedRows() . ' clients';
?>

例 39-9 tableInfo() は、 SELECT クエリの結果のカラムに関する情報を 連想配列で返します。

<?php
// $db という名前の DB オブジェクトが作成済みであると仮定します...
$res =& $db->query('SELECT * FROM phptest');
print_r($db->tableInfo($res));

// この方法は、 DB 1.6.0 以降で動作します。
// それより前のバージョンでは、下の構文を使用します。
print_r($res->tableInfo());
?>

エラーをチェックする

isError() を使用して、 返された処理結果が DB_Error オブジェクトでないかどうかを 確認することを忘れないようにしてください。