PHP Conference Japan 2024

db2_bind_param

(PECL ibm_db2 >= 1.0.0)

db2_bind_param 將 PHP 變數繫結至 SQL 陳述式參數

描述

db2_bind_param(
    resource $stmt,
    int $parameter_number,
    string $variable_name,
    int $parameter_type = DB2_PARAM_IN,
    int $data_type = 0,
    int $precision = -1,
    int $scale = 0
bool

將 PHP 變數繫結至由 db2_prepare() 傳回的陳述式資源中的 SQL 陳述式參數。此函式讓您比單純將變數作為可選輸入陣列傳遞給 db2_execute(),更能控制參數的類型、資料類型、精確度和比例。

參數

stmt

db2_prepare() 傳回的預備陳述式。

parameter_number

指定預備陳述式中參數的 1-indexed 位置。

variable_name

一個字串,指定要繫結至 parameter_number 指定的參數的 PHP 變數名稱。

parameter_type

一個常數,指定 PHP 變數應該以輸入參數 (DB2_PARAM_IN)、輸出參數 (DB2_PARAM_OUT) 或接受輸入並傳回輸出的參數 (DB2_PARAM_INOUT) 的形式繫結至 SQL 參數。為了避免記憶體負擔,您也可以指定 DB2_PARAM_FILE,將 PHP 變數繫結至包含大型物件 (BLOB、CLOB 或 DBCLOB) 資料的檔案名稱。

data_type

一個常數,指定 PHP 變數應繫結為的 SQL 資料類型: DB2_BINARYDB2_CHARDB2_DOUBLEDB2_LONG 其中之一。

precision

指定將變數繫結至資料庫的精確度。此參數也可以用於從預存程序中擷取 XML 輸出值。非負值指定將從資料庫擷取的 XML 資料最大大小。如果未使用此參數,則擷取預存程序的 XML 輸出值時,將假設預設值為 1MB。

scale

指定將變數繫結至資料庫的比例。

傳回值

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

範例

範例 1:將 PHP 變數繫結至預備陳述式

下列範例中的 SQL 陳述式在 WHERE 子句中使用兩個輸入參數。我們呼叫 db2_bind_param() 將兩個 PHP 變數繫結至對應的 SQL 參數。請注意,在呼叫 db2_bind_param() 之前,不必宣告或指派 PHP 變數;在範例中,$lower_limit 在呼叫 db2_bind_param() 之前被指派一個值,但 $upper_limit 在呼叫 db2_bind_param() 之後被指派一個值。在呼叫 db2_execute() 之前,必須繫結這些變數,並且對於接受輸入的參數,必須指派任何值。

<?php

$sql
= 'SELECT name, breed, weight FROM animals
WHERE weight > ? AND weight < ?'
;
$conn = db2_connect($database, $user, $password);
$stmt = db2_prepare($conn, $sql);

// 我們可以在呼叫 db2_bind_param() 之前宣告變數
$lower_limit = 1;

db2_bind_param($stmt, 1, "lower_limit", DB2_PARAM_IN);
db2_bind_param($stmt, 2, "upper_limit", DB2_PARAM_IN);

// 我們也可以在呼叫 db2_bind_param() 之後宣告變數
$upper_limit = 15.0;

if (
db2_execute($stmt)) {
while (
$row = db2_fetch_array($stmt)) {
print
"{$row[0]}, {$row[1]}, {$row[2]}\n";
}
}
?>

上述範例將輸出

Pook, cat, 3.2
Rickety Ride, goat, 9.7
Peaches, dog, 12.3

範例 2:使用 IN 和 OUT 參數呼叫預存程序

下列範例中的預存程序 match_animal 接受三個不同的參數

  1. 一個輸入 (IN) 參數,接受第一個動物的名稱作為輸入

  2. 一個輸入-輸出 (INOUT) 參數,接受第二個動物的名稱作為輸入,如果資料庫中的動物符合該名稱,則傳回字串 TRUE

  3. 一個輸出 (OUT) 參數,傳回兩個已識別動物的權重總和

此外,預存程序會傳回一個結果集,其中包含以字母順序排列的動物,從與第一個參數輸入值對應的動物開始,到與第二個參數輸入值對應的動物結束。

<?php

$sql
= 'CALL match_animal(?, ?, ?)';
$conn = db2_connect($database, $user, $password);
$stmt = db2_prepare($conn, $sql);

$name = "Peaches";
$second_name = "Rickety Ride";
$weight = 0;

db2_bind_param($stmt, 1, "name", DB2_PARAM_IN);
db2_bind_param($stmt, 2, "second_name", DB2_PARAM_INOUT);
db2_bind_param($stmt, 3, "weight", DB2_PARAM_OUT);

print
"綁定參數於 CALL 執行 _之前_ 的值:\n";
print
" 1: {$name} 2: {$second_name} 3: {$weight}\n\n";

if (
db2_execute($stmt)) {
print
"綁定參數於 CALL 執行 _之後_ 的值:\n";
print
" 1: {$name} 2: {$second_name} 3: {$weight}\n\n";

print
"結果:\n";
while (
$row = db2_fetch_array($stmt)) {
print
" {$row[0]}, {$row[1]}, {$row[2]}\n";
}
}
?>

上述範例將輸出

Values of bound parameters _before_ CALL:
  1: Peaches 2: Rickety Ride 3: 0

Values of bound parameters _after_ CALL:
  1: Peaches 2: TRUE 3: 22

Results:
  Peaches, dog, 12.3
  Pook, cat, 3.2
  Rickety Ride, goat, 9.7

範例 #3 直接從檔案插入二進位大型物件 (BLOB)

大型物件的資料通常儲存在檔案中,例如 XML 文件或音訊檔案。您可以避免一些記憶體額外負擔,方法是將檔案直接綁定到 SQL 語句的輸入參數,而不是將整個檔案讀取到 PHP 變數中,然後將該 PHP 變數綁定到 SQL 語句。以下範例示範如何將檔案直接綁定到 BLOB 資料行。

<?php
$stmt
= db2_prepare($conn, "INSERT INTO animal_pictures(picture) VALUES (?)");

$picture = "/opt/albums/spook/grooming.jpg";
$rc = db2_bind_param($stmt, 1, "picture", DB2_PARAM_FILE);
$rc = db2_execute($stmt);
?>

參見

新增筆記

使用者貢獻的筆記 1 筆記

2
bravo1_r at hotmail dot com
3 年前
使用類別時很重要
您必須在定義/設定/綁定變數的相同範圍內呼叫 db2_execute()。
例如

<?php
class DB2Class {
public
$conn;
private
$usr = 'user';
private
$pss = 'password';
private
$cat = 'catalog';
public function
db2_conn(){
$conn = db2_connect($this->cat,$this->usr,$this->pss);
if(!
$conn)
throw new
Exception(db2_conn_errormsg());
$this->conn = $conn;
}
public function
db2_prep($sql){
if(!
$stmt = db2_prepare($this->conn, $sql)){
throw new
Exception($sql . " " . db2_stmt_errormsg());
return
false;
}
return
$stmt;
}
public function
db2_exec($stmt){
if(!
db2_execute($stmt))
throw new
Exception(db2_stmt_errormsg($stmt));
}
}

/* 這不會運作 */
function bindtest(){
try {
$db2 = new DB2Class;
$db2->db2_conn();
$stmt = $db2->db2_prep("SELECT * FROM TABLE WHERE FIELD = ?");
$field = 'value';
db2_bind_param($stmt, 1, "field", DB2_PARAM_IN);
$db2->db2_exec($stmt); // 導致未綁定變數錯誤
while($row = db2_fetch_assoc($stmt))
var_dump($row);
} catch(
Exception $e) {
error_log( $e->getMessage () );
}
}

/* 這會運作 */
function bindtest(){
try {
$db2 = new DB2Class;
$db2->db2_conn();
$stmt = $db2->db2_prep("SELECT * FROM TABLE WHERE FIELD = ?");
$field = 'value';
db2_bind_param($stmt, 1, "field", DB2_PARAM_IN);
if(!
db2_execute($stmt))
throw new
Exception(db2_stmt_errormsg($stmt));
while(
$row = db2_fetch_assoc($stmt))
var_dump($row);
} catch(
Exception $e) {
error_log( $e->getMessage () );
}
}

?>
To Top