Physics & Computer Science > CP363 : Home > Implementation Information
Version: 2020-02-06 11:02

CP363 : Binding Parameters

The examples on this page assumes the use of the class and connection defined at the top of the Selecting Data page.


Using 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.


Placeholder and Binding Counts

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.