protected Statement::getStatement($query, &$args = array())
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 StatementPrefetch::getStatement
File
- core/lib/Drupal/Core/Database/Driver/sqlite/Statement.php, line 29
Class
- Statement
- SQLite implementation of \Drupal\Core\Database\Statement.
Namespace
Drupal\Core\Database\Driver\sqlite
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | 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 // 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 ->pdoConnection->prepare( $query ); } |
Please login to continue.