mirror of
https://github.com/phpbb/phpbb.git
synced 2025-06-27 21:58:52 +00:00
tweak the sql_like_expression feature a little bit to allow correct escaping
git-svn-id: file:///svn/phpbb/trunk@7789 89ea8834-ac86-4346-8a33-228a782c2dd0
This commit is contained in:
parent
318418b0f2
commit
5aa220bcd2
22 changed files with 96 additions and 53 deletions
|
@ -239,7 +239,7 @@ class acp_permission_roles
|
||||||
{
|
{
|
||||||
$sql = 'SELECT auth_option_id, auth_option
|
$sql = 'SELECT auth_option_id, auth_option
|
||||||
FROM ' . ACL_OPTIONS_TABLE . "
|
FROM ' . ACL_OPTIONS_TABLE . "
|
||||||
WHERE auth_option " . $db->sql_like_expression($permission_type . '%') . "
|
WHERE auth_option " . $db->sql_like_expression($permission_type . $db->any_char) . "
|
||||||
AND auth_option <> '{$permission_type}'
|
AND auth_option <> '{$permission_type}'
|
||||||
ORDER BY auth_option_id";
|
ORDER BY auth_option_id";
|
||||||
$result = $db->sql_query($sql);
|
$result = $db->sql_query($sql);
|
||||||
|
@ -305,7 +305,7 @@ class acp_permission_roles
|
||||||
// We need to fill the auth options array with ACL_NO options ;)
|
// We need to fill the auth options array with ACL_NO options ;)
|
||||||
$sql = 'SELECT auth_option_id, auth_option
|
$sql = 'SELECT auth_option_id, auth_option
|
||||||
FROM ' . ACL_OPTIONS_TABLE . "
|
FROM ' . ACL_OPTIONS_TABLE . "
|
||||||
WHERE auth_option " . $db->sql_like_expression($permission_type . '%') . "
|
WHERE auth_option " . $db->sql_like_expression($permission_type . $db->any_char) . "
|
||||||
AND auth_option <> '{$permission_type}'
|
AND auth_option <> '{$permission_type}'
|
||||||
ORDER BY auth_option_id";
|
ORDER BY auth_option_id";
|
||||||
$result = $db->sql_query($sql);
|
$result = $db->sql_query($sql);
|
||||||
|
@ -490,7 +490,7 @@ class acp_permission_roles
|
||||||
// Get complete auth array
|
// Get complete auth array
|
||||||
$sql = 'SELECT auth_option, auth_option_id
|
$sql = 'SELECT auth_option, auth_option_id
|
||||||
FROM ' . ACL_OPTIONS_TABLE . "
|
FROM ' . ACL_OPTIONS_TABLE . "
|
||||||
WHERE auth_option " . $db->sql_like_expression($permission_type . '%');
|
WHERE auth_option " . $db->sql_like_expression($permission_type . $db->any_char);
|
||||||
$result = $db->sql_query($sql);
|
$result = $db->sql_query($sql);
|
||||||
|
|
||||||
$auth_settings = array();
|
$auth_settings = array();
|
||||||
|
|
|
@ -1069,7 +1069,7 @@ class acp_permissions
|
||||||
global $db, $user;
|
global $db, $user;
|
||||||
|
|
||||||
$sql_forum_id = ($permission_scope == 'global') ? 'AND a.forum_id = 0' : ((sizeof($forum_id)) ? 'AND ' . $db->sql_in_set('a.forum_id', $forum_id) : 'AND a.forum_id <> 0');
|
$sql_forum_id = ($permission_scope == 'global') ? 'AND a.forum_id = 0' : ((sizeof($forum_id)) ? 'AND ' . $db->sql_in_set('a.forum_id', $forum_id) : 'AND a.forum_id <> 0');
|
||||||
$sql_permission_option = ' AND o.auth_option ' . $db->sql_like_expression($permission_type . '%');
|
$sql_permission_option = ' AND o.auth_option ' . $db->sql_like_expression($permission_type . $db->any_char);
|
||||||
|
|
||||||
$sql = $db->sql_build_query('SELECT_DISTINCT', array(
|
$sql = $db->sql_build_query('SELECT_DISTINCT', array(
|
||||||
'SELECT' => 'u.username, u.username_clean, u.user_regdate, u.user_id',
|
'SELECT' => 'u.username, u.username_clean, u.user_regdate, u.user_id',
|
||||||
|
|
|
@ -393,8 +393,8 @@ class acp_prune
|
||||||
$sort_by_types = array('username', 'user_email', 'user_posts', 'user_regdate', 'user_lastvisit');
|
$sort_by_types = array('username', 'user_email', 'user_posts', 'user_regdate', 'user_lastvisit');
|
||||||
|
|
||||||
$where_sql = '';
|
$where_sql = '';
|
||||||
$where_sql .= ($username) ? ' AND username_clean ' . $db->sql_like_expression(str_replace('*', '%', utf8_clean_string($username))) : '';
|
$where_sql .= ($username) ? ' AND username_clean ' . $db->sql_like_expression(str_replace('*', $db->any_char, utf8_clean_string($username))) : '';
|
||||||
$where_sql .= ($email) ? ' AND user_email ' . $db->sql_like_expression(str_replace('*', '%', $email)) . ' ' : '';
|
$where_sql .= ($email) ? ' AND user_email ' . $db->sql_like_expression(str_replace('*', $db->any_char, $email)) . ' ' : '';
|
||||||
$where_sql .= (sizeof($joined)) ? " AND user_regdate " . $key_match[$joined_select] . ' ' . gmmktime(0, 0, 0, (int) $joined[1], (int) $joined[2], (int) $joined[0]) : '';
|
$where_sql .= (sizeof($joined)) ? " AND user_regdate " . $key_match[$joined_select] . ' ' . gmmktime(0, 0, 0, (int) $joined[1], (int) $joined[2], (int) $joined[0]) : '';
|
||||||
$where_sql .= ($count !== '') ? " AND user_posts " . $key_match[$count_select] . ' ' . (int) $count . ' ' : '';
|
$where_sql .= ($count !== '') ? " AND user_posts " . $key_match[$count_select] . ' ' . (int) $count . ' ' : '';
|
||||||
$where_sql .= (sizeof($active)) ? " AND user_lastvisit " . $key_match[$active_select] . " " . gmmktime(0, 0, 0, (int) $active[1], (int) $active[2], (int) $active[0]) : '';
|
$where_sql .= (sizeof($active)) ? " AND user_lastvisit " . $key_match[$active_select] . " " . gmmktime(0, 0, 0, (int) $active[1], (int) $active[2], (int) $active[0]) : '';
|
||||||
|
|
|
@ -1831,7 +1831,7 @@ class acp_users
|
||||||
// Select auth options
|
// Select auth options
|
||||||
$sql = 'SELECT auth_option, is_local, is_global
|
$sql = 'SELECT auth_option, is_local, is_global
|
||||||
FROM ' . ACL_OPTIONS_TABLE . '
|
FROM ' . ACL_OPTIONS_TABLE . '
|
||||||
WHERE auth_option ' . $db->sql_like_expression('%_') . '
|
WHERE auth_option ' . $db->sql_like_expression($db->any_char . '_') . '
|
||||||
AND is_global = 1
|
AND is_global = 1
|
||||||
ORDER BY auth_option';
|
ORDER BY auth_option';
|
||||||
$result = $db->sql_query($sql);
|
$result = $db->sql_query($sql);
|
||||||
|
@ -1851,7 +1851,7 @@ class acp_users
|
||||||
{
|
{
|
||||||
$sql = 'SELECT auth_option, is_local, is_global
|
$sql = 'SELECT auth_option, is_local, is_global
|
||||||
FROM ' . ACL_OPTIONS_TABLE . "
|
FROM ' . ACL_OPTIONS_TABLE . "
|
||||||
WHERE auth_option " . $db->sql_like_expression('%_') . "
|
WHERE auth_option " . $db->sql_like_expression($db->any_char . '_') . "
|
||||||
AND is_local = 1
|
AND is_local = 1
|
||||||
ORDER BY is_global DESC, auth_option";
|
ORDER BY is_global DESC, auth_option";
|
||||||
$result = $db->sql_query($sql);
|
$result = $db->sql_query($sql);
|
||||||
|
|
|
@ -968,7 +968,7 @@ class auth_admin extends auth
|
||||||
// Get permission type
|
// Get permission type
|
||||||
$sql = 'SELECT auth_option, auth_option_id
|
$sql = 'SELECT auth_option, auth_option_id
|
||||||
FROM ' . ACL_OPTIONS_TABLE . "
|
FROM ' . ACL_OPTIONS_TABLE . "
|
||||||
WHERE auth_option " . $db->sql_like_expression($permission_type . '%');
|
WHERE auth_option " . $db->sql_like_expression($permission_type . $db->any_char);
|
||||||
$result = $db->sql_query($sql);
|
$result = $db->sql_query($sql);
|
||||||
|
|
||||||
$auth_id_ary = array();
|
$auth_id_ary = array();
|
||||||
|
|
|
@ -842,7 +842,7 @@ class auth
|
||||||
{
|
{
|
||||||
if (strpos($auth_options, '%') !== false)
|
if (strpos($auth_options, '%') !== false)
|
||||||
{
|
{
|
||||||
$sql_opts = "AND $key " . $db->sql_like_expression($auth_options);
|
$sql_opts = "AND $key " . $db->sql_like_expression(str_replace('%', $db->any_char, $auth_options));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -873,7 +873,7 @@ class auth
|
||||||
{
|
{
|
||||||
if (strpos($option, '%') !== false)
|
if (strpos($option, '%') !== false)
|
||||||
{
|
{
|
||||||
$sql[] = $key . ' ' . $db->sql_like_expression($option);
|
$sql[] = $key . ' ' . $db->sql_like_expression(str_replace('%', $db->any_char, $option));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -49,6 +49,12 @@ class dbal
|
||||||
*/
|
*/
|
||||||
var $sql_layer = '';
|
var $sql_layer = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wildcards for matching any (%) or exactly one (_) character within LIKE expressions
|
||||||
|
*/
|
||||||
|
var $any_char;
|
||||||
|
var $one_char;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*/
|
*/
|
||||||
|
@ -63,6 +69,10 @@ class dbal
|
||||||
// Fill default sql layer based on the class being called.
|
// Fill default sql layer based on the class being called.
|
||||||
// This can be changed by the specified layer itself later if needed.
|
// This can be changed by the specified layer itself later if needed.
|
||||||
$this->sql_layer = substr(get_class($this), 5);
|
$this->sql_layer = substr(get_class($this), 5);
|
||||||
|
|
||||||
|
// Do not change this please! This variable is used to easy the use of it - and is hardcoded.
|
||||||
|
$this->any_char = chr(0) . '%';
|
||||||
|
$this->one_char = chr(0) . '_';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -193,17 +203,17 @@ class dbal
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Correctly adjust LIKE expression for special characters
|
* Correctly adjust LIKE expression for special characters
|
||||||
* Some DBMS are handling them in a different way we need to take into account
|
* 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 LIKE expression including the keyword!
|
||||||
*/
|
*/
|
||||||
function sql_like_expression($expression)
|
function sql_like_expression($expression)
|
||||||
{
|
{
|
||||||
// Standard for most DBMS
|
$expression = str_replace(array('_', '%'), array("\_", "\%"), $expression);
|
||||||
if (strpos($expression, '_') === false)
|
$expression = str_replace(array(chr(0) . "\_", chr(0) . "\%"), array('_', '%'), $expression);
|
||||||
{
|
|
||||||
return 'LIKE \'' . $this->sql_escape($expression) . '\'';
|
|
||||||
}
|
|
||||||
|
|
||||||
return 'LIKE \'' . $this->sql_escape(str_replace('_', "\_", $expression)) . '\'';
|
return $this->_sql_like_expression('LIKE \'' . $this->sql_escape($expression) . '\'');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -408,6 +408,15 @@ class dbal_firebird extends dbal
|
||||||
return str_replace("'", "''", $msg);
|
return str_replace("'", "''", $msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build LIKE expression
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _sql_like_expression($expression)
|
||||||
|
{
|
||||||
|
return $expression;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build db-specific query data
|
* Build db-specific query data
|
||||||
* @access private
|
* @access private
|
||||||
|
|
|
@ -309,19 +309,12 @@ class dbal_mssql extends dbal
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Correctly adjust LIKE expression for special characters
|
* Build LIKE expression
|
||||||
* MSSQL needs an escape character being defined
|
* @access private
|
||||||
*/
|
*/
|
||||||
function sql_like_expression($expression)
|
function _sql_like_expression($expression)
|
||||||
{
|
{
|
||||||
// Standard for most DBMS
|
return $expression . " ESCAPE '\\'";
|
||||||
if (strpos($expression, '_') === false)
|
|
||||||
{
|
|
||||||
return 'LIKE \'' . $this->sql_escape($expression) . '\'';
|
|
||||||
}
|
|
||||||
|
|
||||||
// sql_like_expression is only allowed directly within single quotes (to ease the use of it), therefore the special writing of ESCAPE below
|
|
||||||
return 'LIKE \'' . $this->sql_escape(str_replace('_', "\_", $expression)) . "' ESCAPE '\\'";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -320,19 +320,12 @@ class dbal_mssql_odbc extends dbal
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Correctly adjust LIKE expression for special characters
|
* Build LIKE expression
|
||||||
* MSSQL needs an escape character being defined
|
* @access private
|
||||||
*/
|
*/
|
||||||
function sql_like_expression($expression)
|
function _sql_like_expression($expression)
|
||||||
{
|
{
|
||||||
// Standard for most DBMS
|
return $expression . " ESCAPE '\\'";
|
||||||
if (strpos($expression, '_') === false)
|
|
||||||
{
|
|
||||||
return 'LIKE \'' . $this->sql_escape($expression) . '\'';
|
|
||||||
}
|
|
||||||
|
|
||||||
// sql_like_expression is only allowed directly within single quotes (to ease the use of it), therefore the special writing of ESCAPE below
|
|
||||||
return 'LIKE \'' . $this->sql_escape(str_replace('_', "\_", $expression)) . "' ESCAPE '\\'";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -276,6 +276,15 @@ class dbal_mysql extends dbal
|
||||||
return @mysql_real_escape_string($msg, $this->db_connect_id);
|
return @mysql_real_escape_string($msg, $this->db_connect_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build LIKE expression
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _sql_like_expression($expression)
|
||||||
|
{
|
||||||
|
return $expression;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build db-specific query data
|
* Build db-specific query data
|
||||||
* @access private
|
* @access private
|
||||||
|
|
|
@ -245,6 +245,15 @@ class dbal_mysqli extends dbal
|
||||||
return @mysqli_real_escape_string($this->db_connect_id, $msg);
|
return @mysqli_real_escape_string($this->db_connect_id, $msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build LIKE expression
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _sql_like_expression($expression)
|
||||||
|
{
|
||||||
|
return $expression;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Build db-specific query data
|
* Build db-specific query data
|
||||||
* @access private
|
* @access private
|
||||||
|
|
|
@ -533,6 +533,15 @@ class dbal_oracle extends dbal
|
||||||
return str_replace("'", "''", $msg);
|
return str_replace("'", "''", $msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build LIKE expression
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _sql_like_expression($expression)
|
||||||
|
{
|
||||||
|
return $expression . " ESCAPE '\\'";
|
||||||
|
}
|
||||||
|
|
||||||
function _sql_custom_build($stage, $data)
|
function _sql_custom_build($stage, $data)
|
||||||
{
|
{
|
||||||
return $data;
|
return $data;
|
||||||
|
|
|
@ -345,6 +345,15 @@ class dbal_postgres extends dbal
|
||||||
return @pg_escape_string($msg);
|
return @pg_escape_string($msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build LIKE expression
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _sql_like_expression($expression)
|
||||||
|
{
|
||||||
|
return $expression;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* return sql error array
|
* return sql error array
|
||||||
* @access private
|
* @access private
|
||||||
|
|
|
@ -247,12 +247,14 @@ class dbal_sqlite extends dbal
|
||||||
*/
|
*/
|
||||||
function sql_like_expression($expression)
|
function sql_like_expression($expression)
|
||||||
{
|
{
|
||||||
if (strpos($expression, '_') === false)
|
// 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.
|
||||||
return "LIKE '" . $this->sql_escape($expression) . "'";
|
$expression = str_replace(array(chr(0) . '_', chr(0) . '%'), array(chr(0) . '?', chr(0) . '*'), $expression);
|
||||||
}
|
|
||||||
|
|
||||||
return "GLOB '" . $this->sql_escape(str_replace('%', '*', $expression)) . "'";
|
$expression = str_replace(array('?', '*'), array("\?", "\*"), $expression);
|
||||||
|
$expression = str_replace(array(chr(0) . "\?", chr(0) . "\*"), array('?', '*'), $expression);
|
||||||
|
|
||||||
|
return 'GLOB \'' . $this->sql_escape($expression) . '\'';
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -3877,7 +3877,7 @@ function page_header($page_title = '', $display_online_list = true)
|
||||||
{
|
{
|
||||||
$f = request_var('f', 0);
|
$f = request_var('f', 0);
|
||||||
|
|
||||||
$reading_sql = ' AND s.session_page ' . $db->sql_like_expression("%_f_={$f}x%");
|
$reading_sql = ' AND s.session_page ' . $db->sql_like_expression("{$db->any_char}_f_={$f}x{$db->any_char}");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get number of online guests
|
// Get number of online guests
|
||||||
|
|
|
@ -2206,7 +2206,7 @@ function cache_moderators()
|
||||||
AND a.group_id = ug.group_id
|
AND a.group_id = ug.group_id
|
||||||
AND ' . $db->sql_in_set('ug.user_id', $ug_id_ary) . "
|
AND ' . $db->sql_in_set('ug.user_id', $ug_id_ary) . "
|
||||||
AND ug.user_pending = 0
|
AND ug.user_pending = 0
|
||||||
AND o.auth_option " . $db->sql_like_expression('m_%'),
|
AND o.auth_option " . $db->sql_like_expression('m_' . $db->any_char),
|
||||||
));
|
));
|
||||||
$result = $db->sql_query($sql);
|
$result = $db->sql_query($sql);
|
||||||
|
|
||||||
|
|
|
@ -273,7 +273,7 @@ class search_backend
|
||||||
$sql_where = '';
|
$sql_where = '';
|
||||||
foreach ($words as $word)
|
foreach ($words as $word)
|
||||||
{
|
{
|
||||||
$sql_where .= " OR search_keywords " . $db->sql_like_expression('%' . $word . '%');
|
$sql_where .= " OR search_keywords " . $db->sql_like_expression($db->any_char . $word . $db->any_char);
|
||||||
}
|
}
|
||||||
|
|
||||||
$sql = 'SELECT search_key
|
$sql = 'SELECT search_key
|
||||||
|
|
|
@ -226,7 +226,7 @@ class template
|
||||||
FROM ' . STYLES_TEMPLATE_DATA_TABLE . '
|
FROM ' . STYLES_TEMPLATE_DATA_TABLE . '
|
||||||
WHERE template_id = ' . $user->theme['template_id'] . "
|
WHERE template_id = ' . $user->theme['template_id'] . "
|
||||||
AND (template_filename = '" . $db->sql_escape($this->filename[$handle]) . "'
|
AND (template_filename = '" . $db->sql_escape($this->filename[$handle]) . "'
|
||||||
OR template_included " . $db->sql_like_expression('%' . $this->filename[$handle] . ':%') . ')';
|
OR template_included " . $db->sql_like_expression($db->any_char . $this->filename[$handle] . ':' . $db->any_char) . ')';
|
||||||
$result = $db->sql_query($sql);
|
$result = $db->sql_query($sql);
|
||||||
$row = $db->sql_fetchrow($result);
|
$row = $db->sql_fetchrow($result);
|
||||||
|
|
||||||
|
|
|
@ -148,7 +148,7 @@ class ucp_register
|
||||||
'email' => strtolower(request_var('email', '')),
|
'email' => strtolower(request_var('email', '')),
|
||||||
'email_confirm' => strtolower(request_var('email_confirm', '')),
|
'email_confirm' => strtolower(request_var('email_confirm', '')),
|
||||||
'confirm_code' => request_var('confirm_code', ''),
|
'confirm_code' => request_var('confirm_code', ''),
|
||||||
'lang' => request_var('lang', $user->lang_name),
|
'lang' => basename(request_var('lang', $user->lang_name)),
|
||||||
'tz' => request_var('tz', (float) $timezone),
|
'tz' => request_var('tz', (float) $timezone),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -1015,12 +1015,12 @@ switch ($mode)
|
||||||
{
|
{
|
||||||
for ($i = 97; $i < 123; $i++)
|
for ($i = 97; $i < 123; $i++)
|
||||||
{
|
{
|
||||||
$sql_where .= ' AND u.username_clean NOT ' . $db->sql_like_expression(chr($i) . '%');
|
$sql_where .= ' AND u.username_clean NOT ' . $db->sql_like_expression(chr($i) . $db->any_char);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ($first_char)
|
else if ($first_char)
|
||||||
{
|
{
|
||||||
$sql_where .= ' AND u.username_clean ' . $db->sql_like_expression(substr($first_char, 0, 1) . '%');
|
$sql_where .= ' AND u.username_clean ' . $db->sql_like_expression(substr($first_char, 0, 1) . $db->any_char);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Are we looking at a usergroup? If so, fetch additional info
|
// Are we looking at a usergroup? If so, fetch additional info
|
||||||
|
|
|
@ -100,7 +100,7 @@ if ($keywords || $author || $author_id || $search_id || $submit)
|
||||||
trigger_error(sprintf($user->lang['TOO_FEW_AUTHOR_CHARS'], $config['min_search_author_chars']));
|
trigger_error(sprintf($user->lang['TOO_FEW_AUTHOR_CHARS'], $config['min_search_author_chars']));
|
||||||
}
|
}
|
||||||
|
|
||||||
$sql_where = (strpos($author, '*') !== false) ? ' username_clean ' . $db->sql_like_expression(str_replace('*', '%', utf8_clean_string($author))) : " username_clean = '" . $db->sql_escape(utf8_clean_string($author)) . "'";
|
$sql_where = (strpos($author, '*') !== false) ? ' username_clean ' . $db->sql_like_expression(str_replace('*', $db->any_char, utf8_clean_string($author))) : " username_clean = '" . $db->sql_escape(utf8_clean_string($author)) . "'";
|
||||||
|
|
||||||
$sql = 'SELECT user_id
|
$sql = 'SELECT user_id
|
||||||
FROM ' . USERS_TABLE . "
|
FROM ' . USERS_TABLE . "
|
||||||
|
|
Loading…
Add table
Reference in a new issue