¿Cuál es la diferencia entre bindParam y bindValue?
Pregunta
¿Cuál es la diferencia entre PDOStatement::bindParam()
y PDOStatement::bindValue()
?
Solución
La respuesta está en la documentación de bindParam
:
A diferencia de PDOStatement :: bindValue (), la variable está unida como una referencia y sólo serán evaluados en el momento que PDOStatement :: execute () se llama.
llamar PDOStatement :: bindParam () para vincular las variables de PHP a los marcadores de parámetros: variables ligadas pasan su valor como entrada y reciben el valor de salida, en su caso, de sus marcadores de parámetros asociados
Ejemplo:
$value = 'foo';
$s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz');
$s->bindParam(':baz', $value); // use bindParam to bind the variable
$value = 'foobarbaz';
$s->execute(); // executed with WHERE baz = 'foobarbaz'
o
$value = 'foo';
$s = $dbh->prepare('SELECT name FROM bar WHERE baz = :baz');
$s->bindValue(':baz', $value); // use bindValue to bind the variable's value
$value = 'foobarbaz';
$s->execute(); // executed with WHERE baz = 'foo'
Otros consejos
la entrada manual para PDOStatement::bindParam
:
[Con
bindParam
] A diferencia dePDOStatement::bindValue()
, la variable se une como una referencia y sólo se evaluará en el momento quePDOStatement::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'
Aquí están algunos que puedo pensar:
- Con
bindParam
, sólo se puede pasar variables; no los valores - con
bindValue
, puede pasar tanto (valores, obviamente, y variables) -
bindParam
sólo funciona con variables, ya que permite parámetros que se dan como entrada / salida, por "referencia" (y un valor no es una "referencia" válido en PHP) : es útil con controladores que (citando el manual):
apoyar la invocación de almacenado procedimientos que devuelven datos como salida parámetros, y algunos también como parámetros de entrada / salida que ambos envían en los datos y se actualizan para recibirlo.
Con algunos motores de DB, procedimientos almacenados pueden tener parámetros que pueden ser utilizados tanto para la entrada (dando un valor a partir de PHP con el procedimiento) y ouput (volviendo un valor de la proc almacenado para PHP); para unir esos parámetros, usted tiene que utilizar bindParam, y no bindValue.
Sentencias preparadas y procedimientos almacenados
Uso bindParam
para insertar múltiples filas con la unión una vez:
<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)");
$stmt->bindParam(1, $name);
$stmt->bindParam(2, $value);
// insert one row
$name = 'one';
$value = 1;
$stmt->execute();
// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();
A los efectos más común, se debe utilizar bindValue
.
bindParam
tiene dos comportamientos difíciles o inesperadas:
-
bindParam(':foo', 4, PDO::PARAM_INT)
no funciona, ya que requiere pasar una variable (como referencia). -
bindParam(':foo', $value, PDO::PARAM_INT)
cambiará$value
a la cadena después de ejecutarexecute()
. Esto, por supuesto, puede dar lugar a errores sutiles que pueden ser difíciles de atrapar.
Fuente: http://php.net/manual/en/pdostatement.bindparam.php#94711
Usted no tiene que luchar por más tiempo, cuando existe una manera como esto:
$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]);
La forma más sencilla de poner esto en perspectiva para la memorización por el comportamiento (en términos de PHP):
-
bindParam:
referencia -
bindValue:
variables