Register
phpBB.com Wiki · Home Projects Help

root / trunk / phpBB / search.php

1 1350 psotfx
<?php
2 8146 acydburn
/**
3 5114 acydburn
*
4 5114 acydburn
* @package phpBB3
5 5114 acydburn
* @version $Id$
6 8146 acydburn
* @copyright (c) 2005 phpBB Group
7 8146 acydburn
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
8 5114 acydburn
*
9 5114 acydburn
*/
10 368 psotfx
11 5114 acydburn
/**
12 5883 acydburn
* @ignore
13 5114 acydburn
*/
14 2305 psotfx
define('IN_PHPBB', true);
15 8572 acydburn
if (!defined('PHPBB_ROOT_PATH')) define('PHPBB_ROOT_PATH', './');
16 8572 acydburn
if (!defined('PHP_EXT')) define('PHP_EXT', substr(strrchr(__FILE__, '.'), 1));
17 8572 acydburn
include(PHPBB_ROOT_PATH . 'common.' . PHP_EXT);
18 368 psotfx
19 4970 psotfx
// Start session management
20 5236 acydburn
$user->session_begin();
21 4970 psotfx
$auth->acl($user->data);
22 4970 psotfx
$user->setup('search');
23 4970 psotfx
24 4500 psotfx
// Define initial vars
25 5441 naderman
$mode			= request_var('mode', '');
26 5441 naderman
$search_id		= request_var('search_id', '');
27 5441 naderman
$start			= max(request_var('start', 0), 0);
28 5441 naderman
$post_id		= request_var('p', 0);
29 5441 naderman
$topic_id		= request_var('t', 0);
30 5441 naderman
$view			= request_var('view', '');
31 4500 psotfx
32 5727 naderman
$submit			= request_var('submit', false);
33 7920 acydburn
$keywords		= utf8_normalize_nfc(request_var('keywords', '', true));
34 7920 acydburn
$add_keywords	= utf8_normalize_nfc(request_var('add_keywords', '', true));
35 7780 naderman
$author			= request_var('author', '', true);
36 5981 naderman
$author_id		= request_var('author_id', 0);
37 5552 naderman
$show_results	= ($topic_id) ? 'posts' : request_var('sr', 'posts');
38 5727 naderman
$show_results	= ($show_results == 'posts') ? 'posts' : 'topics';
39 5441 naderman
$search_terms	= request_var('terms', 'all');
40 5441 naderman
$search_fields	= request_var('sf', 'all');
41 5441 naderman
$search_child	= request_var('sc', true);
42 4500 psotfx
43 5441 naderman
$sort_days		= request_var('st', 0);
44 5441 naderman
$sort_key		= request_var('sk', 't');
45 5441 naderman
$sort_dir		= request_var('sd', 'd');
46 4500 psotfx
47 7890 naderman
$return_chars	= request_var('ch', ($topic_id) ? -1 : 300);
48 5441 naderman
$search_forum	= request_var('fid', array(0));
49 4500 psotfx
50 3845 psotfx
// Is user able to search? Has search been disabled?
51 5552 naderman
if (!$auth->acl_get('u_search') || !$auth->acl_getf_global('f_search') || !$config['load_search'])
52 3845 psotfx
{
53 7889 acydburn
	$template->assign_var('S_NO_SEARCH', true);
54 7919 kellanved
	trigger_error('NO_SEARCH');
55 3845 psotfx
}
56 3845 psotfx
57 5441 naderman
// Check search load limit
58 5441 naderman
if ($user->load && $config['limit_search_load'] && ($user->load > doubleval($config['limit_search_load'])))
59 5441 naderman
{
60 7889 acydburn
	$template->assign_var('S_NO_SEARCH', true);
61 7919 kellanved
	trigger_error('NO_SEARCH_TIME');
62 5441 naderman
}
63 368 psotfx
64 5981 naderman
// Check flood limit ... if applicable
65 5981 naderman
$interval = ($user->data['user_id'] == ANONYMOUS) ? $config['search_anonymous_interval'] : $config['search_interval'];
66 5981 naderman
if ($interval && !$auth->acl_get('u_ignoreflood'))
67 4530 psotfx
{
68 5981 naderman
	if ($user->data['user_last_search'] > time() - $interval)
69 4530 psotfx
	{
70 7889 acydburn
		$template->assign_var('S_NO_SEARCH', true);
71 7919 kellanved
		trigger_error('NO_SEARCH_TIME');
72 4530 psotfx
	}
73 4530 psotfx
}
74 4530 psotfx
75 5441 naderman
// Define some vars
76 5705 naderman
$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']);
77 5441 naderman
$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']);
78 5441 naderman
79 5441 naderman
$s_limit_days = $s_sort_key = $s_sort_dir = $u_sort_param = '';
80 5441 naderman
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);
81 5441 naderman
82 5981 naderman
if ($keywords || $author || $author_id || $search_id || $submit)
83 368 psotfx
{
84 5236 acydburn
	// clear arrays
85 5441 naderman
	$id_ary = array();
86 2205 psotfx
87 6655 naderman
	// egosearch is an author search
88 6655 naderman
	if ($search_id == 'egosearch')
89 6655 naderman
	{
90 7780 naderman
		$author_id = $user->data['user_id'];
91 8672 acydburn
92 7820 kellanved
		if ($user->data['user_id'] == ANONYMOUS)
93 7820 kellanved
		{
94 7820 kellanved
			login_box('', $user->lang['LOGIN_EXPLAIN_EGOSEARCH']);
95 7820 kellanved
		}
96 6655 naderman
	}
97 5441 naderman
98 6655 naderman
	// If we are looking for authors get their ids
99 6655 naderman
	$author_id_ary = array();
100 6655 naderman
	if ($author_id)
101 6655 naderman
	{
102 6655 naderman
		$author_id_ary[] = $author_id;
103 6655 naderman
	}
104 6655 naderman
	else if ($author)
105 6655 naderman
	{
106 6944 naderman
		if ((strpos($author, '*') !== false) && (utf8_strlen(str_replace(array('*', '%'), '', $author)) < $config['min_search_author_chars']))
107 6655 naderman
		{
108 6655 naderman
			trigger_error(sprintf($user->lang['TOO_FEW_AUTHOR_CHARS'], $config['min_search_author_chars']));
109 6655 naderman
		}
110 6655 naderman
111 7789 acydburn
		$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)) . "'";
