PHP Conference Nagoya 2025

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 с параметром SQL-выражения в ресурсе выражения, возвращаемом db2_prepare(). Эта функция даёт больший контроль над типом параметра, типом данных, точностью и масштабом для параметра, чем простая передача переменной как части необязательного входного массива в db2_execute().

Список параметров

stmt

Подготовленное выражение, возвращаемое db2_prepare().

parameter_number

Задаёт позицию параметра, которая нумеруется с 1, в подготовленном выражении.

variable_name

Строка, определяющая имя переменной PHP для привязки к параметру, заданному parameter_number.

parameter_type

Константа, которая определяет, должна ли переменная PHP быть привязана к параметру SQL как входной параметр (DB2_PARAM_IN), выходной параметр (DB2_PARAM_OUT) или как параметр, который принимает ввод и возвращает вывод (DB2_PARAM_INOUT). Чтобы избежать перегрузки памяти, можно также указать DB2_PARAM_FILE, чтобы привязать переменную PHP к имени файла, который содержит данные большого объекта (BLOB, CLOB или DBCLOB).

data_type

Константа, указывающая тип данных SQL, с которым должна быть связана переменная PHP: DB2_BINARY, DB2_CHAR, DB2_DOUBLE или DB2_LONG.

precision

Задаёт точность, с которой переменная должна быть привязана к базе данных. Этот параметр также можно использовать для получения выходных значений XML из хранимых процедур. Неотрицательное значение указывает максимальный размер данных XML, которые будут извлечены из базы данных. Если этот параметр не используется, для получения выходного значения XML из хранимой процедуры предполагается значение по умолчанию 1 МБ.

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() переменные должны быть связаны, а параметрам, принимающим ввод, должно быть присвоено любое значение. 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
"Values of bound parameters _before_ CALL:\n";
print
" 1: {$name} 2: {$second_name} 3: {$weight}\n\n";

if (
db2_execute($stmt)) {
print
"Values of bound parameters _after_ CALL:\n";
print
" 1: {$name} 2: {$second_name} 3: {$weight}\n\n";

print
"Results:\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);
?>

Смотрите также

  • db2_execute() - Выполняет подготовленный SQL-запрос
  • db2_prepare() - Подготавливает SQL-запрос к выполнению

Добавить

Примечания пользователей 1 note

up
2
bravo1_r at hotmail dot com
3 years ago
Important when using classes:
You must call db2_execute() in the same scope as where you define / set / bind the variables.
For example:

<?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));
}
}

/* This will NOT work */
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); // Results in Unbound Variable Error
while($row = db2_fetch_assoc($stmt))
var_dump($row);
} catch(
Exception $e) {
error_log( $e->getMessage () );
}
}

/* This will work */
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