¿Cuál es la diferencia entre bindParam y bindValue?
¿ Cuál es la diferencia entre PDOStatement::bindParam()
y PDOStatement::bindValue()
?
De la entrada manual paraPDOStatement::bindParam
:
[Con
bindParam
] A diferencia dePDOStatement::bindValue()
, la variable está vinculada como referencia y solo se evaluará en el momento en quePDOStatement::execute()
se llame.
Así por ejemplo:
$sex = 'male';
$s = $dbh->prepare('SELECT name FROM students WHERE sex = :sex');
$s->bindParam(':sex', $sex); // use bindParam to bind the variable
$sex = 'female';
$s->execute(); // executed with WHERE sex = 'female'
o
$sex = 'male';
$s = $dbh->prepare('SELECT name FROM students WHERE sex = :sex');
$s->bindValue(':sex', $sex); // use bindValue to bind the variable's value
$sex = 'female';
$s->execute(); // executed with WHERE sex = 'male'
Aquí hay algunos en los que puedo pensar:
- Con
bindParam
, sólo puedes pasar variables; no valores - con
bindValue
, puedes pasar ambos (valores, obviamente, y variables) bindParam
funciona solo con variables porque permite que los parámetros se proporcionen como entrada/salida, por "referencia" (y un valor no es una "referencia" válida en PHP) : es útil con controladores que (citando el manual):
admiten la invocación de procedimientos almacenados que devuelven datos como parámetros de salida, y algunos también como parámetros de entrada/salida que envían datos y se actualizan para recibirlos.
Con algunos motores de base de datos, los procedimientos almacenados pueden tener parámetros que se pueden usar tanto para la entrada (dando un valor de PHP al procedimiento) como para la salida (devolviendo un valor del proceso almacenado a PHP); para vincular esos parámetros, debe usar bindParam y no bindValue.