MDB2_Result_Common オブジェクトには、結果セットの行からデータを取得するための 4 つのメソッドがあります。 fetchOne()、 fetchRow()、 fetchCol() そして fetchAll() です。
fetchRow() および fetchOne() は、それぞれ行全体あるいは特定のカラムのフィールドを取得します。 結果ポインタは、これらのメソッドがコールされるたびに次の行に移動します。 結果セットの最後に達した場合は NULL が返されます。
fetchAll() および fetchCol() は、結果セットのすべての行を読み込んで結果ポインタを最後まで移動します。 fetchAll() は行全体のデータを読み込みますが、 fetchCol() は特定のカラムのみを読み込みます。
エラーが発生した場合は MDB2_Error が返されます。
例 34-1結果の取得
|
クエリの結果の行から取得したデータは、 数値添字配列 (カラム番号をキーとする)、 連想配列 (カラム名をキーとする) あるいは オブジェクト (カラム名をプロパティとする) の三種類のうちのいずれかの形式となります。
MDB2_FETCHMODE_ORDERED (デフォルト)
Array
(
[0] => 28
[1] => hi
) |
MDB2_FETCHMODE_ASSOC
Array
(
[a] => 28
[b] => hi
) |
MDB2_FETCHMODE_OBJECT
stdClass Object
(
[a] => 28
[b] => hi
) |
注意: クエリの中に同名のカラムが複数含まれており (例えば、同じ名前のカラムがある複数テーブルを JOIN した場合など)、かつフェッチモードが MDB2_FETCHMODE_ASSOC あるいは MDB2_FETCHMODE_OBJECT の場合は、その名前を指定すると 最後に登場したカラムの値が返されます。 この問題を解決するとりあえずの方法としては、次のふたつがあります。
| クエリの中で、例えば People.Name AS PersonName のようにエイリアスを使用する。 |
| フェッチモードを MDB2_FETCHMODE_ORDERED に変更する。 |
豆知識: この問題が発生する場合、 データベースのスキーマに問題があることが多いです。 例えば同じデータが二重に管理されていたり、 異なる内容のデータに同じ名前をつけてしまっていたり といったことが考えられます。
fetch メソッドをコールするたびにフェッチモードを設定することもできますし、 MDB2 インスタンス全体のデフォルトのフェッチモードを設定することもできます。 デフォルトのフェッチモードを設定するには setFetchMode() メソッドを使用します。
例 34-2コールのたびにフェッチモードを設定する
|
例 34-3デフォルトのフェッチモードの変更
|
PEAR MDB2 のフェッチシステムでは、 fetch 文に対して追加のパラメータを指定することができます。 これにより、結果から行番号を指定して行を取得することができます。 これは、結果セットの一部を表示したり (例えば複数ページにまたがる HTML のリストなど)、特別な順番で行を取得する場合などに有用です。
例 34-4番号指定による行の取得
|
MDB2_Result_Common オブジェクトには、 結果セット全体を読み込むためのメソッド群が用意されています。それが fetchCol() および fetchAll() です。
結果セットの使用を終えた後にもしスクリプトの処理が続くのなら、 メモリを節約するために結果セットを開放するとよいでしょう。 そのために使用するのが free() です。
例 34-5開放
|
あなたが読み込まなければならないデータの形式がまだ MDB2 で実装されていない場合は、 getResource() メソッドでネイティブな結果セットを取得し、 それに対して PHP の各拡張モジュールの関数を直接コールすることができます (それによって、当然コードの可搬性は下がります)。
例 34-6ネイティブな結果リソース
|
MDB2 には、クエリの結果セットの情報を取得するための 4 種類の方法があります。
例 34-7 numRows() は、SELECT クエリの結果の行数を返します。
|
例 34-8 numCols() は、SELECT クエリの結果に含まれるカラムの数を返します。
|
例 34-9 rowCount() は、内部的な行ポインタが、現在何行目を指しているかを返します。
|
例 34-10 getColumnNames() は、連想配列を返します。 結果セットのカラム名が連想配列のキー、 結果セット内でのカラムの位置が連想配列の値となります。
|
例 34-11 seek() は、結果セット内の特定の行まで移動します。 既に読み込んだ後の行に戻ることができるのは、'result_buffering' オプションが有効な場合のみであることに注意しましょう。 それ以外の場合は、先へ進むことしかサポートしていません。
|
例 34-12 nextResult() 複数のクエリから返された複数の結果セットを順に処理します。
|
例 34-13 bindColumn() は、ユーザ変数への参照を結果セット内の特定のフィールドにバインドします。 つまり、次の行を取得すると、その変数の内容も連動して更新されます。
|
すべてのフェッチメソッドには、クエリの実行も同時に行うバージョンのメソッドがあります。それが queryOne()、 queryRow()、 queryCol() および queryAll() です。
例 34-14
|
プリペアドステートメントを使用したい場合は、 Extended モジュールのメソッド getOne()、 getRow()、 getCol()、 getAll() および getAssoc() を使用します。
例 34-15
|
MDB2 は、すべてのドライバにまたがる多くのデータ型をサポートしています。 クエリの実行やプリペアの際にこれらを結果セットに設定するには、 setResultTypes() メソッドを使用します。 サポートされるデータ型とその書式についての概要は こちら を参照ください。