aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeolim4 <contact@geolim4.com>2014-08-08 18:32:17 +0200
committerGeolim4 <contact@geolim4.com>2014-08-08 18:32:17 +0200
commit01943adbf72e137b9dfbda3ac85120c21a30fab8 (patch)
tree11d9ecde2da1bb4e7cdab672d7856e5a1bcba603
parent6b60153ab4ac036bcd4eaaa90806d9898fc1e9a2 (diff)
downloadforums-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.php2
-rw-r--r--phpBB/phpbb/db/driver/sqlite3.php17
-rw-r--r--tests/dbal/select_test.php38
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'))
+ ),
);
}