112 7788 acydburn
113 6655 naderman
		$sql = 'SELECT user_id
114 6655 naderman
			FROM ' . USERS_TABLE . "
115 7788 acydburn
			WHERE $sql_where
116 6655 naderman
				AND user_type IN (" . USER_NORMAL . ', ' . USER_FOUNDER . ')';
117 6655 naderman
		$result = $db->sql_query_limit($sql, 100);
118 6655 naderman
119 6655 naderman
		while ($row = $db->sql_fetchrow($result))
120 6655 naderman
		{
121 6655 naderman
			$author_id_ary[] = (int) $row['user_id'];
122 6655 naderman
		}
123 6655 naderman
		$db->sql_freeresult($result);
124 6655 naderman
125 6655 naderman
		if (!sizeof($author_id_ary))
126 6655 naderman
		{
127 7919 kellanved
			trigger_error('NO_SEARCH_RESULTS');
128 6655 naderman
		}
129 6655 naderman
	}
130 6655 naderman
131 6655 naderman
	// if we search in an existing search result just add the additional keywords. But we need to use "all search terms"-mode
132 6655 naderman
	// so we can keep the old keywords in their old mode, but add the new ones as required words
133 6655 naderman
	if ($add_keywords)
134 6655 naderman
	{
135 6655 naderman
		if ($search_terms == 'all')
136 6655 naderman
		{
137 6655 naderman
			$keywords .= ' ' . $add_keywords;
138 6655 naderman
		}
139 6655 naderman
		else
140 6655 naderman
		{
141 6655 naderman
			$search_terms = 'all';
142 6674 acydburn
			$keywords = implode(' |', explode(' ', preg_replace('#\s+#u', ' ', $keywords))) . ' ' .$add_keywords;
143 6655 naderman
		}
144 6655 naderman
	}
145 6655 naderman
146 6655 naderman
	// Which forums should not be searched? Author searches are also carried out in unindexed forums
147 7559 naderman
	if (empty($keywords) && sizeof($author_id_ary))
