クエリの結果の取得

広告

SELECTなどのSQL文を発行した場合、結果としてデータベースから結果が帰ってきます。ここではその帰ってきた結果の処理の方法を見ていきます。

"query"メソッドにおいて、結果が戻ってくるようなクエリを実行した場合、DB_resultオブジェクトを返してきます。DB_resultオブジェクトから結果を取り出すにはDB_resultクラスで用意されている"fetchRow"メソッドを使います。

結果セットからデータの行を取得し、 結果ポインタを次の行に移動します。
データの形式は、配列あるいはオブジェクトとなります。

パラメータ:
  integer $fetchmode  使用するフェッチモード。デフォルトは 
    DB_FETCHMODE_DEFAULT で、この場合は DB の現在のフェッチモードを使用
    します。 DB の現在のデフォルトフェッチモードは、setFetchMode() を使
    用して変更可能です。 とりうる値は以下のようになります。
      DB_FETCHMODE_ORDERED 
      DB_FETCHMODE_ASSOC 
      DB_FETCHMODE_OBJECT
  integer $rownum  取得する行の番号。
返り値:
  行のデータを含む配列あるいはオブジェクト、あるいは 結果セットの最後に
  到達した場合に NULL、 失敗した場合に DB_Error オブジェクトを返します。

次の行を取得します。最初に実行した場合、結果として取得した全ての行の先頭から行を取り出し、取得後は自動的に次の行へ移ります。取り出すべき行が残っていない場合"fetchRow"メソッドはNULLを返します。

先頭から最後まで行を全て取得するには下記のように行います。

$res =& $db->query('select * from shouhin');

while ($row =& $res->fetchRow()) {

}

1番目の引数では、どのような形で行のデータを取り出すのかを指定します。

DB_FETCHMODE_ORDEREDを指定した場合にはカラム名を添字とする連想配列として返しきます。その為、データを取り出す場合は下記のようになります。

$res =& $db->query('select id, name from shouhin');

while ($row =& $res->fetchRow()) {
    print($row[0]);  // IDカラムのデータを取得
    print($row[1]);  // NAMEカラムのデータを取得
}

DB_FETCHMODE_ASSOCを指定した場合には0から始まるカラム番号を添字とする配列として返しきます。その為、データを取り出す場合は下記のようになります。

$res =& $db->query('select id, name from shouhin');

while ($row =& $res->fetchRow()) {
    print($row['id']);    // IDカラムのデータを取得
    print($row['name']);  // NAMEカラムのデータを取得
}

DB_FETCHMODE_OBJECTを指定した場合にはカラム名をプロパティになったオブジェクト返しきます。その為、データを取り出す場合は下記のようになります。

$res =& $db->query('select id, name from shouhin');

while ($row =& $res->fetchRow()) {
    print($row->id);    // IDカラムのデータを取得
    print($row->name);  // NAMEカラムのデータを取得
}

どの形であっても、取得できるデータに変わりはありません。

サンプルプログラム

では実際に試してみます。前回はDB_FETCHMODE_ASSOCを指定したサンプルを試したので、今回はDB_FETCHMODE_OBJECTを試してみます。

sample8-1.php

<html>
<head><title>PHP TEST</title></head>
<body>

<?php

require_once 'DB.php';

$dsn = 'mysqli://testuser:testuser@localhost/uriage';

$db = DB::connect($dsn);
if (PEAR::isError($db)) {
    die($db->getMessage());
}

print('接続に成功しました<br>');

$db->query('SET NAMES sjis');
if (PEAR::isError($db)) {
    die($db->getMessage());
}

$sql = 'select * from shouhin where id > ? and id < ?';
$data = array(1, 4);
$res =& $db->query($sql, $data);
if (PEAR::isError($res)) {
    die($res->getMessage());
}

while ($row =& $res->fetchRow(DB_FETCHMODE_OBJECT)){
    print($row->id);
    print($row->name.'<br>');
}

$db->disconnect();

?>

</body>
</html>

上記をWWWサーバに設置しブラウザで見てみると下記のようなりました。

PEAR::DBのfetchRowメソッド

( Written by Tatsuo Ikura )