What is the difference between bindParam and bindValue? What is the difference between bindParam and bindValue? php php

What is the difference between bindParam and bindValue?


From the manual entry for PDOStatement::bindParam:

[With bindParam] Unlike PDOStatement::bindValue(), the variable is bound as a reference and will only be evaluated at the time that PDOStatement::execute() is called.

So, for example:

$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'

or

$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'


Here are some I can think about :

  • With bindParam, you can only pass variables ; not values
  • with bindValue, you can pass both (values, obviously, and variables)
  • bindParam works only with variables because it allows parameters to be given as input/output, by "reference" (and a value is not a valid "reference" in PHP) : it is useful with drivers that (quoting the manual) :

support the invocation of stored procedures that return data as output parameters, and some also as input/output parameters that both send in data and are updated to receive it.

With some DB engines, stored procedures can have parameters that can be used for both input (giving a value from PHP to the procedure) and ouput (returning a value from the stored proc to PHP) ; to bind those parameters, you've got to use bindParam, and not bindValue.


The answer is in the documentation for bindParam:

Unlike PDOStatement::bindValue(), the variable is bound as a reference and will only be evaluated at the time that PDOStatement::execute() is called.

And 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

Example:

$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'

or

$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'