1050 lines
31 KiB
PHP
1050 lines
31 KiB
PHP
<?php
|
|
|
|
/*
|
|
+--------------------------------------------------------------------------
|
|
| IBFORUMS v1
|
|
| ========================================
|
|
| by Matthew Mecham and David Baxter
|
|
| (c) 2001,2002 IBForums
|
|
| http://www.ibforums.com
|
|
| ========================================
|
|
| Web: http://www.ibforums.com
|
|
| Email: phpboards@ibforums.com
|
|
| Licence Info: phpib-licence@ibforums.com
|
|
+---------------------------------------------------------------------------
|
|
|
|
|
| > Searching procedures
|
|
| > Module written by Matt Mecham
|
|
| > Date started: 24th February 2002
|
|
|
|
|
| > Module Version Number: 1.0.0
|
|
+--------------------------------------------------------------------------
|
|
|
|
|
| MODULE NOTES:
|
|
| -------------
|
|
|
|
|
| I've been deliberating whether we should implement some kind of WORD ID /
|
|
| search logging table for index.
|
|
| iB3 PERL had such a feature, but that was to aide the DBM searches, which
|
|
| were slow at best.
|
|
| The biggest complaint we had was that adding a word ID / search logging table
|
|
| effectively doubled the amount of space needed in the mySQL database. I've seen
|
|
| this complaint echo'd on the support boards of other forum software.
|
|
| The other downside to such a feature would be the overhaul needed to update it
|
|
| with new posts/topics and topic movement / deletion.
|
|
|
|
|
| I figure that people post more than they search, so a full table scan once per
|
|
| search request is offset against the CPU to keep the search log tables up to date
|
|
|
|
|
| I'm going to stick my neck out and go the full table scan route. It's not as effecient
|
|
| as a search table would be, but the benefits include no overhead updating it, and a smaller
|
|
| overall DB size - which is vital to some people on certain hosts.
|
|
|
|
|
| This may change if it becomes apparent that it's not very efficient in the long run
|
|
+--------------------------------------------------------------------------
|
|
*/
|
|
|
|
//
|
|
|
|
$idx = new Search;
|
|
|
|
class Search {
|
|
|
|
var $output = "";
|
|
var $page_title = "";
|
|
var $nav = array();
|
|
var $html = "";
|
|
|
|
var $first = 0;
|
|
|
|
var $search_type = 'posts';
|
|
var $sort_order = 'desc';
|
|
var $sort_key = 'last_post';
|
|
var $search_in = 'posts';
|
|
var $prune = '30';
|
|
var $st_time = array();
|
|
var $end_time = array();
|
|
var $st_stamp = "";
|
|
var $end_stamp = "";
|
|
|
|
function Search() {
|
|
global $ibforums, $DB, $std, $print;
|
|
|
|
if (! $ibforums->vars['allow_search'])
|
|
{
|
|
$std->Error( array( LEVEL => 1, MSG => 'search_off') );
|
|
}
|
|
|
|
if ($ibforums->member['g_use_search'] != 1)
|
|
{
|
|
$std->Error( array( 'LEVEL' => 1, 'MSG' => 'no_permission' ) );
|
|
}
|
|
|
|
|
|
if ($ibforums->input['CODE'] == "") $ibforums->input['CODE'] = '00';
|
|
|
|
//--------------------------------------------
|
|
// Require the HTML and language modules
|
|
//--------------------------------------------
|
|
|
|
$ibforums->lang = $std->load_words($ibforums->lang, 'lang_search', $ibforums->lang_id );
|
|
$ibforums->lang = $std->load_words($ibforums->lang, 'lang_forum' , $ibforums->lang_id );
|
|
|
|
require "./Skin/".$ibforums->skin_id."/skin_search.php";
|
|
|
|
$this->html = new skin_search();
|
|
|
|
$this->base_url = "{$ibforums->vars['board_url']}/index.{$ibforums->vars['php_ext']}?s={$ibforums->session_id}";
|
|
|
|
if (isset($ibforums->input['st']) )
|
|
{
|
|
$this->first = $ibforums->input['st'];
|
|
}
|
|
|
|
//--------------------------------------------
|
|
// What to do?
|
|
//--------------------------------------------
|
|
|
|
if (! isset($ibforums->member['g_use_search']) )
|
|
{
|
|
$std->Error( array( LEVEL => 1, MSG => 'cant_use_feature') );
|
|
}
|
|
|
|
switch($ibforums->input['CODE']) {
|
|
case '01':
|
|
$this->do_search();
|
|
break;
|
|
case '03':
|
|
$this->get_new_posts();
|
|
break;
|
|
case 'getactive':
|
|
$this->get_active();
|
|
break;
|
|
case 'show':
|
|
$this->show_results();
|
|
break;
|
|
default:
|
|
$this->show_form();
|
|
break;
|
|
}
|
|
|
|
// If we have any HTML to print, do so...
|
|
|
|
$print->add_output("$this->output");
|
|
$print->do_output( array( 'TITLE' => $this->page_title, 'JS' => 0, NAV => $this->nav ) );
|
|
|
|
}
|
|
|
|
function show_form() {
|
|
global $DB, $std, $ibforums;
|
|
|
|
$last_cat_id = -1;
|
|
|
|
$the_hiddens = "";
|
|
|
|
$DB->query("SELECT f.id as forum_id, f.name as forum_name, f.position, f.read_perms, c.id as cat_id, c.name as cat_name from ibf_forums f, ibf_categories c where c.id=f.category ORDER BY c.position, f.position");
|
|
|
|
$forums = "<select name='forums' class='forminput' onChange='chooseForum()'>\n"
|
|
."<option value='all'>>>All open forums";
|
|
|
|
$cats = "<select name='cats' class='forminput' onChange='chooseCat()'>\n"
|
|
."<option value='all'>>>All Categories";
|
|
|
|
while ( $i = $DB->fetch_row() ) {
|
|
if ($last_cat_id != $i['cat_id'])
|
|
{
|
|
// Print the category
|
|
$last_cat_id = $i['cat_id'];
|
|
$cats .= "<option value='{$i['cat_id']}'>{$i['cat_name']}\n";
|
|
}
|
|
|
|
$selected = "";
|
|
|
|
if ( isset($ibforums->input['f']) and ($ibforums->input['f'] == $i['forum_id']) )
|
|
{
|
|
$selected = ' selected';
|
|
}
|
|
|
|
if ($i['read_perms'] == '*')
|
|
{
|
|
$forums .= "<option value=\"{$i['forum_id']}\"$selected>{$i['forum_name']}\n";
|
|
}
|
|
else if (preg_match( "/(^|,)".$ibforums->member['mgroup']."(,|$)/", $i['read_perms']) )
|
|
{
|
|
$forums .= "<option value='{$i['forum_id']}'$selected>{$i['forum_name']}\n";
|
|
}
|
|
else
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
|
|
$forums .= "</select>";
|
|
$cats .= "</select>";
|
|
|
|
$this->output = $this->html->Form($forums, $cats);
|
|
|
|
$this->page_title = $ibforums->lang['search_title'];
|
|
$this->nav = array( $ibforums->lang['search_form'] );
|
|
|
|
}
|
|
|
|
/******************************************************/
|
|
//
|
|
// Searching is split into two queries. One query to
|
|
// regexp the matches, and pull the topic ID's, the other
|
|
// to pull the data from the topic_id. As topic_id's are indexed
|
|
// the second query shouldn't be too CPU intensive.
|
|
//
|
|
// To find the maximum records that match our criteria to
|
|
// generate the page span, we cap all searches off to '200'
|
|
// results. We then use mysql_num_rows to return the actual
|
|
// number of rows matched, loop over and push the info to
|
|
// our $topic var until we have 25 results, which is the max.
|
|
// number per page.
|
|
//
|
|
// The other alternative would be to SELECT COUNT(*) then
|
|
// re-query with a 25 LIMIT cap, this of course would be
|
|
// a heavy drain on the SQL engine.
|
|
/******************************************************/
|
|
|
|
|
|
function do_search() {
|
|
global $ibforums, $DB, $std, $HTTP_POST_VARS, $print;
|
|
|
|
//------------------------------------
|
|
// Do we have any input?
|
|
//------------------------------------
|
|
|
|
if ($ibforums->input['keywords'] == "")
|
|
{
|
|
if ($ibforums->input['namesearch'] != "")
|
|
{
|
|
$keywords = $this->filter_keywords($ibforums->input['namesearch']);
|
|
$this->search_type = 'name';
|
|
}
|
|
else if ($ibforums->input['useridsearch'] != "")
|
|
{
|
|
$keywords = $this->filter_keywords($ibforums->input['useridsearch']);
|
|
$this->search_type = 'userid';
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$keywords = $this->filter_keywords($ibforums->input['keywords']);
|
|
$this->search_type = 'posts';
|
|
}
|
|
|
|
//------------------------------------
|
|
|
|
$check_keywords = trim($keywords);
|
|
|
|
$check_keywords = str_replace( "%", "", $check_keywords );
|
|
|
|
if ( (! $check_keywords) or ($check_keywords == "") or (! isset($check_keywords) ) )
|
|
{
|
|
$std->Error( array( 'LEVEL' => 1, 'MSG' => 'no_search_words') );
|
|
}
|
|
|
|
//------------------------------------
|
|
|
|
if ($ibforums->input['search_in'] == 'titles')
|
|
{
|
|
$this->search_in = 'titles';
|
|
}
|
|
|
|
//------------------------------------
|
|
|
|
$forums = $this->get_searchable_forums();
|
|
|
|
//------------------------------------
|
|
// Do we have any forums to search in?
|
|
//------------------------------------
|
|
|
|
if ($forums == "")
|
|
{
|
|
$std->Error( array( 'LEVEL' => 1, 'MSG' => 'no_search_forum') );
|
|
}
|
|
|
|
//------------------------------------
|
|
|
|
foreach( array( 'last_post', 'posts', 'starter_name', 'forum_id' ) as $v )
|
|
{
|
|
if ($ibforums->input['sort_key'] == $v)
|
|
{
|
|
$this->sort_key = $v;
|
|
}
|
|
}
|
|
|
|
//------------------------------------
|
|
|
|
foreach ( array( 1, 7, 30, 365, 0 ) as $v )
|
|
{
|
|
if ($ibforums->input['prune'] == $v)
|
|
{
|
|
$this->prune = $v;
|
|
}
|
|
}
|
|
|
|
//------------------------------------
|
|
|
|
if ($ibforums->input['sort_order'] == 'asc')
|
|
{
|
|
$this->sort_order = 'asc';
|
|
}
|
|
|
|
//------------------------------------
|
|
|
|
$query = "";
|
|
|
|
|
|
if ($this->search_in == 'titles')
|
|
{
|
|
$query = "SELECT DISTINCT(tid) ".
|
|
"FROM ibf_topics ".
|
|
"WHERE forum_id IN ($forums) ".
|
|
"AND approved=1 AND (";
|
|
}
|
|
else
|
|
{
|
|
$query = "SELECT DISTINCT(t.tid) ".
|
|
"FROM ibf_posts p, ibf_topics t ".
|
|
"WHERE (t.tid=p.topic_id AND p.forum_id IN ($forums))".
|
|
" AND (t.approved=1 and p.queued <> 1)".
|
|
" AND (";
|
|
}
|
|
|
|
// Is this a membername search?
|
|
|
|
if ( ($this->search_type == 'name') or ($this->search_type == 'userid') )
|
|
{
|
|
//------------------------------------------------------------------
|
|
// Get all the possible matches for the supplied name from the DB
|
|
//------------------------------------------------------------------
|
|
|
|
$keywords = trim( $keywords );
|
|
|
|
if ($this->search_type == 'name')
|
|
{
|
|
|
|
if ($ibforums->input['exactname'] == 1)
|
|
{
|
|
$sql_query = "SELECT id from ibf_members WHERE lower(name)='".$keywords."'";
|
|
}
|
|
else
|
|
{
|
|
$sql_query = "SELECT id from ibf_members WHERE name like '%".$keywords."%'";
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$sql_query = "SELECT id from ibf_members WHERE id='".$keywords."'";
|
|
}
|
|
|
|
$DB->query( $sql_query );
|
|
$member_string = "";
|
|
|
|
while ($row = $DB->fetch_row())
|
|
{
|
|
$member_string .= "'".$row['id']."',";
|
|
}
|
|
|
|
$member_string = preg_replace( "/,$/", "", $member_string );
|
|
|
|
// Error out of we matched no members
|
|
|
|
if ($member_string == "")
|
|
{
|
|
$std->Error( array( 'LEVEL' => 1, 'MSG' => 'no_search_results') );
|
|
}
|
|
|
|
//------------------------------------------------------------------
|
|
// If we are still here, append the $query.
|
|
//------------------------------------------------------------------
|
|
|
|
switch ( $this->search_in ) {
|
|
case 'posts':
|
|
$query .= "(p.author_id IN ($member_string) or t.starter_id IN ($member_string))";
|
|
break;
|
|
case 'titles':
|
|
$query .= "starter_id IN ($member_string)";
|
|
break;
|
|
default:
|
|
$query .= "(p.author_id IN ($member_string) or t.starter_id IN ($member_string))";
|
|
break;
|
|
}
|
|
|
|
|
|
}
|
|
else {
|
|
|
|
//------------------------------------------------------------------
|
|
// Must be a search in posts / topic titles then..
|
|
//------------------------------------------------------------------
|
|
// Start by matching our keywords and pairing them up with a boolean
|
|
// operator if needed.
|
|
//------------------------------------------------------------------
|
|
|
|
if ($ibforums->input['smethod'] == 'advanced')
|
|
{
|
|
preg_match_all( "/(^|and|or)\s{1,}(\S+?)\s{1,}/", $keywords, $matches );
|
|
|
|
for ($i = 0 ; $i < count($matches[0]) ; $i++ )
|
|
{
|
|
$boolean = $matches[1][$i];
|
|
$word = trim($matches[2][$i]);
|
|
|
|
if ( preg_match( "/^%/" , $word ) )
|
|
{
|
|
$word = preg_replace( "/^%/", "", $word);
|
|
}
|
|
else
|
|
{
|
|
$word = '[^0-9a-zA-Z]?'.$word;
|
|
}
|
|
|
|
if ( preg_match( "/%$/" , $word ) )
|
|
{
|
|
$word = preg_replace( "/%$/", "", $word);
|
|
}
|
|
else
|
|
{
|
|
$word = $word . '[ \t.,!?:;]?';
|
|
}
|
|
|
|
if ($boolean)
|
|
{
|
|
$boolean = " $boolean";
|
|
}
|
|
|
|
switch ( $this->search_in )
|
|
{
|
|
case 'posts':
|
|
$query .= "$boolean (LOWER(t.title) REGEXP '$word' or LOWER(p.post) REGEXP '$word') ";
|
|
break;
|
|
case 'titles':
|
|
$query .= "$boolean LOWER(title) REGEXP '$word' ";
|
|
break;
|
|
default:
|
|
$query .= "$boolean (LOWER(t.title) REGEXP '$word' or LOWER(p.post) REGEXP '$word') ";
|
|
break;
|
|
}
|
|
}
|
|
|
|
}
|
|
else
|
|
{
|
|
switch ( $this->search_in )
|
|
{
|
|
case 'posts':
|
|
$query .= " (LOWER(t.title) LIKE '%".trim($keywords)."%' or LOWER(p.post) LIKE '%".trim($keywords)."%') ";
|
|
break;
|
|
case 'titles':
|
|
$query .= " LOWER(title) LIKE '%".trim($keywords)."%' ";
|
|
break;
|
|
default:
|
|
$query .= " (LOWER(t.title) LIKE '%".trim($keywords)."%' or LOWER(p.post) LIKE '%".trim($keywords)."%') ";
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Close this WHERE argument...
|
|
|
|
$query .= ") ";
|
|
|
|
// Add on the prune days
|
|
|
|
if ($this->prune > 0)
|
|
{
|
|
$gt_lt = $ibforums->input['prune_type'] == 'older' ? "<" : ">";
|
|
$time = time() - ($ibforums->input['prune'] * 86400);
|
|
|
|
switch ( $this->search_in )
|
|
{
|
|
case 'posts':
|
|
$query .= "AND (t.last_post $gt_lt $time or p.post_date $gt_lt $time)";
|
|
break;
|
|
case 'titles':
|
|
$query .= "AND last_post $gt_lt $time";
|
|
break;
|
|
default:
|
|
$query .= "AND (t.last_post $gt_lt $time or p.post_date $gt_lt $time)";
|
|
break;
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------
|
|
// Get the topic ID's to serialize and store into
|
|
// the database
|
|
//------------------------------------------------
|
|
|
|
$DB->query($query);
|
|
|
|
$max_hits = $DB->get_num_rows();
|
|
|
|
$topics = "";
|
|
|
|
while ($row = $DB->fetch_row() )
|
|
{
|
|
$topics .= $row['tid'].",";
|
|
}
|
|
|
|
$DB->free_result();
|
|
|
|
$topics = preg_replace( "/,$/", "", $topics );
|
|
|
|
//------------------------------------------------
|
|
// Do we have any results?
|
|
//------------------------------------------------
|
|
|
|
if ($topics == "")
|
|
{
|
|
$std->Error( array( 'LEVEL' => 1, 'MSG' => 'no_search_results' ) );
|
|
}
|
|
|
|
//------------------------------------------------
|
|
// If we are still here, store the data into the database...
|
|
//------------------------------------------------
|
|
|
|
$unique_id = md5(uniqid(microtime(),1));
|
|
|
|
$DB->query("INSERT INTO ibf_search_results (id, topics, search_date, max_hits, sort_key, sort_order) VALUES ('$unique_id', '$topics', '".time()."', '$max_hits', '".$this->sort_key."', '".$this->sort_order."')");
|
|
|
|
$print->redirect_screen( $ibforums->lang['search_redirect'] , "act=Search&CODE=show&searchid=$unique_id&highlite=".urlencode(trim($keywords)) );
|
|
exit();
|
|
|
|
}
|
|
|
|
/******************************************************/
|
|
// Show Results
|
|
// Shows the results of the search
|
|
/******************************************************/
|
|
|
|
function show_results() {
|
|
global $ibforums, $DB, $std, $HTTP_POST_VARS;
|
|
|
|
if ( $read = $std->my_getcookie('topicsread') )
|
|
{
|
|
$this->read_array = unserialize(stripslashes($read));
|
|
}
|
|
|
|
//------------------------------------------------
|
|
// We have a search ID, so lets get the parsed results.
|
|
// Delete old search queries (older than 24 hours)
|
|
//------------------------------------------------
|
|
|
|
$t_time = time() - (60*60*24);
|
|
|
|
$DB->query("DELETE FROM ibf_search_results WHERE search_date < '$t_time'");
|
|
|
|
$unique_id = $ibforums->input['searchid'];
|
|
|
|
if ($unique_id == "")
|
|
{
|
|
$std->Error( array( 'LEVEL' => 1, 'MSG' => 'no_search_results' ) );
|
|
}
|
|
|
|
$DB->query("SELECT * FROM ibf_search_results WHERE id='$unique_id'");
|
|
$sr = $DB->fetch_row();
|
|
|
|
$topics = $sr['topics'];
|
|
$max_hits = $sr['max_hits'];
|
|
|
|
$this->sort_order = $sr['sort_order'];
|
|
$this->sort_key = $sr['sort_key'];
|
|
|
|
if ($topics == "")
|
|
{
|
|
$std->Error( array( 'LEVEL' => 1, 'MSG' => 'no_search_results' ) );
|
|
}
|
|
|
|
$url_words = $this->convert_highlite_words($ibforums->input['highlite']);
|
|
|
|
$links = $std->build_pagelinks( array( TOTAL_POSS => $max_hits,
|
|
PER_PAGE => 25,
|
|
CUR_ST_VAL => $this->first,
|
|
L_SINGLE => "",
|
|
L_MULTI => $ibforums->lang['search_pages'],
|
|
BASE_URL => $this->base_url."&act=Search&CODE=show&searchid=$unique_id&hl=".$url_words,
|
|
)
|
|
);
|
|
|
|
|
|
|
|
$this->output .= $this->html->start( array( 'SHOW_PAGES' => $links ) );
|
|
|
|
$DB->query("SELECT t.*, f.id as forum_id, f.name as forum_name FROM ibf_topics t, ibf_forums f WHERE t.tid IN($topics) and f.id=t.forum_id ORDER BY ".$this->sort_key." ".$this->sort_order." LIMIT ".$this->first.",25");
|
|
|
|
while ( $row = $DB->fetch_row() )
|
|
{
|
|
$row['keywords'] = $url_words;
|
|
$this->output .= $this->html->RenderRow( $this->parse_entry($row) );
|
|
|
|
}
|
|
|
|
$this->page_title = $ibforums->lang['search_results'];
|
|
$this->nav = array( "<a href='{$this->base_url}&act=Search'>{$ibforums->lang['search_form']}</a>", $ibforums->lang['search_title'] );
|
|
|
|
$this->output .= $this->html->end(array( 'SHOW_PAGES' => $links ));
|
|
|
|
}
|
|
|
|
/******************************************************/
|
|
// Get active
|
|
// Show all topics posted in / created between a user
|
|
// definable amount of days..
|
|
/******************************************************/
|
|
|
|
function get_active() {
|
|
global $ibforums, $DB, $std, $HTTP_POST_VARS;
|
|
|
|
|
|
//------------------------------------
|
|
// If we don't have a search ID (searchid)
|
|
// then it's a fresh query.
|
|
//
|
|
//------------------------------------
|
|
|
|
if (! isset($ibforums->input['searchid']) )
|
|
{
|
|
|
|
//------------------------------------
|
|
// Do we have any start date input?
|
|
//------------------------------------
|
|
|
|
if ($ibforums->input['st_day'] == "")
|
|
{
|
|
// No? Lets work out the start date as 24hrs ago
|
|
$ibforums->input['st_day'] = 1;
|
|
$this->st_stamp = time() - (60*60*24);
|
|
|
|
}
|
|
else
|
|
{
|
|
$ibforums->input['st_day'] = preg_replace( "/s/", "", $ibforums->input['st_day']);
|
|
$this->st_stamp = time() - (60*60*24*$ibforums->input['st_day']);
|
|
}
|
|
|
|
|
|
//------------------------------------
|
|
// Do we have any END date input?
|
|
//------------------------------------
|
|
|
|
if ($ibforums->input['end_day'] == "")
|
|
{
|
|
// No? Lets work out the end date as now
|
|
|
|
$this->end_stamp = time();
|
|
$ibforums->input['end_day'] = 0;
|
|
|
|
}
|
|
else
|
|
{
|
|
$ibforums->input['end_day'] = preg_replace( "/e/", "", $ibforums->input['end_day']);
|
|
$this->end_stamp = time() - (60*60*24*$ibforums->input['end_day']);
|
|
}
|
|
|
|
|
|
//------------------------------------
|
|
// Synchronise our input data
|
|
//------------------------------------
|
|
|
|
$ibforums->input['cat_forum'] = 'cat';
|
|
$ibforums->input['cats'] = 'all';
|
|
|
|
$forums = $this->get_searchable_forums();
|
|
|
|
//------------------------------------
|
|
// Do we have any forums to search in?
|
|
//------------------------------------
|
|
|
|
if ($forums == "")
|
|
{
|
|
$std->Error( array( 'LEVEL' => 1, 'MSG' => 'no_search_forum') );
|
|
}
|
|
|
|
|
|
|
|
$query = "SELECT DISTINCT(t.tid) FROM ibf_posts p, ibf_topics t WHERE p.post_date < ".$this->end_stamp." AND p.post_date > ".$this->st_stamp." AND p.forum_id IN($forums) and p.topic_id=t.tid ORDER BY t.last_post DESC LIMIT 0,200";
|
|
|
|
//------------------------------------------------
|
|
// Get the topic ID's to serialize and store into
|
|
// the database
|
|
//------------------------------------------------
|
|
|
|
$DB->query($query);
|
|
|
|
$max_hits = $DB->get_num_rows();
|
|
|
|
$topics = "";
|
|
|
|
while ($row = $DB->fetch_row() )
|
|
{
|
|
$topics .= $row['tid'].",";
|
|
}
|
|
|
|
$DB->free_result();
|
|
|
|
$topics = preg_replace( "/,$/", "", $topics );
|
|
|
|
//------------------------------------------------
|
|
// Do we have any results?
|
|
//------------------------------------------------
|
|
|
|
if ($topics == "")
|
|
{
|
|
$this->output .= $this->html->active_start( array( 'SHOW_PAGES' => "" ) );
|
|
$this->output .= $this->html->active_none();
|
|
$this->output .= $this->html->end("");
|
|
$this->page_title = $ibforums->lang['search_results'];
|
|
$this->nav = array( "<a href='{$this->base_url}&act=Search'>{$ibforums->lang['search_form']}</a>", $ibforums->lang['search_title'] );
|
|
return ""; // return empty handed
|
|
}
|
|
|
|
//------------------------------------------------
|
|
// If we are still here, store the data into the database...
|
|
//------------------------------------------------
|
|
|
|
$unique_id = md5(uniqid(microtime(),1));
|
|
|
|
$DB->query("INSERT INTO ibf_search_results (id, topics, search_date, max_hits, sort_key, sort_order) VALUES ('$unique_id', '$topics', '".time()."', '$max_hits', '".$this->sort_key."', '".$this->sort_order."')");
|
|
|
|
}
|
|
else
|
|
{
|
|
//------------------------------------------------
|
|
// We have a search ID, so lets get the parsed results.
|
|
// Delete old search queries (older than 24 hours)
|
|
//------------------------------------------------
|
|
|
|
$t_time = time() - (60*60*24);
|
|
|
|
$DB->query("DELETE FROM ibf_search_results WHERE search_date < '$t_time'");
|
|
|
|
$unique_id = $ibforums->input['searchid'];
|
|
|
|
$DB->query("SELECT * FROM ibf_search_results WHERE id='$unique_id'");
|
|
$sr = $DB->fetch_row();
|
|
|
|
$topics = $sr['topics'];
|
|
$max_hits = $sr['max_hits'];
|
|
|
|
$this->sort_order = $sr['sort_order'];
|
|
$this->sort_key = $sr['sort_key'];
|
|
|
|
if ($topics == "")
|
|
{
|
|
$std->Error( array( 'LEVEL' => 1, 'MSG' => 'no_search_results' ) );
|
|
}
|
|
}
|
|
|
|
// Our variables are centralised, lets get the array slice depending on our $this->first
|
|
// position.
|
|
|
|
// How cool is this? ;)
|
|
|
|
$topic_string = implode( "," , array_slice( explode(",",$topics), $this->first, 25 ) );
|
|
|
|
// That splits the string into an array by a comma, gets a slice depending on our limit,
|
|
// say 0 to 25 and then joins the array into a string seperated by commas, all in one
|
|
// line :D
|
|
|
|
$url_words = urlencode(trim($keywords));
|
|
|
|
$links = $std->build_pagelinks( array( TOTAL_POSS => $max_hits,
|
|
PER_PAGE => 25,
|
|
CUR_ST_VAL => $this->first,
|
|
L_SINGLE => "",
|
|
L_MULTI => "",
|
|
BASE_URL => $this->base_url."&act=Search&CODE=getactive&searchid=$unique_id",
|
|
)
|
|
);
|
|
|
|
|
|
|
|
$this->output .= $this->html->active_start( array( 'SHOW_PAGES' => $links ) );
|
|
|
|
// Regex in our selected values.
|
|
|
|
$this->output = preg_replace( "/(<option value='s".$ibforums->input['st_day']."')/" , "\\1 selected", $this->output );
|
|
$this->output = preg_replace( "/(<option value='e".$ibforums->input['end_day']."')/", "\\1 selected", $this->output );
|
|
|
|
$DB->query("SELECT t.*, f.id as forum_id, f.name as forum_name FROM ibf_topics t, ibf_forums f WHERE t.tid IN($topic_string) and f.id=t.forum_id ORDER BY ".$this->sort_key." ".$this->sort_order." LIMIT 0,25");
|
|
|
|
while ( $row = $DB->fetch_row() )
|
|
{
|
|
$row['keywords'] = $url_words;
|
|
$this->output .= $this->html->RenderRow( $this->parse_entry($row) );
|
|
|
|
}
|
|
|
|
$this->page_title = $ibforums->lang['search_results'];
|
|
$this->nav = array( "<a href='{$this->base_url}&act=Search'>{$ibforums->lang['search_form']}</a>", $ibforums->lang['search_title'] );
|
|
|
|
$this->output .= $this->html->end("");
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function parse_entry($topic) {
|
|
global $DB, $std, $ibforums;
|
|
|
|
$topic['last_text'] = $ibforums->lang[last_post_by];
|
|
|
|
$topic['last_poster'] = ($topic['last_poster_id'] != 0)
|
|
? "<b><a href='{$this->base_url}&act=Profile&CODE=03&MID={$topic['last_poster_id']}'>{$topic['last_poster_name']}</a></b>"
|
|
: "-".$topic['last_poster_name']."-";
|
|
|
|
$topic['starter'] = ($topic['starter_id'] != 0)
|
|
? "<a href='{$this->base_url}&act=Profile&CODE=03&MID={$topic['starter_id']}'>{$topic['starter_name']}</a>"
|
|
: "-".$topic['starter_name']."-";
|
|
|
|
if ($topic['poll_state'])
|
|
{
|
|
$topic['prefix'] = $ibforums->vars['pre_polls'].' ';
|
|
}
|
|
|
|
$topic['folder_img'] = $std->folder_icon($topic);
|
|
|
|
$topic['topic_icon'] = $topic['icon_id'] ? '<img src="'.$ibforums->vars['img_url'] . '/icon' . $topic['icon_id'] . '.gif" border="0" alt="">'
|
|
: ' ';
|
|
|
|
if ($topic['pinned'])
|
|
{
|
|
$topic['topic_icon'] = $ibforums->skin['B_PIN'];
|
|
}
|
|
|
|
$topic['topic_start_date'] = $std->get_date( $topic['start_date'], 'LONG' );
|
|
|
|
|
|
$pages = 1;
|
|
|
|
if ($topic['posts'])
|
|
{
|
|
if ( (($topic['posts'] + 1) % $ibforums->vars['display_max_posts']) == 0 )
|
|
{
|
|
$pages = ($topic['posts'] + 1) / $ibforums->vars['display_max_posts'];
|
|
}
|
|
else
|
|
{
|
|
$number = ( ($topic['posts'] + 1) / $ibforums->vars['display_max_posts'] );
|
|
$pages = ceil( $number);
|
|
}
|
|
|
|
}
|
|
|
|
if ($pages > 1)
|
|
{
|
|
$topic['PAGES'] = "<span id='small'>({$ibforums->lang['topic_sp_pages']} ";
|
|
for ($i = 0 ; $i < $pages ; ++$i ) {
|
|
$real_no = $i * $ibforums->vars['display_max_posts'];
|
|
$page_no = $i + 1;
|
|
if ($page_no == 4) {
|
|
$topic['PAGES'] .= "<a href='{$this->base_url}&act=ST&f={$topic['forum_id']}&t={$topic['tid']}&st=" . ($pages - 1) * $ibforums->vars['display_max_posts'] . "&hl={$topic['keywords']}'>...$pages </a>";
|
|
break;
|
|
} else {
|
|
$topic['PAGES'] .= "<a href='{$this->base_url}&act=ST&f={$topic['forum_id']}&t={$topic['tid']}&st=$real_no&hl={$topic['keywords']}'>$page_no </a>";
|
|
}
|
|
}
|
|
$topic['PAGES'] .= ")</span>";
|
|
}
|
|
|
|
if ($topic['posts'] < 0) $topic['posts'] = 0;
|
|
|
|
$last_time = $this->read_array[ $topic['tid'] ] > $ibforums->input['last_visit'] ? $this->read_array[ $topic['tid'] ] : $ibforums->input['last_visit'];
|
|
|
|
if ($last_time && ($topic['last_post'] > $last_time))
|
|
{
|
|
$topic['go_last_page'] = "<a href='{$this->base_url}&act=ST&f={$topic['forum_id']}&t={$topic['tid']}&view=getlastpost'>" . $ibforums->skin['GO_LAST_ON'] . "</a>";
|
|
$topic['go_new_post'] = "<a href='{$this->base_url}&act=ST&f={$topic['forum_id']}&t={$topic['tid']}&view=getnewpost'>" . $ibforums->skin['NEW_POST'] . "</a>";
|
|
|
|
}
|
|
else
|
|
{
|
|
$topic['go_last_page'] = "<a href='{$this->base_url}&act=ST&f={$topic['forum_id']}&t={$topic['tid']}&view=getlastpost'>" . $ibforums->skin['GO_LAST_OFF'] . "</a>";
|
|
$topic['go_new_post'] = "";
|
|
}
|
|
|
|
// Do the quick goto last page icon stuff
|
|
|
|
$maxpages = ($pages - 1) * $ibforums->vars['display_max_posts'];
|
|
if ($maxpages < 0) $maxpages = 0;
|
|
|
|
$topic['last_post'] = $std->get_date($topic['last_post'], 'LONG');
|
|
|
|
if ($topic['state'] == 'link')
|
|
{
|
|
$t_array = explode("&", $topic['moved_to']);
|
|
$topic['tid'] = $t_array[0];
|
|
$topic['forum_id'] = $t_array[1];
|
|
$topic['title'] = $topic['title'];
|
|
$topic['views'] = '--';
|
|
$topic['posts'] = '--';
|
|
$topic['prefix'] = $ibforums->vars['pre_moved']." ";
|
|
$topic['go_new_post'] = "";
|
|
}
|
|
|
|
if ($topic['pinned'] == 1)
|
|
{
|
|
$topic['prefix'] = $ibforums->vars['pre_pinned'];
|
|
$topic['topic_icon'] = $ibforums->skin['B_PIN'];
|
|
|
|
}
|
|
|
|
return $topic;
|
|
}
|
|
|
|
|
|
|
|
function filter_keywords($words="") {
|
|
|
|
// force to lowercase and swop % into a safer version
|
|
|
|
$words = trim( strtolower( str_replace( "%", "\\%", $words) ) );
|
|
|
|
// Remove trailing boolean operators
|
|
|
|
$words = preg_replace( "/\s+(and|or)$/" , "" , $words );
|
|
|
|
// Swop wildcard into *SQL percent
|
|
|
|
$words = str_replace( "*", "%", $words );
|
|
|
|
// Make safe underscores
|
|
|
|
$words = str_replace( "_", "\\_", $words );
|
|
|
|
// Remove crap
|
|
|
|
$words = preg_replace( "/[\|\[\]\{\}\(\)\.,:;\?\-\+\#\\\\\/\"']/", "", $words );
|
|
|
|
return " ".preg_quote($words)." ";
|
|
|
|
}
|
|
|
|
|
|
//------------------------------------------------------
|
|
// Make the hl words nice and stuff
|
|
//------------------------------------------------------
|
|
|
|
function convert_highlite_words($words="")
|
|
{
|
|
$words = trim(urldecode($words));
|
|
|
|
// Convert booleans to something easy to match next time around
|
|
|
|
$words = preg_replace("/\s+(and|or)(\s+|$)/i", ",\\1,", $words);
|
|
|
|
// Convert spaces to plus signs
|
|
|
|
$words = preg_replace("/\s/", "+", $words);
|
|
|
|
return $words;
|
|
}
|
|
|
|
//------------------------------------------------------
|
|
// Get the searchable forums
|
|
//------------------------------------------------------
|
|
|
|
function get_searchable_forums() {
|
|
global $ibforums, $DB, $std, $HTTP_POST_VARS;
|
|
|
|
$forum_array = array();
|
|
$forum_string = "";
|
|
$sql_query = "";
|
|
// If we have an array of "forums", loop
|
|
// through and build our *SQL IN( ) statement.
|
|
|
|
|
|
// Are we looking for cats or forums..
|
|
|
|
if ($ibforums->input['cat_forum'] == 'cat')
|
|
{
|
|
if ($ibforums->input['cats'] == 'all')
|
|
{
|
|
$sql_query = "SELECT id, read_perms, password from ibf_forums";
|
|
}
|
|
else
|
|
{
|
|
if (! preg_match( "/^(?:\d+)$/", $ibforums->input['cats'] ) )
|
|
{
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
$sql_query = "SELECT id, read_perms, password from ibf_forums WHERE category='".$ibforums->input['cats']."'";
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ($ibforums->input['forums'] == 'all')
|
|
{
|
|
$sql_query = "SELECT id, read_perms, password from ibf_forums";
|
|
}
|
|
else
|
|
{
|
|
if (! preg_match( "/^(?:\d+)$/", $ibforums->input['forums'] ) )
|
|
{
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
$sql_query = "SELECT id, read_perms, password from ibf_forums WHERE id='".$ibforums->input['forums']."'";
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($sql_query != "")
|
|
{
|
|
$DB->query( $sql_query );
|
|
|
|
while ($i = $DB->fetch_row())
|
|
{
|
|
$pass = 1;
|
|
|
|
if ($i['password'] != "")
|
|
{
|
|
if ( ! $c_pass = $std->my_getcookie('iBForum'.$i['id']) )
|
|
{
|
|
$pass = 0;
|
|
}
|
|
|
|
if ( $c_pass == $i['password'] )
|
|
{
|
|
$pass = 1;
|
|
}
|
|
}
|
|
|
|
if ($pass == 1)
|
|
{
|
|
if ($i['read_perms'] == '*')
|
|
{
|
|
$forum_array[] = $i['id'];
|
|
}
|
|
else if ( preg_match( "/(^|,)".$ibforums->member['mgroup']."(,|$)/", $i['read_perms']) )
|
|
{
|
|
$forum_array[] = $i['id'];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$forum_string = implode( "," , $forum_array );
|
|
|
|
return $forum_string;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
?>
|