The examples on this page assumes the use of the class and connection defined at the top of the Selecting Data page.
bindParam
The methods bindValue
and
bindParam
differ in only two important respects:
bindValue
allows the a contant to be the bound
value; bindParam
assigns its value to the prepared
SQL statement when the execute
method is called,
while bindValue
does so when it itself is
executed. For all of the examples on the Binding Values page the
bindValue
method could be replaced with the
bindParam
method without any difference in
execution. However, there are some cases where
bindParam
provides some distinct advantages:
public function getKeywords( $values ) { $sql = 'SELECT * FROM keyword WHERE keyword_id = ?'; $stmt = $this->conn->prepare( $sql ); $stmt->setFetchMode(PDO::FETCH_ASSOC); foreach( $values as $val ) { $stmt->bindValue( 1, $val ); $stmt->execute(); $result = $stmt->fetchAll(); print( $result[0] . PHP_EOL ); } }
In this example the parameter $values
is an
array containing a list of keyword IDs. The
foreach
control structure loops through every
element of values
, naming each individual element
$val
. Inside this loop $val
is bound
to the prepared statement and the statement is then executed.
The resulting values are printed. (Note that although each call
to this SQL statement produces only one row -
keyword_id
is the primary key for the table - this
row is still numbered, in this case as row 0.)
This method is rewritten using bindParam
instead:
public function getKeywords( $values ) { $sql = 'SELECT * FROM keyword WHERE keyword_id = ?'; $stmt = $this->conn->prepare( $sql ); $val = null; $stmt->bindParam( 1, $val ); $stmt->setFetchMode(PDO::FETCH_ASSOC); foreach( $values as $val ) { $stmt->execute(); $result = $stmt->fetchAll(); print( $result[0] . PHP_EOL ); } }
This version binds the value of $val
to the
prepared SQL statement only when execute
is
called. Only one call to bindParam
is necessary
because as the value of $val
is changed inside the
foreach
loop the new value is automatically used
during the prepared SQL statement execution.
Which approach should you use? Whichever approach you are
comfortable with. bindValue
works under all
circumstances, but bindParam
can be more
convenient to write under certain circumstances.
Each placeholder in the SQL string must have a matching bound value. Having more or less numbers of bindings than placeholders throws an exception during execution.