PHP 8.4.1 Released!

db2_bind_param

(PECL ibm_db2 >= 1.0.0)

db2_bind_param Vincula una variable PHP a un parámetro de una sentencia SQL

Descripción

db2_bind_param(
    resource $stmt,
    int $parameter-number,
    string $variable-name,
    int $parameter-type = ?,
    int $data-type = 0,
    int $precision = -1,
    int $scale = 0
): bool

Vincula una variabel PHP a una sentencia SQL de un recurso devuelto por db2_prepare(). Esta función proporciona más control sobre el tipo de parámetro, tipo de dato, procesión, y escala del parámetro que cuando se pasa la variabel como parte del array de entrada opcional en db2_execute().

Parámetros

stmt

Sentencia preparada devuelta por db2_prepare().

parameter-number

Especifica la posición del parámetro en la sentencia preparada, utilizando 1 como primera posición.

variable-name

String con el nombre de la variabel PHP que se vinculará al parámetro especificado por parameter-number.

parameter-type

Constante que especifica si la variable PHP debe vincularse al parámetro SQL como un parámetro de entrada (DB2_PARAM_IN), de salida (DB2_PARAM_OUT), o como un parámetro que acepta entrada y salida (DB2_PARAM_INOUT). Para evitar fugas de memoria, puede especificarse DB2_PARAM_FILE para vincular la variable PHP al nombre de un fichero que contiene objetos de gran tamaño (BLOB, CLOB, o DBCLOB).

data-type

Constante que especifica el tipo de dato SQL de la variable PHP que se vincula: de entre DB2_BINARY, DB2_CHAR, DB2_DOUBLE, o DB2_LONG.

precision

Especifica la precisión con la que se debe vincular a la base de datos. Este parámetro se puede utilizar también para consultar valores de salida XML de procedimientos almacenados. Un valor no negativo especifica el tamaño máximo de datos XML que se consultarán de la base de datos. Si este parámetro no se utiliza, se asumirá por omisión 1MB para consultar el valor de salida XML del procedimiento almacenado.

scale

Especifica la escala de la variable que se vinculará a la base de datos.

Valores devueltos

Devuelve true en caso de éxito o false en caso de error.

Ejemplos

Ejemplo #1 Vinculando variables PHP a sentencias preparadas

La sentencia SQL del siguiente ejemplo utiliza dos parámetros de entrada en la cláusula WHERE. Invocamos db2_bind_param() para vincular dos variables PHP a los correspondientes parámetros SQL. Debe tenerse en cuenta que no es necesario que se hayan declarado o asignado las variables PHP antes de llamar a db2_bind_param(); en el ejemplo, se asigna un valor a $lower_limit antes de llamar a db2_bind_param(), a diferencia de $upper_limit, donde el valor se asigna tras llamar a db2_bind_param(). Se deben vincular las variables y, para parámetros que acepten entradas, debe asignarse el valor antes de llamar a parameters that accept input, must have any value assigned, before calling 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);

// Podemos declarar la variable antes de llamar a 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);

// Podemos declarar la variable tras llamar a 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";
}
}
?>

El resultado del ejemplo sería:

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

Ejemplo #2 Llamada a procedimientos almacenados con parámetros de Entrada y Salida

El procedimiento almacenado match_animal del siguiente ejemplo acepta tres parámetros:

  1. un parámetro (IN) de entrada que acepta el nombre del primer animal como entrada

  2. un parámetro (INOUT) de entrada-salida que acepta el nombre del segundo animal como entrada y devuelve el string TRUE si coincidiera algún animal de la base de datos

  3. un parámetro (OUT) de salida que devuelve la suma del peso de los dos animales identificados

Además, el procedimiento almacenado devuelve el juego de resultados que corresponde a la lista de animales en orden alfabética comenzando por el animal del valor de entrada del primer parámetro, y terminando en el animal correspondiente al valor de entrada del segundo parámetro.

<?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
"Valores de los parámetros vinculados _antes_ de la llamada:\n";
print
" 1: {$name} 2: {$second_name} 3: {$weight}\n\n";

if (
db2_execute($stmt)) {
print
"Valores de los parámetros vinculados _tras_ la llamada:\n";
print
" 1: {$name} 2: {$second_name} 3: {$weight}\n\n";

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

El resultado del ejemplo sería:

Valores de los parámetros vinculados _antes_ de la llamada:
  1: Peaches 2: Rickety Ride 3: 0

Valores de los parámetros vinculados _tras_ la llamada:
  1: Peaches 2: TRUE 3: 22

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

Ejemplo #3 Insertando un objeto extenso binario (BLOB) directamente desde un fichero

Los datos de objetos extensos se suelen almacenar en ficheros, como por ejemplo documentos XML o ficheros de audio. En lugar de guardar el fichero completo en una variable PHP, para después vincular ésta a una sentencia SQL, se puede evitar esta sobrecarga de memoria vinculando directamente el fichero al parámetro de entrada de la sentencia SQL. El siguiente ejemplo demuestra cómo vincular directamente un fichero a una columna 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);
?>

Ver también

add a note

User Contributed Notes 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