圈圈元元圈圈天天年年天天 發表於 2023-8-5 00:00:00

帝国CMS跨表查询相关链接实现方法

<p>
本文实例讲述了帝国CMS跨表查询相关链接实现方法。分享给大家供大家参考。具体分析如下:</p>
<p>
官方的相关链接不灵活,样式不能任意的修改且无法跨表,很多人想跨表做相关链接,比如news和info都有几篇文章,关键词都有'北京',那么如何调用这些有有同一关键词的文章呢?为此写了一个自定义函数.</p>
<p>
小范围的调用于本分类,稍大一点范围可以调用同一表的文章,再大一点可以调用指定的表的文章,可以选要调用文章的数量,其实还可以升级,比如指定调用某个表的文章数量,那个表的顺序等,函数没有样式,稍微懂一点代码的可以自行修改,其实不是特别难,如果有哪位升级了这个函数,可以共享给大家.<br>
 </p>
<div>

<p>
代码如下:</p>
</div>
<div id="phpcode5">
&lt;?php <br>
function user_OtherLink($tbname,$num,$ck){ <br>
global $navinfor,$empire,$dbtbpre,$class_r ; <br>
$ck=(int)$ck ; <br>
if($ck==1||$ck==2){ <br>
$tbname=$class_r[$navinfor['classid']]['tbname'] ; <br>
} <br>
$num= $num=='' ? 5 : $num ; //缺省获取数量为5 <br>
$tag_all=explode(',',$navinfor['infotags']); <br>
$tbname_num=explode(',',$tbname) ; <br>
$eq_num=ceil($num/count($tag_all)); <br>
for($i=0;$i&lt;count($tag_all);$i++){ <br>
$r_1_1 =$empire-&gt;fetch1("select tagid,tagname,num,isgood,cid from {$dbtbpre}enewstags where tagname='".$tag_all[$i]."' order by tagid limit 1") ; <br>
$tag_id[$i]=$r_1_1['tagid'] ; //tag的ID <br>
$tag_num[$i]=$r_1_1['num'] ; //tag下的文章数量 <br>
if($tag_num[$i]&gt;=$eq_num){//如果TAG下的文章数量比平均的数量大或者等于,那么TAG的文章数量取平均值 <br>
$tag_num[$i] = $eq_num ;//重新赋值 <br>
}else{//如果TAG下的文章小于平均值,那么TAG取原有的文章数量。同时重新赋值平均值。 <br>
$eg_tag= $eq_num-$tag_num[$i] ; <br>
$eq_num += $eg_tag ; <br>
} <br>
//比如说有3个TAG,每个TAG下有4篇文章,现在指定要显示10篇文章,那么每个TAG要拿出4篇,共有12篇文章 <br>
//3个TAG,每个TAG下有3篇文章,现在指定要显示10篇文章,那么每个TAG要拿出3篇文章,共有9篇文章 <br>
//3个TAG,A有2篇文章,B有5篇文章,C有3篇文章,现在要显示10篇文章,那么A拿出2篇文章,B拿出5篇文章,C拿出3篇文章,共有10篇文章 <br>
//如果 A、B、C中除了当前文章,还有相同的文章,那么会扣除重复的那篇文章,只取一次。所以指定的数量会有偏差 <br>
for($i_n=0;$i_n&lt;count($tbname_num);$i_n++){ <br><br>
$sql=$empire-&gt;query("select tid,classid,id,mid from {$dbtbpre}enewstagsdata where tagid='".$tag_id[$i]."' order by classid "); <br>
$ri=1 ; <br>
while($r=$empire-&gt;fetch($sql)) <br>
{ <br>
$tbname_all[$r['tid']]=$class_r[$r['classid']]['tbname'] ; <br>
if($tbname_all[$r['tid']]==$tbname_num[$i_n] &amp;&amp; $ri &lt;= $tag_num[$i] &amp;&amp; $navinfor['classid']!=$r['classid'] &amp;&amp; $navinfor['id']!=$r['id']){ <br>
if($ck==1&amp;&amp;$navinfor['classid']==$r['classid']){ <br><br>
$tbname_all_r[$r['tid']]=$class_r[$r['classid']]['tbname'] ; <br>
$classid_id[$r['tid']]=$r['classid'] . '_' . $r['id'] ; <br>
$classid_all[$r['tid']]=$r['classid'] ; <br>
$id_all[$r['tid']][$r['classid']]=$r['id'] ; <br><br>
}elseif($ck==2&amp;&amp;$class_r[$navinfor['classid']]['tbname']==$class_r[$r['classid']]['tbname']){ <br><br>
$tbname_all_r[$r['tid']]=$class_r[$r['classid']]['tbname'] ; <br>
$classid_id[$r['tid']]=$r['classid'] . '_' . $r['id'] ; <br>
$classid_all[$r['tid']]=$r['classid'] ; <br>
$id_all[$r['tid']][$r['classid']]=$r['id'] ; <br><br>
}elseif($ck==3){ <br><br>
$tbname_all_r[$r['tid']]=$class_r[$r['classid']]['tbname'] ; <br>
$classid_id[$r['tid']]=$r['classid'] . '_' . $r['id'] ; <br>
$classid_all[$r['tid']]=$r['classid'] ; <br>
$id_all[$r['tid']][$r['classid']]=$r['id'] ; <br><br>
} <br>
$ri++; <br>
} <br>
} <br>
} <br>
} <br>
$classid_id_x=array_unique($classid_id);//去除重复的值 <br>
//去除重复的值,不同的TAG会有相同的文章。所以去除重复的值。比如A篇文章里面都有"北京","奥运",两个关键词,B篇文章里面也有"北京","奥运"在不去除重复的情况下,A篇的相关链接会出现两次B文章。所以必须去除其中一个。 <br>
arsort($classid_id_x); //按键名排列,倒序 <br>
$tid_tid=array_keys($classid_id_x) ;//取出键名重新排列,键名即为TAG的ID:tid <br>
shuffle($tid_tid);//顺序打乱,重新排 <br>
$tid_tid_num=count($tid_tid) ; <br>
if($num&lt;$tid_tid_num) $tid_tid_num=$num+1 ;//由于去除了本文章,所以再加一条弥补 <br>
for($i_tid=0;$i_tid&lt;$tid_tid_num;$i_tid++){ <br>
$tid=$tid_tid[$i_tid]; <br>
$classid=$classid_all[$tid]; <br>
$id=$id_all[$tid][$classid]; <br>
if($id==$navinfor['id']) continue ; //如果是本文章,相关链接里面就不用再放了。 <br>
$tbname=$tbname_all_r[$tid]; <br>
$r_1_2 =$empire-&gt;fetch1("select title,smalltext,titleurl,dp_jt,dp_dwz from {$dbtbpre}ecms_$tbname where id='".$id."' order by newstime limit 1") ;<br><br>
////////显示样式在这修改 <br>
echo $r_1_2['title'].' ' ; <br>
//////// <br>
} <br>
} <br>
?&gt; <br>
/** <br>
&lt;?php <br>
OtherLink('news,info',7,3) ; <br>
?&gt; <br>
**/</div>
<p>
<br><span>希望本文所述对大家的帝国CMS建站有所帮助。</span></p>
頁: [1]
查看完整版本: 帝国CMS跨表查询相关链接实现方法