¿Cuál es la diferencia entre bindParam y bindValue?


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

Author: Adrian Cid Almaguer, 2009-07-25

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

 168
Author: acrosman,
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 de PDOStatement::bindValue(), la variable está enlazada como referencia y solo se evaluará en el momento en que se llame a PDOStatement::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'
 624
Author: lonesomeday,
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.

 207
Author: Pascal MARTIN,
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 ejecutar execute(). 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

 23
Author: Denilson Sá Maia,
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();
 19
Author: Nezar Fadle,
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]); 
 1
Author: Thielicious,
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
 1
Author: tfont,
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.

 -1
Author: Crayons,
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