aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB/search.php
diff options
context:
space:
mode:
authorNils Adermann <naderman@naderman.de>2006-05-28 19:06:21 +0000
committerNils Adermann <naderman@naderman.de>2006-05-28 19:06:21 +0000
commitebf4f4ec8e787153e16cc6cec6fc5fefadc97107 (patch)
tree1dd320eb12a0915a11565bbb0b64c699ca6a6e61 /phpBB/search.php
parentb84ebb999d1e7f0340fbb6ff7fbf113be9a81816 (diff)
downloadforums-ebf4f4ec8e787153e16cc6cec6fc5fefadc97107.tar
forums-ebf4f4ec8e787153e16cc6cec6fc5fefadc97107.tar.gz
forums-ebf4f4ec8e787153e16cc6cec6fc5fefadc97107.tar.bz2
forums-ebf4f4ec8e787153e16cc6cec6fc5fefadc97107.tar.xz
forums-ebf4f4ec8e787153e16cc6cec6fc5fefadc97107.zip
- added search by author_id to solve problems with looking up posts of users with a name containing wildcards
- user based flood control (seperate limits for users and guests) [Bug #1357] - inform the user about ignored words if he receives a "no words specified" message - solve problems with the number of entries per page [Bug #1973] - different height for popup window ["Bug" #1814] - speed improvements for posting and search reindexing in fulltext_native -> use php files for ignore words and synonyms git-svn-id: file:///svn/phpbb/trunk@5981 89ea8834-ac86-4346-8a33-228a782c2dd0
Diffstat (limited to 'phpBB/search.php')
-rw-r--r--phpBB/search.php44
1 files changed, 31 insertions, 13 deletions
diff --git a/phpBB/search.php b/phpBB/search.php
index 3475f33bb6..5e5c9573c0 100644
--- a/phpBB/search.php
+++ b/phpBB/search.php
@@ -33,6 +33,7 @@ $submit = request_var('submit', false);
$keywords = request_var('keywords', '', true);
$add_keywords = request_var('add_keywords', '', true);
$author = request_var('author', '');
+$author_id = request_var('author_id', 0);
$show_results = ($topic_id) ? 'posts' : request_var('sr', 'posts');
$show_results = ($show_results == 'posts') ? 'posts' : 'topics';
$search_terms = request_var('terms', 'all');
@@ -63,10 +64,11 @@ if ($user->load && $config['limit_search_load'] && ($user->load > doubleval($con
trigger_error($user->lang['NO_SEARCH_TIME']);
}
-// Check last search time ... if applicable
-if ($config['search_interval'])
+// Check flood limit ... if applicable
+$interval = ($user->data['user_id'] == ANONYMOUS) ? $config['search_anonymous_interval'] : $config['search_interval'];
+if ($interval && !$auth->acl_get('u_ignoreflood'))
{
- if ($config['last_search_time'] > time() - $config['search_interval'])
+ if ($user->data['user_last_search'] > time() - $interval)
{
trigger_error($user->lang['NO_SEARCH_TIME']);
}
@@ -79,7 +81,7 @@ $sort_by_text = array('a' => $user->lang['SORT_AUTHOR'], 't' => $user->lang['SOR
$s_limit_days = $s_sort_key = $s_sort_dir = $u_sort_param = '';
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);
-if ($keywords || $author || $search_id || $submit)
+if ($keywords || $author || $author_id || $search_id || $submit)
{
// clear arrays
$id_ary = array();
@@ -91,7 +93,7 @@ if ($keywords || $author || $search_id || $submit)
$sql = 'SELECT f.forum_id, f.forum_name, f.parent_id, f.forum_type, f.right_id, f.forum_password, fa.user_id
FROM ' . FORUMS_TABLE . ' f
LEFT JOIN ' . FORUMS_ACCESS_TABLE . " fa ON (fa.forum_id = f.forum_id
- AND fa.session_id = '" . $db->sql_escape($user->data['session_id']) . "')
+ AND fa.session_id = '" . $db->sql_escape($user->session_id) . "')
WHERE $not_in_fid(f.forum_password <> '' AND fa.user_id <> " . (int) $user->data['user_id'] . ')
ORDER BY f.left_id';
$result = $db->sql_query($sql);
@@ -159,14 +161,18 @@ if ($keywords || $author || $search_id || $submit)
// If we are looking for authors get their ids
$author_id_ary = array();
- if ($author)
+ if ($author_id)
{
- if ((strstr($author, '*') !== false) && (str_replace(array('*', '%'), '', $author) < $config['min_search_author_chars']))
+ $author_id_ary[] = $author_id;
+ }
+ elseif ($author)
+ {
+ if ((strpos($author, '*') !== false) && (str_replace(array('*', '%'), '', $author) < $config['min_search_author_chars']))
{
trigger_error(sprintf($user->lang['TOO_FEW_AUTHOR_CHARS'], $config['min_search_author_chars']));
}
- $sql_where = (strstr($author, '*') !== false) ? ' LIKE ' : ' = ';
+ $sql_where = (strpos($author, '*') !== false) ? ' LIKE ' : ' = ';
$sql = 'SELECT user_id
FROM ' . USERS_TABLE . "
WHERE username $sql_where '" . $db->sql_escape(preg_replace('#\*+#', '%', $author)) . "'
@@ -226,19 +232,19 @@ if ($keywords || $author || $search_id || $submit)
$search->split_keywords($keywords, $search_terms);
if (!sizeof($search->split_words) && !sizeof($author_id_ary) && !$search_id)
{
- trigger_error(sprintf($user->lang['NO_KEYWORDS'], $search->word_length['min'], $search->word_length['max']));
+ $ignored = (sizeof($search->common_words)) ? sprintf($user->lang['IGNORED_TERMS_EXPLAIN'], htmlspecialchars(implode(' ', $search->common_words))) . '<br />' : '';
+ trigger_error($ignored . sprintf($user->lang['NO_KEYWORDS'], $search->word_length['min'], $search->word_length['max']));
}
}
if (!$keywords && sizeof($author_id_ary))
{
- // default to showing results as posts when performing an author search
+ // if it is an author search we want to show topics by default
$show_results = ($topic_id) ? 'posts' : request_var('sr', ($search_id == 'egosearch') ? 'topics' : 'posts');
$show_results = ($show_results == 'posts') ? 'posts' : 'topics';
}
// define some variables needed for retrieving post_id/topic_id information
- $per_page = ($show_results == 'posts') ? $config['posts_per_page'] : $config['topics_per_page'];
$sort_by_sql = array('a' => 'u.username', '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'));
// pre-made searches
@@ -356,7 +362,13 @@ if ($keywords || $author || $search_id || $submit)
}
break;
}
+ }
+ // show_results should not change after this
+ $per_page = ($show_results == 'posts') ? $config['posts_per_page'] : $config['topics_per_page'];
+
+ if ($search_id)
+ {
if ($sql)
{
// only return up to 1000 ids (the last one will be removed later)
@@ -377,6 +389,11 @@ if ($keywords || $author || $search_id || $submit)
}
}
+ // make sure that some arrays are always in the same order
+ sort($ex_fid_ary);
+ sort($m_approve_fid_ary);
+ sort($author_id_ary);
+
if (sizeof($search->split_words))
{
$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);
@@ -432,6 +449,7 @@ if ($keywords || $author || $search_id || $submit)
$u_search .= ($u_hilit) ? '&amp;keywords=' . $u_hilit : '';
$u_search .= ($topic_id) ? '&amp;ch=' . $topic_id : '';
$u_search .= ($author) ? '&amp;author=' . urlencode($author) : '';
+ $u_search .= ($author_id) ? '&amp;author_id=' . $author_id : '';
$u_search .= ($u_search_forum) ? '&amp;fid%5B%5D=' . $u_search_forum : '';
$u_search .= (!$search_child) ? '&amp;sc=0' : '';
$u_search .= ($search_fields != 'all') ? '&amp;sf=' . $search_fields : '';
@@ -459,7 +477,7 @@ if ($keywords || $author || $search_id || $submit)
'REPORTED_IMG' => $user->img('icon_reported', 'TOPIC_REPORTED'),
'UNAPPROVED_IMG' => $user->img('icon_unapproved', 'TOPIC_UNAPPROVED'),
- 'U_SEARCH_WORDS' => "{$phpbb_root_path}search.$phpEx$SID$u_show_results&amp;keywords=$u_hilit" . (($author) ? '&amp;author=' . urlencode($author) : ''))
+ 'U_SEARCH_WORDS' => "{$phpbb_root_path}search.$phpEx$SID$u_show_results&amp;keywords=$u_hilit" . (($author) ? '&amp;author=' . urlencode($author) : '') . (($author_id) ? '&amp;author_id=' . $author_id : ''))
);
if ($sql_where)
@@ -722,7 +740,7 @@ $s_forums = '';
$sql = 'SELECT f.forum_id, f.forum_name, f.parent_id, f.forum_type, f.left_id, f.right_id, f.forum_password, fa.user_id
FROM ' . FORUMS_TABLE . ' f
LEFT JOIN ' . FORUMS_ACCESS_TABLE . " fa ON (fa.forum_id = f.forum_id
- AND fa.session_id = '" . $db->sql_escape($user->data['session_id']) . "')
+ AND fa.session_id = '" . $db->sql_escape($user->session_id) . "')
ORDER BY f.left_id ASC";
$result = $db->sql_query($sql);