148 6655 naderman
	{
149 6655 naderman
		$ex_fid_ary = array_keys($auth->acl_getf('!f_read', true));
150 6655 naderman
	}
151 6655 naderman
	else
152 6655 naderman
	{
153 6655 naderman
		$ex_fid_ary = array_unique(array_merge(array_keys($auth->acl_getf('!f_read', true)), array_keys($auth->acl_getf('!f_search', true))));
154 6655 naderman
	}
155 6655 naderman
156 6271 acydburn
	$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'] . ')' : "";
157 6015 acydburn
158 4500 psotfx
	$sql = 'SELECT f.forum_id, f.forum_name, f.parent_id, f.forum_type, f.right_id, f.forum_password, fa.user_id
159 5313 acydburn
		FROM ' . FORUMS_TABLE . ' f
160 6930 acydburn
		LEFT JOIN ' . FORUMS_ACCESS_TABLE . " fa ON (fa.forum_id = f.forum_id
161 5981 naderman
			AND fa.session_id = '" . $db->sql_escape($user->session_id) . "')
162 6175 naderman
		$not_in_fid
163 6175 naderman
		ORDER BY f.left_id";
164 4500 psotfx
	$result = $db->sql_query($sql);
165 4500 psotfx
166 4500 psotfx
	$right_id = 0;
167 5441 naderman
	$reset_search_forum = true;
168 4500 psotfx
	while ($row = $db->sql_fetchrow($result))
169 1051 psotfx
	{
170 6367 acydburn
		if ($row['forum_password'] && $row['user_id'] != $user->data['user_id'])
171 1051 psotfx
		{
172 5488 naderman
			$ex_fid_ary[] = (int) $row['forum_id'];
173 5441 naderman
			continue;
174 5441 naderman
		}
175 5441 naderman
176 5441 naderman
		if (sizeof($search_forum))
177 5441 naderman
		{
178 5441 naderman
			if ($search_child)
179 1566 psotfx
			{
180 5441 naderman
				if (in_array($row['forum_id'], $search_forum) && $row['right_id'] > $right_id)
181 5441 naderman
				{
182 5488 naderman
					$right_id = (int) $row['right_id'];
183 5441 naderman
				}
184 5441 naderman
				else if ($row['right_id'] < $right_id)
185 5441 naderman
				{
186 5441 naderman
					continue;
187 5441 naderman
				}
188 1566 psotfx
			}
189 5441 naderman
190 5441 naderman
			if (!in_array($row['forum_id'], $search_forum))
191 1566 psotfx
			{
192 5488 naderman
				$ex_fid_ary[] = (int) $row['forum_id'];
193 5441 naderman
				$reset_search_forum = false;
194 1566 psotfx
			}
195 1511 psotfx
		}
196 4500 psotfx
	}
197 4500 psotfx
	$db->sql_freeresult($result);
198 2849 psotfx
199 5607 naderman
	// find out in which forums the user is allowed to view approved posts
200 5607 naderman
	if ($auth->acl_get('m_approve'))
201 5607 naderman
	{
202 5607 naderman
		$m_approve_fid_ary = array(-1);
203 5607 naderman
		$m_approve_fid_sql = '';
204 5607 naderman
	}
205 5607 naderman
	else if ($auth->acl_getf_global('m_approve'))
206 5607 naderman
	{
207 5607 naderman
		$m_approve_fid_ary = array_diff(array_keys($auth->acl_getf('!m_approve', true)), $ex_fid_ary);
208 6271 acydburn
		$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) : '') . ')';
209 5607 naderman
	}
210 5607 naderman
	else
211 5607 naderman
	{
212 5607 naderman
		$m_approve_fid_ary = array();
213 5607 naderman
		$m_approve_fid_sql = ' AND p.post_approved = 1';
214 5607 naderman
	}
215 5607 naderman
216 5441 naderman
	if ($reset_search_forum)
217 4626 psotfx
	{
218 5441 naderman
		$search_forum = array();
219 4626 psotfx
	}
220 4626 psotfx
221 5441 naderman
	// Select which method we'll use to obtain the post_id or topic_id information
222 6015 acydburn
	$search_type = basename($config['search_type']);
223 5441 naderman
224 8572 acydburn
	if (!file_exists(PHPBB_ROOT_PATH . 'includes/search/' . $search_type . '.' . PHP_EXT))
