235 votos

PDO: bindParam frente bindValue

¿Cuál es la diferencia entre PDOStatement::bindParam() y PDOStatement::bindValue() ?

348voto

lonesomeday Puntos 95456

Desde la entrada manual para PDOStatement::bindParam :

[Con bindParam ] A diferencia de PDOStatement::bindValue() , la variable está ligada como referencia y sólo se evaluará en el momento que PDOStatement::execute() se llama.

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'
 

173voto

Pascal MARTIN Puntos 195780

Aquí hay algunos que se me ocurre :

  • Con bindParam, sólo se pueden pasar variables ; no valores
  • con bindValue, puede pasar tanto (valores, obviamente, y variables)
  • bindParam solo trabaja con variables, porque permite que los parámetros a ser dado como entrada/salida, por "referencia" (y el valor no es válido "de referencia" en PHP) : es útil con los controladores que (citando el manual) :

apoyo a la invocación de almacenado procedimientos que devuelven datos de salida parámetros, y algunos también como entrada/salida de los parámetros que se envían en los datos y se actualizan para recibirlo.

Con algunos motores de base de datos, procedimientos almacenados pueden tener parámetros que pueden ser utilizados para la entrada (dando un valor de PHP para el procedimiento) y la salida (de devolver un valor desde el procedimiento almacenado para PHP) ; enlazar los parámetros que tienes que usar bindParam, y no bindValue.

134voto

acrosman Puntos 7688

La respuesta está en la documentación para bindParam:

A diferencia de PDOStatement::bindValue(), la variable está enlazado como una referencia y sólo serán evaluados en el momento en que PDOStatement::execute() es llamada.

Y execute

llame PDOStatement::bindParam() para enlazar variables PHP a los marcadores de parámetros: variables vinculadas pasar su valor como entrada y recibir el valor de salida, si los hubiere, de sus asociados marcadores de parámetros

16voto

Denilson Sá Puntos 6953

Para la mayoría de propósito común, debe utilizar bindValue.

bindParam tiene dos complicado o comportamientos inesperados:

  • bindParam(':foo', 4, PDO::PARAM_INT) no trabajo, ya que se requiere la aprobación de una variable (como referencia).
  • bindParam(':foo', $value, PDO::PARAM_INT) cambiará $value a la cadena después de ejecutar execute(). Esto, por supuesto, puede llevar a los sutiles errores que pueden ser muy difícil de detectar.

Fuente: http://php.net/manual/en/pdostatement.bindparam.php#94711

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X