PHP Conference Japan 2024

db2_execute

(PECL ibm_db2 >= 1.0.0)

db2_execute 執行已準備好的 SQL 陳述式

說明

db2_execute(資源 $stmt, 陣列 $parameters = []): 布林值

db2_execute() 執行由 db2_prepare() 準備的 SQL 陳述式。

如果 SQL 陳述式傳回結果集,例如 SELECT 陳述式或呼叫傳回一個或多個結果集的預存程序,您可以使用 db2_fetch_assoc()db2_fetch_both()db2_fetch_array()stmt 資源中以陣列形式擷取一行。或者,您可以使用 db2_fetch_row() 將結果集指標移至下一行,並使用 db2_result() 從該行一次擷取一欄。

參考 db2_prepare() 以簡要了解使用 db2_prepare()db2_execute() 而非 db2_exec() 的優點。

參數

stmt

db2_prepare() 傳回的已準備陳述式。

parameters

與已準備陳述式中包含的任何參數標記相符的輸入參數陣列。

回傳值

成功時傳回 true,失敗時傳回 false

範例

範例 #1 準備和執行帶有參數標記的 SQL 陳述式

以下範例準備一個接受四個參數標記的 INSERT 陳述式,然後迭代包含要傳遞給 db2_execute() 的輸入值的陣列。

<?php
$pet
= array(0, 'cat', 'Pook', 3.2);

$insert = 'INSERT INTO animals (id, breed, name, weight)
VALUES (?, ?, ?, ?)'
;

$stmt = db2_prepare($conn, $insert);
if (
$stmt) {
$result = db2_execute($stmt, $pet);
if (
$result) {
print
"Successfully added new pet.";
}
}
?>

以上範例將輸出

Successfully added new pet.

範例 #2 使用 OUT 參數呼叫預存程序

以下範例準備一個接受一個代表 OUT 參數的參數標記的 CALL 陳述式,使用 db2_bind_param() 將 PHP 變數 $my_pets 綁定到該參數,然後發出 db2_execute() 以執行 CALL 陳述式。呼叫預存程序後,$num_pets 的值會變更以反映預存程序針對該 OUT 參數傳回的值。(假設原文中的 $my_pets 應為 $num_pets)

<?php
$num_pets
= 0;
$res = db2_prepare($conn, "CALL count_my_pets(?)");
$rc = db2_bind_param($res, 1, "num_pets", DB2_PARAM_OUT);
$rc = db2_execute($res);
print
"我有 $num_pets 隻寵物!";
?>

以上範例將輸出

I have 7 pets!

範例 #3 以 SQL 結果集的形式返回 XML 資料

以下範例示範如何使用 SAMPLE 資料庫處理儲存在 XML 資料行中的文件。透過一些相當簡單的 SQL/XML,此範例以大多數使用者熟悉的 SQL 結果集格式返回 XML 文件中的一些節點。

<?php

$conn
= db2_connect("SAMPLE", "db2inst1", "ibmdb2");

$query = 'SELECT * FROM XMLTABLE(
XMLNAMESPACES (DEFAULT \'http://posample.org\'),
\'db2-fn:xmlcolumn("CUSTOMER.INFO")/customerinfo\'
COLUMNS
"CID" VARCHAR (50) PATH \'@Cid\',
"NAME" VARCHAR (50) PATH \'name\',
"PHONE" VARCHAR (50) PATH \'phone [ @type = "work"]\'
) AS T
WHERE NAME = ?
'
;

$stmt = db2_prepare($conn, $query);

$name = 'Kathy Smith';

if (
$stmt) {
db2_bind_param($stmt, 1, "name", DB2_PARAM_IN);
db2_execute($stmt);

while(
$row = db2_fetch_object($stmt)){
printf("$row->CID $row->NAME $row->PHONE\n");
}
}
db2_close($conn);

?>

以上範例將輸出

1000     Kathy Smith     416-555-1358
1001     Kathy Smith     905-555-7258

範例 #4 使用 XML 資料執行「JOIN」

以下範例使用 SAMPLE 資料庫中 2 個不同 XML 資料行中儲存的文件。它從 2 個不同資料行的 XML 文件建立 2 個臨時表格,並返回一個包含客戶運送狀態資訊的 SQL 結果集。

<?php

$conn
= db2_connect("SAMPLE", "db2inst1", "ibmdb2");

