www.gusucode.com > 08CMS空白站群系统 3.3 繁体 UTF-8 > upload/search.php
<?php define('NOROBOT', TRUE); include_once './include/general.inc.php'; include_once M_ROOT.'./include/common.fun.php'; include_once M_ROOT."./include/fields.cls.php"; //只有发送searchsubmit之后搜索文档列表才进行解析 if(!$nousersearch && !$curuser->check_allow('searchpermit')) message(lang('belong usergroup nohave search permission'));//分析搜索权限 if($search_repeat){ empty($m_cookie['cms_search_time']) ? msetcookie('cms_search_time','1',$search_repeat) : message(lang('search overquick')); } $page = empty($page) ? 1 : max(1, intval($page)); $chid = empty($chid) ? 0 : max(0,intval($chid)); if($chid && empty($channels[$chid])) $chid =0; $searchword = empty($searchword) ? '' : cutstr(trim($searchword),50,''); //搜索模式:标题subject、关键词keywords、内容fulltxt、会员mname $searchmode = empty($searchmode) ? 'subject' : trim($searchmode); if(!in_array($searchmode,array('subject','keywords','fulltxt','mname'))) $searchmode = 'subject'; if(!$chid && $searchmode == 'fulltxt') $searchmode = 'subject';//单模型搜索才支持全文搜索 $caid = empty($caid) ? 0 : max(0,intval($caid)); $indays = empty($indays) ? 0 : max(0,intval($indays)); $outdays = empty($outdays) ? 0 : max(0,intval($outdays)); $orderby = empty($orderby) ? 'createdate' : $orderby; $ordermode = empty($ordermode) ? 0 : 1; $item = array('chid' => $chid,'channel' => $chid ? $channels[$chid]['cname'] : lang('all channel'),);//作为模板标识中的原始标识 foreach(array('chid','searchmode','searchword','caid','indays','outdays','orderby','ordermode') as $var){ $item[$var] = in_array($var,array('indays','outdays')) && empty($$var) ? '' : stripslashes($$var); } foreach($cotypes as $coid => $cotype){ ${"ccid$coid"} = empty(${"ccid$coid"}) ? 0 : max(0,intval(${"ccid$coid"})); $item["ccid$coid"] = ${"ccid$coid"}; } $wherestr = "WHERE a.checked=1 AND a.sid='$sid'"; $filterstr = '';//分页链接的附加参数字串 $fromstr = "FROM {$tblprefix}archives AS a"; if($chid){///////////////////////没法搜索模板的其它自定义字段 $channel = read_cache('channel',$chid); $filterstr .= ($filterstr ? '&' : '')."chid=$chid"; $fromstr .= " LEFT JOIN {$tblprefix}archives_$chid AS c ON a.aid=c.aid"; $wherestr .= " AND a.chid='$chid'"; $a_field = new cls_field; $fields = read_cache('fields',$chid); if($searchmode == 'fulltxt'){//处理全文搜索 if($channels[$chid]['fulltxt'] && isset($fields[$channels[$chid]['fulltxt']])) $fulltxt = $channels[$chid]['fulltxt'];//该模型的全文搜索字段 if(!empty($fulltxt)){ $searchword && $wherestr .= ' AND '.($fields[$channels[$chid]['fulltxt']]['tbl'] == 'main' ? 'a' : 'c').".$fulltxt LIKE '%".str_replace(array(' ','*'),'%',addcslashes($searchword, '%_'))."'%"; }else{//如果全文搜索字段没有定义,则返回为标题搜索 $searchmode = $item['searchmode'] = 'subject'; } } foreach($fields as $k => $field){ if($field['available'] && $field['issearch']){ $a_field->init(); $a_field->field = read_cache('field',$chid,$k); $a_field->deal_search(); $wherestr .= $a_field->searchstr ? (' AND '.$a_field->searchstr) : ''; $a_field->filterstr && $filterstr .= ($filterstr ? '&' : '').$a_field->filterstr; if($field['issearch'] == 1 || $field['datatype'] == 'text'){ $item[$k] = stripslashes($$k); }elseif(in_array($field['datatype'],array('select','mselect'))){ $item[$k.'str'] = ${$k.'str'}; }else{ $item[$k.'from'] = ${$k.'from'}; $item[$k.'to'] = ${$k.'to'}; } } } unset($a_field); } if($searchword){ //搜索模式已先行处理全文搜索方式的wherestr,但filterstr的处理还是在这里 $filterstr .= ($filterstr ? '&' : '')."searchword=".rawurlencode(stripslashes($searchword)); $searchmode != 'subject' && $filterstr .= ($filterstr ? '&' : '')."searchmode=$searchmode"; $searchmode != 'fulltxt' && $wherestr .= " AND a.$searchmode LIKE '%".str_replace(array(' ','*'),'%',addcslashes($searchword, '%_'))."%'"; } if($caid){ $filterstr .= ($filterstr ? '&' : '')."caid=$caid"; $caids = array($caid); $tempids = array(); $tempids = son_ids($catalogs,$caid,$tempids); $caids = array_merge($caids,$tempids); $wherestr .= " AND a.caid IN (".mimplode($caids).")"; } foreach($cotypes as $coid => $cotype){ if(${"ccid$coid"}){ $filterstr .= ($filterstr ? '&' : '')."ccid$coid=".${"ccid$coid"}; $ccids = array(${"ccid$coid"}); $tempids = array(); $coclasses = read_cache('coclasses',$coid); $tempids = son_ids($coclasses,${"ccid$coid"},$tempids); $ccids = array_merge($ccids,$tempids); if(empty($cotype['self_reg'])){ $wherestr .= " AND a.cotype$coid IN (".mimplode($ccids).")"; }else{ $tempstr = self_sqlstr($coid,$ccids,'a.'); $tempstr && $wherestr .= ' AND '.$tempstr; unset($tempstr); } } } if($indays){ $filterstr .= ($filterstr ? '&' : '')."indays=$indays"; $wherestr .= " AND a.createdate>'".($timestamp - 86400 * $indays)."'"; } if($outdays){ $filterstr .= ($filterstr ? '&' : '')."outdays=$outdays"; $wherestr .= " AND a.createdate<'".($timestamp - 86400 * $outdays)."'"; } $orderstr = "ORDER BY a.$orderby ".($ordermode ? 'ASC' : 'DESC'); $orderby != 'createdate' && $filterstr .= ($filterstr ? '&' : '')."orderby=$orderby"; $ordermode && $filterstr .= ($filterstr ? '&' : '')."ordermode=$ordermode"; $sqlstr = "$fromstr $wherestr $orderstr"; $tplname = @$sptpls['search'];//不区分模型的搜索模板 if($chid && $channel['srhtpl']) $tplname = $channel['srhtpl']; if(!$tplname || !($template = @load_tpl($tplname,1))) message(lang('please define related template')); if(preg_match("/\{p\\$(.+?)\s+(.*?)\{\/p\\$\\1\}/is",$template,$matches)){ $mpinfo = array(); $mpinfo['filterstr'] = $filterstr; $mpinfo['sqlstr'] = $sqlstr; $mpinfo['nowpage'] = $page; $mpinfo['submit'] = empty($searchsubmit) ? 0 : 1; $mpinfo['pcount'] = 1; $mpinfo['durlpre'] = $cms_abs."search.php?searchsubmit=1&$filterstr&page="; $mpinfo = array_merge($mpinfo,mpinfo($matches[1],stripslashes($matches[2]),$mpinfo)); $item['mpnav'] = mpnav($mpinfo); nreplace($template,'p',$mpinfo); unset($matches,$mpinfo); } $sitem = array(); nreplace($template,'c',$sitem); nreplace($template,'u',$item); nreplace($template,'b',$item); code_parse($template); mexit($template); ?>