/** * {@inheritdoc} */ protected function expandArguments(&$query, &$args) { $modified = parent::expandArguments($query, $args); // The PDO SQLite driver always replaces placeholders with strings, which // breaks numeric expressions (e.g., COUNT(*) >= :count). Replace numeric // placeholders in the query to work around this bug. // @see http://bugs.php.net/bug.php?id=45259 if (empty($args)) { return $modified; } // 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) || is_numeric($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; $modified = TRUE; } else { foreach ($args as $placeholder => $value) { if (is_float($value) || is_int($value) || is_numeric($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); $modified = TRUE; } } } return $modified; }