📄 inc_arcsearch_view.php
字号:
<?php
require_once(dirname(__FILE__)."/inc_typelink.php");
require_once(dirname(__FILE__)."/pub_dedetag.php");
require_once(dirname(__FILE__)."/pub_splitword_www.php");
/******************************************************
//Copyright 2004-2006 by DedeCms.com itprato
//本类的用途是用于文档搜索
******************************************************/
@set_time_limit(0);
//-----------------------
//搜索类
//-----------------------
class SearchView
{
var $dsql;
var $dtp;
var $dtp2;
var $TypeID;
var $TypeLink;
var $PageNo;
var $TotalPage;
var $TotalResult;
var $PageSize;
var $ChannelType;
var $TempInfos;
var $Fields;
var $PartView;
var $StartTime;
var $Keywords;
var $OrderBy;
var $SearchType;
var $KType;
var $Keyword;
var $TempletsFile;
var $result;
var $cacheid;
//-------------------------------
//php5构造函数
//-------------------------------
function __construct($typeid, $keyword, $achanneltype=0, $searchtype="title",$kwtype=0, $cacheid=0)
{
$this->TypeID = $typeid;
$this->Keyword = $keyword;
$this->OrderBy = '#@__full_search.aid desc';
$this->KType = $kwtype;
$this->PageSize = 20;
$this->ChannelType = $achanneltype;
$this->TempletsFile = '';
$this->SearchType = $searchtype;
$this->result = '';
$this->cacheid = $cacheid;
$this->dsql = new DedeSql(false);
$this->dtp = new DedeTagParse();
$this->dtp->SetNameSpace("dede","{","}");
$this->dtp2 = new DedeTagParse();
$this->dtp2->SetNameSpace("field","[","]");
$this->TypeLink = new TypeLink($typeid);
$this->Keywords = $this->GetKeywords($keyword);
//设置一些全局参数的值
foreach($GLOBALS['PubFields'] as $k=>$v) $this->Fields[$k] = $v;
if(isset($GLOBALS['PageNo'])) $this->PageNo = $GLOBALS['PageNo'];
else $this->PageNo = 1;
$this->CountRecord();
$tempfile = $GLOBALS['cfg_basedir'].$GLOBALS['cfg_templets_dir']."/".$GLOBALS['cfg_df_style']."/search.htm";
if(!file_exists($tempfile)||!is_file($tempfile)){
$this->Close();
echo "模板文件:'".$tempfile."' 不存在,无法解析!";
exit();
}
$this->dtp->LoadTemplate($tempfile);
$this->TempletsFile = ereg_replace("^".$GLOBALS['cfg_basedir'],'',$tempfile);
$this->TempInfos['tags'] = $this->dtp->CTags;
$this->TempInfos['source'] = $this->dtp->SourceString;
if($this->PageSize=="") $this->PageSize = 20;
$this->TotalPage = ceil($this->TotalResult/$this->PageSize);
if($this->PageNo==1){
$this->dsql->ExecuteNoneQuery("Update #@__search_keywords set result='".$this->TotalResult."' where keyword='".addslashes($keyword)."'; ");
}
}
//php4构造函数
//---------------------------
function SearchView($typeid,$keyword,$achanneltype=0,$searchtype="title",$kwtype=0, $cacheid=0)
{
$this->__construct($typeid,$keyword,$achanneltype,$searchtype,$kwtype, $cacheid=0);
}
//---------------------------
//关闭相关资源
//---------------------------
function Close()
{
$this->dsql->Close();
$this->TypeLink->Close();
}
//获得关键字的分词结果,并保存到数据库
//--------------------------------
function GetKeywords($keyword){
$keyword = cn_substr($keyword,50);
$row = $this->dsql->GetOne("Select spwords From #@__search_keywords where keyword='".addslashes($keyword)."'; ");
if(!is_array($row)){
if(strlen($keyword) > 16){
$sp = new SplitWord();
$keywords = $sp->SplitRMM($keyword);
$sp->Clear();
$keywords = ereg_replace("[ ]{1,}"," ",trim($keywords));
}else{
$keywords = $keyword;
}
$inquery = "INSERT INTO `#@__search_keywords`(`keyword`,`spwords`,`count`,`result`,`lasttime`)
VALUES ('".addslashes($keyword)."', '".addslashes($keywords)."', '1', '0', '".time()."');
";
$this->dsql->ExecuteNoneQuery($inquery);
}else{
$this->dsql->ExecuteNoneQuery("Update #@__search_keywords set count=count+1,lasttime='".time()."' where keyword='".addslashes($keyword)."'; ");
$keywords = $row['spwords'];
}
return $keywords;
}
//----------------
//获得关键字SQL
//----------------
function GetKeywordSql()
{
$where = $where1 = array();
if($this->TypeID > 0){
$where[] = "#@__full_search.typeid={$this->TypeID}";
}
if(!empty($this->ChannelType)){
$where[] = "#@__full_search.channelid={$this->ChannelType}";
}
$ks = explode(' ',$this->Keywords);
sort($ks);
reset ($ks);
$wherearr = array();
foreach($ks as $k)
{
$kwsqlarr = array();
$k = trim($k);
if(strlen($k) < 3){
continue;
//echo '关键词过短,搜索程序终止程序执行';
//exit;
}
$k = addslashes($k);
if($this->SearchType != "titlekeyword"){
$kwsqlarr[] = " #@__full_search.title like '%$k%' ";
}else{
$kwsqlarr[] = " #@__full_search.title like '%$k%' ";
$kwsqlarr[] = " #@__full_search.addinfos like '%$k%' ";
$kwsqlarr[] = " #@__full_search.keywords like '%$k%' ";
}
$wherearr[] = '('.implode(' OR ',$kwsqlarr).')';
}
if($this->KType==1){
$where[] = '('.implode(' AND ',$wherearr).')';
}else{
$where[] = '('.implode(' OR ',$wherearr).')';
}
$wheresql = implode(' AND ',$where);
$wheresql = 'arcrank > -1 and '.$wheresql;
return $wheresql;
}
//-------------------
//获得相关的关键字
//-------------------
function GetLikeWords($num=8){
$ks = explode(" ",$this->Keywords);
$lsql = "";
foreach($ks as $k){
$k = trim($k);
if(strlen($k)<2) continue;
if(ord($k[0])>0x80 && strlen($k)<3) continue;
$k = addslashes($k);
if($lsql=="") $lsql = $lsql." CONCAT(spwords,' ') like '%$k %' ";
else $lsql = $lsql." Or CONCAT(spwords,' ') like '%$k %' ";
}
if($lsql=="") return "";
else{
$likeword = "";
$lsql = "(".$lsql.") And Not(keyword like '".addslashes($this->Keyword)."') ";
$this->dsql->SetQuery("Select keyword,count From #@__search_keywords where $lsql order by lasttime desc limit 0,$num; ");
$this->dsql->Execute('l');
while($row=$this->dsql->GetArray('l')){
if($row['count']>1000) $fstyle=" style='font-size:11pt;color:red'";
else if($row['count']>300) $fstyle=" style='font-size:10pt;color:green'";
else $style = "";
$likeword .= ' <a href="search.php?keyword='.urlencode($row['keyword']).'"'.$style."><u>".$row['keyword']."</u></a> ";
}
return $likeword;
}
}
//----------------
//加粗关键字
//----------------
function GetRedKeyWord($fstr)
{
$ks = explode(" ",$this->Keywords);
$kwsql = "";
$words = array();
foreach($ks as $k){
$k = trim($k);
if($k=="") continue;
if(ord($k[0])>0x80 && strlen($k)<3) continue;
//$fstr = str_replace($k,"<font color='red'>$k</font>",$fstr);
$words[] = $k;
}
$fstr = highlight($fstr, $words);
return $fstr;
}
//------------------
//统计列表里的记录
//------------------
function CountRecord()
{
global $cfg_search_maxlimit, $cfg_search_cachetime;
$cfg_search_cachetime = max(1,intval($cfg_search_cachetime));
$expiredtime = time() - $cfg_search_cachetime * 3600;
if(empty($cfg_search_maxlimit)) $cfg_search_maxlimit = 500;
if(empty($this->cacheid)){
$where = $this->GetKeywordSql();
$query = "Select aid from #@__full_search where $where limit $cfg_search_maxlimit";
$md5 = md5($query);
$timestamp = time();
$cachequery = $this->dsql->getone("select * from #@__search_cache where md5='$md5' And addtime > $expiredtime limit 1");
if(is_array($cachequery))
{
$nums = $cachequery['nums'];
$result = $cachequery['result'];
$this->result = $result;
$this->TotalResult = $nums;
$this->cacheid = $cachequery['cacheid'];
}else{
$this->dsql->SetQuery($query);
$this->dsql->execute();
$aidarr = array();
$aidarr[] = 0;
while($row = $this->dsql->getarray()){
$aidarr[] = $row['aid'];
}
$nums = count($aidarr)-1;
$aids = implode(',', $aidarr);
$delete = "delete from #@__search_cache where addtime < $expiredtime;";
$this->dsql->SetQuery($delete);
$this->dsql->executenonequery();
$insert = "insert into #@__search_cache(`nums`, `md5`, `result`, `usetime`, `addtime`)
values('$nums', '$md5', '$aids','$timestamp', '$timestamp')";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -