mirror of
https://github.com/phpbb/phpbb.git
synced 2025-06-08 04:18:52 +00:00
[ticket/12671] Possibility to use NOT LIKE expression
PHPBB3-12671
This commit is contained in:
parent
f6da266109
commit
6b60153ab4
11 changed files with 137 additions and 0 deletions
|
@ -369,6 +369,17 @@ abstract class driver implements driver_interface
|
||||||
return $this->_sql_like_expression('LIKE \'' . $this->sql_escape($expression) . '\'');
|
return $this->_sql_like_expression('LIKE \'' . $this->sql_escape($expression) . '\'');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
function sql_not_like_expression($expression)
|
||||||
|
{
|
||||||
|
$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) . '\'');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -418,6 +418,16 @@ interface driver_interface
|
||||||
*/
|
*/
|
||||||
public function sql_like_expression($expression);
|
public function sql_like_expression($expression);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Correctly adjust NOT LIKE expression for special characters
|
||||||
|
* Some DBMS are handling them in a different way
|
||||||
|
*
|
||||||
|
* @param string $expression The expression to use. Every wildcard is
|
||||||
|
* escaped, except $this->any_char and $this->one_char
|
||||||
|
* @return string A SQL statement like: "NOT LIKE 'bertie_%'"
|
||||||
|
*/
|
||||||
|
public function sql_not_like_expression($expression);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Explain queries
|
* Explain queries
|
||||||
*
|
*
|
||||||
|
|
|
@ -417,6 +417,14 @@ class factory implements driver_interface
|
||||||
return $this->get_driver()->sql_like_expression($expression);
|
return $this->get_driver()->sql_like_expression($expression);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function sql_not_like_expression($expression)
|
||||||
|
{
|
||||||
|
return $this->get_driver()->sql_not_like_expression($expression);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritdoc}
|
* {@inheritdoc}
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -350,6 +350,15 @@ class mssql extends \phpbb\db\driver\driver
|
||||||
return $expression . " ESCAPE '\\'";
|
return $expression . " ESCAPE '\\'";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build NOT LIKE expression
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _sql_not_like_expression($expression)
|
||||||
|
{
|
||||||
|
return $expression . " ESCAPE '\\'";
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* return sql error array
|
* return sql error array
|
||||||
* @access private
|
* @access private
|
||||||
|
|
|
@ -51,6 +51,15 @@ abstract class mssql_base extends \phpbb\db\driver\driver
|
||||||
return $expression . " ESCAPE '\\'";
|
return $expression . " ESCAPE '\\'";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build NOT LIKE expression
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _sql_not_like_expression($expression)
|
||||||
|
{
|
||||||
|
return $expression . " ESCAPE '\\'";
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build db-specific query data
|
* Build db-specific query data
|
||||||
* @access private
|
* @access private
|
||||||
|
|
|
@ -111,6 +111,15 @@ abstract class mysql_base extends \phpbb\db\driver\driver
|
||||||
return $expression;
|
return $expression;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build NOT LIKE expression
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _sql_not_like_expression($expression)
|
||||||
|
{
|
||||||
|
return $expression;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build db-specific query data
|
* Build db-specific query data
|
||||||
* @access private
|
* @access private
|
||||||
|
|
|
@ -645,6 +645,15 @@ class oracle extends \phpbb\db\driver\driver
|
||||||
return $expression . " ESCAPE '\\'";
|
return $expression . " ESCAPE '\\'";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build NOT LIKE expression
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _sql_not_like_expression($expression)
|
||||||
|
{
|
||||||
|
return $expression . " ESCAPE '\\'";
|
||||||
|
}
|
||||||
|
|
||||||
function _sql_custom_build($stage, $data)
|
function _sql_custom_build($stage, $data)
|
||||||
{
|
{
|
||||||
return $data;
|
return $data;
|
||||||
|
|
|
@ -370,6 +370,15 @@ class postgres extends \phpbb\db\driver\driver
|
||||||
return $expression;
|
return $expression;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build NOT LIKE expression
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _sql_not_like_expression($expression)
|
||||||
|
{
|
||||||
|
return $expression;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -287,6 +287,23 @@ class sqlite extends \phpbb\db\driver\driver
|
||||||
return 'GLOB \'' . $this->sql_escape($expression) . '\'';
|
return 'GLOB \'' . $this->sql_escape($expression) . '\'';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*
|
||||||
|
* For SQLite an underscore is a not-known character... this may change with SQLite3
|
||||||
|
*/
|
||||||
|
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 sql error array
|
||||||
* @access private
|
* @access private
|
||||||
|
|
|
@ -233,6 +233,48 @@ class phpbb_dbal_select_test extends phpbb_database_test_case
|
||||||
$db->sql_freeresult($result);
|
$db->sql_freeresult($result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function not_like_expression_data()
|
||||||
|
{
|
||||||
|
// * = 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('*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'))),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider not_like_expression_data
|
||||||
|
*/
|
||||||
|
public function test_not_like_expression($like_expression, $expected)
|
||||||
|
{
|
||||||
|
$db = $this->new_dbal();
|
||||||
|
|
||||||
|
$like_expression = str_replace('*', $db->get_any_char(), $like_expression);
|
||||||
|
$like_expression = str_replace('#', $db->get_one_char(), $like_expression);
|
||||||
|
$where = ($like_expression) ? 'username_clean ' . $db->sql_not_like_expression($like_expression) : '';
|
||||||
|
|
||||||
|
$result = $db->sql_query('SELECT username_clean
|
||||||
|
FROM phpbb_users
|
||||||
|
' . (($where) ? ' WHERE ' . $where : '') . '
|
||||||
|
ORDER BY user_id ASC');
|
||||||
|
|
||||||
|
$this->assertEquals($expected, $db->sql_fetchrowset($result));
|
||||||
|
|
||||||
|
$db->sql_freeresult($result);
|
||||||
|
}
|
||||||
|
|
||||||
public function in_set_data()
|
public function in_set_data()
|
||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
|
|
|
@ -191,6 +191,10 @@ namespace phpbb\db\driver
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function sql_not_like_expression($expression)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
function sql_fetchrowset($query_id = false)
|
function sql_fetchrowset($query_id = false)
|
||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
|
|
Loading…
Add table
Reference in a new issue