DB_result オブジェクトは、結果セットの行からデータを取得する関数を fetchRow() と fetchInto() の 2 種類提供します。
fetchRow() は、行のデータを返します。 fetchInto() は、指定した変数に行のデータを代入して DB_OK を返します。
これらのメソッドがコールされるたびに、結果ポインタが次の行に移動します。 結果セットの最後に到達した場合には NULL が返されます。
エラーが発生した場合には DB_Error が返されます。
例 39-1結果セットの取得
|
クエリ結果の行から取得されるデータの構造は、 数値添字の配列 (カラム番号をキーとする)・ 連想配列 (カラム名をキーとする)・ オブジェクト (カラム名をプロパティとする) の 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フェッチモードを毎回設定する
|
例 39-3デフォルトのフェッチモードを変更する
|
PEAR DB のフェッチシステムは、ステートメントで追加のパラメータを 指定することもサポートしています。 このため、結果から番号により行を取得することが可能です。 これは、 (例えば、ページングを行う HTML リストを作成する場合のように) 結果全体の部分集合の表示のみを行いたい場合や、 特別な順番でレコードを取得する場合等に特に便利です。
例 39-4数字で取得する
|
DB_common オブジェクトでは、データの取得を簡単に行うための メソッドをいくつか提供しています。これは、指定したクエリ文字列を 実行し、返された情報を PHP のデータ形式に取得し、取得結果を開放する という手順を組み合わせて実行するもので、 getOne()、 getRow()、 getCol()、 getAssoc() および getAll() が該当します。
結果セットを使用し終えた後、もしスクリプトをもうしばらく実行させる のであれば、メモリを節約するために結果セットを開放することを 推奨します。これを行うには free() を使用します。
例 39-5開放する
|
DB には、クエリの結果セット自身についての有用な情報を 取得するための方法が 4 種類あります。
例 39-6 numRows() は、 SELECT クエリの結果に含まれる行の数を返します。
|
例 39-7 numCols() は、 SELECT クエリの結果に含まれるカラムの数を返します。
|
例 39-8 affectedRows() は、データを変更するクエリ (INSERT、 UPDATE あるいは DELETE) により変更された行の数を返します。
|
例 39-9 tableInfo() は、 SELECT クエリの結果のカラムに関する情報を 連想配列で返します。
|