導入 - 結果

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

Description

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

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 のように、クエリでエイリアスを使用する
  • フェッチモードを DB_FETCHMODE_ORDERED に変更する

豆知識: このような問題に遭遇する場合は、たいていデータベーススキーマの 設計に問題があります。データが不必要に重複していたり、 違う種類のデータに同じ名前をつけているなどが考えられます。

形式を設定する

フェッチメソッドをコールするたびに毎回フェッチモードを設定することも できますし、 setFetchMode() メソッドを使用して DB インスタンス全体に適用されるデフォルトのフェッチモードを 設定することもできます。

フェッチモードを毎回設定する

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

while (
$res->fetchInto($rowDB_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($rowDB_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() は、データを変更するクエリ (INSERTUPDATE あるいは 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());
?>

エラーをチェックする

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

クエリを実行する (Previous) SQL 文を準備し、実行する (Next)
Last updated: Wed, 20 Aug 2014 — Download Documentation
Do you think that something on this page is wrong? Please file a bug report or add a note.
View this page in:

User Notes:

There are no user contributed notes for this page.