帝国CMS二次开发实现多关键字搜索功能
帝国CMS二次开发搜索支持多关键字,这意味着用户在搜索时可以使用多个关键词来获取更精确的结果。例如,如果用户想要查找关于“苹果”和“手机”的信息,他们可以在搜索框中输入“苹果 手机”,系统将返回包含这两个关键词的所有文章。这种功能可以提高用户体验,使用户能够更快地找到所需的信息。此外,帝国CMS还提供了丰富的API接口,方便开发者进行二次开发。总之,帝国CMS二次开发搜索支持多关键字是一项非常实用的功能,值得开发者关注和使用。
帝国cms二次开发最终效果
二次开发修改方法
打开/e/search/index.php
1、找到:
//处理关键字functionSearchDoKeyboardVar($keyboard){$keyboard=RepPostVar2(trim($keyboard));$keyboard=str_replace('','',$keyboard);return$keyboard;}
修改为:
//处理关键字functionSearchDoKeyboardVar($keyboard){$keyboard=RepPostVar2(trim($keyboard));//$keyboard=str_replace('','',$keyboard);/*xuan搜索关键字优化*/$keyboard=preg_replace('/[s]+/s','',$keyboard);/*xuan搜索关键字优化*/return$keyboard;}
2、找到:
//(有两处,修改第二处)$where=$f."LIKE'%".$keyboard."%'";7.0版为:$where=$f."LIKE'%".str_replace("","%",$keyboard)."%'";
修改为:
/*xuan搜索关键字优化*/preg_match_all("/[^s]+/s",$keyboard,$keyarr);foreach($keyarr[0]as$val){$tj.=$f."like'%".$val."%'or";}$where=substr($tj,0,-4);/*xuan搜索关键字优化*/这样即可。
懒人直接复制以下代码替换/e/search/index.php中所有代码即可
/e/search/index.php:
<?phprequire("../class/connect.php");require("../class/db_sql.php");require("../data/dbcache/class.php");require("../class/q_functions.php");eCheckCloseMods('search');//关闭模块$link=db_connect();$empire=newmysqlquery();//处理关键字functionSearchDoKeyboardVar($keyboard){$keyboard=RepPostVar2(trim($keyboard));//$keyboard=str_replace('','',$keyboard);/*xuan搜索关键字优化*/$keyboard=preg_replace('/[s]+/s','',$keyboard);/*xuan搜索关键字优化*/return$keyboard;}//返回SQLfunctionSearchDoKeyboard($f,$hh,$keyboard){$where='';$keyboard=SearchDoKeyboardVar($keyboard);if(empty($keyboard)){return"";}if(!empty($hh)){if($hh=='LT')//小于{$where=$f."<'".$keyboard."'";}elseif($hh=='GT')//大于{$where=$f.">'".$keyboard."'";}elseif($hh=='EQ')//等于{$where=$f."='".$keyboard."'";}elseif($hh=='LE')//小于等于{$where=$f."<='".$keyboard."'";}elseif($hh=='GE')//大于等于{$where=$f.">='".$keyboard."'";}elseif($hh=='NE')//不等于{$where=$f."<>'".$keyboard."'";}elseif($hh=='IN')//包含{$kr=explode('',$keyboard);$kcount=count($kr);$kbs='';$dh='';for($i=0;$i<$kcount;$i++){$kr[$i]=(float)$kr[$i];if(empty($kr[$i])){continue;}if($kbs){$dh=',';}$kbs.=$dh."'".$kr[$i]."'";}if($kbs){$where=$f."IN(".$kbs.")";}else{return'';}}elseif($hh=='BT')//范围{$keyboard=ltrim($keyboard);if(!strstr($keyboard,'')){return'';}$kr=explode('',$keyboard);$kr[0]=(float)$kr[0];$kr[1]=(float)$kr[1];if(!trim($kr[0])||!trim($kr[1])){return'';}$where=$f."BETWEEN'".$kr[0]."'and'".$kr[1]."'";}else//相似{$where=$f."LIKE'%".$keyboard."%'";}}else{//$where=$f."LIKE'%".str_replace("","%",$keyboard)."%'";/*xuan搜索关键字优化*/preg_match_all("/[^s]+/s",$keyboard,$keyarr);foreach($keyarr[0]as$val){$tj.=$f."like'%".$val."%'or";}$where=substr($tj,0,-4);/*xuan搜索关键字优化*/}return$where;}//变量if($_GET['searchget']==1){$_POST=$_GET;}$ip=egetip();$searchtime=time();$getvar=$_POST['getvar'];if(empty($getvar)){$getfrom="history.go(-1)";$dogetvar='';}else{$getfrom="../../search/";$dogetvar="&getvar=1";}//返回$getfrom=DoingReturnUrl($getfrom,$_POST['ecmsfrom']);//搜索用户组if($public_r['searchgroupid']){$psearchgroupid=$public_r['searchgroupid'];@include("../data/dbcache/MemberLevel.php");$searchgroupid=(int)getcvar('mlgroupid');if($level_r[$searchgroupid][level]<$level_r[$psearchgroupid][level]){printerror("NotLevelToSearch",$getfrom,1);}}//搜索间隔$lastsearchtime=getcvar('lastsearchtime');if($lastsearchtime){if($searchtime-$lastsearchtime<$public_r[searchtime]){printerror("SearchOutTime",$getfrom,1);}}//搜索字段$searchclass=$_POST['show'];if(empty($searchclass)||@strstr($searchclass,"")){printerror("SearchNotRecord",$getfrom,1);}//时间范围$add='';$addtime='';$starttime=RepPostVar($_POST['starttime']);if(empty($starttime)){$starttime="0000-00-00";}$endtime=RepPostVar($_POST['endtime']);if(empty($endtime)){$endtime="0000-00-00";}if($endtime!="0000-00-00"){$addtime="and(newstimeBETWEEN'".to_time($starttime."00:00:00")."'and'".to_time($endtime."23:59:59")."')";}//价格$addprice='';$startprice=(int)$_POST['startprice'];$endprice=(int)$_POST['endprice'];if($endprice){$addprice="and(priceBETWEEN".$startprice."and".$endprice.")";}//搜索栏目及表$classid=RepPostVar($_POST['classid']);$s_tbname=RepPostVar($_POST['tbname']);$s_tempid=(int)$_POST['tempid'];$trueclassid=0;if($classid)//按栏目{if(strstr($classid,","))//多栏目{$son_r=sys_ReturnMoreClass($classid,1);$trueclassid=$son_r[0];$add.='and('.$son_r[1].')';}else{$trueclassid=intval($classid);$add.=$class_r[$trueclassid][islast]?"andclassid='$trueclassid'":"and".ReturnClass($class_r[$trueclassid][sonclass]);}$tbname=$class_r[$trueclassid][tbname];$modid=$class_r[$trueclassid][modid];}elseif($s_tbname)//按数据表{$tbnamenum=$empire->gettotal("selectcount(*)astotalfrom{$dbtbpre}enewstablewheretbname='$s_tbname'limit1");if(!$tbnamenum){printerror("SearchNotRecord",$getfrom,1);}$tbname=$s_tbname;//模型id$thestemp_r=$empire->fetch1("selectmodidfrom".GetTemptb("enewssearchtemp")."wheretempid='$s_tempid'");if(empty($thestemp_r['modid'])){printerror("SearchNotRecord",$getfrom,1);}$modid=$thestemp_r['modid'];}else{$tbname=$public_r['tbname'];$modid=0;}//表不存在if(empty($tbname)||InfoIsInTable($tbname)){printerror("SearchNotRecord",$getfrom,1);}//标题分类$ttid=RepPostVar($_POST['ttid']);$truettid=0;if($ttid){if(strstr($ttid,","))//多标题分类{$son_r=sys_ReturnMoreTT($ttid);$truettid=$son_r[0];$add.='and('.$son_r[1].')';}else{$truettid=intval($ttid);$add.="andttid='$truettid'";}}//会员$member=$_POST['member'];if($member==1){$add.='andismember=1';}elseif($member==2){$add.='andismember=0';}//模型$tempr=array();if(empty($class_r[$trueclassid][searchtempid])){if(empty($modid)){$tempr=$empire->fetch1("selectmodidfrom".GetTemptb("enewssearchtemp")."whereisdefault=1limit1");}else{$tempr[modid]=$modid;}}else{$tempr[modid]=$modid;}//关键字$keyboard=$_POST['keyboard'];$keyboardone=0;if(is_array($keyboard)){}elseif(strstr($keyboard,',')){$keyboard=explode(',',$keyboard);}else{$keyboard=trim($keyboard);$len=strlen($keyboard);if($len<$public_r[min_keyboard]||$len>$public_r[max_keyboard]){printerror("MinKeyboard",$getfrom,1);}$keyboardone=1;}//符号$hh=$_POST['hh'];$hhone=0;if(is_array($hh)){}elseif(strstr($hh,',')){$hh=explode(',',$hh);}else{$hhone=1;}//字段if(!is_array($searchclass)){$searchclass=explode(',',$searchclass);}$andor=$_POST['andor'];$andor=$andor=='and'?'and':'or';$mr=$empire->fetch1("selectsearchvar,tbnamefrom{$dbtbpre}enewsmodwheremid='$tempr[modid]'");if(!strstr($mr[searchvar],",price,"))//是否包含价格{$addprice="";$startprice=0;$endprice=0;}//搜索特殊字段$mr[searchvar].='id,keyboard,userid,username,';$where='';$newsearchclass='';$count=count($searchclass);for($i=0;$i<$count;$i++){if(empty($searchclass[$i])){continue;}$searchclass[$i]=str_replace(',','',$searchclass[$i]);if(!strstr($mr[searchvar],",".$searchclass[$i].",")){continue;}$searchclass[$i]=RepPostVar($searchclass[$i]);$dh=empty($newsearchclass)?'':',';$newsearchclass.=$dh.$searchclass[$i];$dohh=$hhone==1?$hh:$hh[$i];$dokeyboard=$keyboardone==1?$keyboard:$keyboard[$i];$onewhere=SearchDoKeyboard($searchclass[$i],$dohh,$dokeyboard);if($onewhere){$or=empty($where)?'':''.$andor.'';$where.=$or.'('.$onewhere.')';}}//参数错if(empty($newsearchclass)){printerror("SearchNotRecord",$getfrom,1);}if($where){$add.='and('.$where.')';}$allwhere=$add.$addtime.$addprice;$keyboard=$keyboardone==1?SearchDoKeyboardVar($keyboard):'';$andsql=addslashes($allwhere);if(strlen($newsearchclass)>250||strlen($classid)>200||strlen($andsql)>3000||strlen($keyboard)>100||strlen($ttid)>200){printerror("SearchNotRecord",$getfrom,1);}//验证码$checkpass=md5($allwhere.$tbname);$query="selectcount(*)astotalfrom{$dbtbpre}ecms_".$tbname.($allwhere?'where'.substr($allwhere,5):'');$search_r=$empire->fetch1("selectsearchidfrom{$dbtbpre}enewssearchwherecheckpass='$checkpass'limit1");$searchid=$search_r[searchid];//排序$orderby=RepPostVar($_POST['orderby']);$myorder=(int)$_POST['myorder'];if($orderby){$orderr=ReturnDoOrderF($tempr[modid],$orderby,$myorder);$orderby=$orderr['returnf'];}else{$orderby='newstime';}//是否有历史记录if($searchid){$search_num=$empire->gettotal($query);$sql=$empire->query("update{$dbtbpre}enewssearchsetsearchtime='$searchtime',result_num='$search_num',onclick=onclick+1,orderby='$orderby',myorder='$myorder',tempid='$s_tempid'wheresearchid='$searchid'");if(empty($search_num)){$searchid=0;}}else{$search_num=$empire->gettotal($query);if(empty($search_num)){$searchid=0;}else{$iskey=$keyboardone==1?0:1;$sql=$empire->query("insertinto{$dbtbpre}enewssearch(searchtime,keyboard,searchclass,result_num,searchip,classid,onclick,orderby,myorder,checkpass,tbname,tempid,iskey,andsql,trueclassid)values('$searchtime','$keyboard','$newsearchclass','$search_num','$ip','$classid',1,'$orderby','$myorder','$checkpass','$tbname','$s_tempid','$iskey','$andsql','$trueclassid')");$searchid=$empire->lastid();}}//设置最后搜索时间$set1=esetcookie("lastsearchtime",$searchtime,$searchtime+3600*24);if(!$searchid){printerror("SearchNotRecord",$getfrom,1);}else{Header("Location:result/?searchid=$searchid".$dogetvar);}db_close();$empire=null;?>
本方法兼容帝国CMS7.0/7.2,其他版本暂未测试。