What is the difference between bindParam and bindValue?
From the manual entry for PDOStatement::bindParam
:
[With
bindParam
] UnlikePDOStatement::bindValue()
, the variable is bound as a reference and will only be evaluated at the time thatPDOStatement::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'