官方的相关链接不灵敏,款式不能恣意的修正无法跨表。很多人想跨表做相关链接,比方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