diff --git a/phpBB/includes/search.php b/phpBB/includes/search.php index ce6fb935c3..09efc93ac9 100644 --- a/phpBB/includes/search.php +++ b/phpBB/includes/search.php @@ -19,11 +19,11 @@ * ***************************************************************************/ -function clean_words($mode, $entry, &$stopword_list, &$synonym_list) +function clean_words($mode, &$entry, &$synonym_list) { // Weird, $init_match doesn't work with static when double quotes (") are used... - static $drop_char_match = array('^', '$', '&', '(', ')', '<', '>', '`', "'", '|', ',', '@', '_', '?', '%', '-', '~', '+', '.', '[', ']', '{', '}', ':', '\\', '/', '=', '#', '\'', ';', '*', '!'); - static $drop_char_replace = array(" ", " ", " ", " ", " ", " ", " ", " ", "", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " " , " ", " ", " ", " ", " ", " ", " "); + static $drop_char_match = array('^', '$', '&', '(', ')', '<', '>', '`', "'", '|', ',', '@', '_', '?', '%', '-', '~', '+', '.', '[', ']', '{', '}', ':', '\\', '/', '=', '#', '\'', ';', '!'); + static $drop_char_replace = array(" ", " ", " ", " ", " ", " ", " ", " ", "", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " " , " ", " ", " ", " ", " ", " "); static $accent_match = array("ß", "à", "á", "â", "ã", "ä", "å", "æ", "ç", "è", "é", "ê", "ë", "ì", "í", "î", "ï", "ð", "ñ", "ò", "ó", "ô", "õ", "ö", "ø", "ù", "ú", "û", "ü", "ý", "þ", "ÿ"); static $accent_replace = array("s", "a", "a", "a", "a", "a", "a", "a", "c", "e", "e", "e", "e", "i", "i", "i", "i", "o", "n", "o", "o", "o", "o", "o", "o", "u", "u", "u", "u", "y", "t", "y"); @@ -62,26 +62,15 @@ function clean_words($mode, $entry, &$stopword_list, &$synonym_list) // for($i = 0; $i < count($drop_char_match); $i++) { - $entry = str_replace($drop_char_match[$i], $drop_char_replace[$i], $entry); + $entry = str_replace($drop_char_match[$i], $drop_char_replace[$i], $entry); } if( $mode == "post" ) { - // 'words' that consist of <=2 or >=50 characters are removed. - $entry = preg_replace("/\b([a-z0-9]{1,2}|[a-z0-9]{50,})\b/si", " ", $entry); - } + $entry = str_replace("*", " ", $entry); - if( !empty($stopword_list) ) - { - for ($j = 0; $j < count($stopword_list); $j++) - { - $filter_word = trim(strtolower($stopword_list[$j])); - - if( ( $filter_word != "and" && $filter_word != "or" && $filter_word != "not" ) || $mode == "post" ) - { - $entry = preg_replace("/\b" . phpbb_preg_quote($filter_word, "/") . "\b/is", " ", $entry); - } - } + // 'words' that consist of <=3 or >=50 characters are removed. + $entry = preg_replace("/\b([a-z0-9]{1,3}|[a-z0-9]{50,})\b/si", " ", $entry); } if( !empty($synonym_list) ) @@ -101,9 +90,16 @@ function clean_words($mode, $entry, &$stopword_list, &$synonym_list) return $entry; } -function split_words(&$entry) +function split_words(&$entry, $mode = "post") { - preg_match_all("/\b(\w[\w']*\w+|\w+?)\b/", $entry, $split_entries); + if( $mode == "post" ) + { + preg_match_all("/\b(\w[\w']*\w+|\w+?)\b/", $entry, $split_entries); + } + else + { + preg_match_all("/(\*?[a-z0-9]+\*?)|\b([a-z0-9]+)\b/is", $entry, $split_entries); + } return $split_entries[1]; } @@ -112,12 +108,11 @@ function add_search_words($post_id, $post_text, $post_title = "") { global $db, $phpbb_root_path, $board_config, $lang; - $stopword_array = @file($phpbb_root_path . "language/lang_" . $board_config['default_lang'] . "/search_stopwords.txt"); $synonym_array = @file($phpbb_root_path . "language/lang_" . $board_config['default_lang'] . "/search_synonyms.txt"); $search_raw_words = array(); - $search_raw_words['text'] = split_words(clean_words("post", $post_text, $stopword_array, $synonym_array)); - $search_raw_words['title'] = split_words(clean_words("post", $post_title, $stopword_array, $synonym_array)); + $search_raw_words['text'] = split_words(clean_words("post", $post_text, $synonym_array)); + $search_raw_words['title'] = split_words(clean_words("post", $post_title, $synonym_array)); while( list($word_in, $search_matches) = @each($search_raw_words) ) { diff --git a/phpBB/search.php b/phpBB/search.php index e486e93048..6f23612aa8 100644 --- a/phpBB/search.php +++ b/phpBB/search.php @@ -67,14 +67,12 @@ else $search_id = ( isset($HTTP_GET_VARS['search_id']) ) ? $HTTP_GET_VARS['search_id'] : ""; +$show_results = ( isset($HTTP_POST_VARS['showresults']) ) ? $HTTP_POST_VARS['showresults'] : "posts"; + if( isset($HTTP_POST_VARS['addterms']) ) { $search_all_terms = ( $HTTP_POST_VARS['addterms'] == "all" ) ? 1 : 0; } -else if( isset($HTTP_GET_VARS['addterms']) ) -{ - $search_all_terms = ( $HTTP_GET_VARS['addterms'] == "all" ) ? 1 : 0; -} else { $search_all_terms = 0; @@ -84,67 +82,25 @@ if( isset($HTTP_POST_VARS['searchfields']) ) { $search_msg_title = ( $HTTP_POST_VARS['searchfields'] == "all" ) ? 1 : 0; } -else if( isset($HTTP_GET_VARS['searchfields']) ) -{ - $search_msg_title = ( $HTTP_GET_VARS['searchfields'] == "all" ) ? 1 : 0; -} else { $search_msg_title = 0; } -if( isset($HTTP_POST_VARS['charsreqd']) || isset($HTTP_GET_VARS['charsreqd']) ) -{ - $return_chars = ( isset($HTTP_POST_VARS['charsreqd']) ) ? intval($HTTP_POST_VARS['charsreqd']) : intval($HTTP_GET_VARS['charsreqd']); -} -else -{ - $return_chars = 200; -} +$return_chars = ( isset($HTTP_POST_VARS['charsreqd']) ) ? intval($HTTP_POST_VARS['charsreqd']) : 200; -if( isset($HTTP_POST_VARS['searchcat']) || isset($HTTP_GET_VARS['searchcat']) ) -{ - $search_cat = ( isset($HTTP_POST_VARS['searchcat']) ) ? intval($HTTP_POST_VARS['searchcat']) : intval($HTTP_GET_VARS['searchcat']); -} -else -{ - $search_cat = -1; -} +$search_cat = ( isset($HTTP_POST_VARS['searchcat']) ) ? intval($HTTP_POST_VARS['searchcat']) : -1; +$search_forum = ( isset($HTTP_POST_VARS['searchforum']) ) ? intval($HTTP_POST_VARS['searchforum']) : -1; -if( isset($HTTP_POST_VARS['searchforum']) || isset($HTTP_GET_VARS['searchforum']) ) -{ - $search_forum = ( isset($HTTP_POST_VARS['searchforum']) ) ? intval($HTTP_POST_VARS['searchforum']) : intval($HTTP_GET_VARS['searchforum']); -} -else -{ - $search_forum = -1; -} +$sortby = ( isset($HTTP_POST_VARS['sortby']) ) ? intval($HTTP_POST_VARS['sortby']) : 0; -if( isset($HTTP_POST_VARS['sortby']) || isset($HTTP_GET_VARS['sortby']) ) +if( isset($HTTP_POST_VARS['sortdir']) ) { - $sortby = ( isset($HTTP_POST_VARS['sortby']) ) ? intval($HTTP_POST_VARS['sortby']) : intval($HTTP_GET_VARS['sortby']); + $sortby_dir = ( $HTTP_POST_VARS['sortdir'] == "DESC" ) ? "DESC" : "ASC"; } else { - $sortby = 0; -} - -if( isset($HTTP_POST_VARS['sortdir']) || isset($HTTP_GET_VARS['sortdir']) ) -{ - $sortby_dir = ( isset($HTTP_POST_VARS['sortdir']) ) ? $HTTP_POST_VARS['sortdir'] : $HTTP_GET_VARS['sortdir']; -} -else -{ - $sortby_dir = "DESC"; -} - -if( isset($HTTP_POST_VARS['showresults']) || isset($HTTP_GET_VARS['showresults']) ) -{ - $show_results = ( isset($HTTP_POST_VARS['showresults']) ) ? $HTTP_POST_VARS['showresults'] : $HTTP_GET_VARS['showresults']; -} -else -{ - $show_results = "posts"; + $sortby_dir = "DESC"; } if(!empty($HTTP_POST_VARS['resultdays']) ) @@ -189,9 +145,6 @@ if( $mode == "searchuser" ) } else if( $query_keywords != "" || $query_author != "" || $search_id ) { - - $search_sql = ""; - // // Cycle through options ... // @@ -203,8 +156,7 @@ else if( $query_keywords != "" || $query_author != "" || $search_id ) { $sql = "SELECT post_id FROM " . POSTS_TABLE . " - WHERE post_time >= " . $userdata['user_lastvisit'] . " - ORDER BY post_time DESC"; + WHERE post_time >= " . $userdata['user_lastvisit']; } else { @@ -219,10 +171,9 @@ else if( $query_keywords != "" || $query_author != "" || $search_id ) { $sql = "SELECT post_id FROM " . POSTS_TABLE . " - WHERE poster_id = " . $userdata['user_id'] . " - ORDER BY post_time DESC"; + WHERE poster_id = " . $userdata['user_id']; - $show_results = "topics"; + $show_results = "posts"; $sortby = 0; $sortby_dir = "DESC"; } @@ -254,8 +205,7 @@ else if( $query_keywords != "" || $query_author != "" || $search_id ) $sql = "SELECT post_id FROM " . POSTS_TABLE . " - WHERE poster_id IN ($matching_userids) - ORDER BY post_time DESC"; + WHERE poster_id IN ($matching_userids)"; } $result = $db->sql_query($sql); @@ -264,87 +214,25 @@ else if( $query_keywords != "" || $query_author != "" || $search_id ) message_die(GENERAL_ERROR, "Couldn't obtain matched posts list", "", __LINE__, __FILE__, $sql); } - $sql_post_id_in = ""; + $search_ids = array(); while( $row = $db->sql_fetchrow($result) ) { - if( $sql_post_id_in != "" ) - { - $sql_post_id_in .= ", "; - } - $sql_post_id_in .= $row['post_id']; - - $total_posts++; - } - - if( $sql_post_id_in != "" ) - { - if( $show_results == "posts" ) - { - $search_sql .= "p.post_id IN ($sql_post_id_in)"; - - if( $search_time ) - { - $search_sql .= " AND p.post_time >= $search_time "; - } - } - else - { - $search_time_sql = ""; - if( $search_time ) - { - $search_time_sql = "AND post_time >= $search_time"; - } - - $sql = "SELECT topic_id - FROM " . POSTS_TABLE . " - WHERE post_id IN ($sql_post_id_in) - $search_time_sql - GROUP BY topic_id"; - $result = $db->sql_query($sql); - if( !$result ) - { - message_die(GENERAL_ERROR, "Couldn't matched posts", "", __LINE__, __FILE__, $sql); - } - - $sql_post_id_in = ""; - while( $row = $db->sql_fetchrow($result) ) - { - if( $sql_post_id_in != "" ) - { - $sql_post_id_in .= ", "; - } - $sql_post_id_in .= $row['topic_id']; - } - - $search_sql .= "t.topic_id IN ($sql_post_id_in) "; - } + $search_ids[] = $row['post_id']; } - else - { - message_die(GENERAL_MESSAGE, $lang['No_search_match']); - } - } - else if( $search_id == "unanswered" ) - { - $search_sql = "t.topic_replies = 0 AND t.topic_moved_id = 0"; + $db->sql_freeresult($result); + + $total_match_count = count($search_ids); - // - // Basic requirements - // - $show_results = "topics"; - $sortby = 0; - $sortby_dir = "DESC"; } - else if( $query_keywords != "" || $query_author != "" ) + else if( $query_keywords != "" ) { $synonym_array = @file($phpbb_root_path . "language/lang_" . $board_config['default_lang'] . "/search_synonyms.txt"); - $stopword_array = @file($phpbb_root_path . "language/lang_" . $board_config['default_lang'] . "/search_stopwords.txt"); $split_search = array(); - $cleaned_search = clean_words("search", $query_keywords, $stopword_array, $synonym_array); - $split_search = split_words($cleaned_search); + $cleaned_search = clean_words("search", $query_keywords, $synonym_array); + $split_search = split_words($cleaned_search, "search"); $search_msg_only = ( !$search_msg_title ) ? "AND m.title_match = 0" : ""; @@ -377,7 +265,7 @@ else if( $query_keywords != "" || $query_author != "" || $search_id ) $match_word = str_replace("*", "%", $split_search[$i]); - $sql = "SELECT m.post_id + $sql = "SELECT m.post_id FROM " . SEARCH_WORD_TABLE . " w, " . SEARCH_MATCH_TABLE . " m WHERE w.word_text LIKE '$match_word' AND m.word_id = w.word_id @@ -430,122 +318,19 @@ else if( $query_keywords != "" || $query_author != "" || $search_id ) @reset($result_list); - $total_posts = 0; - $sql_post_id_in = ""; + $search_ids = array(); while( list($post_id, $matches) = each($result_list) ) { if( $matches ) { - if( $sql_post_id_in != "" ) - { - $sql_post_id_in .= ", "; - } - $sql_post_id_in .= $post_id; - - $total_posts++; + $search_ids[] = $post_id; } } - - // - // Author name search - // - if( $query_author != "" ) - { - $query_author = str_replace("*", "%", trim(str_replace("\'", "''", $query_author))); - } - - // - // Keyword search - // - if( $sql_post_id_in != "" ) - { - if( $show_results == "posts" ) - { - $search_sql .= ( $query_author == "" ) ? "p.post_id IN ($sql_post_id_in)" : "p.post_id IN ($sql_post_id_in) AND u.username LIKE '$query_author' "; - - if( $search_time ) - { - $search_sql .= " AND p.post_time >= $search_time "; - } - } - else - { - - $search_time_sql = ""; - if( $search_time ) - { - $search_time_sql = ( $query_author == "" ) ? "AND post_time >= $search_time " : "AND p.post_time >= $search_time "; - } - - if( $query_author == "" ) - { - $sql = "SELECT topic_id - FROM " . POSTS_TABLE . " - WHERE post_id IN ($sql_post_id_in) - $search_time_sql - GROUP BY topic_id"; - } - else - { - $sql = "SELECT p.topic_id - FROM " . POSTS_TABLE . " p, " . USERS_TABLE . " u - WHERE p.post_id IN ($sql_post_id_in) - AND u.username LIKE '$query_author' - AND p.poster_id = u.user_id - $search_time_sql - GROUP BY p.topic_id"; - } - $result = $db->sql_query($sql); - if( !$result ) - { - message_die(GENERAL_ERROR, "Couldn't matched posts", "", __LINE__, __FILE__, $sql); - } - - if( $db->sql_numrows($result) ) - { - $sql_post_id_in = ""; - while( $row = $db->sql_fetchrow($result) ) - { - if( $sql_post_id_in != "" ) - { - $sql_post_id_in .= ", "; - } - $sql_post_id_in .= $row['topic_id']; - } - - $search_sql .= "t.topic_id IN ($sql_post_id_in) "; - - $db->sql_freeresult($result); - } - else - { - message_die(GENERAL_MESSAGE, $lang['No_search_match']); - } - } - } - else - { - message_die(GENERAL_MESSAGE, $lang['No_search_match']); - } + + unset($result_list); + $total_match_count = count($search_ids); } - // - // Define common SQL - // - $sql_fields = ( $show_results == "posts" ) ? "pt.post_text, pt.bbcode_uid, pt.post_subject, p.post_id, p.post_time, p.post_username, p.enable_bbcode, p.enable_html, p.enable_smilies, p.enable_sig, f.forum_id, f.forum_name, t.topic_id, t.topic_title, t.topic_poster, t.topic_time, t.topic_views, t.topic_replies, u.username, u.user_id, u.user_sig, u.user_sig_bbcode_uid" : "f.forum_id, f.forum_name, t.topic_id, t.topic_title, t.topic_poster, t.topic_time, t.topic_views, t.topic_replies, t.topic_last_post_id, u.username, u.user_id, u2.username as user2, u2.user_id as id2, p.post_time, p.post_username" ; - - $sql_from = ( $show_results == "posts" ) ? FORUMS_TABLE . " f, " . TOPICS_TABLE . " t, " . USERS_TABLE . " u, " . POSTS_TABLE . " p, " . POSTS_TEXT_TABLE . " pt" : FORUMS_TABLE . " f, " . TOPICS_TABLE . " t, " . USERS_TABLE . " u, " . POSTS_TABLE . " p, " . USERS_TABLE . " u2"; - - $sql_where = ( $show_results == "posts" ) ? "pt.post_id = p.post_id AND f.forum_id = p.forum_id AND p.topic_id = t.topic_id AND p.poster_id = u.user_id" : "f.forum_id = t.forum_id AND u.user_id = t.topic_poster AND p.post_id = t.topic_last_post_id AND u2.user_id = p.poster_id"; - - // - // Build query ... - // - $sql = "SELECT $sql_fields - FROM $sql_from "; - - $sql .= "WHERE $search_sql AND $sql_where "; - // // If user is logged in then we'll check to see which (if any) private // forums they are allowed to view and include them in the search. @@ -561,10 +346,8 @@ else if( $query_keywords != "" || $query_author != "" || $search_id ) { message_die(GENERAL_MESSAGE, $lang['No_searchable_forums']); } - else - { - $auth_sql = "f.forum_id = $search_forum"; - } + + $auth_sql = "f.forum_id = $search_forum"; } else { @@ -594,33 +377,153 @@ else if( $query_keywords != "" || $query_author != "" || $search_id ) } } + // + // Author name search + // + if( $query_author != "" ) + { + $query_author = str_replace("*", "%", trim(str_replace("\'", "''", $query_author))); + } + + if( $total_match_count ) + { + if( $show_results == "topics" ) + { + $where_sql = ""; + + if( $search_time ) + { + $where_sql .= ( $query_author == "" && $auth_sql == "" ) ? " AND post_time >= $search_time " : " AND p.post_time >= $search_time "; + } + + if( $query_author == "" && $auth_sql == "" ) + { + $sql = "SELECT topic_id + FROM " . POSTS_TABLE . " + WHERE post_id IN (" . implode(", ", $search_ids) . ") + $where_sql + GROUP BY topic_id"; + } + else + { + $from_sql = POSTS_TABLE . " p"; + + if( $query_author != "" ) + { + $from_sql .= ", " . USERS_TABLE . " u"; + $where_sql .= " AND u.user_id = p.poster_id AND u.username LIKE '$query_author' "; + } + + if( $auth_sql != "" ) + { + $from_sql .= ", " . FORUMS_TABLE . " f"; + $where_sql .= " AND f.forum_id = p.forum_id AND $auth_sql"; + } + + $sql = "SELECT p.topic_id + FROM $from_sql + WHERE p.post_id IN (" . implode(", ", $search_ids) . ") + $where_sql + GROUP BY p.topic_id"; + } + + $result = $db->sql_query($sql); + if( !$result ) + { + message_die(GENERAL_ERROR, "Couldn't obtain topic ids", "", __LINE__, __FILE__, $sql); + } + + $search_ids = array(); + while( $row = $db->sql_fetchrow($result) ) + { + $search_ids[] = $row['topic_id']; + } + + $db->sql_freeresult($result); + + $total_match_count = count($search_ids); + + } + else if( $query_author != "" || $search_time || $auth_sql != "" ) + { + $where_sql = ( $query_author == "" && $auth_sql == "" ) ? "post_id IN (" . implode(", ", $search_ids) . ")" : "p.post_id IN (" . implode(", ", $search_ids) . ")"; + $from_sql = ( $query_author == "" && $auth_sql == "" ) ? POSTS_TABLE : POSTS_TABLE . " p"; + + if( $search_time ) + { + $where_sql .= ( $query_author == "" && $auth_sql == "" ) ? " AND post_time >= $search_time " : " AND p.post_time >= $search_time"; + } + + if( $auth_sql != "" ) + { + $from_sql .= ", " . FORUMS_TABLE . " f"; + $where_sql .= " AND f.forum_id = p.forum_id AND $auth_sql"; + } + + if( $query_author != "" ) + { + $from_sql .= ", " . USERS_TABLE . " u"; + $where_sql .= " AND u.user_id = p.poster_id AND u.username LIKE '$query_author'"; + } + + $sql = "SELECT p.post_id + FROM $from_sql + WHERE $where_sql"; + $result = $db->sql_query($sql); + if( !$result ) + { + message_die(GENERAL_ERROR, "Couldn't obtain post ids", "", __LINE__, __FILE__, $sql); + } + + $search_ids = array(); + while( $row = $db->sql_fetchrow($result) ) + { + $search_ids[] = $row['post_id']; + } + + $db->sql_freeresult($result); + + $total_match_count = count($search_ids); + } + } + else if( $search_id == "unanswered" ) + { + + $sql = "SELECT topic_id + FROM " . TOPICS_TABLE . " + WHERE topic_replies = 0 + AND topic_moved_id = 0"; + $result = $db->sql_query($sql); + if( !$result ) + { + message_die(GENERAL_ERROR, "Couldn't obtain post ids", "", __LINE__, __FILE__, $sql); + } + + $search_ids = array(); + while( $row = $db->sql_fetchrow($result) ) + { + $search_ids[] = $row['topic_id']; + } + + $db->sql_freeresult($result); + + $total_match_count = count($search_ids); + + // + // Basic requirements + // + $show_results = "topics"; + $sortby = 0; + $sortby_dir = "DESC"; + } + + // // Finish building query (for all combinations) // and run it ... // - if( $search_sql != "" || $search_id == "newposts" || $search_id == "egosearch" || $search_id == "unanswered" ) + if( $total_match_count ) { - if( $auth_sql != "" ) - { - $sql .= " AND " . $auth_sql; - } - - $sql .= " ORDER BY " . $sortby_sql[$sortby] . " $sortby_dir"; - - // - // Throw in a limit of 1500 posts/topics ... - // - $sql .= " LIMIT 1500"; - - if( !$result = $db->sql_query($sql) ) - { - message_die(GENERAL_ERROR, "Couldn't obtain search results", "", __LINE__, __FILE__, $sql); - } - - $total_match_count = $db->sql_numrows($result); - - $searchset = $db->sql_fetchrowset($result); - // // Clean up search results table // @@ -628,20 +531,16 @@ else if( $query_keywords != "" || $query_author != "" || $search_id ) FROM " . SESSIONS_TABLE; if( $result = $db->sql_query($sql) ) { - $delete_search_id_sql = ""; + $delete_search_ids = array(); while( $row = $db->sql_fetchrow($result) ) { - if( $delete_search_id_sql != "" ) - { - $delete_search_id_sql .= ", "; - } - $delete_search_id_sql .= "'" . $row['session_id'] . "'"; + $delete_search_ids[] = "'" . $row['session_id'] . "'"; } - if( $delete_search_id_sql != "" ) + if( count($delete_search_ids) ) { $sql = "DELETE FROM " . SEARCH_TABLE . " - WHERE session_id NOT IN ($delete_search_id_sql)"; + WHERE session_id NOT IN (" . implode(", ", $delete_search_ids) . ")"; if( !$result = $db->sql_query($sql) ) { message_die(GENERAL_ERROR, "Couldn't delete old search id sessions", "", __LINE__, __FILE__, $sql); @@ -654,19 +553,7 @@ else if( $query_keywords != "" || $query_author != "" || $search_id ) // if( $total_match_count ) { - $search_results = ""; - for($i = 0; $i < count($searchset); $i++) - { - if( $show_results == "posts") - { - $search_results .= ($search_results != "") ? ", " . $searchset[$i]['post_id'] : $searchset[$i]['post_id']; - } - else - { - $search_results .= ($search_results != "") ? ", " . $searchset[$i]['topic_id'] : $searchset[$i]['topic_id']; - } - } - + $search_results = implode(", ", $search_ids); $per_page = ( $show_results == "posts" ) ? $board_config['posts_per_page'] : $board_config['topics_per_page']; // @@ -675,12 +562,17 @@ else if( $query_keywords != "" || $query_author != "" || $search_id ) // $store_search_data = array(); $store_search_data['results'] = $search_results; - $store_search_data['word_array'] = $split_search; $store_search_data['match_count'] = $total_match_count; + $store_search_data['word_array'] = $split_search; + + $store_search_data['sort_by'] = $sortby; + $store_search_data['sortby_dir'] = $sortby_dir; + $store_search_data['show_results'] = $show_results; + $store_search_data['return_chars'] = $return_chars; + $result_array = serialize($store_search_data); unset($store_search_data); - unset($search_results); mt_srand ((double) microtime() * 1000000); $search_id = mt_rand(); @@ -704,78 +596,85 @@ else if( $query_keywords != "" || $query_author != "" || $search_id ) message_die(GENERAL_MESSAGE, $lang['No_search_match']); } } - else + else if( isset($HTTP_GET_VARS['search_id']) ) { - $search_id = $HTTP_GET_VARS['search_id']; + $search_id = intval($HTTP_GET_VARS['search_id']); $sql = "SELECT search_array FROM " . SEARCH_TABLE . " - WHERE search_id = '$search_id' + WHERE search_id = $search_id AND session_id = '". $userdata['session_id'] . "'"; if( !$result = $db->sql_query($sql) ) { message_die(GENERAL_ERROR, "Couldn't obtain search results", "", __LINE__, __FILE__, $sql); } - if( $db->sql_numrows($result) ) + if( $row = $db->sql_fetchrow($result) ) { - $row = $db->sql_fetchrow($result); - $search_data = unserialize($row['search_array']); unset($row); $search_results = $search_data['results']; $total_match_count = $search_data['match_count']; + $split_search = $search_data['word_array']; - if( $show_results == "posts" ) - { - $sql = "SELECT pt.post_text, pt.bbcode_uid, pt.post_subject, p.*, f.forum_id, f.forum_name, t.*, u.username, u.user_id, u.user_sig, u.user_sig_bbcode_uid - FROM " . FORUMS_TABLE . " f, " . TOPICS_TABLE . " t, " . USERS_TABLE . " u, " . POSTS_TABLE . " p, " . POSTS_TEXT_TABLE . " pt - WHERE p.post_id IN ($search_results) - AND pt.post_id = p.post_id - AND f.forum_id = p.forum_id - AND p.topic_id = t.topic_id - AND p.poster_id = u.user_id"; - } - else - { - $sql = "SELECT t.*, f.forum_id, f.forum_name, u.username, u.user_id, u2.username as user2, u2.user_id as id2, p.post_time, p.post_username - FROM " . TOPICS_TABLE . " t, " . FORUMS_TABLE . " f, " . USERS_TABLE . " u, " . USERS_TABLE . " u2, " . POSTS_TABLE . " p - WHERE t.topic_id IN ($search_results) - AND f.forum_id = t.forum_id - AND u.user_id = t.topic_poster - AND p.post_id = t.topic_last_post_id - AND p.poster_id = u2.user_id"; - } - - $per_page = ( $show_results == "posts" ) ? $board_config['posts_per_page'] : $board_config['topics_per_page']; + $sortby = $search_data['sort_by']; + $sortby_dir = $search_data['sortby_dir']; + $show_results = $search_data['show_results']; + $return_chars = $search_data['return_chars']; - $sql .= " ORDER BY " . $sortby_sql[$sortby] . " $sortby_dir LIMIT $start, " . $per_page; - - if( !$result = $db->sql_query($sql) ) - { - message_die(GENERAL_ERROR, "Couldn't obtain search results", "", __LINE__, __FILE__, $sql); - } - - $searchset = $db->sql_fetchrowset($result); - - $db->sql_freeresult($result); } else { header("Location: " . append_sid("search.$phpEx", true)); } } - - if( count($searchset) ) + else { - // - // Output header - // - $page_title = $lang['Search']; - include($phpbb_root_path . 'includes/page_header.'.$phpEx); + message_die(GENERAL_MESSAGE, $lang['No_search_match']); + } + if( $search_results != "" ) + { + if( $show_results == "posts" ) + { + $sql = "SELECT pt.post_text, pt.bbcode_uid, pt.post_subject, p.*, f.forum_id, f.forum_name, t.*, u.username, u.user_id, u.user_sig, u.user_sig_bbcode_uid + FROM " . FORUMS_TABLE . " f, " . TOPICS_TABLE . " t, " . USERS_TABLE . " u, " . POSTS_TABLE . " p, " . POSTS_TEXT_TABLE . " pt + WHERE p.post_id IN ($search_results) + AND pt.post_id = p.post_id + AND f.forum_id = p.forum_id + AND p.topic_id = t.topic_id + AND p.poster_id = u.user_id"; + } + else + { + $sql = "SELECT t.*, f.forum_id, f.forum_name, u.username, u.user_id, u2.username as user2, u2.user_id as id2, p.post_time, p.post_username + FROM " . TOPICS_TABLE . " t, " . FORUMS_TABLE . " f, " . USERS_TABLE . " u, " . USERS_TABLE . " u2, " . POSTS_TABLE . " p + WHERE t.topic_id IN ($search_results) + AND f.forum_id = t.forum_id + AND u.user_id = t.topic_poster + AND p.post_id = t.topic_last_post_id + AND p.poster_id = u2.user_id"; + } + + $per_page = ( $show_results == "posts" ) ? $board_config['posts_per_page'] : $board_config['topics_per_page']; + + $sql .= " ORDER BY " . $sortby_sql[$sortby] . " $sortby_dir LIMIT $start, " . $per_page; + + if( !$result = $db->sql_query($sql) ) + { + message_die(GENERAL_ERROR, "Couldn't obtain search results", "", __LINE__, __FILE__, $sql); + } + + $searchset = array(); + while( $row = $db->sql_fetchrow($result) ) + { + $searchset[] = $row; + } + + $db->sql_freeresult($result); + // // Define censored word matches // @@ -783,7 +682,13 @@ else if( $query_keywords != "" || $query_author != "" || $search_id ) $replacement_word = array(); obtain_word_list($orig_word, $replacement_word); - if( $showresults == "posts" ) + // + // Output header + // + $page_title = $lang['Search']; + include($phpbb_root_path . 'includes/page_header.'.$phpEx); + + if( $show_results == "posts" ) { $template->set_filenames(array( "body" => "search_results_posts.tpl", @@ -827,8 +732,8 @@ else if( $query_keywords != "" || $query_author != "" || $search_id ) { $highlight_active .= " " . $split_word; - $search_string[] = "#\b(" . str_replace("\*", ".*?", phpbb_preg_quote($split_word, "#")) . ")(?!.*?<\/a>)(?!.*?\[/url\])\b#i"; - $replace_string[] = "\\1"; + $search_string[] = "#\b(" . str_replace("\*", ".*?", phpbb_preg_quote($split_word, "#")) . ")(?!.*?<\/a>)(?!.*?\[/url\])(?!.*?<\/span>)\b#i"; + $replace_string[] = '\\1'; for ($k = 0; $k < count($synonym_array); $k++) { @@ -836,8 +741,8 @@ else if( $query_keywords != "" || $query_author != "" || $search_id ) if( $replace_synonym == $split_word ) { - $search_string[] = "#\b(" . str_replace("\*", ".*?", phpbb_preg_quote($replace_synonym, "#")) . ")(?!.*?<\/a>)(?!.*?\[/url\])\b#i"; - $replace_string[] = "\\1"; + $search_string[] = "#\b(" . str_replace("\*", ".*?", phpbb_preg_quote($replace_synonym, "#")) . ")(?!.*?<\/a>)(?!.*?\[/url\])(?!.*?<\/span>)\b#i"; + $replace_string[] = '\\1'; $highlight_active .= " " . $match_synonym; } @@ -850,7 +755,7 @@ else if( $query_keywords != "" || $query_author != "" || $search_id ) $tracking_topics = ( isset($HTTP_COOKIE_VARS[$board_config['cookie_name'] . "_t"]) ) ? unserialize($HTTP_COOKIE_VARS[$board_config['cookie_name'] . "_t"]) : array(); $tracking_forums = ( isset($HTTP_COOKIE_VARS[$board_config['cookie_name'] . "_f"]) ) ? unserialize($HTTP_COOKIE_VARS[$board_config['cookie_name'] . "_f"]) : array(); - for($i = 0; $i < min($per_page, count($searchset)); $i++) + for($i = 0; $i < count($searchset); $i++) { $forum_url = append_sid("viewforum.$phpEx?" . POST_FORUM_URL . "=" . $searchset[$i]['forum_id']); $topic_url = append_sid("viewtopic.$phpEx?" . POST_TOPIC_URL . "=" . $searchset[$i]['topic_id'] . "&highlight=$highlight_active"); @@ -865,7 +770,7 @@ else if( $query_keywords != "" || $query_author != "" || $search_id ) $forum_id = $searchset[$i]['forum_id']; $topic_id = $searchset[$i]['topic_id']; - if( $showresults == "posts" ) + if( $show_results == "posts" ) { if( isset($return_chars) ) { @@ -891,37 +796,19 @@ else if( $query_keywords != "" || $query_author != "" || $search_id ) } else { - $user_sig = $searchset[$i]['user_sig']; - $user_sig_bbcode_uid = $searchset[$i]['user_sig_bbcode_uid']; - if( !$board_config['allow_html'] ) { - if( $user_sig != "" && $searchset[$i]['enable_sig'] && $userdata['user_allowhtml'] ) - { - $user_sig = preg_replace("#(<)([\/]?.*?)(>)#is", "<\\2>", $user_sig); - } - if( $postrow[$i]['enable_html'] ) { $message = preg_replace("#(<)([\/]?.*?)(>)#is", "<\\2>", $message); } } - if( $user_sig != "" && $searchset[$i]['enable_sig'] && $user_sig_bbcode_uid != "" ) - { - $user_sig = ( $board_config['allow_bbcode'] ) ? bbencode_second_pass($user_sig, $user_sig_bbcode_uid) : preg_replace("/\:[0-9a-z\:]+\]/si", "]", $user_sig); - } - if( $bbcode_uid != "" ) { $message = ( $board_config['allow_bbcode'] ) ? bbencode_second_pass($message, $bbcode_uid) : preg_replace("/\:[0-9a-z\:]+\]/si", "]", $message); } - if( $searchset[$i]['enable_sig'] ) - { - $message .= "

_________________
" . $user_sig; - } - $message = make_clickable($message); if( count($search_string) ) @@ -1208,7 +1095,7 @@ else if( $query_keywords != "" || $query_author != "" || $search_id ) } } - $base_url = "search.$phpEx?search_id=$search_id&showresults=" . $show_results . "&sortby=" . $sortby . "&sortdir=" . $sortby_dir . "&charsreqd=" . $return_chars; + $base_url = "search.$phpEx?search_id=$search_id"; $template->assign_vars(array( "PAGINATION" => generate_pagination($base_url, $total_match_count, $per_page, $start),