$query = '
SELECT A.CID, A.NAME, A.PHONE, C.PONUM, C.STATUS
FROM
XMLTABLE(
XMLNAMESPACES (DEFAULT \'http://posample.org\'),
\'db2-fn:xmlcolumn("CUSTOMER.INFO")/customerinfo\'
COLUMNS
"CID" BIGINT PATH \'@Cid\',
"NAME" VARCHAR (50) PATH \'name\',
"PHONE" VARCHAR (50) PATH \'phone [ @type = "work"]\'
) as A,
PURCHASEORDER AS B,
XMLTABLE (
XMLNAMESPACES (DEFAULT \'http://posample.org\'),
\'db2-fn:xmlcolumn("PURCHASEORDER.PORDER")/PurchaseOrder\'
COLUMNS
"PONUM" BIGINT PATH \'@PoNum\',
"STATUS" VARCHAR (50) PATH \'@Status\'
) as C
WHERE A.CID = B.CUSTID AND
B.POID = C.PONUM AND
A.NAME = ?
'
;

$stmt = db2_prepare($conn, $query);

$name = 'Kathy Smith';

if (
$stmt) {
db2_bind_param($stmt, 1, "name", DB2_PARAM_IN);
db2_execute($stmt);

while(
$row = db2_fetch_object($stmt)){
printf("$row->CID $row->NAME $row->PHONE $row->PONUM $row->STATUS\n");
}
}

db2_close($conn);

?>

以上範例將輸出

1001     Kathy Smith     905-555-7258     5002     Shipped

範例 #5 將 SQL 資料作為更大的 XML 文件的一部分返回

以下範例使用 SAMPLE 資料庫中 PRODUCT.DESCRIPTION 文件的一部分。它會建立一個包含產品描述(XML 資料)和價格資訊(SQL 資料)的 XML 文件。

<?php

$conn
= db2_connect("SAMPLE", "db2inst1", "ibmdb2");

$query = '
SELECT
XMLSERIALIZE(
XMLQUERY(\'
declare boundary-space strip;
declare default element namespace "http://posample.org";
<promoList> {
for $prod in $doc/product
where $prod/description/price < 10.00
order by $prod/description/price ascending
return(
<promoitem> {
$prod,
<startdate> {$start} </startdate>,
<enddate> {$end} </enddate>,
<promoprice> {$promo} </promoprice>
} </promoitem>
)
} </promoList>
\' passing by ref DESCRIPTION AS "doc",
PROMOSTART as "start",
PROMOEND as "end",
PROMOPRICE as "promo"
RETURNING SEQUENCE)
AS CLOB (32000))
AS NEW_PRODUCT_INFO
FROM PRODUCT
WHERE PID = ?
'
;

$stmt = db2_prepare($conn, $query);

$pid = "100-100-01";

if (
$stmt) {
db2_bind_param($stmt, 1, "pid", DB2_PARAM_IN);
db2_execute($stmt);

while(
$row = db2_fetch_array($stmt)){
printf("$row[0]\n");
}
}

db2_close($conn);

?>

以上範例將輸出

<promoList xmlns="http://posample.org">
    <promoitem>
    <product pid="100-100-01">
        <description>
            <name>Snow Shovel, Basic 22 inch</name>
            <details>Basic Snow Shovel, 22 inches wide, straight handle with D-Grip</details>
            <price>9.99</price>
            <weight>1 kg</weight>
        </description>
    </product>
    <startdate>2004-11-19</startdate>
    <enddate>2004-12-19</enddate>
    <promoprice>7.25</promoprice>
    </promoitem>
</promoList>

另請參閱

  • db2_exec() - 直接執行 SQL 陳述式
  • db2_fetch_array() - 傳回以欄位位置作為索引的陣列,表示結果集中的某一行
  • db2_fetch_assoc() - 傳回以欄位名稱作為索引的陣列,表示結果集中的某一行
  • db2_fetch_both() - 傳回以欄位名稱和位置作為索引的陣列,表示結果集中的某一行
  • db2_fetch_row() - 將結果集指標設定到下一行或指定的行
  • db2_prepare() - 準備要執行的 SQL 陳述式
  • db2_result() - 從結果集中的某一行傳回單一欄位

新增註記

使用者貢獻的註記 1 則註記

stefanov at uk dot ibm dot com
8 年前
您「不能」將參數綁定到表格和/或欄位名稱。參數綁定僅適用於值。

正確範例: $sqlQuery = "UPDATE ".TB_NAME." SET ".CN_NAME." = ? WHERE DAY = ?";
錯誤範例: $sqlQuery = "UPDATE ? SET ? = ? WHERE DAY = ?";

任何嘗試綁定欄位或表格名稱的動作,都會在執行 db2_execute() 期間導致以下錯誤:
PHP 警告: db2_bind_param(): Describe Param Failed in ...
To Top