db2_bind_param

(PECL ibm_db2 >= 1.0.0)

db2_bind_param将 PHP 变量绑定到 SQL 语句参数

描述

db2_bind_param(
    资源 $stmt,
    整数 $parameter_number,
    字符串 $variable_name,
    整数 $parameter_type = DB2_PARAM_IN,
    整数 $data_type = 0,
    整数 $precision = -1,
    整数 $scale = 0
): 布尔值

将 PHP 变量绑定到由 db2_prepare() 返回的语句资源中的 SQL 语句参数。此函数允许您比简单地将变量作为 db2_execute() 的可选输入数组的一部分传递给参数,更详细地控制参数类型、数据类型、精度和比例。

参数

stmt

db2_prepare() 返回的已准备语句。

parameter_number

指定已准备语句中参数的 1 索引位置。

variable_name

一个字符串,指定要绑定到由 parameter_number 指定的参数的 PHP 变量的名称。

parameter_type

一个常量,指定 PHP 变量应该绑定到 SQL 参数的方式:作为输入参数 (DB2_PARAM_IN)、输出参数 (DB2_PARAM_OUT) 还是作为接受输入并返回输出的参数 (DB2_PARAM_INOUT)。为了避免内存开销,您也可以指定 DB2_PARAM_FILE 将 PHP 变量绑定到包含大型对象 (BLOB、CLOB 或 DBCLOB) 数据的文件的名称。

data_type

一个常量,指定 PHP 变量应该绑定的 SQL 数据类型:DB2_BINARYDB2_CHARDB2_DOUBLEDB2_LONG 之一。

precision

指定变量绑定到数据库的精度。此参数也可以用于从存储过程检索 XML 输出值。非负值指定从数据库检索的 XML 数据的最大大小。如果未使用此参数,将假设默认值为 1MB 用于从存储过程检索 XML 输出值。

scale

指定变量绑定到数据库的比例。

返回值

成功时返回 true,失败时返回 false

示例

示例 #1 将 PHP 变量绑定到已准备语句

以下示例中的 SQL 语句在 WHERE 子句中使用两个输入参数。我们调用 db2_bind_param() 将两个 PHP 变量绑定到相应的 SQL 参数。请注意,PHP 变量不必在调用 db2_bind_param() 之前声明或赋值;在示例中,$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 文档或音频文件。您无需将整个文件读入 PHP 变量,然后将该 PHP 变量绑定到 SQL 语句,而是可以将文件直接绑定到 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
2 年前
使用类时很重要
您必须在定义/设置/绑定变量的相同范围内调用 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