123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447 |
- <?php
- /**
- * [Discuz!] (C)2001-2099 Comsenz Inc.
- * This is NOT a freeware, use is subject to license terms
- *
- * $Id: search_forum.php 33198 2013-05-06 09:23:45Z jeffjzhang $
- */
- if(!defined('IN_DISCUZ')) {
- exit('Access Denied');
- }
- define('NOROBOT', TRUE);
- if(!$_G['setting']['search']['forum']['status']) {
- showmessage('search_forum_closed');
- }
- if(!$_G['adminid'] && !($_G['group']['allowsearch'] & 2)) {
- showmessage('group_nopermission', NULL, array('grouptitle' => $_G['group']['grouptitle']), array('login' => 1));
- }
- $_G['setting']['search']['forum']['searchctrl'] = intval($_G['setting']['search']['forum']['searchctrl']);
- require_once libfile('function/forumlist');
- require_once libfile('function/forum');
- require_once libfile('function/post');
- loadcache(array('forums', 'posttable_info'));
- $posttableselect = '';
- if(!empty($_G['cache']['posttable_info']) && is_array($_G['cache']['posttable_info'])) {
- $posttableselect = '<select name="seltableid" id="seltableid" class="ps" style="display:none">';
- foreach($_G['cache']['posttable_info'] as $posttableid => $data) {
- $posttableselect .= '<option value="'.$posttableid.'"'.($_GET['posttableid'] == $posttableid ? ' selected="selected"' : '').'>'.($data['memo'] ? $data['memo'] : 'post_'.$posttableid).'</option>';
- }
- $posttableselect .= '</select>';
- }
- $srchmod = 2;
- $cachelife_time = 300; // Life span for cache of searching in specified range of time
- $cachelife_text = 3600; // Life span for cache of text searching
- $srchtype = empty($_GET['srchtype']) ? '' : trim($_GET['srchtype']);
- $searchid = isset($_GET['searchid']) ? intval($_GET['searchid']) : 0;
- $seltableid = intval($_GET['seltableid']);
- if($srchtype != 'title' && $srchtype != 'fulltext') {
- $srchtype = '';
- }
- $srchtxt = trim($_GET['srchtxt']);
- $srchuid = intval($_GET['srchuid']);
- $srchuname = isset($_GET['srchuname']) ? trim(str_replace('|', '', $_GET['srchuname'])) : '';;
- $srchfrom = intval($_GET['srchfrom']);
- $before = intval($_GET['before']);
- $srchfid = $_GET['srchfid'];
- $srhfid = intval($_GET['srhfid']);
- $keyword = isset($srchtxt) ? dhtmlspecialchars(trim($srchtxt)) : '';
- $forumselect = forumselect();
- if(!empty($srchfid) && !is_numeric($srchfid)) {
- $forumselect = str_replace('<option value="'.$srchfid.'">', '<option value="'.$srchfid.'" selected="selected">', $forumselect);
- }
- $mySearchData = $_G['setting']['my_search_data'];
- if($mySearchData['status'] && !$srchfrom && !$searchid) {
- if (!$_G['setting']['my_siteid']) {
- dheader('Location: index.php');
- }
- $appService = Cloud::loadClass('Service_App');
- if($appService->getCloudAppStatus('search') && $searchparams) {
- $source = 'discuz';
- $cloudSource = array('collectionsearch', 'hotsearch');
- if(!empty($_GET['srhlocality'])) {
- $sourcetype = explode('::', $_GET['srhlocality']);
- if($sourcetype[0] == 'forum') {
- $source = $sourcetype[1] == 'index' ? 'forum' : ($sourcetype[1] == 'forumdisplay' ? 'forum_forum' : 'forum_thread');
- } elseif($sourcetype[0] == 'portal') {
- $source = $sourcetype[1] == 'view' ? 'article' : ($sourcetype[1] == 'list' ? 'portal_list': 'portal');
- } elseif($sourcetype[0] == 'group') {
- $source = $sourcetype[1] == 'viewthread' ? 'group_thread' : ($sourcetype[1] == 'group' ? 'group_forum' : 'group');
- } elseif($sourcetype[0] == 'home') {
- $source = 'home'.(empty($sourcetype[1]) ? '' : '_'.$sourcetype[1]);
- } elseif($sourcetype[0] == 'misc' && $sourcetype[1] == 'ranklist') {
- $source = 'toplist';
- }
- } elseif(in_array($_GET['source'], $cloudSource)) {
- $source = $_GET['source'];
- }
- $params = array();
- $params['source'] = $source;
- $params['q'] = $keyword;
- $params['module'] = 'forum';
- if($srhfid) {
- $params['fId'] = $srhfid;
- }
- if($_GET['adv']) {
- $params['isAdv'] = 1;
- }
- if(!empty($_GET['author'])) {
- $params['author']=$_GET['author'];
- }
- if(!empty($_GET['scope'])) {
- $params['scope']=$_GET['scope'];
- }
- if(!empty($_GET['orderField'])) {
- $params['orderField']=$_GET['orderField'];
- }
- $searchparams['params'] = array_merge($searchparams['params'], $params);
- $utilService = Cloud::loadClass('Service_Util');
- $url = $searchparams['url'] . '?' . $utilService->httpBuildQuery($searchparams['params'], '', '&');
- $utilService->redirect($url);
- die;
- }
- }
- if(!submitcheck('searchsubmit', 1)) {
- if($_GET['adv']) {
- include template('search/forum_adv');
- } else {
- include template('search/forum');
- }
- } else {
- $orderby = in_array($_GET['orderby'], array('dateline', 'replies', 'views')) ? $_GET['orderby'] : 'lastpost';
- $ascdesc = isset($_GET['ascdesc']) && $_GET['ascdesc'] == 'asc' ? 'asc' : 'desc';
- if(!empty($searchid)) {
- require_once libfile('function/misc');
- $page = max(1, intval($_GET['page']));
- $start_limit = ($page - 1) * $_G['tpp'];
- $index = C::t('common_searchindex')->fetch_by_searchid_srchmod($searchid, $srchmod);
- if(!$index) {
- showmessage('search_id_invalid');
- }
- $keyword = dhtmlspecialchars($index['keywords']);
- $keyword = $keyword != '' ? str_replace('+', ' ', $keyword) : '';
- $index['keywords'] = rawurlencode($index['keywords']);
- $searchstring = explode('|', $index['searchstring']);
- $index['searchtype'] = $searchstring[0];//preg_replace("/^([a-z]+)\|.*/", "\\1", $index['searchstring']);
- $searchstring[2] = base64_decode($searchstring[2]);
- $srchuname = $searchstring[3];
- $modfid = 0;
- if($keyword) {
- $modkeyword = str_replace(' ', ',', $keyword);
- $fids = explode(',', str_replace('\'', '', $searchstring[5]));
- if(count($fids) == 1 && in_array($_G['adminid'], array(1,2,3))) {
- $modfid = $fids[0];
- if($_G['adminid'] == 3 && !C::t('forum_moderator')->fetch_uid_by_fid_uid($modfid, $_G['uid'])) {
- $modfid = 0;
- }
- }
- }
- $threadlist = $posttables = array();
- foreach(C::t('forum_thread')->fetch_all_by_tid_fid_displayorder(explode(',',$index['ids']), null, 0, $orderby, $start_limit, $_G['tpp'], '>=', $ascdesc) as $thread) {
- $thread['subject'] = bat_highlight($thread['subject'], $keyword);
- $thread['realtid'] = $thread['isgroup'] == 1 ? $thread['closed'] : $thread['tid'];
- $threadlist[$thread['tid']] = procthread($thread, 'dt');
- $posttables[$thread['posttableid']][] = $thread['tid'];
- }
- if($threadlist) {
- foreach($posttables as $tableid => $tids) {
- foreach(C::t('forum_post')->fetch_all_by_tid($tableid, $tids, true, '', 0, 0, 1) as $post) {
- $threadlist[$post['tid']]['message'] = bat_highlight(messagecutstr($post['message'], 200), $keyword);
- }
- }
- }
- $multipage = multi($index['num'], $_G['tpp'], $page, "search.php?mod=forum&searchid=$searchid&orderby=$orderby&ascdesc=$ascdesc&searchsubmit=yes");
- $url_forward = 'search.php?mod=forum&'.$_SERVER['QUERY_STRING'];
- $fulltextchecked = $searchstring[1] == 'fulltext' ? 'checked="checked"' : '';
- include template('search/forum');
- } else {
- if($_G['group']['allowsearch'] & 32 && $srchtype == 'fulltext') {
- periodscheck('searchbanperiods');
- } elseif($srchtype != 'title') {
- $srchtype = 'title';
- }
- $forumsarray = array();
- if(!empty($srchfid)) {
- foreach((is_array($srchfid) ? $srchfid : explode('_', $srchfid)) as $forum) {
- if($forum = intval(trim($forum))) {
- $forumsarray[] = $forum;
- }
- }
- }
- $fids = $comma = '';
- foreach($_G['cache']['forums'] as $fid => $forum) {
- if($forum['type'] != 'group' && (!$forum['viewperm'] && $_G['group']['readaccess']) || ($forum['viewperm'] && forumperm($forum['viewperm']))) {
- if(!$forumsarray || in_array($fid, $forumsarray)) {
- $fids .= "$comma'$fid'";
- $comma = ',';
- }
- }
- }
- if($_G['setting']['threadplugins'] && $specialplugin) {
- $specialpluginstr = implode("','", $specialplugin);
- $special[] = 127;
- } else {
- $specialpluginstr = '';
- }
- $special = $_GET['special'];
- $specials = $special ? implode(',', $special) : '';
- $srchfilter = in_array($_GET['srchfilter'], array('all', 'digest', 'top')) ? $_GET['srchfilter'] : 'all';
- $searchstring = 'forum|'.$srchtype.'|'.base64_encode($srchtxt).'|'.intval($srchuid).'|'.$srchuname.'|'.addslashes($fids).'|'.intval($srchfrom).'|'.intval($before).'|'.$srchfilter.'|'.$specials.'|'.$specialpluginstr.'|'.$seltableid;
- $searchindex = array('id' => 0, 'dateline' => '0');
- foreach(C::t('common_searchindex')->fetch_all_search($_G['setting']['search']['forum']['searchctrl'], $_G['clientip'], $_G['uid'], $_G['timestamp'], $searchstring, $srchmod) as $index) {
- if($index['indexvalid'] && $index['dateline'] > $searchindex['dateline']) {
- $searchindex = array('id' => $index['searchid'], 'dateline' => $index['dateline']);
- break;
- } elseif($_G['adminid'] != '1' && $index['flood']) {
- showmessage('search_ctrl', 'search.php?mod=forum', array('searchctrl' => $_G['setting']['search']['forum']['searchctrl']));
- }
- }
- if($searchindex['id']) {
- $searchid = $searchindex['id'];
- } else {
- !($_G['group']['exempt'] & 2) && checklowerlimit('search');
- if(!$srchtxt && !$srchuid && !$srchuname && !$srchfrom && !in_array($srchfilter, array('digest', 'top')) && !is_array($special)) {
- dheader('Location: search.php?mod=forum');
- } elseif(isset($srchfid) && !empty($srchfid) && $srchfid != 'all' && !(is_array($srchfid) && in_array('all', $srchfid)) && empty($forumsarray)) {
- showmessage('search_forum_invalid', 'search.php?mod=forum');
- } elseif(!$fids) {
- showmessage('group_nopermission', NULL, array('grouptitle' => $_G['group']['grouptitle']), array('login' => 1));
- }
- if($_G['adminid'] != '1' && $_G['setting']['search']['forum']['maxspm']) {
- if(C::t('common_searchindex')->count_by_dateline($_G['timestamp'], $srchmod) >= $_G['setting']['search']['forum']['maxspm']) {
- showmessage('search_toomany', 'search.php?mod=forum', array('maxspm' => $_G['setting']['search']['forum']['maxspm']));
- }
- }
- if($srchtype == 'fulltext' && $_G['setting']['sphinxon']) {
- require_once libfile('class/sphinx');
- $s = new SphinxClient();
- $s->setServer($_G['setting']['sphinxhost'], intval($_G['setting']['sphinxport']));
- $s->setMaxQueryTime(intval($_G['setting']['sphinxmaxquerytime']));
- $s->SetRankingMode($_G['setting']['sphinxrank']);
- $s->setLimits(0, intval($_G['setting']['sphinxlimit']), intval($_G['setting']['sphinxlimit']));
- $s->setGroupBy('tid', SPH_GROUPBY_ATTR);
- if($srchfilter == 'digest') {
- $s->setFilterRange('digest', 1, 3, false);
- }
- if($srchfilter == 'top') {
- $s->setFilterRange('displayorder', 1, 2, false);
- } else {
- $s->setFilterRange('displayorder', 0, 2, false);
- }
- if(!empty($srchfrom) && empty($srchtxt) && empty($srchuid) && empty($srchuname)) {
- $expiration = TIMESTAMP + $cachelife_time;
- $keywords = '';
- if($before) {
- $spx_timemix = 0;
- $spx_timemax = TIMESTAMP - $srchfrom;
- } else {
- $spx_timemix = TIMESTAMP - $srchfrom;
- $spx_timemax = TIMESTAMP;
- }
- } else {
- $uids = array();
- if($srchuname) {
- $uids = array_keys(C::t('common_member')->fetch_all_by_like_username($srchuname, 0, 50));
- if(count($uids) == 0) {
- $uids = array(0);
- }
- } elseif($srchuid) {
- $uids = array($srchuid);
- }
- if(is_array($uids) && count($uids) > 0) {
- $s->setFilter('authorid', $uids, false);
- }
- if($srchtxt) {
- if(preg_match("/\".*\"/", $srchtxt)) {
- $spx_matchmode = "PHRASE";
- $s->setMatchMode(SPH_MATCH_PHRASE);
- } elseif(preg_match("(AND|\+|&|\s)", $srchtxt) && !preg_match("(OR|\|)", $srchtxt)) {
- $srchtxt = preg_replace("/( AND |&| )/is", "+", $srchtxt);
- $spx_matchmode = "ALL";
- $s->setMatchMode(SPH_MATCH_ALL);
- } else {
- $srchtxt = preg_replace("/( OR |\|)/is", "+", $srchtxt);
- $spx_matchmode = 'ANY';
- $s->setMatchMode(SPH_MATCH_ANY);
- }
- $srchtxt = str_replace('*', '%', addcslashes($srchtxt, '%_'));
- foreach(explode('+', $srchtxt) as $text) {
- $text = trim(daddslashes($text));
- if($text) {
- $sqltxtsrch .= $andor;
- $sqltxtsrch .= $srchtype == 'fulltext' ? "(p.message LIKE '%".str_replace('_', '\_', $text)."%' OR p.subject LIKE '%$text%')" : "t.subject LIKE '%$text%'";
- }
- }
- $sqlsrch .= " AND ($sqltxtsrch)";
- }
- if(!empty($srchfrom)) {
- if($before) {
- $spx_timemix = 0;
- $spx_timemax = TIMESTAMP - $srchfrom;
- } else {
- $spx_timemix = TIMESTAMP - $srchfrom;
- $spx_timemax = TIMESTAMP;
- }
- $s->setFilterRange('lastpost', $spx_timemix, $spx_timemax, false);
- }
- if(!empty($specials)) {
- $s->setFilter('special', explode(",", $special), false);
- }
- $keywords = str_replace('%', '+', $srchtxt).(trim($srchuname) ? '+'.str_replace('%', '+', $srchuname) : '');
- $expiration = TIMESTAMP + $cachelife_text;
- }
- if($srchtype == "fulltext") {
- $result = $s->query("'".$srchtxt."'", $_G['setting']['sphinxmsgindex']);
- } else {
- $result = $s->query($srchtxt, $_G['setting']['sphinxsubindex']);
- }
- $tids = array();
- if($result) {
- if(is_array($result['matches'])) {
- foreach($result['matches'] as $value) {
- if($value['attrs']['tid']) {
- $tids[$value['attrs']['tid']] = $value['attrs']['tid'];
- }
- }
- }
- }
- if(count($tids) == 0) {
- $ids = 0;
- $num = 0;
- } else {
- $ids = implode(",", $tids);
- $num = $result['total_found'];
- }
- } else {
- $digestltd = $srchfilter == 'digest' ? "t.digest>'0' AND" : '';
- $topltd = $srchfilter == 'top' ? "AND t.displayorder>'0'" : "AND t.displayorder>='0'";
- if(!empty($srchfrom) && empty($srchtxt) && empty($srchuid) && empty($srchuname)) {
- $searchfrom = $before ? '<=' : '>=';
- $searchfrom .= TIMESTAMP - $srchfrom;
- $sqlsrch = "FROM ".DB::table('forum_thread')." t WHERE $digestltd t.fid IN ($fids) $topltd AND t.lastpost$searchfrom";
- $expiration = TIMESTAMP + $cachelife_time;
- $keywords = '';
- } else {
- $sqlsrch = $srchtype == 'fulltext' ?
- "FROM ".DB::table(getposttable($seltableid))." p, ".DB::table('forum_thread')." t WHERE $digestltd t.fid IN ($fids) $topltd AND p.tid=t.tid AND p.invisible='0'" :
- "FROM ".DB::table('forum_thread')." t WHERE $digestltd t.fid IN ($fids) $topltd";
- if($srchuname) {
- $srchuid = array_keys(C::t('common_member')->fetch_all_by_like_username($srchuname, 0, 50));
- if(!$srchuid) {
- $sqlsrch .= ' AND 0';
- }
- }/* elseif($srchuid) {
- $srchuid = "'$srchuid'";
- }*/
- if($srchtxt) {
- $srcharr = $srchtype == 'fulltext' ? searchkey($keyword, "(p.message LIKE '%{text}%' OR p.subject LIKE '%{text}%')", true) : searchkey($keyword,"t.subject LIKE '%{text}%'", true);
- $srchtxt = $srcharr[0];
- $sqlsrch .= $srcharr[1];
- }
- if($srchuid) {
- $sqlsrch .= ' AND '.($srchtype == 'fulltext' ? 'p' : 't').'.authorid IN ('.dimplode((array)$srchuid).')';
- }
- if(!empty($srchfrom)) {
- $searchfrom = ($before ? '<=' : '>=').(TIMESTAMP - $srchfrom);
- $sqlsrch .= " AND t.lastpost$searchfrom";
- }
- if(!empty($specials)) {
- $sqlsrch .= " AND special IN (".dimplode($special).")";
- }
- $keywords = str_replace('%', '+', $srchtxt);
- $expiration = TIMESTAMP + $cachelife_text;
- }
- $num = $ids = 0;
- $_G['setting']['search']['forum']['maxsearchresults'] = $_G['setting']['search']['forum']['maxsearchresults'] ? intval($_G['setting']['search']['forum']['maxsearchresults']) : 500;
- $query = DB::query("SELECT ".($srchtype == 'fulltext' ? 'DISTINCT' : '')." t.tid, t.closed, t.author, t.authorid $sqlsrch ORDER BY tid DESC LIMIT ".$_G['setting']['search']['forum']['maxsearchresults']);
- while($thread = DB::fetch($query)) {
- $ids .= ','.$thread['tid'];
- $num++;
- }
- DB::free_result($query);
- }
- $searchid = C::t('common_searchindex')->insert(array(
- 'srchmod' => $srchmod,
- 'keywords' => $keywords,
- 'searchstring' => $searchstring,
- 'useip' => $_G['clientip'],
- 'uid' => $_G['uid'],
- 'dateline' => $_G['timestamp'],
- 'expiration' => $expiration,
- 'num' => $num,
- 'ids' => $ids
- ), true);
- !($_G['group']['exempt'] & 2) && updatecreditbyaction('search');
- }
- dheader("location: search.php?mod=forum&searchid=$searchid&orderby=$orderby&ascdesc=$ascdesc&searchsubmit=yes&kw=".urlencode($keyword));
- }
- }
- ?>
|