Пример #1
0
 /**
  * {@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;
 }