update param_int php pdo bindparam bindvalue

param_int - prepare php



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

Aquí hay algunos en los que puedo pensar:

  • Con bindParam , solo puedes 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 almacenados que devuelven datos como parámetros de salida, y algunos también como parámetros de entrada / salida que envían datos y se actualizan para recibirlos.

Con algunos motores de base de datos, los procedimientos almacenados pueden tener parámetros que se pueden usar tanto para la entrada (dando un valor desde PHP al procedimiento) como para salir (devolviendo un valor desde el proceso almacenado a PHP); para enlazar esos parámetros, tienes que usar bindParam, y no bindValue.

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


De declaraciones preparadas y procedimientos almacenados.

Utilice bindParam para insertar varias filas con un enlace de tiempo:

<?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();


De la entrada manual para PDOStatement::bindParam :

[Con bindParam ] A diferencia de PDOStatement::bindValue() , la variable está vinculada como referencia y solo se evaluará en el momento en que se 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''


La forma más sencilla de ponerlo (en términos de PHP):

  • bindParam: referencia
  • bindValue: variable

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

A diferencia de PDOStatement :: bindValue (), la variable está vinculada como referencia y solo se evaluará en el momento en que se llame a PDOStatement :: execute ().

Y execute

llame a PDOStatement :: bindParam () para vincular las variables de PHP a los marcadores de parámetros: las variables enlazadas pasan su valor como entrada y reciben el valor de salida, si corresponde, de sus marcadores de parámetros asociados


No tienes que luchar por más tiempo, cuando existe una manera de hacer esto:

$stmt = $pdo->prepare("SELECT * FROM someTable WHERE col = :val"); $stmt->execute([":val" => $bind]);


Para el propósito más común, debes 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 llevar a errores sutiles que pueden ser difíciles de atrapar.

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