PHP Conference Japan 2024

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_assoc()db2_fetch_both()db2_fetch_array() 其中之一,而不是呼叫 db2_fetch_row()db2_result(),來推進結果集指標並以陣列形式傳回完整的列。

參數

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 建議的 db2_fetch_row/db2_result 替代方案

在 i5/OS 上,建議使用 db2_fetch_both()db2_fetch_array()db2_fetch_object(),而不是 db2_fetch_row()/db2_result()。一般來說,db2_fetch_row()/db2_result()EBCIDICASCII 轉換中,對於各種欄型別有較多的問題,包括 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() - 從結果集中的列傳回單一欄

新增註解

使用者貢獻的註解 2 則註解

krisdover at hotmail dot com
17 年前
如果指定第二個參數(列號),您的連線必須將 CURSOR 選項設定為 DB2_SCROLLABLE。否則,所有對此函數的呼叫都會失敗。在 ibm_db2 擴充模組內部,db2cli API 函數 SQLFetchScroll() 會產生錯誤 "CLI0145E Fetch type out of range",因為它需要一個可捲動的結果集才能運作,而不是預設的僅向前結果集。

希望這能為某些人節省我追蹤 db2cli 追蹤所花費的時間。

敬上,
Kris Dover
andrey at php dot net
19 年前
如果第二個參數是 0 或 NULL(最終會評估為 0),則內部指標會向前移動。< 0 的值會回傳一個警告。
To Top