protected function DatabaseStatement_sqlite::getStatement

protected DatabaseStatement_sqlite::getStatement($query, &$args = array())

SQLite specific implementation of getStatement().

The PDO SQLite layer doesn't replace numeric placeholders in queries correctly, and this makes numeric expressions (such as COUNT(*) >= :count) fail. We replace numeric placeholders in the query ourselves to work around this bug.

See http://bugs.php.net/bug.php?id=45259 for more details.

Overrides DatabaseStatementPrefetch::getStatement

File

includes/database/sqlite/database.inc, line 411
Database interface code for SQLite embedded database engine.

Class

DatabaseStatement_sqlite
Specific SQLite implementation of DatabaseConnection.

Code

protected function getStatement($query, &$args = array()) {
  if (count($args)) {
    // Check if $args is a simple numeric array.
    if (range(0, count($args) - 1) === array_keys($args)) {
      // In that case, we have unnamed placeholders.
      $count = 0;
      $new_args = array();
      foreach ($args as $value) {
        if (is_float($value) || is_int($value)) {
          if (is_float($value)) {
            // Force the conversion to float so as not to loose precision
            // in the automatic cast.
            $value = sprintf('%F', $value);
          }
          $query = substr_replace($query, $value, strpos($query, '?'), 1);
        }
        else {
          $placeholder = ':db_statement_placeholder_' . $count++;
          $query = substr_replace($query, $placeholder, strpos($query, '?'), 1);
          $new_args[$placeholder] = $value;
        }
      }
      $args = $new_args;
    }
    else {
      // Else, this is using named placeholders.
      foreach ($args as $placeholder => $value) {
        if (is_float($value) || is_int($value)) {
          if (is_float($value)) {
            // Force the conversion to float so as not to loose precision
            // in the automatic cast.
            $value = sprintf('%F', $value);
          }

          // We will remove this placeholder from the query as PDO throws an
          // exception if the number of placeholders in the query and the
          // arguments does not match.
          unset($args[$placeholder]);
          // PDO allows placeholders to not be prefixed by a colon. See
          // http://marc.info/?l=php-internals&m=111234321827149&w=2 for
          // more.
          if ($placeholder[0] != ':') {
            $placeholder = ":$placeholder";
          }
          // When replacing the placeholders, make sure we search for the
          // exact placeholder. For example, if searching for
          // ':db_placeholder_1', do not replace ':db_placeholder_11'.
          $query = preg_replace('/' . preg_quote($placeholder) . '\b/', $value, $query);
        }
      }
    }
  }

  return $this->dbh->PDOPrepare($query);
}

© 2001–2016 by the original authors
Licensed under the GNU General Public License, version 2 and later.
Drupal is a registered trademark of Dries Buytaert.
https://api.drupal.org/api/drupal/includes!database!sqlite!database.inc/function/DatabaseStatement_sqlite::getStatement/7.x