首页 > 电脑专区 > CMS教程 > 帝国cms >

帝国cms中随机调用指定栏目下的信息若干条

来源:互联网 2023-03-14 19:30:55 版权归原作者所有,如有侵权,请联系我们

随机调用帝国cms指定栏目下的几条信息,简单的使用order by rand()效率低下。官方给出的方法没有考虑id不连续的情况,这里为您介绍改进后的方法11S办公区 - 实用经验教程分享!

工具/原料

帝国cms 源码

方法/步骤

1

自然的代码11S办公区 - 实用经验教程分享!

看代码:11S办公区 - 实用经验教程分享!

[e:loop={'select * from phome_ecms_news order by rand() limit 10',0,24}]11S办公区 - 实用经验教程分享!

<a href="<?=$bqsr['titleurl']?>" target="_blank"><?=$bqr['title']?></a>11S办公区 - 实用经验教程分享!

[/e:loop]11S办公区 - 实用经验教程分享!

11S办公区 - 实用经验教程分享!

这是用灵动标签调用的帝国新闻数据表中随机的10条信息。然而order by rand() 在mysql中,是出名的效率低下。十万以上的数据,用这个调用,耗费的时间无法忍受。11S办公区 - 实用经验教程分享!

2

官方的代码11S办公区 - 实用经验教程分享!

== 开始==11S办公区 - 实用经验教程分享!

发个比较高效的随机调用方法11S办公区 - 实用经验教程分享!

看不少人喜欢用ORDER BY RAND()随机调用,随机调用是最耗资源的一种调用方式,信息数在1万以上随机调用就开始影响速度。使用时建议慎之又慎。如果确实要使用,可以用下面思路:11S办公区 - 实用经验教程分享!

先用php随机出信息ID,然后SQL调用用id in (php随机的ID列表)11S办公区 - 实用经验教程分享!

调用举例:11S办公区 - 实用经验教程分享!

<?php$randnum=10; //随机数量$randids='';$randdh='';for($i=1;$i<=$randnum;$i ){ $randids.=$randdh.rand(1,100000); //1为最小ID,100000为最大ID $randdh=',';}?>[e:loop={栏目ID,显示条数,操作类型,只显示有标题图片,"id in ($randids)"}]模板代码内容[/e:loop]11S办公区 - 实用经验教程分享!

==结束==11S办公区 - 实用经验教程分享!

这个效率自然是非常高的。但是如果id不连续,则随机函数ran命中的id可能不存在。有人要问了,id是自增字段,怎么会不连续呢?11S办公区 - 实用经验教程分享!

11S办公区 - 实用经验教程分享!

有两种情况会导致id不连续。其一是,文章删除后;其二,要考虑指定栏目下的信息随机调用,这自然是无法保障id的连续。11S办公区 - 实用经验教程分享!

11S办公区 - 实用经验教程分享!

11S办公区 - 实用经验教程分享!

11S办公区 - 实用经验教程分享!

3

进化后的代码11S办公区 - 实用经验教程分享!

<?php11S办公区 - 实用经验教程分享!

$classid=18;//指定栏目id,当前为$navclassid,多个请用分号隔开,比如'1,10'表示调用栏目1和10下的所有终极栏目11S办公区 - 实用经验教程分享!

$limit=7;//七条11S办公区 - 实用经验教程分享!

$tbname='news';//数据表11S办公区 - 实用经验教程分享!

list(,$classids)=sys_ReturnMoreClass($classid,1);11S办公区 - 实用经验教程分享!

$ids=$empire->gettotal("selectgroup_concat(id)astotalfrom{$dbtbpre}ecms_{$tbname}where$classids");11S办公区 - 实用经验教程分享!

$idsr=explode(',',$ids);11S办公区 - 实用经验教程分享!

$max=count($idsr)-1;11S办公区 - 实用经验教程分享!

if($max<$limit-1){11S办公区 - 实用经验教程分享!

$rand=implode(',',$idsr);11S办公区 - 实用经验教程分享!

}else{11S办公区 - 实用经验教程分享!

$ids=array();$i=0;11S办公区 - 实用经验教程分享!

while($i<$limit){11S办公区 - 实用经验教程分享!

$key=rand(0,$max);11S办公区 - 实用经验教程分享!

if(array_key_exists($key,$ids))continue;11S办公区 - 实用经验教程分享!

$ids[$key]=$idsr[$key];$i ;}11S办公区 - 实用经验教程分享!

$rand=implode(',',$ids);11S办公区 - 实用经验教程分享!

}?>11S办公区 - 实用经验教程分享!

[e:loop={"select*from{$dbtbpre}ecms_{$tbname}whereidin($rand)limit$limit",0,24}]11S办公区 - 实用经验教程分享!

<ahref="<?=$bqsr['titleurl']?>"><?=$bqr[title]?></a>11S办公区 - 实用经验教程分享!

[/e:loop]11S办公区 - 实用经验教程分享!

4

给你点解释11S办公区 - 实用经验教程分享!

11S办公区 - 实用经验教程分享!

这个代码经过实验证明,是高效和健壮的。11S办公区 - 实用经验教程分享!

group_concat() ,是mysql中的字段函数,我们利用他取出了指定栏目下所有符合条件的id,这些id可能是不连续的。11S办公区 - 实用经验教程分享!

11S办公区 - 实用经验教程分享!

用数组,把这些id映射为一个连续的自然数集,然后再随机,大功告成。11S办公区 - 实用经验教程分享!

注意事项

调试若有问题或有定制需要,可以通过qq:110102296联系本人。

以上方法由办公区教程网编辑摘抄自百度经验可供大家参考!11S办公区 - 实用经验教程分享!


标签:

办公区 Copyright © 2016-2023 www.bgqu.net. Some Rights Reserved. 备案号:湘ICP备2020019561号