PHP Conference Nagoya 2025

db2_fetch_row

(PECL ibm_db2 >= 1.0.0)

db2_fetch_row 結果セットポインタを次の行あるいは要求された行に設定する

説明

db2_fetch_row(resource $stmt, int $row_number = -1): bool

db2_fetch_row() を使用して結果セットを順に処理します。 あるいは、スクロール可能なカーソルを使用している場合は 指定した行を指すようにします。

結果セットから個々のフィールドを取得するには db2_result() 関数をコールします。

db2_fetch_row() および db2_result() をコールするのではなく、 ほとんどのアプリケーションでは db2_fetch_assoc()db2_fetch_both()、 および db2_fetch_array() のいずれかをコールするでしょう。 これらは、結果セットのポインタを前に進めたうえで行の内容を配列として取得します。

パラメータ

stmt

有効な stmt リソース。

row_number

スクロール可能なカーソルの場合に、結果セットの行番号を指定します。 行番号は 1 から始まります。

戻り値

結果セットに指定した行が存在する場合に true、存在しない場合に false を返します。

例1 結果セットを順に処理する

次の例では、db2_fetch_row() を使用して結果セットを順に処理し、db2_result() で結果セットからカラムを取得する方法を示します。

<?php
$sql
= 'SELECT name, breed FROM animals WHERE weight < ?';
$stmt = db2_prepare($conn, $sql);
db2_execute($stmt, array(10));
while (
db2_fetch_row($stmt)) {
$name = db2_result($stmt, 0);
$breed = db2_result($stmt, 1);
print
"$name $breed";
}
?>

上の例の出力は以下となります。

cat Pook
gold fish Bubbles
budgerigar Gizmo
goat Rickety Ride

例2 i5/OS recommended alternatives to db2_fetch_row/db2_result

i5/OS では、db2_fetch_row()/db2_result() ではなく db2_fetch_both()db2_fetch_array() あるいは db2_fetch_object() を使用することを推奨します。一般に db2_fetch_row()/db2_result() は、さまざまなカラム型で EBCIDIC から ASCII への変換の際に問題が発生します。 DBCS アプリケーションではデータが切り捨てられてしまう可能性もあります。 また、パフォーマンス面でも db2_fetch_both()db2_fetch_array() および db2_fetch_object()db2_fetch_row()/db2_result() よりすぐれています。

<?php
$conn
= db2_connect("","","");
$sql = 'SELECT SPECIFIC_SCHEMA, SPECIFIC_NAME, ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE, ROUTINE_CREATED, ROUTINE_BODY, IN_PARMS, OUT_PARMS, INOUT_PARMS, PARAMETER_STYLE, EXTERNAL_NAME, EXTERNAL_LANGUAGE FROM QSYS2.SYSROUTINES FETCH FIRST 2 ROWS ONLY';
$stmt = db2_exec($conn, $sql, array('cursor' => DB2_SCROLLABLE));
while (
$row = db2_fetch_both($stmt)){
echo
"<br>db2_fetch_both {$row['SPECIFIC_NAME']} {$row['ROUTINE_CREATED']} {$row[5]}";
}
$stmt = db2_exec($conn, $sql, array('cursor' => DB2_SCROLLABLE));
while (
$row = db2_fetch_array($stmt)){
echo
"<br>db2_fetch_array {$row[1]} {$row[5]}";
}
$stmt = db2_exec($conn, $sql, array('cursor' => DB2_SCROLLABLE));
while (
$row = db2_fetch_object($stmt)){
echo
"<br>db2_fetch_object {$row->SPECIFIC_NAME} {$row->ROUTINE_CREATED}";
}
db2_close($conn);
?>

上の例の出力は以下となります。

db2_fetch_both MATCH_ANIMAL 2006-08-25-17.10.23.775000 2006-08-25-17.10.23.775000
db2_fetch_both MULTIRESULTS 2006-10-17-10.11.05.308000 2006-10-17-10.11.05.308000
db2_fetch_array MATCH_ANIMAL 2006-08-25-17.10.23.775000
db2_fetch_array MULTIRESULTS 2006-10-17-10.11.05.308000
db2_fetch_object MATCH_ANIMAL 2006-08-25-17.10.23.775000
db2_fetch_object MULTIRESULTS 2006-10-17-10.11.05.308000

参考

  • db2_fetch_array() - 結果セット内の行を表す、カラム位置をインデックスとする配列を返す
  • db2_fetch_assoc() - 結果セット内の行を表す、カラム名をインデックスとする配列を返す
  • db2_fetch_both() - 結果セット内の行を表す、 カラム位置およびカラム名の両方をインデックスとする配列を返す
  • db2_fetch_object() - 結果セット内の行を表す、カラムをプロパティとするオブジェクトを返す
  • db2_result() - 結果セットの行からひとつのカラムを返す

add a note

User Contributed Notes 2 notes

up
1
krisdover at hotmail dot com
17 years ago
if the second parameter (the row number) is specified, your connection needs to have the CURSOR option set to DB2_SCROLLABLE. Otherwise all calls to this function will fail. Internal to the ibm_db2 extension module the db2cli api function SQLFetchScroll() generates the error "CLI0145E Fetch type out of range" since it requires a scrollable resultset to work, instead of the default forward only resultset.

hope this saves someone the time it took me to track this down in the db2cli traces.

Regards,
Kris Dover
up
1
andrey at php dot net
19 years ago
If the second parameter is 0 or NULL (which eventually evaluates to 0) then the internal pointer is moved forward. < 0 value will return an warning.
To Top