[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/ -> search.php (source)

   1  <?php
   2  /**
   3  *
   4  * @package phpBB3
   5  * @version $Id$
   6  * @copyright (c) 2005 phpBB Group
   7  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
   8  *
   9  */
  10  
  11  /**
  12  * @ignore
  13  */
  14  define('IN_PHPBB', true);
  15  $phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
  16  $phpEx = substr(strrchr(__FILE__, '.'), 1);
  17  include($phpbb_root_path . 'common.' . $phpEx);
  18  
  19  // Start session management
  20  $user->session_begin();
  21  $auth->acl($user->data);
  22  $user->setup('search');
  23  
  24  // Define initial vars
  25  $mode            = request_var('mode', '');
  26  $search_id        = request_var('search_id', '');
  27  $start            = max(request_var('start', 0), 0);
  28  $post_id        = request_var('p', 0);
  29  $topic_id        = request_var('t', 0);
  30  $view            = request_var('view', '');
  31  
  32  $submit            = request_var('submit', false);
  33  $keywords        = utf8_normalize_nfc(request_var('keywords', '', true));
  34  $add_keywords    = utf8_normalize_nfc(request_var('add_keywords', '', true));
  35  $author            = request_var('author', '', true);
  36  $author_id        = request_var('author_id', 0);
  37  $show_results    = ($topic_id) ? 'posts' : request_var('sr', 'posts');
  38  $show_results    = ($show_results == 'posts') ? 'posts' : 'topics';
  39  $search_terms    = request_var('terms', 'all');
  40  $search_fields    = request_var('sf', 'all');
  41  $search_child    = request_var('sc', true);
  42  
  43  $sort_days        = request_var('st', 0);
  44  $sort_key        = request_var('sk', 't');
  45  $sort_dir        = request_var('sd', 'd');
  46  
  47  $return_chars    = request_var('ch', ($topic_id) ? -1 : 300);
  48  $search_forum    = request_var('fid', array(0));
  49  
  50  // We put login boxes for the case if search_id is newposts, egosearch or unreadposts
  51  // because a guest should be able to log in even if guests search is not permitted
  52  
  53  switch ($search_id)
  54  {
  55      // Egosearch is an author search
  56      case 'egosearch':
  57          $author_id = $user->data['user_id'];
  58          if ($user->data['user_id'] == ANONYMOUS)
  59          {
  60              login_box('', $user->lang['LOGIN_EXPLAIN_EGOSEARCH']);
  61          }
  62      break;
  63  
  64      // Search for unread posts needs to be allowed and user to be logged in if topics tracking for guests is disabled
  65      case 'unreadposts':
  66          if (!$config['load_unreads_search'])
  67          {
  68              $template->assign_var('S_NO_SEARCH', true);
  69              trigger_error('NO_SEARCH_UNREADS');
  70          }
  71          else if (!$config['load_anon_lastread'] && !$user->data['is_registered'])
  72          {
  73              login_box('', $user->lang['LOGIN_EXPLAIN_UNREADSEARCH']);
  74          }
  75      break;
  76      
  77      // The "new posts" search uses user_lastvisit which is user based, so it should require user to log in.
  78      case 'newposts':
  79          if ($user->data['user_id'] == ANONYMOUS)
  80          {
  81              login_box('', $user->lang['LOGIN_EXPLAIN_NEWPOSTS']);
  82          }
  83      break;
  84      
  85      default:
  86          // There's nothing to do here for now ;)
  87      break;
  88  }
  89  
  90  // Is user able to search? Has search been disabled?
  91  if (!$auth->acl_get('u_search') || !$auth->acl_getf_global('f_search') || !$config['load_search'])
  92  {
  93      $template->assign_var('S_NO_SEARCH', true);
  94      trigger_error('NO_SEARCH');
  95  }
  96  
  97  // Check search load limit
  98  if ($user->load && $config['limit_search_load'] && ($user->load > doubleval($config['limit_search_load'])))
  99  {
 100      $template->assign_var('S_NO_SEARCH', true);
 101      trigger_error('NO_SEARCH_TIME');
 102  }
 103  
 104  // It is applicable if the configuration setting is non-zero, and the user cannot
 105  // ignore the flood setting, and the search is a keyword search.
 106  $interval = ($user->data['user_id'] == ANONYMOUS) ? $config['search_anonymous_interval'] : $config['search_interval'];
 107  if ($interval && !in_array($search_id, array('unreadposts', 'unanswered', 'active_topics', 'egosearch')) && !$auth->acl_get('u_ignoreflood'))
 108  {
 109      if ($user->data['user_last_search'] > time() - $interval)
 110      {
 111          $template->assign_var('S_NO_SEARCH', true);
 112          trigger_error('NO_SEARCH_TIME');
 113      }
 114  }
 115  
 116  // Define some vars
 117  $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']);
 118  $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']);
 119  
 120  $s_limit_days = $s_sort_key = $s_sort_dir = $u_sort_param = '';
 121  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);
 122  
 123  if ($keywords || $author || $author_id || $search_id || $submit)
 124  {
 125      // clear arrays
 126      $id_ary = array();
 127  
 128      // If we are looking for authors get their ids
 129      $author_id_ary = array();
 130      $sql_author_match = '';
 131      if ($author_id)
 132      {
 133          $author_id_ary[] = $author_id;
 134      }
 135      else if ($author)
 136      {
 137          if ((strpos($author, '*') !== false) && (utf8_strlen(str_replace(array('*', '%'), '', $author)) < $config['min_search_author_chars']))
 138          {
 139              trigger_error(sprintf($user->lang['TOO_FEW_AUTHOR_CHARS'], $config['min_search_author_chars']));
 140          }
 141  
 142          $sql_where = (strpos($author, '*') !== false) ? ' username_clean ' . $db->sql_like_expression(str_replace('*', $db->any_char, utf8_clean_string($author))) : " username_clean = '" . $db->sql_escape(utf8_clean_string($author)) . "'";
 143  
 144          $sql = 'SELECT user_id
 145              FROM ' . USERS_TABLE . "
 146              WHERE $sql_where
 147                  AND user_type <> " . USER_IGNORE;
 148          $result = $db->sql_query_limit($sql, 100);
 149  
 150          while ($row = $db->sql_fetchrow($result))
 151          {
 152              $author_id_ary[] = (int) $row['user_id'];
 153          }
 154          $db->sql_freeresult($result);
 155  
 156          $sql_where = (strpos($author, '*') !== false) ? ' post_username ' . $db->sql_like_expression(str_replace('*', $db->any_char, utf8_clean_string($author))) : " post_username = '" . $db->sql_escape(utf8_clean_string($author)) . "'";
 157  
 158          $sql = 'SELECT 1 as guest_post
 159              FROM ' . POSTS_TABLE . "
 160              WHERE $sql_where
 161                  AND poster_id = " . ANONYMOUS;
 162          $result = $db->sql_query_limit($sql, 1);
 163          $found_guest_post = $db->sql_fetchfield('guest_post');
 164          $db->sql_freeresult($result);
 165  
 166          if ($found_guest_post)
 167          {
 168              $author_id_ary[] = ANONYMOUS;
 169              $sql_author_match = (strpos($author, '*') !== false) ? ' ' . $db->sql_like_expression(str_replace('*', $db->any_char, utf8_clean_string($author))) : " = '" . $db->sql_escape(utf8_clean_string($author)) . "'";
 170          }
 171  
 172          if (!sizeof($author_id_ary))
 173          {
 174              trigger_error('NO_SEARCH_RESULTS');
 175          }
 176      }
 177  
 178      // if we search in an existing search result just add the additional keywords. But we need to use "all search terms"-mode
 179      // so we can keep the old keywords in their old mode, but add the new ones as required words
 180      if ($add_keywords)
 181      {
 182          if ($search_terms == 'all')
 183          {
 184              $keywords .= ' ' . $add_keywords;
 185          }
 186          else
 187          {
 188              $search_terms = 'all';
 189              $keywords = implode(' |', explode(' ', preg_replace('#\s+#u', ' ', $keywords))) . ' ' .$add_keywords;
 190          }
 191      }
 192  
 193      // Which forums should not be searched? Author searches are also carried out in unindexed forums
 194      if (empty($keywords) && sizeof($author_id_ary))
 195      {
 196          $ex_fid_ary = array_keys($auth->acl_getf('!f_read', true));
 197      }
 198      else
 199      {
 200          $ex_fid_ary = array_unique(array_merge(array_keys($auth->acl_getf('!f_read', true)), array_keys($auth->acl_getf('!f_search', true))));
 201      }
 202  
 203      $not_in_fid = (sizeof($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'] . ')' : "";
 204  
 205      $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
 206          FROM ' . FORUMS_TABLE . ' f
 207          LEFT JOIN ' . FORUMS_ACCESS_TABLE . " fa ON (fa.forum_id = f.forum_id
 208              AND fa.session_id = '" . $db->sql_escape($user->session_id) . "')
 209          $not_in_fid
 210          ORDER BY f.left_id";
 211      $result = $db->sql_query($sql);
 212  
 213      $right_id = 0;
 214      $reset_search_forum = true;
 215      while ($row = $db->sql_fetchrow($result))
 216      {
 217          if ($row['forum_password'] && $row['user_id'] != $user->data['user_id'])
 218          {
 219              $ex_fid_ary[] = (int) $row['forum_id'];
 220              continue;
 221          }
 222  
 223          // Exclude forums from active topics
 224          if (!($row['forum_flags'] & FORUM_FLAG_ACTIVE_TOPICS) && ($search_id == 'active_topics'))
 225          {
 226              $ex_fid_ary[] = (int) $row['forum_id'];
 227              continue;
 228          }
 229  
 230          if (sizeof($search_forum))
 231          {
 232              if ($search_child)
 233              {
 234                  if (in_array($row['forum_id'], $search_forum) && $row['right_id'] > $right_id)
 235                  {
 236                      $right_id = (int) $row['right_id'];
 237                  }
 238                  else if ($row['right_id'] < $right_id)
 239                  {
 240                      continue;
 241                  }
 242              }
 243  
 244              if (!in_array($row['forum_id'], $search_forum))
 245              {
 246                  $ex_fid_ary[] = (int) $row['forum_id'];
 247                  $reset_search_forum = false;
 248              }
 249          }
 250      }
 251      $db->sql_freeresult($result);
 252  
 253      // find out in which forums the user is allowed to view approved posts
 254      if ($auth->acl_get('m_approve'))
 255      {
 256          $m_approve_fid_ary = array(-1);
 257          $m_approve_fid_sql = '';
 258      }
 259      else if ($auth->acl_getf_global('m_approve'))
 260      {
 261          $m_approve_fid_ary = array_diff(array_keys($auth->acl_getf('!m_approve', true)), $ex_fid_ary);
 262          $m_approve_fid_sql = ' AND (p.post_approved = 1' . ((sizeof($m_approve_fid_ary)) ? ' OR ' . $db->sql_in_set('p.forum_id', $m_approve_fid_ary, true) : '') . ')';
 263      }
 264      else
 265      {
 266          $m_approve_fid_ary = array();
 267          $m_approve_fid_sql = ' AND p.post_approved = 1';
 268      }
 269  
 270      if ($reset_search_forum)
 271      {
 272          $search_forum = array();
 273      }
 274  
 275      // Select which method we'll use to obtain the post_id or topic_id information
 276      $search_type = basename($config['search_type']);
 277  
 278      if (!file_exists($phpbb_root_path . 'includes/search/' . $search_type . '.' . $phpEx))
 279      {
 280          trigger_error('NO_SUCH_SEARCH_MODULE');
 281      }
 282  
 283      require("{$phpbb_root_path}includes/search/$search_type.$phpEx");
 284  
 285      // We do some additional checks in the module to ensure it can actually be utilised
 286      $error = false;
 287      $search = new $search_type($error);
 288  
 289      if ($error)
 290      {
 291          trigger_error($error);
 292      }
 293  
 294      // let the search module split up the keywords
 295      if ($keywords)
 296      {
 297          $correct_query = $search->split_keywords($keywords, $search_terms);
 298          if (!$correct_query || (empty($search->search_query) && !sizeof($author_id_ary) && !$search_id))
 299          {
 300              $ignored = (sizeof($search->common_words)) ? sprintf($user->lang['IGNORED_TERMS_EXPLAIN'], implode(' ', $search->common_words)) . '<br />' : '';
 301              trigger_error($ignored . sprintf($user->lang['NO_KEYWORDS'], $search->word_length['min'], $search->word_length['max']));
 302          }
 303      }
 304  
 305      if (!$keywords && sizeof($author_id_ary))
 306      {
 307          // if it is an author search we want to show topics by default
 308          $show_results = ($topic_id) ? 'posts' : request_var('sr', ($search_id == 'egosearch') ? 'topics' : 'posts');
 309          $show_results = ($show_results == 'posts') ? 'posts' : 'topics';
 310      }
 311  
 312      // define some variables needed for retrieving post_id/topic_id information
 313      $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'));
 314  
 315      // pre-made searches
 316      $sql = $field = $l_search_title = '';
 317      if ($search_id)
 318      {
 319          switch ($search_id)
 320          {
 321              // Oh holy Bob, bring us some activity...
 322              case 'active_topics':
 323                  $l_search_title = $user->lang['SEARCH_ACTIVE_TOPICS'];
 324                  $show_results = 'topics';
 325                  $sort_key = 't';
 326                  $sort_dir = 'd';
 327                  $sort_days = request_var('st', 7);
 328                  $sort_by_sql['t'] = 't.topic_last_post_time';
 329  
 330                  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);
 331                  $s_sort_key = $s_sort_dir = '';
 332  
 333                  $last_post_time_sql = ($sort_days) ? ' AND t.topic_last_post_time > ' . (time() - ($sort_days * 24 * 3600)) : '';
 334  
 335                  $sql = 'SELECT t.topic_last_post_time, t.topic_id
 336                      FROM ' . TOPICS_TABLE . " t
 337                      WHERE t.topic_moved_id = 0
 338                          $last_post_time_sql
 339                          " . str_replace(array('p.', 'post_'), array('t.', 'topic_'), $m_approve_fid_sql) . '
 340                          ' . ((sizeof($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('t.forum_id', $ex_fid_ary, true) : '') . '
 341                      ORDER BY t.topic_last_post_time DESC';
 342                  $field = 'topic_id';
 343              break;
 344  
 345              case 'unanswered':
 346                  $l_search_title = $user->lang['SEARCH_UNANSWERED'];
 347                  $show_results = request_var('sr', 'topics');
 348                  $show_results = ($show_results == 'posts') ? 'posts' : 'topics';
 349                  $sort_by_sql['t'] = ($show_results == 'posts') ? 'p.post_time' : 't.topic_last_post_time';
 350                  $sort_by_sql['s'] = ($show_results == 'posts') ? 'p.post_subject' : 't.topic_title';
 351                  $sql_sort = 'ORDER BY ' . $sort_by_sql[$sort_key] . (($sort_dir == 'a') ? ' ASC' : ' DESC');
 352  
 353                  $sort_join = ($sort_key == 'f') ? FORUMS_TABLE . ' f, ' : '';
 354                  $sql_sort = ($sort_key == 'f') ? ' AND f.forum_id = p.forum_id ' . $sql_sort : $sql_sort;
 355  
 356                  if ($sort_days)
 357                  {
 358                      $last_post_time = 'AND p.post_time > ' . (time() - ($sort_days * 24 * 3600));
 359                  }
 360                  else
 361                  {
 362                      $last_post_time = '';
 363                  }
 364  
 365                  if ($sort_key == 'a')
 366                  {
 367                      $sort_join = USERS_TABLE . ' u, ';
 368                      $sql_sort = ' AND u.user_id = p.poster_id ' . $sql_sort;
 369                  }
 370                  if ($show_results == 'posts')
 371                  {
 372                      $sql = "SELECT p.post_id
 373                          FROM $sort_join" . POSTS_TABLE . ' p, ' . TOPICS_TABLE . " t
 374                          WHERE t.topic_replies = 0
 375                              AND p.topic_id = t.topic_id
 376                              $last_post_time
 377                              $m_approve_fid_sql
 378                              " . ((sizeof($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '') . "
 379                              $sql_sort";
 380                      $field = 'post_id';
 381                  }
 382                  else
 383                  {
 384                      $sql = 'SELECT DISTINCT ' . $sort_by_sql[$sort_key] . ", p.topic_id
 385                          FROM $sort_join" . POSTS_TABLE . ' p, ' . TOPICS_TABLE . " t
 386                          WHERE t.topic_replies = 0
 387                              AND t.topic_moved_id = 0
 388                              AND p.topic_id = t.topic_id
 389                              $last_post_time
 390                              $m_approve_fid_sql
 391                              " . ((sizeof($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '') . "
 392                          $sql_sort";
 393                      $field = 'topic_id';
 394                  }
 395              break;
 396  
 397              case 'unreadposts':
 398                  $l_search_title = $user->lang['SEARCH_UNREAD'];
 399                  // force sorting
 400                  $show_results = 'topics';
 401                  $sort_key = 't';
 402                  $sort_by_sql['t'] = 't.topic_last_post_time';
 403                  $sql_sort = 'ORDER BY ' . $sort_by_sql[$sort_key] . (($sort_dir == 'a') ? ' ASC' : ' DESC');
 404  
 405                  $sql_where = 'AND t.topic_moved_id = 0
 406                      ' . str_replace(array('p.', 'post_'), array('t.', 'topic_'), $m_approve_fid_sql) . '
 407                      ' . ((sizeof($ex_fid_ary)) ? 'AND ' . $db->sql_in_set('t.forum_id', $ex_fid_ary, true) : '');
 408  
 409                  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);
 410                  $s_sort_key = $s_sort_dir = $u_sort_param = $s_limit_days = '';
 411              break;
 412  
 413              case 'newposts':
 414                  $l_search_title = $user->lang['SEARCH_NEW'];
 415                  // force sorting
 416                  $show_results = (request_var('sr', 'topics') == 'posts') ? 'posts' : 'topics';
 417                  $sort_key = 't';
 418                  $sort_dir = 'd';
 419                  $sort_by_sql['t'] = ($show_results == 'posts') ? 'p.post_time' : 't.topic_last_post_time';
 420                  $sql_sort = 'ORDER BY ' . $sort_by_sql[$sort_key] . (($sort_dir == 'a') ? ' ASC' : ' DESC');
 421  
 422                  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);
 423                  $s_sort_key = $s_sort_dir = $u_sort_param = $s_limit_days = '';
 424  
 425                  if ($show_results == 'posts')
 426                  {
 427                      $sql = 'SELECT p.post_id
 428                          FROM ' . POSTS_TABLE . ' p
 429                          WHERE p.post_time > ' . $user->data['user_lastvisit'] . "
 430                              $m_approve_fid_sql
 431                              " . ((sizeof($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '') . "
 432                          $sql_sort";
 433                      $field = 'post_id';
 434                  }
 435                  else
 436                  {
 437                      $sql = 'SELECT t.topic_id
 438                          FROM ' . TOPICS_TABLE . ' t
 439                          WHERE t.topic_last_post_time > ' . $user->data['user_lastvisit'] . '
 440                              AND t.topic_moved_id = 0
 441                              ' . str_replace(array('p.', 'post_'), array('t.', 'topic_'), $m_approve_fid_sql) . '
 442                              ' . ((sizeof($ex_fid_ary)) ? 'AND ' . $db->sql_in_set('t.forum_id', $ex_fid_ary, true) : '') . "
 443                          $sql_sort";
 444  /*
 445          [Fix] queued replies missing from "view new posts" (Bug #42705 - Patch by Paul)
 446          - Creates temporary table, query is far from optimized
 447  
 448                      $sql = 'SELECT t.topic_id
 449                          FROM ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE . ' p
 450                          WHERE p.post_time > ' . $user->data['user_lastvisit'] . '
 451                              AND t.topic_id = p.topic_id
 452                              AND t.topic_moved_id = 0
 453                              ' . $m_approve_fid_sql . '
 454                              ' . ((sizeof($ex_fid_ary)) ? 'AND ' . $db->sql_in_set('t.forum_id', $ex_fid_ary, true) : '') . "
 455                          GROUP BY t.topic_id
 456                          $sql_sort";
 457  */
 458                      $field = 'topic_id';
 459                  }
 460              break;
 461  
 462              case 'egosearch':
 463                  $l_search_title = $user->lang['SEARCH_SELF'];
 464              break;
 465          }
 466      }
 467  
 468      // show_results should not change after this
 469      $per_page = ($show_results == 'posts') ? $config['posts_per_page'] : $config['topics_per_page'];
 470      $total_match_count = 0;
 471  
 472      // Set limit for the $total_match_count to reduce server load
 473      $total_matches_limit = 1000;
 474      $found_more_search_matches = false;
 475  
 476      if ($search_id)
 477      {
 478          if ($sql)
 479          {
 480              // Only return up to $total_matches_limit+1 ids (the last one will be removed later)
 481              $result = $db->sql_query_limit($sql, $total_matches_limit + 1);
 482  
 483              while ($row = $db->sql_fetchrow($result))
 484              {
 485                  $id_ary[] = (int) $row[$field];
 486              }
 487              $db->sql_freeresult($result);
 488          }
 489          else if ($search_id == 'unreadposts')
 490          {
 491              // Only return up to $total_matches_limit+1 ids (the last one will be removed later)
 492              $id_ary = array_keys(get_unread_topics($user->data['user_id'], $sql_where, $sql_sort, $total_matches_limit + 1));
 493          }
 494          else
 495          {
 496              $search_id = '';
 497          }
 498  
 499          $total_match_count = sizeof($id_ary);
 500          if ($total_match_count)
 501          {
 502              // Limit the number to $total_matches_limit for pre-made searches
 503              if ($total_match_count > $total_matches_limit)
 504              {
 505                  $found_more_search_matches = true;
 506                  $total_match_count = $total_matches_limit;
 507              }
 508  
 509              // Make sure $start is set to the last page if it exceeds the amount
 510              if ($start < 0)
 511              {
 512                  $start = 0;
 513              }
 514              else if ($start >= $total_match_count)
 515              {
 516                  $start = floor(($total_match_count - 1) / $per_page) * $per_page;
 517              }
 518  
 519              $id_ary = array_slice($id_ary, $start, $per_page);
 520          }
 521          else
 522          {
 523              // Set $start to 0 if no matches were found
 524              $start = 0;
 525          }
 526      }
 527  
 528      // make sure that some arrays are always in the same order
 529      sort($ex_fid_ary);
 530      sort($m_approve_fid_ary);
 531      sort($author_id_ary);
 532  
 533      if (!empty($search->search_query))
 534      {
 535          $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_fid_ary, $topic_id, $author_id_ary, $sql_author_match, $id_ary, $start, $per_page);
 536      }
 537      else if (sizeof($author_id_ary))
 538      {
 539          $firstpost_only = ($search_fields === 'firstpost' || $search_fields == 'titleonly') ? true : false;
 540          $total_match_count = $search->author_search($show_results, $firstpost_only, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_fid_ary, $m_approve_fid_ary, $topic_id, $author_id_ary, $sql_author_match, $id_ary, $start, $per_page);
 541      }
 542  
 543      // For some searches we need to print out the "no results" page directly to allow re-sorting/refining the search options.
 544      if (!sizeof($id_ary) && !$search_id)
 545      {
 546          trigger_error('NO_SEARCH_RESULTS');
 547      }
 548  
 549      $sql_where = '';
 550  
 551      if (sizeof($id_ary))
 552      {
 553          $sql_where .= $db->sql_in_set(($show_results == 'posts') ? 'p.post_id' : 't.topic_id', $id_ary);
 554          $sql_where .= (sizeof($ex_fid_ary)) ? ' AND (' . $db->sql_in_set('f.forum_id', $ex_fid_ary, true) . ' OR f.forum_id IS NULL)' : '';
 555          $sql_where .= ($show_results == 'posts') ? $m_approve_fid_sql : str_replace(array('p.post_approved', 'p.forum_id'), array('t.topic_approved', 't.forum_id'), $m_approve_fid_sql);
 556      }
 557  
 558      if ($show_results == 'posts')
 559      {
 560          include($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
 561      }
 562      else
 563      {
 564          include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
 565      }
 566  
 567      $user->add_lang('viewtopic');
 568  
 569      // Grab icons
 570      $icons = $cache->obtain_icons();
 571  
 572      // Output header
 573      if ($found_more_search_matches)
 574      {
 575          $l_search_matches = sprintf($user->lang['FOUND_MORE_SEARCH_MATCHES'], $total_match_count);
 576      }
 577      else
 578      {
 579          $l_search_matches = ($total_match_count == 1) ? sprintf($user->lang['FOUND_SEARCH_MATCH'], $total_match_count) : sprintf($user->lang['FOUND_SEARCH_MATCHES'], $total_match_count);
 580      }
 581  
 582      // define some vars for urls
 583      $hilit = implode('|', explode(' ', preg_replace('#\s+#u', ' ', str_replace(array('+', '-', '|', '(', ')', '&quot;'), ' ', $keywords))));
 584      // Do not allow *only* wildcard being used for hilight
 585      $hilit = (strspn($hilit, '*') === strlen($hilit)) ? '' : $hilit;
 586  
 587      $u_hilit = urlencode(htmlspecialchars_decode(str_replace('|', ' ', $hilit)));
 588      $u_show_results = '&amp;sr=' . $show_results;
 589      $u_search_forum = implode('&amp;fid%5B%5D=', $search_forum);
 590  
 591      $u_search = append_sid("{$phpbb_root_path}search.$phpEx", $u_sort_param . $u_show_results);
 592      $u_search .= ($search_id) ? '&amp;search_id=' . $search_id : '';
 593      $u_search .= ($u_hilit) ? '&amp;keywords=' . urlencode(htmlspecialchars_decode($keywords)) : '';
 594      $u_search .= ($search_terms != 'all') ? '&amp;terms=' . $search_terms : '';
 595      $u_search .= ($topic_id) ? '&amp;t=' . $topic_id : '';
 596      $u_search .= ($author) ? '&amp;author=' . urlencode(htmlspecialchars_decode($author)) : '';
 597      $u_search .= ($author_id) ? '&amp;author_id=' . $author_id : '';
 598      $u_search .= ($u_search_forum) ? '&amp;fid%5B%5D=' . $u_search_forum : '';
 599      $u_search .= (!$search_child) ? '&amp;sc=0' : '';
 600      $u_search .= ($search_fields != 'all') ? '&amp;sf=' . $search_fields : '';
 601      $u_search .= ($return_chars != 300) ? '&amp;ch=' . $return_chars : '';
 602  
 603      $template->assign_vars(array(
 604          'SEARCH_TITLE'        => $l_search_title,
 605          'SEARCH_MATCHES'    => $l_search_matches,
 606          'SEARCH_WORDS'        => $keywords,
 607          'SEARCHED_QUERY'    => $search->search_query,
 608          'IGNORED_WORDS'        => (sizeof($search->common_words)) ? implode(' ', $search->common_words) : '',
 609          'PAGINATION'        => generate_pagination($u_search, $total_match_count, $per_page, $start),
 610          'PAGE_NUMBER'        => on_page($total_match_count, $per_page, $start),
 611          'TOTAL_MATCHES'        => $total_match_count,
 612          'SEARCH_IN_RESULTS'    => ($search_id) ? false : true,
 613  
 614          'S_SELECT_SORT_DIR'        => $s_sort_dir,
 615          'S_SELECT_SORT_KEY'        => $s_sort_key,
 616          'S_SELECT_SORT_DAYS'    => $s_limit_days,
 617          'S_SEARCH_ACTION'        => $u_search,
 618          'S_SHOW_TOPICS'            => ($show_results == 'posts') ? false : true,
 619  
 620          'GOTO_PAGE_IMG'        => $user->img('icon_post_target', 'GOTO_PAGE'),
 621          'NEWEST_POST_IMG'    => $user->img('icon_topic_newest', 'VIEW_NEWEST_POST'),
 622          'REPORTED_IMG'        => $user->img('icon_topic_reported', 'TOPIC_REPORTED'),
 623          'UNAPPROVED_IMG'    => $user->img('icon_topic_unapproved', 'TOPIC_UNAPPROVED'),
 624          'LAST_POST_IMG'        => $user->img('icon_topic_latest', 'VIEW_LATEST_POST'),
 625  
 626          'U_SEARCH_WORDS'    => $u_search,
 627      ));
 628  
 629      if ($sql_where)
 630      {
 631          if ($show_results == 'posts')
 632          {
 633              // @todo Joining this query to the one below?
 634              $sql = 'SELECT zebra_id, friend, foe
 635                  FROM ' . ZEBRA_TABLE . '
 636                  WHERE user_id = ' . $user->data['user_id'];
 637              $result = $db->sql_query($sql);
 638  
 639              $zebra = array();
 640              while ($row = $db->sql_fetchrow($result))
 641              {
 642                  $zebra[($row['friend']) ? 'friend' : 'foe'][] = $row['zebra_id'];
 643              }
 644              $db->sql_freeresult($result);
 645  
 646              $sql = '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
 647                  FROM ' . POSTS_TABLE . ' p
 648                      LEFT JOIN ' . TOPICS_TABLE . ' t ON (p.topic_id = t.topic_id)
 649                      LEFT JOIN ' . FORUMS_TABLE . ' f ON (p.forum_id = f.forum_id)
 650                      LEFT JOIN ' . USERS_TABLE . " u ON (p.poster_id = u.user_id)
 651                  WHERE $sql_where";
 652          }
 653          else
 654          {
 655              $sql_from = TOPICS_TABLE . ' t
 656                  LEFT JOIN ' . FORUMS_TABLE . ' f ON (f.forum_id = t.forum_id)
 657                  ' . (($sort_key == 'a') ? ' LEFT JOIN ' . USERS_TABLE . ' u ON (u.user_id = t.topic_poster) ' : '');
 658              $sql_select = 't.*, f.forum_id, f.forum_name';
 659  
 660              if ($user->data['is_registered'])
 661              {
 662                  if ($config['load_db_track'] && $author_id !== $user->data['user_id'])
 663                  {
 664                      $sql_from .= ' LEFT JOIN ' . TOPICS_POSTED_TABLE . ' tp ON (tp.user_id = ' . $user->data['user_id'] . '
 665                          AND t.topic_id = tp.topic_id)';
 666                      $sql_select .= ', tp.topic_posted';
 667                  }
 668  
 669                  if ($config['load_db_lastread'])
 670                  {
 671                      $sql_from .= ' LEFT JOIN ' . TOPICS_TRACK_TABLE . ' tt ON (tt.user_id = ' . $user->data['user_id'] . '
 672                              AND t.topic_id = tt.topic_id)
 673                          LEFT JOIN ' . FORUMS_TRACK_TABLE . ' ft ON (ft.user_id = ' . $user->data['user_id'] . '
 674                              AND ft.forum_id = f.forum_id)';
 675                      $sql_select .= ', tt.mark_time, ft.mark_time as f_mark_time';
 676                  }
 677              }
 678  
 679              if ($config['load_anon_lastread'] || ($user->data['is_registered'] && !$config['load_db_lastread']))
 680              {
 681                  $tracking_topics = (isset($_COOKIE[$config['cookie_name'] . '_track'])) ? ((STRIP) ? stripslashes($_COOKIE[$config['cookie_name'] . '_track']) : $_COOKIE[$config['cookie_name'] . '_track']) : '';
 682                  $tracking_topics = ($tracking_topics) ? tracking_unserialize($tracking_topics) : array();
 683              }
 684  
 685              $sql = "SELECT $sql_select
 686                  FROM $sql_from
 687                  WHERE $sql_where";
 688          }
 689          $sql .= ' ORDER BY ' . $sort_by_sql[$sort_key] . ' ' . (($sort_dir == 'd') ? 'DESC' : 'ASC');
 690          $result = $db->sql_query($sql);
 691          $result_topic_id = 0;
 692  
 693          $rowset = array();
 694  
 695          if ($show_results == 'topics')
 696          {
 697              $forums = $rowset = $shadow_topic_list = array();
 698              while ($row = $db->sql_fetchrow($result))
 699              {
 700                  $row['forum_id'] = (int) $row['forum_id'];
 701                  $row['topic_id'] = (int) $row['topic_id'];
 702  
 703                  if ($row['topic_status'] == ITEM_MOVED)
 704                  {
 705                      $shadow_topic_list[$row['topic_moved_id']] = $row['topic_id'];
 706                  }
 707  
 708                  $rowset[$row['topic_id']] = $row;
 709  
 710                  if (!isset($forums[$row['forum_id']]) && $user->data['is_registered'] && $config['load_db_lastread'])
 711                  {
 712                      $forums[$row['forum_id']]['mark_time'] = $row['f_mark_time'];
 713                  }
 714                  $forums[$row['forum_id']]['topic_list'][] = $row['topic_id'];
 715                  $forums[$row['forum_id']]['rowset'][$row['topic_id']] = &$rowset[$row['topic_id']];
 716              }
 717              $db->sql_freeresult($result);
 718  
 719              // If we have some shadow topics, update the rowset to reflect their topic information
 720              if (sizeof($shadow_topic_list))
 721              {
 722                  $sql = 'SELECT *
 723                      FROM ' . TOPICS_TABLE . '
 724                      WHERE ' . $db->sql_in_set('topic_id', array_keys($shadow_topic_list));
 725                  $result = $db->sql_query($sql);
 726  
 727                  while ($row = $db->sql_fetchrow($result))
 728                  {
 729                      $orig_topic_id = $shadow_topic_list[$row['topic_id']];
 730  
 731                      // We want to retain some values
 732                      $row = array_merge($row, array(
 733                          'topic_moved_id'    => $rowset[$orig_topic_id]['topic_moved_id'],
 734                          'topic_status'        => $rowset[$orig_topic_id]['topic_status'],
 735                          'forum_name'        => $rowset[$orig_topic_id]['forum_name'])
 736                      );
 737  
 738                      $rowset[$orig_topic_id] = $row;
 739                  }
 740                  $db->sql_freeresult($result);
 741              }
 742              unset($shadow_topic_list);
 743  
 744              foreach ($forums as $forum_id => $forum)
 745              {
 746                  if ($user->data['is_registered'] && $config['load_db_lastread'])
 747                  {
 748                      $topic_tracking_info[$forum_id] = get_topic_tracking($forum_id, $forum['topic_list'], $forum['rowset'], array($forum_id => $forum['mark_time']), ($forum_id) ? false : $forum['topic_list']);
 749                  }
 750                  else if ($config['load_anon_lastread'] || $user->data['is_registered'])
 751                  {
 752                      $topic_tracking_info[$forum_id] = get_complete_topic_tracking($forum_id, $forum['topic_list'], ($forum_id) ? false : $forum['topic_list']);
 753  
 754                      if (!$user->data['is_registered'])
 755                      {
 756                          $user->data['user_lastmark'] = (isset($tracking_topics['l'])) ? (int) (base_convert($tracking_topics['l'], 36, 10) + $config['board_startdate']) : 0;
 757                      }
 758                  }
 759              }
 760              unset($forums);
 761          }
 762          else
 763          {
 764              $bbcode_bitfield = $text_only_message = '';
 765              $attach_list = array();
 766  
 767              while ($row = $db->sql_fetchrow($result))
 768              {
 769                  // We pre-process some variables here for later usage
 770                  $row['post_text'] = censor_text($row['post_text']);
 771  
 772                  $text_only_message = $row['post_text'];
 773                  // make list items visible as such
 774                  if ($row['bbcode_uid'])
 775                  {
 776                      $text_only_message = str_replace('[*:' . $row['bbcode_uid'] . ']', '&sdot;&nbsp;', $text_only_message);
 777                      // no BBCode in text only message
 778                      strip_bbcode($text_only_message, $row['bbcode_uid']);
 779                  }
 780  
 781                  if ($return_chars == -1 || utf8_strlen($text_only_message) < ($return_chars + 3))
 782                  {
 783                      $row['display_text_only'] = false;
 784                      $bbcode_bitfield = $bbcode_bitfield | base64_decode($row['bbcode_bitfield']);
 785  
 786                      // Does this post have an attachment? If so, add it to the list
 787                      if ($row['post_attachment'] && $config['allow_attachments'])
 788                      {
 789                          $attach_list[$row['forum_id']][] = $row['post_id'];
 790                      }
 791                  }
 792                  else
 793                  {
 794                      $row['post_text'] = $text_only_message;
 795                      $row['display_text_only'] = true;
 796                  }
 797  
 798                  $rowset[] = $row;
 799              }
 800              $db->sql_freeresult($result);
 801  
 802              unset($text_only_message);
 803  
 804              // Instantiate BBCode if needed
 805              if ($bbcode_bitfield !== '')
 806              {
 807                  include_once($phpbb_root_path . 'includes/bbcode.' . $phpEx);
 808                  $bbcode = new bbcode(base64_encode($bbcode_bitfield));
 809              }
 810  
 811              // Pull attachment data
 812              if (sizeof($attach_list))
 813              {
 814                  $use_attach_list = $attach_list;
 815                  $attach_list = array();
 816  
 817                  foreach ($use_attach_list as $forum_id => $_list)
 818                  {
 819                      if ($auth->acl_get('u_download') && $auth->acl_get('f_download', $forum_id))
 820                      {
 821                          $attach_list = array_merge($attach_list, $_list);
 822                      }
 823                  }
 824              }
 825  
 826              if (sizeof($attach_list))
 827              {
 828                  $sql = 'SELECT *
 829                      FROM ' . ATTACHMENTS_TABLE . '
 830                      WHERE ' . $db->sql_in_set('post_msg_id', $attach_list) . '
 831                          AND in_message = 0
 832                      ORDER BY filetime DESC, post_msg_id ASC';
 833                  $result = $db->sql_query($sql);
 834  
 835                  while ($row = $db->sql_fetchrow($result))
 836                  {
 837                      $attachments[$row['post_msg_id']][] = $row;
 838                  }
 839                  $db->sql_freeresult($result);
 840              }
 841          }
 842  
 843          if ($hilit)
 844          {
 845              // Remove bad highlights
 846              $hilit_array = array_filter(explode('|', $hilit), 'strlen');
 847              foreach ($hilit_array as $key => $value)
 848              {
 849                  $hilit_array[$key] = str_replace('\*', '\w*?', preg_quote($value, '#'));
 850                  $hilit_array[$key] = preg_replace('#(^|\s)\\\\w\*\?(\s|$)#', '$1\w+?$2', $hilit_array[$key]);
 851              }
 852              $hilit = implode('|', $hilit_array);
 853          }
 854  
 855          foreach ($rowset as $row)
 856          {
 857              $forum_id = $row['forum_id'];
 858              $result_topic_id = $row['topic_id'];
 859              $topic_title = censor_text($row['topic_title']);
 860  
 861              // we need to select a forum id for this global topic
 862              if (!$forum_id)
 863              {
 864                  if (!isset($g_forum_id))
 865                  {
 866                      // Get a list of forums the user cannot read
 867                      $forum_ary = array_unique(array_keys($auth->acl_getf('!f_read', true)));
 868  
 869                      // Determine first forum the user is able to read (must not be a category)
 870                      $sql = 'SELECT forum_id
 871                          FROM ' . FORUMS_TABLE . '
 872                          WHERE forum_type = ' . FORUM_POST;
 873  
 874                      if (sizeof($forum_ary))
 875                      {
 876                          $sql .= ' AND ' . $db->sql_in_set('forum_id', $forum_ary, true);
 877                      }
 878  
 879                      $result = $db->sql_query_limit($sql, 1);
 880                      $g_forum_id = (int) $db->sql_fetchfield('forum_id');
 881                  }
 882                  $u_forum_id = $g_forum_id;
 883              }
 884              else
 885              {
 886                  $u_forum_id = $forum_id;
 887              }
 888  
 889              $view_topic_url_params = "f=$u_forum_id&amp;t=$result_topic_id" . (($u_hilit) ? "&amp;hilit=$u_hilit" : '');
 890              $view_topic_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", $view_topic_url_params);
 891  
 892              $replies = ($auth->acl_get('m_approve', $forum_id)) ? $row['topic_replies_real'] : $row['topic_replies'];
 893  
 894              if ($show_results == 'topics')
 895              {
 896                  if ($config['load_db_track'] && $author_id === $user->data['user_id'])
 897                  {
 898                      $row['topic_posted'] = 1;
 899                  }
 900  
 901                  $folder_img = $folder_alt = $topic_type = '';
 902                  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);
 903  
 904                  $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;
 905  
 906                  $topic_unapproved = (!$row['topic_approved'] && $auth->acl_get('m_approve', $forum_id)) ? true : false;
 907                  $posts_unapproved = ($row['topic_approved'] && $row['topic_replies'] < $row['topic_replies_real'] && $auth->acl_get('m_approve', $forum_id)) ? true : false;
 908                  $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) : '';
 909  
 910                  $row['topic_title'] = preg_replace('#(?!<.*)(?<!\w)(' . $hilit . ')(?!\w|[^<>]*(?:</s(?:cript|tyle))?>)#is', '<span class="posthilit">$1</span>', $row['topic_title']);
 911  
 912                  $tpl_ary = array(
 913                      'TOPIC_AUTHOR'                => get_username_string('username', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
 914                      'TOPIC_AUTHOR_COLOUR'        => get_username_string('colour', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
 915                      'TOPIC_AUTHOR_FULL'            => get_username_string('full', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
 916                      'FIRST_POST_TIME'            => $user->format_date($row['topic_time']),
 917                      'LAST_POST_SUBJECT'            => $row['topic_last_post_subject'],
 918                      'LAST_POST_TIME'            => $user->format_date($row['topic_last_post_time']),
 919                      'LAST_VIEW_TIME'            => $user->format_date($row['topic_last_view_time']),
 920                      'LAST_POST_AUTHOR'            => get_username_string('username', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']),
 921                      'LAST_POST_AUTHOR_COLOUR'    => get_username_string('colour', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']),
 922                      'LAST_POST_AUTHOR_FULL'        => get_username_string('full', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']),
 923  
 924                      'PAGINATION'        => topic_generate_pagination($replies, $view_topic_url),
 925                      'TOPIC_TYPE'        => $topic_type,
 926  
 927                      'TOPIC_FOLDER_IMG'        => $user->img($folder_img, $folder_alt),
 928                      'TOPIC_FOLDER_IMG_SRC'    => $user->img($folder_img, $folder_alt, false, '', 'src'),
 929                      'TOPIC_FOLDER_IMG_ALT'    => $user->lang[$folder_alt],
 930                      'TOPIC_FOLDER_IMG_WIDTH'=> $user->img($folder_img, '', false, '', 'width'),
 931                      'TOPIC_FOLDER_IMG_HEIGHT'    => $user->img($folder_img, '', false, '', 'height'),
 932  
 933                      'TOPIC_ICON_IMG'        => (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['img'] : '',
 934                      'TOPIC_ICON_IMG_WIDTH'    => (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['width'] : '',
 935                      'TOPIC_ICON_IMG_HEIGHT'    => (!empty($icons[$row['icon_id']])) ? $icons[$row['icon_id']]['height'] : '',
 936                      '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']) : '',
 937                      'UNAPPROVED_IMG'        => ($topic_unapproved || $posts_unapproved) ? $user->img('icon_topic_unapproved', ($topic_unapproved) ? 'TOPIC_UNAPPROVED' : 'POSTS_UNAPPROVED') : '',
 938  
 939                      'S_TOPIC_GLOBAL'        => (!$forum_id) ? true : false,
 940                      'S_TOPIC_TYPE'            => $row['topic_type'],
 941                      'S_USER_POSTED'            => (!empty($row['topic_posted'])) ? true : false,
 942                      'S_UNREAD_TOPIC'        => $unread_topic,
 943  
 944                      'S_TOPIC_REPORTED'        => (!empty($row['topic_reported']) && $auth->acl_get('m_report', $forum_id)) ? true : false,
 945                      'S_TOPIC_UNAPPROVED'    => $topic_unapproved,
 946                      'S_POSTS_UNAPPROVED'    => $posts_unapproved,
 947  
 948                      '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'],
 949                      'U_LAST_POST_AUTHOR'    => get_username_string('profile', $row['topic_last_poster_id'], $row['topic_last_poster_name'], $row['topic_last_poster_colour']),
 950                      'U_TOPIC_AUTHOR'        => get_username_string('profile', $row['topic_poster'], $row['topic_first_poster_name'], $row['topic_first_poster_colour']),
 951                      'U_NEWEST_POST'            => append_sid("{$phpbb_root_path}viewtopic.$phpEx", $view_topic_url_params . '&amp;view=unread') . '#unread',
 952                      'U_MCP_REPORT'            => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&amp;mode=reports&amp;t=' . $result_topic_id, true, $user->session_id),
 953                      'U_MCP_QUEUE'            => $u_mcp_queue,
 954                  );
 955              }
 956              else
 957              {
 958                  if ((isset($zebra['foe']) && in_array($row['poster_id'], $zebra['foe'])) && (!$view || $view != 'show' || $post_id != $row['post_id']))
 959                  {
 960                      $template->assign_block_vars('searchresults', array(
 961                          'S_IGNORE_POST' => true,
 962  
 963                          '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>'))
 964                      );
 965  
 966                      continue;
 967                  }
 968  
 969                  // Replace naughty words such as farty pants
 970                  $row['post_subject'] = censor_text($row['post_subject']);
 971  
 972                  if ($row['display_text_only'])
 973                  {
 974                      // now find context for the searched words
 975                      $row['post_text'] = get_context($row['post_text'], array_filter(explode('|', $hilit), 'strlen'), $return_chars);
 976                      $row['post_text'] = bbcode_nl2br($row['post_text']);
 977                  }
 978                  else
 979                  {
 980                      // Second parse bbcode here
 981                      if ($row['bbcode_bitfield'])
 982                      {
 983                          $bbcode->bbcode_second_pass($row['post_text'], $row['bbcode_uid'], $row['bbcode_bitfield']);
 984                      }
 985  
 986                      $row['post_text'] = bbcode_nl2br($row['post_text']);
 987                      $row['post_text'] = smiley_text($row['post_text']);
 988  
 989                      if (!empty($attachments[$row['post_id']]))
 990                      {
 991                          parse_attachments($forum_id, $row['post_text'], $attachments[$row['post_id']], $update_count);
 992  
 993                          // we only display inline attachments
 994                          unset($attachments[$row['post_id']]);
 995                      }
 996                  }
 997  
 998                  if ($hilit)
 999                  {
1000                      // post highlighting
1001                      $row['post_text'] = preg_replace('#(?!<.*)(?<!\w)(' . $hilit . ')(?!\w|[^<>]*(?:</s(?:cript|tyle))?>)#is', '<span class="posthilit">$1</span>', $row['post_text']);
1002                      $row['post_subject'] = preg_replace('#(?!<.*)(?<!\w)(' . $hilit . ')(?!\w|[^<>]*(?:</s(?:cript|tyle))?>)#is', '<span class="posthilit">$1</span>', $row['post_subject']);
1003                  }
1004  
1005                  $tpl_ary = array(
1006                      'POST_AUTHOR_FULL'        => get_username_string('full', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']),
1007                      'POST_AUTHOR_COLOUR'    => get_username_string('colour', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']),
1008                      'POST_AUTHOR'            => get_username_string('username', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']),
1009                      'U_POST_AUTHOR'            => get_username_string('profile', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']),
1010  
1011                      'POST_SUBJECT'        => $row['post_subject'],
1012                      'POST_DATE'            => (!empty($row['post_time'])) ? $user->format_date($row['post_time']) : '',
1013                      'MESSAGE'            => $row['post_text']
1014                  );
1015              }
1016  
1017              $template->assign_block_vars('searchresults', array_merge($tpl_ary, array(
1018                  'FORUM_ID'            => $forum_id,
1019                  'TOPIC_ID'            => $result_topic_id,
1020                  'POST_ID'            => ($show_results == 'posts') ? $row['post_id'] : false,
1021  
1022                  'FORUM_TITLE'        => $row['forum_name'],
1023                  'TOPIC_TITLE'        => $topic_title,
1024                  'TOPIC_REPLIES'        => $replies,
1025                  'TOPIC_VIEWS'        => $row['topic_views'],
1026  
1027                  'U_VIEW_TOPIC'        => $view_topic_url,
1028                  'U_VIEW_FORUM'        => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id),
1029                  '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'] : '')
1030              ));
1031          }
1032  
1033          if ($topic_id && ($topic_id == $result_topic_id))
1034          {
1035              $template->assign_vars(array(
1036                  'SEARCH_TOPIC'        => $topic_title,
1037                  'U_SEARCH_TOPIC'    => $view_topic_url
1038              ));
1039          }
1040      }
1041      unset($rowset);
1042  
1043      page_header(($l_search_title) ? $l_search_title : $user->lang['SEARCH']);
1044  
1045      $template->set_filenames(array(
1046          'body' => 'search_results.html')
1047      );
1048      make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx"));
1049  
1050      page_footer();
1051  }
1052  
1053  // Search forum
1054  $s_forums = '';
1055  $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
1056      FROM ' . FORUMS_TABLE . ' f
1057      LEFT JOIN ' . FORUMS_ACCESS_TABLE . " fa ON (fa.forum_id = f.forum_id
1058          AND fa.session_id = '" . $db->sql_escape($user->session_id) . "')
1059      ORDER BY f.left_id ASC";
1060  $result = $db->sql_query($sql);
1061  
1062  $right = $cat_right = $padding_inc = 0;
1063  $padding = $forum_list = $holding = '';
1064  $pad_store = array('0' => '');
1065  
1066  while ($row = $db->sql_fetchrow($result))
1067  {
1068      if ($row['forum_type'] == FORUM_CAT && ($row['left_id'] + 1 == $row['right_id']))
1069      {
1070          // Non-postable forum with no subforums, don't display
1071          continue;
1072      }
1073  
1074      if ($row['forum_type'] == FORUM_POST && ($row['left_id'] + 1 == $row['right_id']) && !$row['enable_indexing'])
1075      {
1076          // Postable forum with no subforums and indexing disabled, don't display
1077          continue;
1078      }
1079  
1080      if ($row['forum_type'] == FORUM_LINK || ($row['forum_password'] && !$row['user_id']))
1081      {
1082          // if this forum is a link or password protected (user has not entered the password yet) then skip to the next branch
1083          continue;
1084      }
1085  
1086      if ($row['left_id'] < $right)
1087      {
1088          $padding .= '&nbsp; &nbsp;';
1089          $pad_store[$row['parent_id']] = $padding;
1090      }
1091      else if ($row['left_id'] > $right + 1)
1092      {
1093          if (isset($pad_store[$row['parent_id']]))
1094          {
1095              $padding = $pad_store[$row['parent_id']];
1096          }
1097          else
1098          {
1099              continue;
1100          }
1101      }
1102  
1103      $right = $row['right_id'];
1104  
1105      if ($auth->acl_gets('!f_search', '!f_list', $row['forum_id']))
1106      {
1107          // if the user does not have permissions to search or see this forum skip only this forum/category
1108          continue;
1109      }
1110  
1111      $selected = (in_array($row['forum_id'], $search_forum)) ? ' selected="selected"' : '';
1112  
1113      if ($row['left_id'] > $cat_right)
1114      {
1115          // make sure we don't forget anything
1116          $s_forums .= $holding;
1117          $holding = '';
1118      }
1119  
1120      if ($row['right_id'] - $row['left_id'] > 1)
1121      {
1122          $cat_right = max($cat_right, $row['right_id']);
1123  
1124          $holding .= '<option value="' . $row['forum_id'] . '"' . $selected . '>' . $padding . $row['forum_name'] . '</option>';
1125      }
1126      else
1127      {
1128          $s_forums .= $holding . '<option value="' . $row['forum_id'] . '"' . $selected . '>' . $padding . $row['forum_name'] . '</option>';
1129          $holding = '';
1130      }
1131  }
1132  
1133  if ($holding)
1134  {
1135      $s_forums .= $holding;
1136  }
1137  
1138  $db->sql_freeresult($result);
1139  unset($pad_store);
1140  
1141  if (!$s_forums)
1142  {
1143      trigger_error('NO_SEARCH');
1144  }
1145  
1146  // Number of chars returned
1147  $s_characters = '<option value="-1">' . $user->lang['ALL_AVAILABLE'] . '</option>';
1148  $s_characters .= '<option value="0">0</option>';
1149  $s_characters .= '<option value="25">25</option>';
1150  $s_characters .= '<option value="50">50</option>';
1151  
1152  for ($i = 100; $i <= 1000 ; $i += 100)
1153  {
1154      $selected = ($i == 300) ? ' selected="selected"' : '';
1155      $s_characters .= '<option value="' . $i . '"' . $selected . '>' . $i . '</option>';
1156  }
1157  
1158  $s_hidden_fields = array('t' => $topic_id);
1159  
1160  if ($_SID)
1161  {
1162      $s_hidden_fields['sid'] = $_SID;
1163  }
1164  
1165  if (!empty($_EXTRA_URL))
1166  {
1167      foreach ($_EXTRA_URL as $url_param)
1168      {
1169          $url_param = explode('=', $url_param, 2);
1170          $s_hidden_fields[$url_param[0]] = $url_param[1];
1171      }
1172  }
1173  
1174  $template->assign_vars(array(
1175      'S_SEARCH_ACTION'        => append_sid("{$phpbb_root_path}search.$phpEx", false, true, 0), // We force no ?sid= appending by using 0
1176      'S_HIDDEN_FIELDS'        => build_hidden_fields($s_hidden_fields),
1177      'S_CHARACTER_OPTIONS'    => $s_characters,
1178      'S_FORUM_OPTIONS'        => $s_forums,
1179      'S_SELECT_SORT_DIR'        => $s_sort_dir,
1180      'S_SELECT_SORT_KEY'        => $s_sort_key,
1181      'S_SELECT_SORT_DAYS'    => $s_limit_days,
1182      'S_IN_SEARCH'            => true,
1183  ));
1184  
1185  // only show recent searches to search administrators
1186  if ($auth->acl_get('a_search'))
1187  {
1188      // Handle large objects differently for Oracle and MSSQL
1189      switch ($db->sql_layer)
1190      {
1191          case 'oracle':
1192              $sql = 'SELECT search_time, search_keywords
1193                  FROM ' . SEARCH_RESULTS_TABLE . '
1194                  WHERE dbms_lob.getlength(search_keywords) > 0
1195                  ORDER BY search_time DESC';
1196          break;
1197  
1198          case 'mssql':
1199          case 'mssql_odbc':
1200          case 'mssqlnative':
1201              $sql = 'SELECT search_time, search_keywords
1202                  FROM ' . SEARCH_RESULTS_TABLE . '
1203                  WHERE DATALENGTH(search_keywords) > 0
1204                  ORDER BY search_time DESC';
1205          break;
1206  
1207          default:
1208              $sql = 'SELECT search_time, search_keywords
1209                  FROM ' . SEARCH_RESULTS_TABLE . '
1210                  WHERE search_keywords <> \'\'
1211                  ORDER BY search_time DESC';
1212          break;
1213      }
1214      $result = $db->sql_query_limit($sql, 5);
1215  
1216      while ($row = $db->sql_fetchrow($result))
1217      {
1218          $keywords = $row['search_keywords'];
1219  
1220          $template->assign_block_vars('recentsearch', array(
1221              'KEYWORDS'    => $keywords,
1222              'TIME'        => $user->format_date($row['search_time']),
1223  
1224              'U_KEYWORDS'    => append_sid("{$phpbb_root_path}search.$phpEx", 'keywords=' . urlencode(htmlspecialchars_decode($keywords)))
1225          ));
1226      }
1227      $db->sql_freeresult($result);
1228  }
1229  
1230  // Output the basic page
1231  page_header($user->lang['SEARCH']);
1232  
1233  $template->set_filenames(array(
1234      'body' => 'search_body.html')
1235  );
1236  make_jumpbox(append_sid("{$phpbb_root_path}viewforum.$phpEx"));
1237  
1238  page_footer();
1239  
1240  ?>


Generated: Wed Oct 2 15:03:47 2013 Cross-referenced by PHPXref 0.7.1