(PECL ibm_db2 >= 1.0.0)
db2_bind_param — Связывает переменную PHP с параметром SQL-выражения
$stmt,$parameter_number,$variable_name,$parameter_type = DB2_PARAM_IN ,$data_type = 0,$precision = -1,$scale = 0Связывает переменную PHP с параметром SQL-выражения в ресурсе выражения, возвращаемом db2_prepare() . Эта функция даёт больший контроль над типом параметра, типом данных, точностью и масштабом для параметра, чем простая передача переменной как части необязательного входного массива в db2_execute() .
stmtparameter_numbervariable_nameparameter_number.
parameter_typeDB2_PARAM_IN ),
выходной параметр (DB2_PARAM_OUT ) или как параметр,
который принимает ввод и возвращает вывод (DB2_PARAM_INOUT ).
Чтобы избежать перегрузки памяти, можно также указать
DB2_PARAM_FILE , чтобы привязать переменную PHP к имени
файла, который содержит данные большого объекта (BLOB, CLOB или DBCLOB).
data_typeDB2_BINARY , DB2_CHAR ,
DB2_DOUBLE или DB2_LONG .
precisionscale
Функция возвращает 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 в данном примере принимает три разных параметра:
TRUE,
если животное в базе данных совпадает с этим именем
<?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);
?>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 () );
}
}
?>