官方的相关链接不灵敏,款式不能恣意的修正无法跨表。很多人想跨表做相关链接,比方news和info都有几篇文章,关键词都有'北京',那么怎么调用这些有有同一关键词的文章呢?为此写了一个函数。

小规模的调用于本分类,稍大一点规模能够调用同一表的文章,再大一点能够调用指定的表的文章。能够选要调用文章的数量。 其实还能够晋级,比方指定调用某个表的文章数量,那个表的次序等。 函数没有款式,略微懂一点代码的能够自行修正。其实不是特别难。 假如有哪位晋级了这个函数,能够同享给我们。

<?php

functionuser_OtherLink($tbname,$num,$ck){
global$navinfor,$empire,$dbtbpre,$class_r;
$ck=(int)$ck;
if($ck==1||$ck==2){
$tbname=$class_r[$navinfor['classid']]['tbname'];
}
$num=$num==''?5:$num;//缺省获取数量为5
$tag_all=explode(',',$navinfor['infotags']);
$tbname_num=explode(',',$tbname);
$eq_num=ceil($num/count($tag_all));
for($i=0;$i<count($tag_all);$i++){
$r_1_1=$empire->fetch1("selecttagid,tagname,num,isgood,cidfrom{$dbtbpre}enewstagswheretagname='".$tag_all[$i]."'orderbytagidlimit1");
$tag_id[$i]=$r_1_1['tagid'];//tag的ID
$tag_num[$i]=$r_1_1['num'];//tag下的文章数量
if($tag_num[$i]>=$eq_num){//假如TAG下的文章数量比均匀的数量大或许等于,那么TAG的文章数量取均匀值
$tag_num[$i]=$eq_num;//从头赋值
}else{//假如TAG下的文章小于均匀值,那么TAG取原有的文章数量。一起从头赋值均匀值。
$eg_tag=$eq_num-$tag_num[$i];
$eq_num+=$eg_tag;
}
//比方说有3个TAG,每个TAG下有4篇文章,现在指定要显现10篇文章,那么每个TAG要拿出4篇,共有12篇文章
//3个TAG,每个TAG下有3篇文章,现在指定要显现10篇文章,那么每个TAG要拿出3篇文章,共有9篇文章
//3个TAG,A有2篇文章,B有5篇文章,C有3篇文章,现在要显现10篇文章,那么A拿出2篇文章,B拿出5篇文章,C拿出3篇文章,共有10篇文章
//假如A、B、C中除了当时文章,还有相同的文章,那么会扣除重复的那篇文章,只取一次。所以指定的数量会有误差
for($i_n=0;$i_n<count($tbname_num);$i_n++){

$sql=$empire->query("selecttid,classid,id,midfrom{$dbtbpre}enewstagsdatawheretagid='".$tag_id[$i]."'orderbyclassid");
$ri=1;
while($r=$empire->fetch($sql))
{
$tbname_all[$r['tid']]=$class_r[$r['classid']]['tbname'];
if($tbname_all[$r['tid']]==$tbname_num[$i_n]&&$ri<=$tag_num[$i]&&$navinfor['classid']!=$r['classid']&&$navinfor['id']!=$r['id']){
if($ck==1&&$navinfor['classid']==$r['classid']){

$tbname_all_r[$r['tid']]=$class_r[$r['classid']]['tbname'];
$classid_id[$r['tid']]=$r['classid'].'_'.$r['id'];
$classid_all[$r['tid']]=$r['classid'];
$id_all[$r['tid']][$r['classid']]=$r['id'];

}elseif($ck==2&&$class_r[$navinfor['classid']]['tbname']==$class_r[$r['classid']]['tbname']){

$tbname_all_r[$r['tid']]=$class_r[$r['classid']]['tbname'];
$classid_id[$r['tid']]=$r['classid'].'_'.$r['id'];
$classid_all[$r['tid']]=$r['classid'];
$id_all[$r['tid']][$r['classid']]=$r['id'];

}elseif($ck==3){

$tbname_all_r[$r['tid']]=$class_r[$r['classid']]['tbname'];
$classid_id[$r['tid']]=$r['classid'].'_'.$r['id'];
$classid_all[$r['tid']]=$r['classid'];
$id_all[$r['tid']][$r['classid']]=$r['id'];

}
$ri++;
}
}
}
}
$classid_id_x=array_unique($classid_id);//去除重复的值
//去除重复的值,不同的TAG会有相同的文章。所以去除重复的值。比方A篇文章里边都有"北京","奥运",两个关键词,B篇文章里边也有"北京","奥运"在不去除重复的情况下,A篇的相关链接会呈现两次B文章。所以有必要去除其间一个。
arsort($classid_id_x);//按键名摆放,倒序
$tid_tid=array_keys($classid_id_x);//取出键名从头摆放,键名即为TAG的ID:tid
shuffle($tid_tid);//次序打乱,从头排
$tid_tid_num=count($tid_tid);
if($num<$tid_tid_num)$tid_tid_num=$num+1;//因为去除了本文章,所以再加一条补偿
for($i_tid=0;$i_tid<$tid_tid_num;$i_tid++){
$tid=$tid_tid[$i_tid];
$classid=$classid_all[$tid];
$id=$id_all[$tid][$classid];
if($id==$navinfor['id'])continue;//假如是本文章,相关链接里边就不必再放了。
$tbname=$tbname_all_r[$tid];
$r_1_2=$empire->fetch1("selecttitle,smalltext,titleurl,dp_jt,dp_dwzfrom{$dbtbpre}ecms_$tbnamewhereid='".$id."'orderbynewstimelimit1");

////////显现款式在这修正
echo$r_1_2['title'].'';
////////
}
}
?>
/**
<?php
OtherLink('news,info',7,3);
?>
**/


声明:有的资源均来自网络转载,版权归原作者所有,如有侵犯到您的权益 请联系邮箱:123456@qq.com 我们将配合处理!

原文地址:帝国CMS二次开发跨表查询相关文章发布于2022-06-10 07:43:28

相关推荐