diff --git a/include/class.search.php b/include/class.search.php index 8965f2e45f7f52856d2ed728d4e6ad0c9c4dac59..74dc48638c2d5e7593eae4794aba5cf2a6d95544 100644 --- a/include/class.search.php +++ b/include/class.search.php @@ -330,16 +330,15 @@ class MysqlSearchBackend extends SearchBackend { $criteria = clone $criteria; $mode = ' IN NATURAL LANGUAGE MODE'; - // If using boolean operators, search in boolean mode - if (preg_match('/["+<>(~-]\w|\w["*)]/u', $query, $T = array())) + // If using boolean operators, search in boolean mode. This regex + // will ensure proper placement of operators, whitespace, and quotes + // in an effort to avoid crashing the query at MySQL + if (preg_match('/^(?:[(+<>~-]*(\w+[*]?|"[^"]+")[)]?(\s+|$))+$/u', $query, $T = array())) $mode = ' IN BOOLEAN MODE'; - #if (count(explode(' ', $query)) == 1) + #elseif (count(explode(' ', $query)) == 1) # $mode = ' WITH QUERY EXPANSION'; $query = $this->quote($query); $search = 'MATCH (Z1.title, Z1.content) AGAINST ('.db_input($query).$mode.')'; - $tables = array(); - $P = TABLE_PREFIX; - $sort = ''; switch ($criteria->model) { case false: @@ -353,10 +352,7 @@ class MysqlSearchBackend extends SearchBackend { "(SELECT COALESCE(Z3.`object_id`, Z5.`ticket_id`) as `ticket_id`, {} AS `relevance` FROM `:_search` Z1 LEFT JOIN `:thread_entry` Z2 ON (Z1.`object_type` = 'H' AND Z1.`object_id` = Z2.`id`) LEFT JOIN `:thread` Z3 ON (Z2.`thread_id` = Z3.`id` AND Z3.`object_type` = 'T') LEFT JOIN `:ticket` Z5 ON (Z1.`object_type` = 'T' AND Z1.`object_id` = Z5.`ticket_id`) WHERE {}) Z1"), ) )); - // XXX: This is extremely ugly $criteria->filter(array('ticket_id'=>new SqlCode('Z1.`ticket_id`')))->distinct('ticket_id'); - - // TODO: Consider sorting preferences } // TODO: Ensure search table exists; diff --git a/include/staff/tickets.inc.php b/include/staff/tickets.inc.php index 7b7cddd23e94e616481d7cdfda691b715864482f..8438ac2d4b844650e964619c1ae612f6a79f97a7 100644 --- a/include/staff/tickets.inc.php +++ b/include/staff/tickets.inc.php @@ -340,7 +340,7 @@ return false;"> <input type="hidden" name="search-type" value=""/> <div class="attached input"> <input type="text" class="basic-search" data-url="ajax.php/tickets/lookup" name="query" - autofocus size="30" value="<?php echo Format::htmlchars(urldecode($_REQUEST['query']), true); ?>" + autofocus size="30" value="<?php echo Format::htmlchars($_REQUEST['query'], true); ?>" autocomplete="off" autocorrect="off" autocapitalize="off"> <button type="submit" class="attached button"><i class="icon-search"></i> </button> diff --git a/scp/js/scp.js b/scp/js/scp.js index a47af3361a58e9d5f04bdee2eb5d8aa629b982c3..fe090490ab19626257041f5afbfbce29f9489f75 100644 --- a/scp/js/scp.js +++ b/scp/js/scp.js @@ -1173,7 +1173,7 @@ function __(s) { // Thanks, http://stackoverflow.com/a/487049 function addSearchParam(data) { - var kvp = document.location.search.substr(1).split('&'); + var kvp = document.location.search.substr(1).replace('+', ' ').split('&'); var i=kvp.length, x, params = {}; while (i--) { x = kvp[i].split('=');