[ Index ]

PHP Cross Reference of phpBB-3.2.2-deutsch

title

Body

[close]

/ -> search.php (source)

   1  <?php
   2  /**
   3  *
   4  * This file is part of the phpBB Forum Software package.
   5  *
   6  * @copyright (c) phpBB Limited <https://www.phpbb.com>
   7  * @license GNU General Public License, version 2 (GPL-2.0)
   8  *
   9  * For full copyright and license information, please see
  10  * the docs/CREDITS.txt file.
  11  *
  12  */
  13  
  14  /**
  15  * @ignore
  16  */
  17  define('IN_PHPBB', true);
  18  $phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
  19  $phpEx = substr(strrchr(__FILE__, '.'), 1);
  20  include($phpbb_root_path . 'common.' . $phpEx);
  21  
  22  // Start session management
  23  $user->session_begin();
  24  $auth->acl($user->data);
  25  $user->setup('search');
  26  
  27  // Define initial vars
  28  $mode            = $request->variable('mode', '');
  29  $search_id        = $request->variable('search_id', '');
  30  $start            = max($request->variable('start', 0), 0);
  31  $post_id        = $request->variable('p', 0);
  32  $topic_id        = $request->variable('t', 0);
  33  $view            = $request->variable('view', '');
  34  
  35  $submit            = $request->variable('submit', false);
  36  $keywords        = $request->variable('keywords', '', true);
  37  $add_keywords    = $request->variable('add_keywords', '', true);
  38  $author            = $request->variable('author', '', true);
  39  $author_id        = $request->variable('author_id', 0);
  40  $show_results    = ($topic_id) ? 'posts' : $request->variable('sr', 'posts');
  41  $show_results    = ($show_results == 'posts') ? 'posts' : 'topics';
  42  $search_terms    = $request->variable('terms', 'all');
  43  $search_fields    = $request->variable('sf', 'all');
  44  $search_child    = $request->variable('sc', true);
  45  
  46  $sort_days        = $request->variable('st', 0);
  47  $sort_key        = $request->variable('sk', 't');
  48  $sort_dir        = $request->variable('sd', 'd');
  49  
  50  $return_chars    = $request->variable('ch', ($topic_id) ? -1 : 300);
  51  $search_forum    = $request->variable('fid', array(0));
  52  
  53  // We put login boxes for the case if search_id is newposts, egosearch or unreadposts
  54  // because a guest should be able to log in even if guests search is not permitted
  55  
  56  switch ($search_id)
  57  {
  58      // Egosearch is an author search
  59      case 'egosearch':
  60          $author_id = $user->data['user_id'];
  61          if ($user->data['user_id'] == ANONYMOUS)
  62          {
  63              login_box('', $user->lang['LOGIN_EXPLAIN_EGOSEARCH']);
  64          }
  65      break;
  66  
  67      // Search for unread posts needs to be allowed and user to be logged in if topics tracking for guests is disabled
  68      case 'unreadposts':
  69          if (!$config['load_unreads_search'])
  70          {
  71              $template->assign_var('S_NO_SEARCH', true);
  72              trigger_error('NO_SEARCH_UNREADS');
  73          }
  74          else if (!$config['load_anon_lastread'] && !$user->data['is_registered'])
  75          {
  76              login_box('', $user->lang['LOGIN_EXPLAIN_UNREADSEARCH']);
  77          }
  78      break;
  79  
  80      // The "new posts" search uses user_lastvisit which is user based, so it should require user to log in.
  81      case 'newposts':
  82          if ($user->data['user_id'] == ANONYMOUS)
  83          {
  84              login_box('', $user->lang['LOGIN_EXPLAIN_NEWPOSTS']);
  85          }
  86      break;
  87  
  88      default:
  89          // There's nothing to do here for now ;)
  90      break;
  91  }
  92  
  93  // Is user able to search? Has search been disabled?
  94  if (!$auth->acl_get('u_search') || !$auth->acl_getf_global('f_search') || !$config['load_search'])
  95  {
  96      $template->assign_var('S_NO_SEARCH', true);
  97      trigger_error('NO_SEARCH');
  98  }
  99  
 100  // Check search load limit
 101  if ($user->load && $config['limit_search_load'] && ($user->load > doubleval($config['limit_search_load'])))
 102  {
 103      $template->assign_var('S_NO_SEARCH', true);
 104      trigger_error('NO_SEARCH_LOAD');
 105  }
 106  
 107  // It is applicable if the configuration setting is non-zero, and the user cannot
 108  // ignore the flood setting, and the search is a keyword search.
 109  $interval = ($user->data['user_id'] == ANONYMOUS) ? $config['search_anonymous_interval'] : $config['search_interval'];
 110  if ($interval && !in_array($search_id, array('unreadposts', 'unanswered', 'active_topics', 'egosearch')) && !$auth->acl_get('u_ignoreflood'))
 111  {
 112      if ($user->data['user_last_search'] > time() - $interval)
 113      {
 114          $template->assign_var('S_NO_SEARCH', true);
 115          trigger_error($user->lang('NO_SEARCH_TIME', (int) ($user->data['user_last_search'] + $interval - time())));
 116      }
 117  }
 118  
 119  // Define some vars
 120  $limit_days        = array(0 => $user->lang['ALL_RESULTS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
 121  $sort_by_text    = array('a' => $user->lang['SORT_AUTHOR'], 't' => $user->lang['SORT_TIME'], 'f' => $user->lang['SORT_FORUM'], 'i' => $user->lang['SORT_TOPIC_TITLE'], 's' => $user->lang['SORT_POST_SUBJECT']);
 122  
 123  $s_limit_days = $s_sort_key = $s_sort_dir = $u_sort_param = '';
 124  gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param);
 125  
 126  /* @var $phpbb_content_visibility \phpbb\content_visibility */
 127  $phpbb_content_visibility = $phpbb_container->get('content.visibility');
 128  
 129  /* @var $pagination \phpbb\pagination */
 130  $pagination = $phpbb_container->get('pagination');
 131  
 132  /**
 133  * This event allows you to alter the above parameters, such as keywords and submit
 134  *
 135  * @event core.search_modify_submit_parameters
 136  * @var    string    keywords    The search keywords
 137  * @var    string    author        Specifies the author match, when ANONYMOUS is also a search-match
 138  * @var    int        author_id    ID of the author to search by
 139  * @var    string    search_id    Predefined search type name
 140  * @var    bool    submit        Whether or not the form has been submitted
 141  * @since 3.1.10-RC1
 142  */
 143  $vars = array(
 144      'keywords',
 145      'author',
 146      'author_id',
 147      'search_id',
 148      'submit',
 149  );
 150  extract($phpbb_dispatcher->trigger_event('core.search_modify_submit_parameters', compact($vars)));
 151  
 152  if ($keywords || $author || $author_id || $search_id || $submit)
 153  {
 154      // clear arrays
 155      $id_ary = array();
 156  
 157      // If we are looking for authors get their ids
 158      $author_id_ary = array();
 159      $sql_author_match = '';
 160      if ($author_id)
 161      {
 162          $author_id_ary[] = $author_id;
 163      }
 164      else if ($author)
 165      {
 166          if ((strpos($author, '*') !== false) && (utf8_strlen(str_replace(array('*', '%'), '', $author)) < $config['min_search_author_chars']))
 167          {
 168              trigger_error($user->lang('TOO_FEW_AUTHOR_CHARS', (int) $config['min_search_author_chars']));
 169          }
 170  
 171          $sql_where = (strpos($author, '*') !== false) ? ' username_clean ' . $db->sql_like_expression(str_replace('*', $db->get_any_char(), utf8_clean_string($author))) : " username_clean = '" . $db->sql_escape(utf8_clean_string($author)) . "'";
 172  
 173          $sql = 'SELECT user_id
 174              FROM ' . USERS_TABLE . "
 175              WHERE $sql_where
 176                  AND user_type <> " . USER_IGNORE;
 177          $result = $db->sql_query_limit($sql, 100);
 178  
 179          while ($row = $db->sql_fetchrow($result))
 180          {
 181              $author_id_ary[] = (int) $row['user_id'];
 182          }
 183          $db->sql_freeresult($result);
 184  
 185          $sql_where = (strpos($author, '*') !== false) ? ' post_username ' . $db->sql_like_expression(str_replace('*', $db->get_any_char(), utf8_clean_string($author))) : " post_username = '" . $db->sql_escape(utf8_clean_string($author)) . "'";
 186  
 187          $sql = 'SELECT 1 as guest_post
 188              FROM ' . POSTS_TABLE . "
 189              WHERE $sql_where
 190                  AND poster_id = " . ANONYMOUS;
 191          $result = $db->sql_query_limit($sql, 1);
 192          $found_guest_post = $db->sql_fetchfield('guest_post');
 193          $db->sql_freeresult($result);
 194  
 195          if ($found_guest_post)
 196          {
 197              $author_id_ary[] = ANONYMOUS;
 198              $sql_author_match = (strpos($author, '*') !== false) ? ' ' . $db->sql_like_expression(str_replace('*', $db->get_any_char(), utf8_clean_string($author))) : " = '" . $db->sql_escape(utf8_clean_string($author)) . "'";
 199          }
 200  
 201          if (!count($author_id_ary))
 202          {
 203              trigger_error('NO_SEARCH_RESULTS');
 204          }
 205      }
 206  
 207      // if we search in an existing search result just add the additional keywords. But we need to use "all search terms"-mode
 208      // so we can keep the old keywords in their old mode, but add the new ones as required words
 209      if ($add_keywords)
 210      {
 211          if ($search_terms == 'all')
 212          {
 213              $keywords .= ' ' . $add_keywords;
 214          }
 215          else
 216          {
 217              $search_terms = 'all';
 218              $keywords = implode(' |', explode(' ', preg_replace('#\s+#u', ' ', $keywords))) . ' ' .$add_keywords;
 219          }
 220      }
 221  
 222      // Which forums should not be searched? Author searches are also carried out in unindexed forums
 223      if (empty($keywords) && count($author_id_ary))
 224      {
 225          $ex_fid_ary = array_keys($auth->acl_getf('!f_read', true));
 226      }
 227      else
 228      {
 229          $ex_fid_ary = array_unique(array_merge(array_keys($auth->acl_getf('!f_read', true)), array_keys($auth->acl_getf('!f_search', true))));
 230      }
 231  
 232      $not_in_fid = (count($ex_fid_ary)) ? 'WHERE ' . $db->sql_in_set('f.forum_id', $ex_fid_ary, true) . " OR (f.forum_password <> '' AND fa.user_id <> " . (int) $user->data['user_id'] . ')' : "";
 233  
 234      $sql = 'SELECT f.forum_id, f.forum_name, f.parent_id, f.forum_type, f.right_id, f.forum_password, f.forum_flags, fa.user_id
 235          FROM ' . FORUMS_TABLE . ' f
 236          LEFT JOIN ' . FORUMS_ACCESS_TABLE . " fa ON (fa.forum_id = f.forum_id
 237              AND fa.session_id = '" . $db->sql_escape($user->session_id) . "')
 238          $not_in_fid
 239          ORDER BY f.left_id";
 240      $result = $db->sql_query($sql);
 241  
 242      $right_id = 0;
 243      $reset_search_forum = true;
 244      while ($row = $db->sql_fetchrow($result))
 245      {
 246          if ($row['forum_password'] && $row['user_id'] != $user->data['user_id'])
 247          {
 248              $ex_fid_ary[] = (int) $row['forum_id'];
 249              continue;
 250          }
 251  
 252          // Exclude forums from active topics
 253          if (!($row['forum_flags'] & FORUM_FLAG_ACTIVE_TOPICS) && ($search_id == 'active_topics'))
 254          {
 255              $ex_fid_ary[] = (int) $row['forum_id'];
 256              continue;
 257          }
 258  
 259          if (count($search_forum))
 260          {
 261              if ($search_child)
 262              {
 263                  if (in_array($row['forum_id'], $search_forum) && $row['right_id'] > $right_id)
 264                  {
 265                      $right_id = (int) $row['right_id'];
 266                  }
 267                  else if ($row['right_id'] < $right_id)
 268                  {
 269                      continue;
 270                  }
 271              }
 272  
 273              if (!in_array($row['forum_id'], $search_forum))
 274              {
 275                  $ex_fid_ary[] = (int) $row['forum_id'];
 276                  $reset_search_forum = false;
 277              }
 278          }
 279      }
 280      $db->sql_freeresult($result);
 281  
 282      // find out in which forums the user is allowed to view posts
 283      $m_approve_posts_fid_sql = $phpbb_content_visibility->get_global_visibility_sql('post', $ex_fid_ary, 'p.');
 284      $m_approve_topics_fid_sql = $phpbb_content_visibility->get_global_visibility_sql('topic', $ex_fid_ary, 't.');
 285  
 286      if ($reset_search_forum)
 287      {
 288          $search_forum = array();
 289      }
 290  
 291      // Select which method we'll use to obtain the post_id or topic_id information
 292      $search_type = $config['search_type'];
 293  
 294      if (!class_exists($search_type))
 295      {
 296          trigger_error('NO_SUCH_SEARCH_MODULE');
 297      }
 298      // We do some additional checks in the module to ensure it can actually be utilised
 299      $error = false;
 300      $search = new $search_type($error, $phpbb_root_path, $phpEx, $auth, $config, $db, $user, $phpbb_dispatcher);
 301  
 302      if ($error)
 303      {
 304          trigger_error($error);
 305      }
 306  
 307      // let the search module split up the keywords
 308      if ($keywords)
 309      {
 310          $correct_query = $search->split_keywords($keywords, $search_terms);
 311          $common_words = $search->get_common_words();
 312          if (!$correct_query || (!$search->get_search_query() && !count($author_id_ary) && !$search_id))
 313          {
 314              $ignored = (count($common_words)) ? sprintf($user->lang['IGNORED_TERMS_EXPLAIN'], implode(' ', $common_words)) . '<br />' : '';
 315              $word_length = $search->get_word_length();
 316              if ($word_length)
 317              {
 318                  trigger_error($ignored . $user->lang('NO_KEYWORDS', $user->lang('CHARACTERS', (int) $word_length['min']), $user->lang('CHARACTERS', (int) $word_length['max'])));
 319              }
 320              else
 321              {
 322                  trigger_error($ignored);
 323              }
 324          }
 325      }
 326  
 327      if (!$keywords && count($author_id_ary))
 328      {
 329          // if it is an author search we want to show topics by default
 330          $show_results = ($topic_id) ? 'posts' : $request->variable('sr', ($search_id == 'egosearch') ? 'topics' : 'posts');
 331          $show_results = ($show_results == 'posts') ? 'posts' : 'topics';
 332      }
 333  
 334      // define some variables needed for retrieving post_id/topic_id information
 335      $sort_by_sql = array('a' => 'u.username_clean', 't' => (($show_results == 'posts') ? 'p.post_time' : 't.topic_last_post_time'), 'f' => 'f.forum_id', 'i' => 't.topic_title', 's' => (($show_results == 'posts') ? 'p.post_subject' : 't.topic_title'));
 336  
 337      /**
 338      * Event to modify the SQL parameters before pre-made searches
 339      *
 340      * @event core.search_modify_param_before
 341      * @var    string    keywords        String of the specified keywords
 342      * @var    array    sort_by_sql        Array of SQL sorting instructions
 343      * @var    array    ex_fid_ary        Array of excluded forum ids
 344      * @var    array    author_id_ary    Array of exclusive author ids
 345      * @var    string    search_id        The id of the search request
 346      * @var    array    id_ary            Array of post or topic ids for search result
 347      * @var    string    show_results    'posts' or 'topics' type of ids
 348      * @since 3.1.3-RC1
 349      * @changed 3.1.10-RC1 Added id_ary, show_results
 350      */
 351      $vars = array(
 352          'keywords',
 353          'sort_by_sql',
 354          'ex_fid_ary',
 355          'author_id_ary',
 356          'search_id',
 357          'id_ary',
 358          'show_results',
 359      );
 360      extract($phpbb_dispatcher->trigger_event('core.search_modify_param_before', compact($vars)));
 361  
 362      // pre-made searches
 363      $sql = $field = $l_search_title = '';
 364      if ($search_id)
 365      {
 366          switch ($search_id)
 367          {
 368              // Oh holy Bob, bring us some activity...
 369              case 'active_topics':
 370                  $l_search_title = $user->lang['SEARCH_ACTIVE_TOPICS'];
 371                  $show_results = 'topics';
 372                  $sort_key = 't';
 373                  $sort_dir = 'd';
 374                  $sort_days = $request->variable('st', 7);
 375                  $sort_by_sql['t'] = 't.topic_last_post_time';
 376  
 377                  gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param);
 378                  $s_sort_key = $s_sort_dir = '';
 379  
 380                  $last_post_time_sql = ($sort_days) ? ' AND t.topic_last_post_time > ' . (time() - ($sort_days * 24 * 3600)) : '';
 381  
 382                  $sql = 'SELECT t.topic_last_post_time, t.topic_id
 383                      FROM ' . TOPICS_TABLE . " t
 384                      WHERE t.topic_moved_id = 0
 385                          $last_post_time_sql
 386                          AND " . $m_approve_topics_fid_sql . '
 387                          ' . ((count($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('t.forum_id', $ex_fid_ary, true) : '') . '
 388                      ORDER BY t.topic_last_post_time DESC';
 389                  $field = 'topic_id';
 390              break;
 391  
 392              case 'unanswered':
 393                  $l_search_title = $user->lang['SEARCH_UNANSWERED'];
 394                  $show_results = $request->variable('sr', 'topics');
 395                  $show_results = ($show_results == 'posts') ? 'posts' : 'topics';
 396                  $sort_by_sql['t'] = ($show_results == 'posts') ? 'p.post_time' : 't.topic_last_post_time';
 397                  $sort_by_sql['s'] = ($show_results == 'posts') ? 'p.post_subject' : 't.topic_title';
 398                  $sql_sort = 'ORDER BY ' . $sort_by_sql[$sort_key] . (($sort_dir == 'a') ? ' ASC' : ' DESC');
 399  
 400                  $sort_join = ($sort_key == 'f') ? FORUMS_TABLE . ' f, ' : '';
 401                  $sql_sort = ($sort_key == 'f') ? ' AND f.forum_id = p.forum_id ' . $sql_sort : $sql_sort;
 402  
 403                  if ($sort_days)
 404                  {
 405                      $last_post_time = 'AND p.post_time > ' . (time() - ($sort_days * 24 * 3600));
 406                  }
 407                  else
 408                  {
 409                      $last_post_time = '';
 410                  }
 411  
 412                  if ($sort_key == 'a')
 413                  {
 414                      $sort_join = USERS_TABLE . ' u, ';
 415                      $sql_sort = ' AND u.user_id = p.poster_id ' . $sql_sort;
 416                  }
 417                  if ($show_results == 'posts')
 418                  {
 419                      $sql = "SELECT p.post_id
 420                          FROM $sort_join" . POSTS_TABLE . ' p, ' . TOPICS_TABLE . " t
 421                          WHERE t.topic_posts_approved = 1
 422                              AND p.topic_id = t.topic_id
 423                              $last_post_time
 424                              AND $m_approve_posts_fid_sql
 425                              " . ((count($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '') . "
 426                              $sql_sort";
 427                      $field = 'post_id';
 428                  }
 429                  else
 430                  {
 431                      $sql = 'SELECT DISTINCT ' . $sort_by_sql[$sort_key] . ", p.topic_id
 432                          FROM $sort_join" . POSTS_TABLE . ' p, ' . TOPICS_TABLE . " t
 433                          WHERE t.topic_posts_approved = 1
 434                              AND t.topic_moved_id = 0
 435                              AND p.topic_id = t.topic_id
 436                              $last_post_time
 437                              AND $m_approve_topics_fid_sql
 438                              " . ((count($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '') . "
 439                          $sql_sort";
 440                      $field = 'topic_id';
 441                  }
 442              break;
 443  
 444              case 'unreadposts':
 445                  $l_search_title = $user->lang['SEARCH_UNREAD'];
 446                  // force sorting
 447                  $show_results = 'topics';
 448                  $sort_key = 't';
 449                  $sort_by_sql['t'] = 't.topic_last_post_time';
 450                  $sql_sort = 'ORDER BY ' . $sort_by_sql[$sort_key] . (($sort_dir == 'a') ? ' ASC' : ' DESC');
 451  
 452                  $sql_where = 'AND t.topic_moved_id = 0
 453                      AND ' . $m_approve_topics_fid_sql . '
 454                      ' . ((count($ex_fid_ary)) ? 'AND ' . $db->sql_in_set('t.forum_id', $ex_fid_ary, true) : '');
 455  
 456                  gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param);
 457                  $s_sort_key = $s_sort_dir = $u_sort_param = $s_limit_days = '';
 458  
 459                  $template->assign_var('U_MARK_ALL_READ', ($user->data['is_registered'] || $config['load_anon_lastread']) ? append_sid("{$phpbb_root_path}index.$phpEx", 'hash=' . generate_link_hash('global') . '&amp;mark=forums&amp;mark_time=' . time()) : '');
 460              break;
 461  
 462              case 'newposts':
 463                  $l_search_title = $user->lang['SEARCH_NEW'];
 464                  // force sorting
 465                  $show_results = ($request->variable('sr', 'topics') == 'posts') ? 'posts' : 'topics';
 466                  $sort_key = 't';
 467                  $sort_dir = 'd';
 468                  $sort_by_sql['t'] = ($show_results == 'posts') ? 'p.post_time' : 't.topic_last_post_time';
 469                  $sql_sort = 'ORDER BY ' . $sort_by_sql[$sort_key] . (($sort_dir == 'a') ? ' ASC' : ' DESC');
 470  
 471                  gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param);
 472                  $s_sort_key = $s_sort_dir = $u_sort_param = $s_limit_days = '';
 473  
 474                  if ($show_results == 'posts')
 475                  {
 476                      $sql = 'SELECT p.post_id
 477                          FROM ' . POSTS_TABLE . ' p
 478                          WHERE p.post_time > ' . $user->data['user_lastvisit'] . '
 479                              AND ' . $m_approve_posts_fid_sql . '
 480                              ' . ((count($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '') . "
 481                          $sql_sort";
 482                      $field = 'post_id';
 483                  }
 484                  else
 485                  {
 486                      $sql = 'SELECT t.topic_id
 487                          FROM ' . TOPICS_TABLE . ' t
 488                          WHERE t.topic_last_post_time > ' . $user->data['user_lastvisit'] . '
 489                              AND t.topic_moved_id = 0
 490                              AND ' . $m_approve_topics_fid_sql . '
 491                              ' . ((count($ex_fid_ary)) ? 'AND ' . $db->sql_in_set('t.forum_id', $ex_fid_ary, true) : '') . "
 492                          $sql_sort";
 493  /*
 494          [Fix] queued replies missing from "view new posts" (Bug #42705 - Patch by Paul)
 495          - Creates temporary table, query is far from optimized
 496  
 497                      $sql = 'SELECT t.topic_id
 498                          FROM ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE . ' p
 499                          WHERE p.post_time > ' . $user->data['user_lastvisit'] . '
 500                              AND t.topic_id = p.topic_id
 501                              AND t.topic_moved_id = 0
 502                              AND ' . $m_approve_topics_fid_sql . "
 503                          GROUP BY t.topic_id
 504                          $sql_sort";
 505  */
 506                      $field = 'topic_id';
 507                  }
 508              break;
 509  
 510              case 'egosearch':
 511                  $l_search_title = $user->lang['SEARCH_SELF'];
 512              break;
 513          }
 514      }
 515  
 516      /**
 517      * Event to modify data after pre-made searches
 518      *
 519      * @event core.search_modify_param_after
 520      * @var    string    l_search_title    The title of the search page
 521      * @var    string    search_id        Predefined search type name
 522      * @var    string    show_results    Display topics or posts
 523      * @var    string    sql                SQL query corresponding to the pre-made search id
 524      * @since 3.1.7-RC1
 525      */
 526      $vars = array(
 527          'l_search_title',
 528          'search_id',
 529          'show_results',
 530          'sql',
 531      );
 532      extract($phpbb_dispatcher->trigger_event('core.search_modify_param_after', compact($vars)));
 533  
 534      // show_results should not change after this
 535      $per_page = ($show_results == 'posts') ? $config['posts_per_page'] : $config['topics_per_page'];
 536      $total_match_count = 0;
 537  
 538      // Set limit for the $total_match_count to reduce server load
 539      $total_matches_limit = 1000;
 540      $found_more_search_matches = false;
 541  
 542      if ($search_id)
 543      {
 544          if ($sql)
 545          {
 546              // Only return up to $total_matches_limit+1 ids (the last one will be removed later)
 547              $result = $db->sql_query_limit($sql, $total_matches_limit + 1);
 548  
 549              while ($row = $db->sql_fetchrow($result))
 550              {
 551                  $id_ary[] = (int) $row[$field];
 552              }
 553              $db->sql_freeresult($result);
 554          }
 555          else if ($search_id == 'unreadposts')
 556          {
 557              // Only return up to $total_matches_limit+1 ids (the last one will be removed later)
 558              $id_ary = array_keys(get_unread_topics($user->data['user_id'], $sql_where, $sql_sort, $total_matches_limit + 1));
 559          }
 560          else
 561          {
 562              $search_id = '';
 563          }
 564  
 565          $total_match_count = count($id_ary);
 566          if ($total_match_count)
 567          {
 568              // Limit the number to $total_matches_limit for pre-made searches
 569              if ($total_match_count > $total_matches_limit)
 570              {
 571                  $found_more_search_matches = true;
 572                  $total_match_count = $total_matches_limit;
 573              }
 574  
 575              // Make sure $start is set to the last page if it exceeds the amount
 576              $start = $pagination->validate_start($start, $per_page, $total_match_count);
 577  
 578              $id_ary = array_slice($id_ary, $start, $per_page);
 579          }
 580          else
 581          {
 582              // Set $start to 0 if no matches were found
 583              $start = 0;
 584          }
 585      }
 586  
 587      // make sure that some arrays are always in the same order
 588      sort($ex_fid_ary);
 589      sort($author_id_ary);
 590  
 591      if ($search->get_search_query())
 592      {
 593          $total_match_count = $search->keyword_search($show_results, $search_fields, $search_terms, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_fid_ary, $m_approve_posts_fid_sql, $topic_id, $author_id_ary, $sql_author_match, $id_ary, $start, $per_page);
 594      }
 595      else if (count($author_id_ary))
 596      {
 597          $firstpost_only = ($search_fields === 'firstpost' || $search_fields == 'titleonly') ? true : false;
 598          $total_match_count = $search->author_search($show_results, $firstpost_only, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_fid_ary, $m_approve_posts_fid_sql, $topic_id, $author_id_ary, $sql_author_match, $id_ary, $start, $per_page);
 599      }
 600  
 601      /**
 602      * Event to search otherwise than by keywords or author
 603      *
 604      * @event core.search_backend_search_after
 605      * @var    string        show_results                'posts' or 'topics' type of ids
 606      * @var    string        search_fields                The data fields to search in
 607      * @var    string        search_terms                Is either 'all' (use query as entered, words without prefix should default to "have to be in field") or 'any' (ignore search query parts and just return all posts that contain any of the specified words)
 608      * @var    array        sort_by_sql                    Array of SQL sorting instructions
 609      * @var    string        sort_key                    The sort key
 610      * @var    string        sort_dir                    The sort direction
 611      * @var    int            sort_days                    Limit the age of results
 612      * @var    array        ex_fid_ary                    Array of excluded forum ids
 613      * @var    string        m_approve_posts_fid_sql        Specifies which types of posts the user can view in which forums
 614      * @var    int            topic_id                    is set to 0 or a topic id, if it is not 0 then only posts in this topic should be searched
 615      * @var    array        author_id_ary                Array of exclusive author ids
 616      * @var    string        sql_author_match            Specifies the author match, when ANONYMOUS is also a search-match
 617      * @var    array        id_ary                        Array of post or topic ids for search result
 618      * @var    int            start                        The starting id of the results
 619      * @var    int            per_page                    Number of ids each page is supposed to contain
 620      * @var    int            total_match_count            The total number of search matches
 621      * @since 3.1.10-RC1
 622      */
 623      $vars = array(
 624          'show_results',
 625          'search_fields',
 626          'search_terms',
 627          'sort_by_sql',
 628          'sort_key',
 629          'sort_dir',
 630          'sort_days',
 631          'ex_fid_ary',
 632          'm_approve_posts_fid_sql',
 633          'topic_id',
 634          'author_id_ary',
 635          'sql_author_match',
 636          'id_ary',
 637          'start',
 638          'per_page',
 639          'total_match_count',
 640      );
 641      extract($phpbb_dispatcher->trigger_event('core.search_backend_search_after', compact($vars)));
 642  
 643      $sql_where = '';
 644  
 645      if (count($id_ary))
 646      {
 647          $sql_where .= $db->sql_in_set(($show_results == 'posts') ? 'p.post_id' : 't.topic_id', $id_ary);
 648          $sql_where .= (count($ex_fid_ary)) ? ' AND (' . $db->sql_in_set('f.forum_id', $ex_fid_ary, true) . ' OR f.forum_id IS NULL)' : '';
 649          $sql_where .= ' AND ' . (($show_results == 'posts') ? $m_approve_posts_fid_sql : $m_approve_topics_fid_sql);
 650      }
 651  
 652      if ($show_results == 'posts')
 653      {
 654          include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
 655      }
 656      else
 657      {
 658          include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
 659      }
 660  
 661      $user->add_lang('viewtopic');
 662  
 663      // Grab icons
 664      $icons = $cache->obtain_icons();
 665  
 666      // define some vars for urls
 667      // A single wildcard will make the search results look ugly
 668      $hilit = phpbb_clean_search_string(str_replace(array('+', '-', '|', '(', ')', '&quot;'), ' ', $keywords));
 669      $hilit = str_replace(' ', '|', $hilit);
 670  
 671      $u_hilit = urlencode(htmlspecialchars_decode(str_replace('|', ' ', $hilit)));
 672      $u_show_results = '&amp;sr=' . $show_results;
 673      $u_search_forum = implode('&amp;fid%5B%5D=', $search_forum);
 674  
 675      $u_search = append_sid("{$phpbb_root_path}search.$phpEx", $u_sort_param . $u_show_results);
 676      $u_search .= ($search_id) ? '&amp;search_id=' . $search_id : '';
 677      $u_search .= ($u_hilit) ? '&amp;keywords=' . urlencode(htmlspecialchars_decode($keywords)) : '';
 678      $u_search .= ($search_terms != 'all') ? '&amp;terms=' . $search_terms : '';
 679      $u_search .= ($topic_id) ? '&amp;t=' . $topic_id : '';
 680      $u_search .= ($author) ? '&amp;author=' . urlencode(htmlspecialchars_decode($author)) : '';
 681      $u_search .= ($author_id) ? '&amp;author_id=' . $author_id : '';
 682      $u_search .= ($u_search_forum) ? '&amp;fid%5B%5D=' . $u_search_forum : '';
 683      $u_search .= (!$search_child) ? '&amp;sc=0' : '';
 684      $u_search .= ($search_fields != 'all') ? '&amp;sf=' . $search_fields : '';
 685      $u_search .= ($return_chars != 300) ? '&amp;ch=' . $return_chars : '';
 686  
 687      /**
 688      * Event to add or modify search URL parameters
 689      *
 690      * @event core.search_modify_url_parameters
 691      * @var    string    u_search        Search URL parameters string
 692      * @var    string    search_id        Predefined search type name
 693      * @var    string    show_results    String indicating the show results mode
 694      * @var    string    sql_where        The SQL WHERE string used by search to get topic data
 695      * @var    int        total_match_count    The total number of search matches
 696      * @var    array    ex_fid_ary        Array of excluded forum ids
 697      * @since 3.1.7-RC1
 698      * @changed 3.1.10-RC1 Added show_results, sql_where, total_match_count
 699      * @changed 3.1.11-RC1 Added ex_fid_ary
 700      */
 701      $vars = array(
 702          'u_search',
 703          'search_id',
 704          'show_results',
 705          'sql_where',
 706          'total_match_count',
 707          'ex_fid_ary',
 708      );
 709      extract($phpbb_dispatcher->trigger_event('core.search_modify_url_parameters', compact($vars)));
 710  
 711      if ($sql_where)
 712      {
 713          if ($show_results == 'posts')
 714          {
 715              // @todo Joining this query to the one below?
 716              $sql = 'SELECT zebra_id, friend, foe
 717                  FROM ' . ZEBRA_TABLE . '
 718                  WHERE user_id = ' . $user->data['user_id'];
 719              $result = $db->sql_query($sql);
 720  
 721              $zebra = array();
 722              while ($row = $db->sql_fetchrow($result))
 723              {
 724                  $zebra[($row['friend']) ? 'friend' : 'foe'][] = $row['zebra_id'];
 725              }
 726              $db->sql_freeresult($result);
 727  
 728              $sql_array = array(
 729                  'SELECT'    => 'p.*, f.forum_id, f.forum_name, t.*, u.username, u.username_clean, u.user_sig, u.user_sig_bbcode_uid, u.user_colour',
 730                  'FROM'        => array(
 731                      POSTS_TABLE        => 'p',
 732                  ),
 733                  'LEFT_JOIN' => array(
 734                      array(
 735                          'FROM'    => array(TOPICS_TABLE => 't'),
 736                          'ON'    => 'p.topic_id = t.topic_id',
 737                      ),
 738                      array(
 739                          'FROM'    => array(FORUMS_TABLE => 'f'),
 740                          'ON'    => 'p.forum_id = f.forum_id',
 741                      ),
 742                      array(
 743                          'FROM'    => array(USERS_TABLE => 'u'),
 744                          'ON'    => 'p.poster_id = u.user_id',
 745                      ),
 746                  ),
 747                  'WHERE'    => $sql_where,
 748                  'ORDER_BY' => $sort_by_sql[$sort_key] . ' ' . (($sort_dir == 'd') ? 'DESC' : 'ASC'),
 749              );
 750  
 751              /**
 752              * Event to modify the SQL query before the posts data is retrieved
 753              *
 754              * @event core.search_get_posts_data
 755              * @var    array    sql_array        The SQL array
 756              * @var    array    zebra            Array of zebra data for the current user
 757              * @var    int        total_match_count    The total number of search matches
 758              * @var    string    keywords        String of the specified keywords
 759              * @var    array    sort_by_sql        Array of SQL sorting instructions
 760              * @var    string    s_sort_dir        The sort direction
 761              * @var    string    s_sort_key        The sort key
 762              * @var    string    s_limit_days    Limit the age of results
 763              * @var    array    ex_fid_ary        Array of excluded forum ids
 764              * @var    array    author_id_ary    Array of exclusive author ids
 765              * @var    string    search_fields    The data fields to search in
 766              * @var    int        search_id        The id of the search request
 767              * @var    int        start            The starting id of the results
 768              * @since 3.1.0-b3
 769              */
 770              $vars = array(
 771                  'sql_array',
 772                  'zebra',
 773                  'total_match_count',
 774                  'keywords',
 775                  'sort_by_sql',
 776                  's_sort_dir',
 777                  's_sort_key',
 778                  's_limit_days',
 779                  'ex_fid_ary',
 780                  'author_id_ary',
 781                  'search_fields',
 782                  'search_id',
 783                  'start',
 784              );
 785              extract($phpbb_dispatcher->trigger_event('core.search_get_posts_data', compact($vars)));
 786  
 787              $sql = $db->sql_build_query('SELECT', $sql_array);
 788          }
 789          else
 790          {
 791              $sql_from = TOPICS_TABLE . ' t
 792                  LEFT JOIN ' . FORUMS_TABLE . ' f ON (f.forum_id = t.forum_id)
 793                  ' . (($sort_key == 'a') ? ' LEFT JOIN ' . USERS_TABLE . ' u ON (u.user_id = t.topic_poster) ' : '');
 794              $sql_select = 't.*, f.forum_id, f.forum_name';
 795  
 796              if ($user->data['is_registered'])
 797              {
 798                  if ($config['load_db_track'] && $author_id !== $user->data['user_id'])
 799                  {
 800                      $sql_from .= ' LEFT JOIN ' . TOPICS_POSTED_TABLE . ' tp ON (tp.user_id = ' . $user->data['user_id'] . '
 801                          AND t.topic_id = tp.topic_id)';
 802                      $sql_select .= ', tp.topic_posted';
 803                  }
 804  
 805                  if ($config['load_db_lastread'])
 806                  {
 807                      $sql_from .= ' LEFT JOIN ' . TOPICS_TRACK_TABLE . ' tt ON (tt.user_id = ' . $user->data['user_id'] . '
 808                              AND t.topic_id = tt.topic_id)
 809                          LEFT JOIN ' . FORUMS_TRACK_TABLE . ' ft ON (ft.user_id = ' . $user->data['user_id'] . '
 810                              AND ft.forum_id = f.forum_id)';
 811                      $sql_select .= ', tt.mark_time, ft.mark_time as f_mark_time';
 812                  }
 813              }
 814  
 815              if ($config['load_anon_lastread'] || ($user->data['is_registered'] && !$config['load_db_lastread']))
 816              {
 817                  $tracking_topics = $request->variable($config['cookie_name'] . '_track', '', true, \phpbb\request\request_interface::COOKIE);
 818                  $tracking_topics = ($tracking_topics) ? tracking_unserialize($tracking_topics) : array();
 819              }
 820  
 821              $sql_order_by = $sort_by_sql[$sort_key] . ' ' . (($sort_dir == 'd') ? 'DESC' : 'ASC');
 822  
 823              /**
 824              * Event to modify the SQL query before the topic data is retrieved
 825              *
 826              * @event core.search_get_topic_data
 827              * @var    string    sql_select        The SQL SELECT string used by search to get topic data
 828              * @var    string    sql_from        The SQL FROM string used by search to get topic data
 829              * @var    string    sql_where        The SQL WHERE string used by search to get topic data
 830              * @var    int        total_match_count    The total number of search matches
 831              * @var    array    sort_by_sql        Array of SQL sorting instructions
 832              * @var    string    sort_dir        The sorting direction
 833              * @var    string    sort_key        The sorting key
 834              * @var    string    sql_order_by    The SQL ORDER BY string used by search to get topic data
 835              * @since 3.1.0-a1
 836              * @changed 3.1.0-RC5 Added total_match_count
 837              * @changed 3.1.7-RC1 Added sort_by_sql, sort_dir, sort_key, sql_order_by
 838              */
 839              $vars = array(
 840                  'sql_select',
 841                  'sql_from',
 842                  'sql_where',
 843                  'total_match_count',
 844                  'sort_by_sql',
 845                  'sort_dir',
 846                  'sort_key',
 847                  'sql_order_by',
 848              );
 849              extract($phpbb_dispatcher->trigger_event('core.search_get_topic_data', compact($vars)));
 850  
 851              $sql = "SELECT $sql_select
 852                  FROM $sql_from
 853                  WHERE $sql_where
 854                  ORDER BY $sql_order_by";
 855          }
 856          $result = $db->sql_query($sql);
 857          $result_topic_id = 0;
 858  
 859          $rowset = $attachments = $topic_tracking_info = array();
 860  
 861          if ($show_results == 'topics')
 862          {
 863              $forums = $rowset = $shadow_topic_list = array();
 864              while ($row = $db->sql_fetchrow($result))
 865              {
 866                  $row['forum_id'] = (int) $row['forum_id'];
 867                  $row['topic_id'] = (int) $row['topic_id'];
 868  
 869                  if ($row['topic_status'] == ITEM_MOVED)
 870                  {
 871                      $shadow_topic_list[$row['topic_moved_id']] = $row['topic_id'];
 872                  }
 873  
 874                  $rowset[$row['topic_id']] = $row;
 875  
 876                  if (!isset($forums[$row['forum_id']]) && $user->data['is_registered'] && $config['load_db_lastread'])
 877                  {
 878                      $forums[$row['forum_id']]['mark_time'] = $row['f_mark_time'];
 879                  }
 880                  $forums[$row['forum_id']]['topic_list'][] = $row['topic_id'];
 881                  $forums[$row['forum_id']]['rowset'][$row['topic_id']] = &$rowset[$row['topic_id']];
 882              }
 883              $db->sql_freeresult($result);
 884  
 885              // If we have some shadow topics, update the rowset to reflect their topic information
 886              if (count($shadow_topic_list))
 887              {
 888                  $sql = 'SELECT *
 889                      FROM ' . TOPICS_TABLE . '
 890                      WHERE ' . $db->sql_in_set('topic_id', array_keys($shadow_topic_list));
 891                  $result = $db->sql_query($sql);
 892  
 893                  while ($row = $db->sql_fetchrow($result))
 894                  {
 895                      $orig_topic_id = $shadow_topic_list[$row['topic_id']];
 896  
 897                      // We want to retain some values
 898                      $row = array_merge($row, array(
 899                          'topic_moved_id'    => $rowset[$orig_topic_id]['topic_moved_id'],
 900                          'topic_status'        => $rowset[$orig_topic_id]['topic_status'],
 901                          'forum_name'        => $rowset[$orig_topic_id]['forum_name'])
 902                      );
 903  
 904                      $rowset[$orig_topic_id] = $row;
 905                  }
 906                  $db->sql_freeresult($result);
 907              }
 908              unset($shadow_topic_list);
 909  
 910              foreach ($forums as $forum_id => $forum)
 911              {
 912                  if ($user->data['is_registered'] && $config['load_db_lastread'])
 913                  {
 914                      $topic_tracking_info[$forum_id] = get_topic_tracking($forum_id, $forum['topic_list'], $forum['rowset'], array($forum_id => $forum['mark_time']));
 915                  }
 916                  else if ($config['load_anon_lastread'] || $user->data['is_registered'])
 917                  {
 918                      $topic_tracking_info[$forum_id] = get_complete_topic_tracking($forum_id, $forum['topic_list']);
 919  
 920                      if (!$user->data['is_registered'])
 921                      {
 922                          $user->data['user_lastmark'] = (isset($tracking_topics['l'])) ? (int) (base_convert($tracking_topics['l'], 36, 10) + $config['board_startdate']) : 0;
 923                      }
 924                  }
 925              }
 926              unset($forums);
 927          }
 928          else
 929          {
 930              $text_only_message = '';
 931              $attach_list = array();
 932  
 933              while ($row = $db->sql_fetchrow($result))
 934              {
 935                  /**
 936                  * Modify the row of a post result before the post_text is trimmed
 937                  *
 938                  * @event core.search_modify_post_row
 939                  * @var    string    hilit                    String to highlight
 940                  * @var    array    row                        Array with the post data
 941                  * @var    string    u_hilit                    Highlight string to be injected into URL
 942                  * @var    string    view                    Search results view mode
 943                  * @var    array    zebra                    Array with zebra data for the current user
 944                  * @since 3.2.2-RC1
 945                  */
 946                  $vars = array(
 947                      'hilit',
 948                      'row',
 949                      'u_hilit',
 950                      'view',
 951                      'zebra',
 952                  );
 953                  extract($phpbb_dispatcher->trigger_event('core.search_modify_post_row', compact($vars)));
 954  
 955                  // We pre-process some variables here for later usage
 956                  $row['post_text'] = censor_text($row['post_text']);
 957  
 958                  $text_only_message = $row['post_text'];
 959                  // make list items visible as such
 960                  if ($row['bbcode_uid'])
 961                  {
 962                      $text_only_message = str_replace('[*:' . $row['bbcode_uid'] . ']', '&sdot;&nbsp;', $text_only_message);
 963                      // no BBCode in text only message
 964                      strip_bbcode($text_only_message, $row['bbcode_uid']);
 965                  }
 966  
 967                  if ($return_chars == -1 || utf8_strlen($text_only_message) < ($return_chars + 3))
 968                  {
 969                      $row['display_text_only'] = false;
 970  
 971                      // Does this post have an attachment? If so, add it to the list
 972                      if ($row['post_attachment'] && $config['allow_attachments'])
 973                      {
 974                          $attach_list[$row['forum_id']][] = $row['post_id'];
 975                      }
 976                  }
 977                  else
 978                  {
 979                      $row['post_text'] = $text_only_message;
 980                      $row['display_text_only'] = true;
 981                  }
 982  
 983                  $rowset[] = $row;
 984              }
 985              $db->sql_freeresult($result);
 986  
 987              unset($text_only_message);
 988  
 989              // Pull attachment data
 990              if (count($attach_list))
 991              {
 992                  $use_attach_list = $attach_list;
 993                  $attach_list = array();
 994  
 995                  foreach ($use_attach_list as $forum_id => $_list)
 996                  {
 997                      if ($auth->acl_get('u_download') && $auth->acl_get('f_download', $forum_id))
 998                      {
 999                          $attach_list = array_merge($attach_list, $_list);
1000                      }
1001                  }
1002              }
1003  
1004              if (count($attach_list))
1005              {
1006                  $sql = 'SELECT *
1007                      FROM ' . ATTACHMENTS_TABLE . '
1008                      WHERE ' . $db->sql_in_set('post_msg_id', $attach_list) . '
1009                          AND in_message = 0
1010                      ORDER BY filetime DESC, post_msg_id ASC';
1011                  $result = $db->sql_query($sql);
1012  
1013                  while ($row = $db->sql_fetchrow($result))
1014                  {
1015                      $attachments[$row['post_msg_id']][] = $row;
1016                  }
1017                  $db->sql_freeresult($result);
1018              }
1019          }
1020  
1021          if ($hilit)
1022          {
1023              // Remove bad highlights
1024              $hilit_array = array_filter(explode('|', $hilit), 'strlen');
1025              foreach ($hilit_array as $key => $value)
1026              {
1027                  $hilit_array[$key] = phpbb_clean_search_string($value);
1028                  $hilit_array[$key] = str_replace('\*', '\w*?', preg_quote($hilit_array[$key], '#'));
1029                  $hilit_array[$key] = preg_replace('#(^|\s)\\\\w\*\?(\s|$)#', '$1\w+?$2', $hilit_array[$key]);
1030              }
1031              $hilit = implode('|', $hilit_array);
1032          }
1033  
1034          /**
1035          * Modify the rowset data
1036          *
1037          * @event core.search_modify_rowset
1038          * @var    array    attachments                Array with posts attachments data
1039          * @var    string    hilit                    String to highlight
1040          * @var    array    rowset                    Array with the search results data
1041          * @var    string    show_results            String indicating the show results mode
1042          * @var    array    topic_tracking_info        Array with the topics tracking data
1043          * @var    string    u_hilit                    Highlight string to be injected into URL
1044          * @var    string    view                    Search results view mode
1045          * @var    array    zebra                    Array with zebra data for the current user
1046          * @since 3.1.0-b4
1047          * @changed 3.1.0-b5 Added var show_results
1048          */
1049          $vars = array(
1050              'attachments',
1051              'hilit',
1052              'rowset',
1053              'show_results',
1054              'topic_tracking_info',
1055              'u_hilit',
1056              'view',
1057              'zebra',
1058          );
1059          extract($phpbb_dispatcher->trigger_event('core.search_modify_rowset', compact($vars)));
1060  
1061          foreach ($rowset as $row)
1062          {
1063              $forum_id = $row['forum_id'];
1064              $result_topic_id = $row['topic_id'];
1065              $topic_title = censor_text($row['topic_title']);
1066              $replies = $phpbb_content_visibility->get_count('topic_posts', $row, $forum_id) - 1;
1067  
1068              $view_topic_url_params = "f=$forum_id&amp;t=$result_topic_id" . (($u_hilit) ? "&amp;hilit=$u_hilit" : '');
1069              $view_topic_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", $view_topic_url_params);
1070  
1071              if ($show_results == 'topics')
1072              {
1073                  if ($config['load_db_track'] && $author_id === $user->data['user_id'])
1074                  {
1075                      $row['topic_posted'] = 1;
1076                  }
1077  
1078                  $folder_img = $folder_alt = $topic_type = '';
1079                  topic_status($row, $replies, (isset($topic_tracking_info[$forum_id][$row['topic_id']]) && $row['topic_last_post_time'] > $topic_tracking_info[$forum_id][$row['topic_id']]) ? true : false, $folder_img, $folder_alt, $topic_type);
1080  
1081                  $unread_topic = (isset($topic_tracking_info[$forum_id][$row['topic_id']]) && $row['topic_last_post_time'] > $topic_tracking_info[$forum_id][$row['topic_id']]) ? true : false;
1082  
1083                  $topic_unapproved = (($row['topic_visibility'] == ITEM_UNAPPROVED || $row['topic_visibility'] == ITEM_REAPPROVE) && $auth->acl_get('m_approve', $forum_id)) ? true : false;
1084                  $posts_unapproved = ($row['topic_visibility'] == ITEM_APPROVED && $row['topic_posts_unapproved'] && $auth->acl_get('m_approve', $forum_id)) ? true : false;
1085                  $topic_deleted = $row['topic_visibility'] == ITEM_DELETED;
1086                  $u_mcp_queue = ($topic_unapproved || $posts_unapproved) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&amp;mode=' . (($topic_unapproved) ? 'approve_details' : 'unapproved_posts') . "&amp;t=$result_topic_id", true, $user->session_id) : '';
1087                  $u_mcp_queue = (!$u_mcp_queue && $topic_deleted) ? append_sid("{$phpbb_root_path}mcp.$phpEx", "i=queue&amp;mode=deleted_topics&amp;t=$result_topic_id", true, $user->session_id) : $u_mcp_queue;
1088  
1089                  $row['topic_title'] = preg_replace('#(?!<.*)(?<!\w)(' . $hilit . ')(?!\w|[^<>]*(?:</s(?:cript|tyle))?>)#isu', '<span class="posthilit">$1</span>', $row['topic_title']);
1090  
1091                  $tpl_ary = array(
1092                      'TOPIC_AUTHOR'                => get_username_string('username', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
1093                      'TOPIC_AUTHOR_COLOUR'        => get_username_string('colour', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
1094                      'TOPIC_AUTHOR_FULL'            => get_username_string('full', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
1095                      'FIRST_POST_TIME'            => $user->format_date($row['topic_time']),
1096                      'LAST_POST_SUBJECT'            => $row['topic_last_post_subject'],
1097                      'LAST_POST_TIME'            => $user->format_date($row['topic_last_post_time']),
1098                      'LAST_VIEW_TIME'            => $user->format_date($row['topic_last_view_time']),
1099                      'LAST_POST_AUTHOR'            => get_username_string('username', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']),
1100                      'LAST_POST_AUTHOR_COLOUR'    => get_username_string('colour', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']),
1101                      'LAST_POST_AUTHOR_FULL'        => get_username_string('full', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']),
1102  
1103                      'TOPIC_TYPE'        => $topic_type,
1104  
1105                      'TOPIC_IMG_STYLE'        => $folder_img,
1106                      'TOPIC_FOLDER_IMG'        => $user->img($folder_img, $folder_alt),
1107                      'TOPIC_FOLDER_IMG_ALT'    => $user->lang[$folder_alt],
1108  
1109                      'TOPIC_ICON_IMG'        => (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['img'] : '',
1110                      'TOPIC_ICON_IMG_WIDTH'    => (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['width'] : '',
1111                      'TOPIC_ICON_IMG_HEIGHT'    => (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['height'] : '',
1112                      'ATTACH_ICON_IMG'        => ($auth->acl_get('u_download') && $auth->acl_get('f_download', $forum_id) && $row['topic_attachment']) ? $user->img('icon_topic_attach', $user->lang['TOTAL_ATTACHMENTS']) : '',
1113                      'UNAPPROVED_IMG'        => ($topic_unapproved || $posts_unapproved) ? $user->img('icon_topic_unapproved', ($topic_unapproved) ? 'TOPIC_UNAPPROVED' : 'POSTS_UNAPPROVED') : '',
1114  
1115                      'S_TOPIC_TYPE'            => $row['topic_type'],
1116                      'S_USER_POSTED'            => (!empty($row['topic_posted'])) ? true : false,
1117                      'S_UNREAD_TOPIC'        => $unread_topic,
1118  
1119                      'S_TOPIC_REPORTED'        => (!empty($row['topic_reported']) && $auth->acl_get('m_report', $forum_id)) ? true : false,
1120                      'S_TOPIC_UNAPPROVED'    => $topic_unapproved,
1121                      'S_POSTS_UNAPPROVED'    => $posts_unapproved,
1122                      'S_TOPIC_DELETED'        => $topic_deleted,
1123                      'S_HAS_POLL'            => ($row['poll_start']) ? true : false,
1124  
1125                      'U_LAST_POST'            => append_sid("{$phpbb_root_path}viewtopic.$phpEx", $view_topic_url_params . '&amp;p=' . $row['topic_last_post_id']) . '#p' . $row['topic_last_post_id'],
1126                      'U_LAST_POST_AUTHOR'    => get_username_string('profile', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']),
1127                      'U_TOPIC_AUTHOR'        => get_username_string('profile', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
1128                      'U_NEWEST_POST'            => append_sid("{$phpbb_root_path}viewtopic.$phpEx", $view_topic_url_params . '&amp;view=unread') . '#unread',
1129                      'U_MCP_REPORT'            => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&amp;mode=reports&amp;t=' . $result_topic_id, true, $user->session_id),
1130                      'U_MCP_QUEUE'            => $u_mcp_queue,
1131                  );
1132              }
1133              else
1134              {
1135                  if ((isset($zebra['foe']) && in_array($row['poster_id'], $zebra['foe'])) && (!$view || $view != 'show' || $post_id != $row['post_id']))
1136                  {
1137                      $template->assign_block_vars('searchresults', array(
1138                          'S_IGNORE_POST' => true,
1139  
1140                          'L_IGNORE_POST' => sprintf($user->lang['POST_BY_FOE'], $row['username'], "<a href=\"$u_search&amp;start=$start&amp;p=" . $row['post_id'] . '&amp;view=show#p' . $row['post_id'] . '">', '</a>'))
1141                      );
1142  
1143                      continue;
1144                  }
1145  
1146                  // Replace naughty words such as farty pants
1147                  $row['post_subject'] = censor_text($row['post_subject']);
1148  
1149                  if ($row['display_text_only'])
1150                  {
1151                      // now find context for the searched words
1152                      $row['post_text'] = get_context($row['post_text'], array_filter(explode('|', $hilit), 'strlen'), $return_chars);
1153                      $row['post_text'] = bbcode_nl2br($row['post_text']);
1154                  }
1155                  else
1156                  {
1157                      $parse_flags = ($row['bbcode_bitfield'] ? OPTION_FLAG_BBCODE : 0) | OPTION_FLAG_SMILIES;
1158                      $row['post_text'] = generate_text_for_display($row['post_text'], $row['bbcode_uid'], $row['bbcode_bitfield'], $parse_flags, false);
1159  
1160                      if (!empty($attachments[$row['post_id']]))
1161                      {
1162                          parse_attachments($forum_id, $row['post_text'], $attachments[$row['post_id']], $update_count);
1163  
1164                          // we only display inline attachments
1165                          unset($attachments[$row['post_id']]);
1166                      }
1167                  }
1168  
1169                  if ($hilit)
1170                  {
1171                      // post highlighting
1172                      $row['post_text'] = preg_replace('#(?!<.*)(?<!\w)(' . $hilit . ')(?!\w|[^<>]*(?:</s(?:cript|tyle))?>)#isu', '<span class="posthilit">$1</span>', $row['post_text']);
1173                      $row['post_subject'] = preg_replace('#(?!<.*)(?<!\w)(' . $hilit . ')(?!\w|[^<>]*(?:</s(?:cript|tyle))?>)#isu', '<span class="posthilit">$1</span>', $row['post_subject']);
1174                  }
1175  
1176                  $tpl_ary = array(
1177                      'POST_AUTHOR_FULL'        => get_username_string('full', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']),
1178                      'POST_AUTHOR_COLOUR'    => get_username_string('colour', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']),
1179                      'POST_AUTHOR'            => get_username_string('username', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']),
1180                      'U_POST_AUTHOR'            => get_username_string('profile', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']),
1181  
1182                      'POST_SUBJECT'        => $row['post_subject'],
1183                      'POST_DATE'            => (!empty($row['post_time'])) ? $user->format_date($row['post_time']) : '',
1184                      'MESSAGE'            => $row['post_text']
1185                  );
1186              }
1187  
1188              $tpl_ary = array_merge($tpl_ary, array(
1189                  'FORUM_ID'            => $forum_id,
1190                  'TOPIC_ID'            => $result_topic_id,
1191                  'POST_ID'            => ($show_results == 'posts') ? $row['post_id'] : false,
1192  
1193                  'FORUM_TITLE'        => $row['forum_name'],
1194                  'TOPIC_TITLE'        => $topic_title,
1195                  'TOPIC_REPLIES'        => $replies,
1196                  'TOPIC_VIEWS'        => $row['topic_views'],
1197  
1198                  'U_VIEW_TOPIC'        => $view_topic_url,
1199                  'U_VIEW_FORUM'        => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id),
1200                  'U_VIEW_POST'        => (!empty($row['post_id'])) ? append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&amp;t=" . $row['topic_id'] . '&amp;p=' . $row['post_id'] . (($u_hilit) ? '&amp;hilit=' . $u_hilit : '')) . '#p' . $row['post_id'] : '',
1201              ));
1202  
1203              /**
1204              * Modify the topic data before it is assigned to the template
1205              *
1206              * @event core.search_modify_tpl_ary
1207              * @var    array    row                Array with topic data
1208              * @var    array    tpl_ary            Template block array with topic data
1209              * @var    string    show_results    Display topics or posts
1210              * @var    string    topic_title        Cleaned topic title
1211              * @var    int        replies            The number of topic replies
1212              * @var    string    view_topic_url    The URL to the topic
1213              * @var    string    folder_img        The folder image of the topic
1214              * @var    string    folder_alt        The alt attribute of the topic folder img
1215              * @var    int        topic_type        The topic type
1216              * @var    bool    unread_topic    Whether the topic has unread posts
1217              * @var    bool    topic_unapproved    Whether the topic is unapproved
1218              * @var    int        posts_unapproved    The number of unapproved posts
1219              * @var    bool    topic_deleted    Whether the topic has been deleted
1220              * @var    string    u_mcp_queue        The URL to the corresponding MCP queue page
1221              * @var    array    zebra            The zebra data of the current user
1222              * @var    array    attachments        All the attachments of the search results
1223              * @since 3.1.0-a1
1224              * @changed 3.1.0-b3 Added vars show_results, topic_title, replies,
1225              *        view_topic_url, folder_img, folder_alt, topic_type, unread_topic,
1226              *        topic_unapproved, posts_unapproved, topic_deleted, u_mcp_queue,
1227              *        zebra, attachments
1228              */
1229              $vars = array(
1230                  'row',
1231                  'tpl_ary',
1232                  'show_results',
1233                  'topic_title',
1234                  'replies',
1235                  'view_topic_url',
1236                  'folder_img',
1237                  'folder_alt',
1238                  'topic_type',
1239                  'unread_topic',
1240                  'topic_unapproved',
1241                  'posts_unapproved',
1242                  'topic_deleted',
1243                  'u_mcp_queue',
1244                  'zebra',
1245                  'attachments',
1246              );
1247              extract($phpbb_dispatcher->trigger_event('core.search_modify_tpl_ary', compact($vars)));
1248  
1249              $template->assign_block_vars('searchresults', $tpl_ary);
1250  
1251              if ($show_results == 'topics')
1252              {
1253                  $pagination->generate_template_pagination($view_topic_url, 'searchresults.pagination', 'start', $replies + 1, $config['posts_per_page'], 1, true, true);
1254              }
1255          }
1256  
1257          if ($topic_id && ($topic_id == $result_topic_id))
1258          {
1259              $template->assign_vars(array(
1260                  'SEARCH_TOPIC'        => $topic_title,
1261                  'L_RETURN_TO_TOPIC'    => $user->lang('RETURN_TO', $topic_title),
1262                  'U_SEARCH_TOPIC'    => $view_topic_url
1263              ));
1264          }
1265      }
1266      unset($rowset);
1267  
1268      // Output header
1269      if ($found_more_search_matches)
1270      {
1271          $l_search_matches = $user->lang('FOUND_MORE_SEARCH_MATCHES', (int) $total_match_count);
1272      }
1273      else
1274      {
1275          $l_search_matches = $user->lang('FOUND_SEARCH_MATCHES', (int) $total_match_count);
1276      }
1277  
1278      // Check if search backend supports phrase search or not
1279      $phrase_search_disabled = '';
1280      if (strpos(html_entity_decode($keywords), '"') !== false && method_exists($search, 'supports_phrase_search'))
1281      {
1282          $phrase_search_disabled = $search->supports_phrase_search() ? false : true;
1283      }
1284  
1285      $pagination->generate_template_pagination($u_search, 'pagination', 'start', $total_match_count, $per_page, $start);
1286  
1287      $template->assign_vars(array(
1288          'SEARCH_TITLE'        => $l_search_title,
1289          'SEARCH_MATCHES'    => $l_search_matches,
1290          'SEARCH_WORDS'        => $keywords,
1291          'SEARCHED_QUERY'    => $search->get_search_query(),
1292          'IGNORED_WORDS'        => (!empty($common_words)) ? implode(' ', $common_words) : '',
1293  
1294          'PHRASE_SEARCH_DISABLED'        => $phrase_search_disabled,
1295  
1296          'TOTAL_MATCHES'        => $total_match_count,
1297          'SEARCH_IN_RESULTS'    => ($search_id) ? false : true,
1298  
1299          'S_SELECT_SORT_DIR'        => $s_sort_dir,
1300          'S_SELECT_SORT_KEY'        => $s_sort_key,
1301          'S_SELECT_SORT_DAYS'    => $s_limit_days,
1302          'S_SEARCH_ACTION'        => $u_search,
1303          'S_SHOW_TOPICS'            => ($show_results == 'posts') ? false : true,
1304  
1305          'GOTO_PAGE_IMG'        => $user->img('icon_post_target', 'GOTO_PAGE'),
1306          'NEWEST_POST_IMG'    => $user->img('icon_topic_newest', 'VIEW_NEWEST_POST'),
1307          'REPORTED_IMG'        => $user->img('icon_topic_reported', 'TOPIC_REPORTED'),
1308          'UNAPPROVED_IMG'    => $user->img('icon_topic_unapproved', 'TOPIC_UNAPPROVED'),
1309          'DELETED_IMG'        => $user->img('icon_topic_deleted', 'TOPIC_DELETED'),
1310          'POLL_IMG'            => $user->img('icon_topic_poll', 'TOPIC_POLL'),
1311          'LAST_POST_IMG'        => $user->img('icon_topic_latest', 'VIEW_LATEST_POST'),
1312  
1313          'U_SEARCH_WORDS'    => $u_search,
1314      ));
1315  
1316      /**
1317      * Modify the title and/or load data for the search results page
1318      *
1319      * @event core.search_results_modify_search_title
1320      * @var    int        author_id            ID of the author to search by
1321      * @var    string    l_search_title        The title of the search page
1322      * @var    string    search_id            Predefined search type name
1323      * @var    string    show_results        Search results output mode - topics or posts
1324      * @var    int        start                The starting id of the results
1325      * @var    int        total_match_count    The count of search results
1326      * @var    string    keywords            The search keywords
1327      * @since 3.1.0-RC4
1328      * @changed 3.1.6-RC1 Added total_match_count and keywords
1329      */
1330      $vars = array(
1331          'author_id',
1332          'l_search_title',
1333          'search_id',
1334          'show_results',
1335          'start',
1336          'total_match_count',
1337          'keywords',
1338      );
1339      extract($phpbb_dispatcher->trigger_event('core.search_results_modify_search_title', compact($vars)));
1340  
1341      page_header(($l_search_title) ? $l_search_title : $user->lang['SEARCH']);
1342  
1343      $template->set_filenames(array(
1344          'body' => 'search_results.html')
1345      );
1346      make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx"));
1347  
1348      page_footer();
1349  }
1350  
1351  // Search forum
1352  $rowset = array();
1353  $s_forums = '';
1354  $sql = 'SELECT f.forum_id, f.forum_name, f.parent_id, f.forum_type, f.left_id, f.right_id, f.forum_password, f.enable_indexing, fa.user_id
1355      FROM ' . FORUMS_TABLE . ' f
1356      LEFT JOIN ' . FORUMS_ACCESS_TABLE . " fa ON (fa.forum_id = f.forum_id
1357          AND fa.session_id = '" . $db->sql_escape($user->session_id) . "')
1358      ORDER BY f.left_id ASC";
1359  $result = $db->sql_query($sql);
1360  
1361  while ($row = $db->sql_fetchrow($result))
1362  {
1363      $rowset[(int) $row['forum_id']] = $row;
1364  }
1365  $db->sql_freeresult($result);
1366  
1367  $right = $cat_right = $padding_inc = 0;
1368  $padding = $forum_list = $holding = '';
1369  $pad_store = array('0' => '');
1370  
1371  /**
1372  * Modify the forum select list for advanced search page
1373  *
1374  * @event core.search_modify_forum_select_list
1375  * @var    array    rowset    Array with the forums list data
1376  * @since 3.1.10-RC1
1377  */
1378  $vars = array('rowset');
1379  extract($phpbb_dispatcher->trigger_event('core.search_modify_forum_select_list', compact($vars)));
1380  
1381  foreach ($rowset as $row)
1382  {
1383      if ($row['forum_type'] == FORUM_CAT && ($row['left_id'] + 1 == $row['right_id']))
1384      {
1385          // Non-postable forum with no subforums, don't display
1386          continue;
1387      }
1388  
1389      if ($row['forum_type'] == FORUM_POST && ($row['left_id'] + 1 == $row['right_id']) && !$row['enable_indexing'])
1390      {
1391          // Postable forum with no subforums and indexing disabled, don't display
1392          continue;
1393      }
1394  
1395      if ($row['forum_type'] == FORUM_LINK || ($row['forum_password'] && !$row['user_id']))
1396      {
1397          // if this forum is a link or password protected (user has not entered the password yet) then skip to the next branch
1398          continue;
1399      }
1400  
1401      if ($row['left_id'] < $right)
1402      {
1403          $padding .= '&nbsp; &nbsp;';
1404          $pad_store[$row['parent_id']] = $padding;
1405      }
1406      else if ($row['left_id'] > $right + 1)
1407      {
1408          if (isset($pad_store[$row['parent_id']]))
1409          {
1410              $padding = $pad_store[$row['parent_id']];
1411          }
1412          else
1413          {
1414              continue;
1415          }
1416      }
1417  
1418      $right = $row['right_id'];
1419  
1420      if ($auth->acl_gets('!f_search', '!f_list', $row['forum_id']))
1421      {
1422          // if the user does not have permissions to search or see this forum skip only this forum/category
1423          continue;
1424      }
1425  
1426      $selected = (in_array($row['forum_id'], $search_forum)) ? ' selected="selected"' : '';
1427  
1428      if ($row['left_id'] > $cat_right)
1429      {
1430          // make sure we don't forget anything
1431          $s_forums .= $holding;
1432          $holding = '';
1433      }
1434  
1435      if ($row['right_id'] - $row['left_id'] > 1)
1436      {
1437          $cat_right = max($cat_right, $row['right_id']);
1438  
1439          $holding .= '<option value="' . $row['forum_id'] . '"' . $selected . '>' . $padding . $row['forum_name'] . '</option>';
1440      }
1441      else
1442      {
1443          $s_forums .= $holding . '<option value="' . $row['forum_id'] . '"' . $selected . '>' . $padding . $row['forum_name'] . '</option>';
1444          $holding = '';
1445      }
1446  }
1447  
1448  if ($holding)
1449  {
1450      $s_forums .= $holding;
1451  }
1452  
1453  unset($pad_store);
1454  unset($rowset);
1455  
1456  if (!$s_forums)
1457  {
1458      trigger_error('NO_SEARCH');
1459  }
1460  
1461  // Number of chars returned
1462  $s_characters = '<option value="-1">' . $user->lang['ALL_AVAILABLE'] . '</option>';
1463  $s_characters .= '<option value="0">0</option>';
1464  $s_characters .= '<option value="25">25</option>';
1465  $s_characters .= '<option value="50">50</option>';
1466  
1467  for ($i = 100; $i <= 1000; $i += 100)
1468  {
1469      $selected = ($i == 300) ? ' selected="selected"' : '';
1470      $s_characters .= '<option value="' . $i . '"' . $selected . '>' . $i . '</option>';
1471  }
1472  
1473  $s_hidden_fields = array('t' => $topic_id);
1474  
1475  if ($_SID)
1476  {
1477      $s_hidden_fields['sid'] = $_SID;
1478  }
1479  
1480  if (!empty($_EXTRA_URL))
1481  {
1482      foreach ($_EXTRA_URL as $url_param)
1483      {
1484          $url_param = explode('=', $url_param, 2);
1485          $s_hidden_fields[$url_param[0]] = $url_param[1];
1486      }
1487  }
1488  
1489  $template->assign_vars(array(
1490      'S_SEARCH_ACTION'        => append_sid("{$phpbb_root_path}search.$phpEx", false, true, 0), // We force no ?sid= appending by using 0
1491      'S_HIDDEN_FIELDS'        => build_hidden_fields($s_hidden_fields),
1492      'S_CHARACTER_OPTIONS'    => $s_characters,
1493      'S_FORUM_OPTIONS'        => $s_forums,
1494      'S_SELECT_SORT_DIR'        => $s_sort_dir,
1495      'S_SELECT_SORT_KEY'        => $s_sort_key,
1496      'S_SELECT_SORT_DAYS'    => $s_limit_days,
1497      'S_IN_SEARCH'            => true,
1498  ));
1499  
1500  // only show recent searches to search administrators
1501  if ($auth->acl_get('a_search'))
1502  {
1503      // Handle large objects differently for Oracle and MSSQL
1504      switch ($db->get_sql_layer())
1505      {
1506          case 'oracle':
1507              $sql = 'SELECT search_time, search_keywords
1508                  FROM ' . SEARCH_RESULTS_TABLE . '
1509                  WHERE dbms_lob.getlength(search_keywords) > 0
1510                  ORDER BY search_time DESC';
1511          break;
1512  
1513          case 'mssql_odbc':
1514          case 'mssqlnative':
1515              $sql = 'SELECT search_time, search_keywords
1516                  FROM ' . SEARCH_RESULTS_TABLE . '
1517                  WHERE DATALENGTH(search_keywords) > 0
1518                  ORDER BY search_time DESC';
1519          break;
1520  
1521          default:
1522              $sql = 'SELECT search_time, search_keywords
1523                  FROM ' . SEARCH_RESULTS_TABLE . '
1524                  WHERE search_keywords <> \'\'
1525                  ORDER BY search_time DESC';
1526          break;
1527      }
1528      $result = $db->sql_query_limit($sql, 5);
1529  
1530      while ($row = $db->sql_fetchrow($result))
1531      {
1532          $keywords = $row['search_keywords'];
1533  
1534          $template->assign_block_vars('recentsearch', array(
1535              'KEYWORDS'    => $keywords,
1536              'TIME'        => $user->format_date($row['search_time']),
1537  
1538              'U_KEYWORDS'    => append_sid("{$phpbb_root_path}search.$phpEx", 'keywords=' . urlencode(htmlspecialchars_decode($keywords)))
1539          ));
1540      }
1541      $db->sql_freeresult($result);
1542  }
1543  
1544  // Output the basic page
1545  page_header($user->lang['SEARCH']);
1546  
1547  $template->set_filenames(array(
1548      'body' => 'search_body.html')
1549  );
1550  make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx"));
1551  
1552  page_footer();


Generated: Thu Jan 11 23:14:31 2018 Cross-referenced by PHPXref 0.7.1