225 5441 naderman
	{
226 5441 naderman
		trigger_error('NO_SUCH_SEARCH_MODULE');
227 5441 naderman
	}
228 5441 naderman
229 8572 acydburn
	require(PHPBB_ROOT_PATH . "includes/search/$search_type." . PHP_EXT);
230 5441 naderman
231 5441 naderman
	// We do some additional checks in the module to ensure it can actually be utilised
232 5441 naderman
	$error = false;
233 5441 naderman
	$search = new $search_type($error);
234 5441 naderman
235 5441 naderman
	if ($error)
236 5441 naderman
	{
237 5441 naderman
		trigger_error($error);
238 5441 naderman
	}
239 5441 naderman
240 5441 naderman
	// let the search module split up the keywords
241 5441 naderman
	if ($keywords)
242 5441 naderman
	{
243 6675 naderman
		$correct_query = $search->split_keywords($keywords, $search_terms);
244 6675 naderman
		if (!$correct_query || (empty($search->search_query) && !sizeof($author_id_ary) && !$search_id))
245 5441 naderman
		{
246 7076 naderman
			$ignored = (sizeof($search->common_words)) ? sprintf($user->lang['IGNORED_TERMS_EXPLAIN'], implode(' ', $search->common_words)) . '<br />' : '';
247 5981 naderman
			trigger_error($ignored . sprintf($user->lang['NO_KEYWORDS'], $search->word_length['min'], $search->word_length['max']));
248 5441 naderman
		}
249 5441 naderman
	}
250 5441 naderman
251 5488 naderman
	if (!$keywords && sizeof($author_id_ary))
252 5488 naderman
	{
253 5981 naderman
		// if it is an author search we want to show topics by default
254 5552 naderman
		$show_results = ($topic_id) ? 'posts' : request_var('sr', ($search_id == 'egosearch') ? 'topics' : 'posts');
255 5727 naderman
		$show_results = ($show_results == 'posts') ? 'posts' : 'topics';
256 5488 naderman
	}
257 5488 naderman
258 5441 naderman
	// define some variables needed for retrieving post_id/topic_id information
259 6650 acydburn
	$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'));
260 5441 naderman
261 5441 naderman
	// pre-made searches
262 6814 naderman
	$sql = $field = $l_search_title = '';
263 4500 psotfx
	if ($search_id)
