diff options
author | Geolim4 <contact@geolim4.com> | 2014-08-08 18:32:17 +0200 |
---|---|---|
committer | Geolim4 <contact@geolim4.com> | 2014-08-08 18:32:17 +0200 |
commit | 01943adbf72e137b9dfbda3ac85120c21a30fab8 (patch) | |
tree | 11d9ecde2da1bb4e7cdab672d7856e5a1bcba603 | |
parent | 6b60153ab4ac036bcd4eaaa90806d9898fc1e9a2 (diff) | |
download | forums-01943adbf72e137b9dfbda3ac85120c21a30fab8.tar forums-01943adbf72e137b9dfbda3ac85120c21a30fab8.tar.gz forums-01943adbf72e137b9dfbda3ac85120c21a30fab8.tar.bz2 forums-01943adbf72e137b9dfbda3ac85120c21a30fab8.tar.xz forums-01943adbf72e137b9dfbda3ac85120c21a30fab8.zip |
[ticket/12671] Possibility to use NOT LIKE expression
PHPBB3-12671
-rw-r--r-- | phpBB/phpbb/db/driver/driver.php | 2 | ||||
-rw-r--r-- | phpBB/phpbb/db/driver/sqlite3.php | 17 | ||||
-rw-r--r-- | tests/dbal/select_test.php | 38 |
3 files changed, 43 insertions, 14 deletions
diff --git a/phpBB/phpbb/db/driver/driver.php b/phpBB/phpbb/db/driver/driver.php index ed650bd6a9..9fc04d47a1 100644 --- a/phpBB/phpbb/db/driver/driver.php +++ b/phpBB/phpbb/db/driver/driver.php @@ -377,7 +377,7 @@ abstract class driver implements driver_interface $expression = utf8_str_replace(array('_', '%'), array("\_", "\%"), $expression); $expression = utf8_str_replace(array(chr(0) . "\_", chr(0) . "\%"), array('_', '%'), $expression); - return $this->_sql_like_expression('NOT LIKE \'' . $this->sql_escape($expression) . '\''); + return $this->_sql_not_like_expression('NOT LIKE \'' . $this->sql_escape($expression) . '\''); } /** diff --git a/phpBB/phpbb/db/driver/sqlite3.php b/phpBB/phpbb/db/driver/sqlite3.php index 0922229e0a..f79245afb1 100644 --- a/phpBB/phpbb/db/driver/sqlite3.php +++ b/phpBB/phpbb/db/driver/sqlite3.php @@ -275,6 +275,23 @@ class sqlite3 extends \phpbb\db\driver\driver } /** + * {@inheritDoc} + * + * For SQLite an underscore is a not-known character... + */ + public function sql_not_like_expression($expression) + { + // Unlike LIKE, GLOB is case sensitive (unfortunatly). SQLite users need to live with it! + // We only catch * and ? here, not the character map possible on file globbing. + $expression = str_replace(array(chr(0) . '_', chr(0) . '%'), array(chr(0) . '?', chr(0) . '*'), $expression); + + $expression = str_replace(array('?', '*'), array("\?", "\*"), $expression); + $expression = str_replace(array(chr(0) . "\?", chr(0) . "\*"), array('?', '*'), $expression); + + return 'GLOB \'' . $this->sql_escape($expression) . '\''; + } + + /** * return sql error array * * @return array diff --git a/tests/dbal/select_test.php b/tests/dbal/select_test.php index ce07d7d0fb..50ac5eb4d5 100644 --- a/tests/dbal/select_test.php +++ b/tests/dbal/select_test.php @@ -237,20 +237,32 @@ class phpbb_dbal_select_test extends phpbb_database_test_case { // * = any_char; # = one_char return array( - array('barfoo', array(array('username_clean' => 'bertie'), - array('username_clean' => 'foobar'))), - array('bar', array(array('username_clean' => 'bertie'),)), - array('bar*', array(array('username_clean' => 'bertie'), - array('username_clean' => 'foobar'))), + array('barfoo', array( + array('username_clean' => 'foobar'), + array('username_clean' => 'bertie')) + ), + array('bar', array(array('username_clean' => 'bertie'))), + array('bar*', array( + array('username_clean' => 'foobar'), + array('username_clean' => 'bertie')) + ), array('*bar*', array(array('username_clean' => 'bertie'))), - array('b*r', array(array('username_clean' => 'barfoo'), - array('username_clean' => 'foobar'))), - array('b*e', array(array('username_clean' => 'barfoo'), - array('username_clean' => 'foobar'))), - array('#b*e', array(array('username_clean' => 'barfoo'), - array('username_clean' => 'foobar'))), - array('b####e', array(array('username_clean' => 'barfoo'), - array('username_clean' => 'foobar'))), + array('b*r', array( + array('username_clean' => 'barfoo'), + array('username_clean' => 'foobar')) + ), + array('b*e', array( + array('username_clean' => 'barfoo'), + array('username_clean' => 'foobar')) + ), + array('#b*e', array( + array('username_clean' => 'barfoo'), + array('username_clean' => 'foobar')) + ), + array('b####e', array( + array('username_clean' => 'barfoo'), + array('username_clean' => 'foobar')) + ), ); } |