Pregunta

¿Fue útil?

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.

execute

  

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 de PDOStatement::bindValue(), la variable se une como una 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'

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 ejecutar execute(). 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top