264 4500 psotfx
	{
265 4500 psotfx
		switch ($search_id)
266 1511 psotfx
		{
267 5161 acydburn
			// Oh holy Bob, bring us some activity...
268 5161 acydburn
			case 'active_topics':
269 6814 naderman
				$l_search_title = $user->lang['SEARCH_ACTIVE_TOPICS'];
270 5161 acydburn
				$show_results = 'topics';
271 5441 naderman
				$sort_key = 't';
272 5441 naderman
				$sort_dir = 'd';
273 6643 acydburn
				$sort_days = request_var('st', 7);
274 5441 naderman
				$sort_by_sql['t'] = 't.topic_last_post_time';
275 5161 acydburn
276 5441 naderman
				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);
277 6380 naderman
				$s_sort_key = $s_sort_dir = '';
278 5161 acydburn
279 6643 acydburn
				$last_post_time_sql = ($sort_days) ? ' AND t.topic_last_post_time > ' . (time() - ($sort_days * 24 * 3600)) : '';
280 5161 acydburn
281 6380 naderman
				$sql = 'SELECT t.topic_last_post_time, t.topic_id
282 6380 naderman
					FROM ' . TOPICS_TABLE . " t
283 6643 acydburn
					WHERE t.topic_moved_id = 0
284 6643 acydburn
						$last_post_time_sql
285 6380 naderman
						" . str_replace(array('p.', 'post_'), array('t.', 'topic_'), $m_approve_fid_sql) . '
286 6380 naderman
						' . ((sizeof($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('t.forum_id', $ex_fid_ary, true) : '') . '
287 5236 acydburn
					ORDER BY t.topic_last_post_time DESC';
288 5441 naderman
				$field = 'topic_id';
289 5488 naderman
			break;
290 5161 acydburn
291 4500 psotfx
			case 'unanswered':
292 6814 naderman
				$l_search_title = $user->lang['SEARCH_UNANSWERED'];
293 5552 naderman
				$show_results = request_var('sr', 'topics');
294 5727 naderman
				$show_results = ($show_results == 'posts') ? 'posts' : 'topics';
295 5552 naderman
				$sort_by_sql['t'] = ($show_results == 'posts') ? 'p.post_time' : 't.topic_last_post_time';
296 5552 naderman
				$sort_by_sql['s'] = ($show_results == 'posts') ? 'p.post_subject' : 't.topic_title';
297 5727 naderman
				$sql_sort = 'ORDER BY ' . $sort_by_sql[$sort_key] . (($sort_dir == 'a') ? ' ASC' : ' DESC');
298 5552 naderman
299 5441 naderman
				$sort_join = ($sort_key == 'f') ? FORUMS_TABLE . ' f, ' : '';
300 5441 naderman
				$sql_sort = ($sort_key == 'f') ? ' AND f.forum_id = p.forum_id ' . $sql_sort : $sql_sort;
301 6015 acydburn
302 6380 naderman
				if ($sort_days)
303 6380 naderman
				{
304 6380 naderman
					$last_post_time = 'AND p.post_time > ' . (time() - ($sort_days * 24 * 3600));
305 6380 naderman
				}
306 6380 naderman
				else
307 6380 naderman
				{
308 6380 naderman
					$last_post_time = '';
309 6380 naderman
				}
310 6380 naderman
311 7779 kellanved
312 7779 kellanved
				if ($sort_key == 'a')
313 7779 kellanved
				{
314 7779 kellanved
					$sort_join = USERS_TABLE . ' u, ';
315 7779 kellanved
					$sql_sort = ' AND u.user_id = p.poster_id ' . $sql_sort;
316 7779 kellanved
				}
317 4500 psotfx
				if ($show_results == 'posts')
318 1089 psotfx
				{
319 5441 naderman
					$sql = "SELECT p.post_id
320 5441 naderman
						FROM $sort_join" . POSTS_TABLE . ' p, ' . TOPICS_TABLE . " t
321 4500 psotfx
						WHERE t.topic_replies = 0
322 4626 psotfx
							AND p.topic_id = t.topic_id
323 6380 naderman
							$last_post_time
324 5607 naderman
							$m_approve_fid_sql
325 6271 acydburn
							" . ((sizeof($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '') . "
326 5441 naderman
							$sql_sort";
327 4500 psotfx
					$field = 'post_id';
328 1089 psotfx
				}
329 2205 psotfx
				else
330 2205 psotfx
				{
331 5727 naderman
					$sql = 'SELECT DISTINCT ' . $sort_by_sql[$sort_key] . ", p.topic_id
332 5441 naderman
						FROM $sort_join" . POSTS_TABLE . ' p, ' . TOPICS_TABLE . " t
333 5236 acydburn
						WHERE t.topic_replies = 0
334 6284 naderman
							AND t.topic_moved_id = 0
335 4626 psotfx
							AND p.topic_id = t.topic_id
336 6380 naderman
							$last_post_time
337 5607 naderman
							$m_approve_fid_sql
338 6271 acydburn
							" . ((sizeof($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '') . "
339 5441 naderman
						$sql_sort";
340 4500 psotfx
					$field = 'topic_id';
341 2205 psotfx
				}
342 5488 naderman
			break;
343 2205 psotfx
344 4500 psotfx
			case 'newposts':
345 6814 naderman
				$l_search_title = $user->lang['SEARCH_NEW'];
346 6116 naderman
				// force sorting
347 6116 naderman
				$show_results = (request_var('sr', 'topics') == 'posts') ? 'posts' : 'topics';
348 6116 naderman
				$sort_key = 't';
349 6116 naderman
				$sort_dir = 'd';
350 5552 naderman
				$sort_by_sql['t'] = ($show_results == 'posts') ? 'p.post_time' : 't.topic_last_post_time';
351 5727 naderman
				$sql_sort = 'ORDER BY ' . $sort_by_sql[$sort_key] . (($sort_dir == 'a') ? ' ASC' : ' DESC');
352 5552 naderman
353 6116 naderman
				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);
354 6116 naderman
				$s_sort_key = $s_sort_dir = $u_sort_param = $s_limit_days = '';
355 6015 acydburn
356 4500 psotfx
				if ($show_results == 'posts')
