結果リソースからデータを取得するには、次の fetchInto() 、 fetchOne() 、 fetchRow() 、 fetchCol() および fetchAll() のいずれかのメソッドを使用します。 これらのメソッドのうち、fetchOne() 以外はすべてデータを (多次元の) 配列に格納します。 データがもうない場合には NULL、エラーが発生した場合には MDB_Error を返します。 fetch() で始まるすべてのメソッドは、結果セットを自動的に開放します。
結果セットの取得
<?php
...
$db = MDB::connect($dsn);
$res = $db->query("SELECT * FROM mytable");
// 行がなくなるまで、各行のデータを
// 順に取得します
while ($row = $db->fetchInto($res)) {
$id = $row[0];
}
// 最初の行の最初のカラムだけがほしいのならこのようにします
$id = $db->fetchOne($res);
// fetch 系のメソッドは常に結果セットを開放するので、
// 結果セットをループさせることができません。
// そのかわりに適切なメソッドを選択する必要があります
$data = $db->getAll($res);
foreach($data as $row)
{
$id = $row[0];
}
?>
以下の取得モードがサポートされています。
MDB_FETCHMODE_ORDERED (デフォルト)
fetch*() は順番に並べられた配列を返します。 並び順は SELECT 文で指定されたものです。
順番に並べられた配列の取得
<?php
$res = $db->query('SELECT id, name, email FROM users');
$row = $db->fetchRow($res, MDB_FETCHMODE_ORDERED);
/*
$row は次のようになります。
array (
0 => <column "id" data>,
1 => <column "name" data>,
2 => <column "email" data>
)
*/
// データにアクセスするには、このようにします。
$id = $row[0];
$name = $row[1];
$email = $row[2];
?>
MDB_FETCHMODE_ASSOC
カラム名をキーとする連想配列を返します。
Fetch a assoc. array
<?php
$res = $db->query('SELECT id, name, email FROM users');
$row = $db->fetchRow($res, MDB_FETCHMODE_ASSOC);
/*
$row は次のようになります。
array (
'id' => <column "id" data>,
'name' => <column "name" data>,
'email' => <column "email" data>
)
*/
// データにアクセスするには、このようにします。
$id = $row['id'];
$name = $row['name'];
$email = $row['email'];
?>
取得モードは、コールの際に設定することもできますし、 MDB インスタンスの作成時に指定することもできます。
コールの際の指定
<?php
while ($row = $db->fetchInto($res, MDB_FETCHMODE_ASSOC)) {
$id = $row['id'];
}
?>
インスタンス単位での指定
<?php
$db = MDB::connect($dsn);
// これは、デフォルトの取得モードをこの Pear MDB インスタンス
// (のすべてのクエリ) に対して設定します。
$db->setFetchMode(MDB_FETCHMODE_ASSOC);
$result = $db->query(...);
while ($row = $db->fetchRow($res)) {
$id = $row['id'];
}
?>
PEAR MDB では、取得ステートメントに対して追加のパラメータを指定することができます。 これを用いると、行番号を指定して行を取得することができるようになります。 これは、結果全体の一部のみを表示したい場合 (ページ処理をした HTML のリストなど) や、取得した行を特別な順番で表示したい場合などに便利です。
番号指定による取得
<?php
...
// 取得を開始する行
$from = 50;
// ページ単位の表示件数
$resPage = 10;
// このページで取得する最後の行
$to = $from + $resPage;
foreach (range($from, $to) as $rowNum) {
if (!$row = $db->fetchInto($res, $fetchmode, $rowNum)) {
break;
}
$id = $row[0];
....
}
?>
処理が終わったら、結果セットの後始末をしておくことを推奨します。 これにより、メモリが節約できます。後始末には freeResult() を使用します。
開放
<?php
...
$res = $db->query('SELECT * FROM clients');
while ($row = $res->fetchInto($res)) {
...
}
$db->freeResult($res);
?>
MDB では、クエリからの情報を簡単に取得するための特別な方法を提供しています。 これを使用すると、 fetch*() の結果をループさせる必要がなくなります。
queryOne() は、クエリの最初のカラムの最初の結果を取得します。
<?php
$numrows = $db->queryOne('select count(id) from clients');
?>
queryRow() は、最初の行を配列で返します。
<?php
$sql = 'select name, address, phone from clients where id=1';
if (is_array($row = $db->queryRow($sql))) {
list($name, $address, $phone) = $row;
}
?>
queryCol() は、選択したカラムのデータを配列で返します。 取得したいカラムの番号を二番目のパラメータで指定できます。
<?php
$all_client_names = $db->queryCol('SELECT name FROM clients');
?>
上の文は、例えばこのような結果を返します。
<?php
$all_client_names = array('Stig', 'Jon', 'Colin');
?>
getAll() は、クエリから返されたすべての行を取得します。 このメソッドでは追加のパラメータを指定することができ、 対処のカラムをキーとする連想配列で結果を返すこともできます。
<?php
$data = getAll('SELECT id, text, date FROM mytable');
/*
返り値はこのようになります。
array(
1 => array('4', 'four', '2004'),
2 => array('5', 'five', '2005'),
3 => array('6', 'six', '2006')
)
*/
?>
query*() 系のメソッドは、 裏方の作業をすべて肩代わりしてくれます。 たとえばクエリの実行、データの取得、結果の開放などです。 PEAR MDB の関数は、エラー時に MDB_Error オブジェクトを返すことを覚えておきましょう。
MDB を使用すると、クエリ結果から以下のようなさまざまな情報を取得することができます。
numRows() : "SELECT" クエリから返された行の総数を返します。
<?php
// 行の数
echo $db->numRows($res);
?>
numCols() : "SELECT" クエリから返された結果のカラムの数を返します。
<?php
// カラムの数
echo $db->numCols($res);
?>
affectedRows() : データ操作系のクエリ ("INSERT"、"UPDATE" あるいは "DELETE") で変更された行の数を返します。
<?php
// この文は結果オブジェクトを返さないことに注意しましょう
$db->query('DELETE * FROM clients');
echo 'クライアントを ' . $db->affectedRows() . ' 件削除しました';
?>
tableInfo() : "SELECT" クエリが返すフィールドについての情報を連想配列で返します。
<?php
// テーブルの情報
print_r($db->tableInfo($res));
?>
処理の結果が MDB_Error オブジェクトになっていないかどうかを常に確認するようにしましょう。 "MDB_Error: database not capable" のようなエラーメッセージが返された場合は、 使用中のバックエンドではその操作がサポートされていません。