¿Cuál es la diferencia entre bindParam y bindValue?
¿Cuál es la diferencia entre PDOStatement::bindParam()
y PDOStatement::bindValue()
?
8 answers
La respuesta está en la documentación de bindParam
:
A diferencia de PDOStatement::bindValue(), la variable está enlazada como referencia y solo se evaluará en el momento en que se llame a PDOStatement::execute ().
Y execute
Call PDOStatement:: bindParam () to bind PHP variables to the parameter markers: bound variables pass their value as input and receive the output value, if any, of their associated parameter markers
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-19 18:44:53
Desde la entrada manual para PDOStatement::bindParam
:
[Con
bindParam
] A diferencia dePDOStatement::bindValue()
, la variable está enlazada como referencia y solo se evaluará en el momento en que se llame aPDOStatement::execute()
.
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'
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-22 10:48:22
Aquí hay algunos en los que puedo pensar :
- Con
bindParam
, solo se pueden pasar variables; no valores - con
bindValue
, puede pasar ambos (valores, obviamente, y variables) -
bindParam
funciona solo con variables porque permite que los parámetros se den como entrada / salida, por "referencia" (y un valor no es una "referencia" válida en PHP): es útil con controladores que (citando el manual):
Admite la invocación de procedimientos que devuelve 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 BD, los procedimientos almacenados pueden tener parámetros que se pueden usar tanto para input (dando un valor de PHP al procedimiento) como para ouput (devolviendo un valor del proc almacenado a PHP) ; para enlazar esos parámetros, tienes que usar bindParam, y no bindValue.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-24 20:12:36
Para el propósito más común, debe usar bindValue
.
bindParam
tiene dos comportamientos difíciles o inesperados:
-
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 cadena después de ejecutarexecute()
. Esto, por supuesto, puede conducir a errores sutiles que podrían ser difíciles de atrapar.
Fuente: http://php.net/manual/en/pdostatement.bindparam.php#94711
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-10 21:03:06
De Declaraciones preparadas y procedimientos almacenados
Use bindParam
para insertar varias filas con un enlace único:
<?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();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-10 06:16:20
Usted no tiene que luchar más, cuando existe una manera lilke esto:
$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val");
$stmt->execute([":val" => $bind]);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-27 22:49:58
La forma más sencilla de ponerlo (en términos de PHP):
-
bindParam:
referencia -
bindValue:
variable
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-04 15:39:58
La diferencia clave entre los dos métodos, que se puede leer desde la documentación de bindParam(), es cómo se pasa la variable de parámetro en la llamada al procedimiento.
El método bindParam() enlazará el parámetro marker al nombre de la variable PHP que contendrá el valor de salida, no el valor en sí. Además, su valor solo se evalúa en el momento en que se llama a PDOStatement::execute ().
... la variable está enlazada como referencia y solo se evaluará en el momento en que se llame a PDOStatement::execute ().
Por comparación, el método bindValue() enlazará el parámetro marker al valor de la variable PHP su referencia, y por lo tanto está inmediatamente disponible en el momento en que se llama a PDOStatement::execute ().
Es importante tener en cuenta al usar el método bindParam (), si su parámetro es un parámetro OUT, lo que significa que se une a una variable que obtiene su valor de un procedimiento almacenado, entonces debe establezca explícitamente la longitud como se indica en la documentación del parámetro de longitud :
Longitud
Longitud del tipo de datos. Para indicar que un parámetro es un parámetro OUT de un procedimiento almacenado, debe establecer explícitamente la longitud.
Debe establecer la longitud del parámetro de salida para que coincida con la longitud máxima esperada definida en su base de datos.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-30 13:10:08