357 1938 psotfx
				{
358 6116 naderman
					$sql = 'SELECT p.post_id
359 6116 naderman
						FROM ' . POSTS_TABLE . ' p
360 4626 psotfx
						WHERE p.post_time > ' . $user->data['user_lastvisit'] . "
361 5607 naderman
							$m_approve_fid_sql
362 6271 acydburn
							" . ((sizeof($ex_fid_ary)) ? ' AND ' . $db->sql_in_set('p.forum_id', $ex_fid_ary, true) : '') . "
363 5441 naderman
						$sql_sort";
364 4500 psotfx
					$field = 'post_id';
365 1938 psotfx
				}
366 4500 psotfx
				else
367 1938 psotfx
				{
368 6116 naderman
					$sql = 'SELECT t.topic_id
369 6116 naderman
						FROM ' . TOPICS_TABLE . ' t
370 6116 naderman
						WHERE t.topic_last_post_time > ' . $user->data['user_lastvisit'] . '
371 6284 naderman
							AND t.topic_moved_id = 0
372 6116 naderman
							' . str_replace(array('p.', 'post_'), array('t.', 'topic_'), $m_approve_fid_sql) . '
373 6271 acydburn
							' . ((sizeof($ex_fid_ary)) ? 'AND ' . $db->sql_in_set('t.forum_id', $ex_fid_ary, true) : '') . "
374 5441 naderman
						$sql_sort";
375 4500 psotfx
					$field = 'topic_id';
376 1938 psotfx
				}
377 5488 naderman
			break;
378 6814 naderman
379 6814 naderman
			case 'egosearch':
380 6814 naderman
				$l_search_title = $user->lang['SEARCH_SELF'];
381 6814 naderman
			break;
382 5161 acydburn
		}
383 5981 naderman
	}
384 5236 acydburn
385 5981 naderman
	// show_results should not change after this
386 5981 naderman
	$per_page = ($show_results == 'posts') ? $config['posts_per_page'] : $config['topics_per_page'];
387 6643 acydburn
	$total_match_count = 0;
388 5981 naderman
389 5981 naderman
	if ($search_id)
390 5981 naderman
	{
391 5441 naderman
		if ($sql)
392 5161 acydburn
		{
393 5441 naderman
			// only return up to 1000 ids (the last one will be removed later)
394 5441 naderman
			$result = $db->sql_query_limit($sql, 1001 - $start, $start);
395 5003 acydburn
396 5441 naderman
			while ($row = $db->sql_fetchrow($result))
397 5161 acydburn
			{
398 5441 naderman
				$id_ary[] = $row[$field];
399 5161 acydburn
			}
400 5441 naderman
			$db->sql_freeresult($result);
401 5236 acydburn
402 5441 naderman
			$total_match_count = sizeof($id_ary) + $start;
403 5441 naderman
			$id_ary = array_slice($id_ary, 0, $per_page);
404 1511 psotfx
		}
405 5441 naderman
		else
406 5441 naderman
		{
407 5441 naderman
			$search_id = '';
408 5441 naderman
		}
409 4500 psotfx
	}
410 2849 psotfx
411 5981 naderman
	// make sure that some arrays are always in the same order
412 5981 naderman
	sort($ex_fid_ary);
413 5981 naderman
	sort($m_approve_fid_ary);
414 5981 naderman
	sort($author_id_ary);
415 5981 naderman
416 6211 naderman
	if (!empty($search->search_query))
417 4500 psotfx
	{
418 5607 naderman
		$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, $id_ary, $start, $per_page);
419 5441 naderman
	}
420 5441 naderman
	else if (sizeof($author_id_ary))
421 5441 naderman
	{
422 7930 kellanved
		$firstpost_only = ($search_fields === 'firstpost') ? true : false;
423 7930 kellanved
		$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, $id_ary, $start, $per_page);
424 5441 naderman
	}
425 2448 psotfx
426 6643 acydburn
	// For some searches we need to print out the "no results" page directly to allow re-sorting/refining the search options.
427 6655 naderman
	if (!sizeof($id_ary) && !$search_id)
428 5441 naderman
	{
429 7919 kellanved
		trigger_error('NO_SEARCH_RESULTS');
430 4500 psotfx
	}