最近几次上架新主题的时候都被驳回了,原因是zblog博客已经全面禁止利有“rand()”函数进行提取,不让使用“rand()”原因就是:“rand()”不支持mysql以外的数据库,在数据库数据比较多的情况下速度会变得很慢。
1.不支持MySQL之外的数据库; 2. 数据量上万即奇慢无比。 所以,除非特殊情况,zblog博客今后不再允许代码含直接在数据库内rand()的应用通过审核。当然,不包含在PHP里用rand()或mt_rand()函数,也不包含Math.random()。 为什么会慢?我这里尝试用非计算机专业术语来解释。 我们把一本书比作数据库。一般的数据库查询,比如查一条ID为1的记录,一般会直接根据索引来得到结果。索引的用途,相当于一本书的目录。直接查目录得到结果,自然会比一页一页翻来得快。然而,ORDER BY RAND()呢?它会先给你这本书的每一页都随机写一个数字,这就要翻过每一页了。接着,再排序比大小,把每一页的数字都排序排一遍,这就又要把书翻一遍。再取出数字最小的那几条记录。所以,这就是慢的原因。(当然,MySQL的内部实现我没看过,这两个任务不一定是互相独立的。)如果要比较专业解释的话,请参看MySQL的官方文档: You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times. However, you can retrieve rows in random order like this: mysql> SELECT * FROM tbl_name ORDER BY RAND();ORDER BY RAND() combined with LIMIT is useful for selecting a random sample from a set of rows: mysql> SELECT * FROM table1, table2 WHERE a=b AND c<d -> ORDER BY RAND() LIMIT 1000;RAND() is not meant to be a perfect random generator. It is a fast way to generate random numbers on demand that is portable between platforms for the same MySQL version.
以上就是解释,不明觉厉啊,无论是计算机专业术语还是mysql官网文档的解释我都不明白,不过明不明白不要紧,要紧的是你必须的修改,否则就别想通过审核,于是乎,鸟儿的随机显示就横空出世,随机的主体思路:
1、先查出post表中,log_ID的最大值和最小值。
2、获取一个随机数,在最大值和最小值之间。
3、用这个随机数去查表。
function 模板ID_Theme_Get_Rand(){
global $zbp,$str,$order;
$str='';
$sql = $zbp->db->sql->Select(
$zbp->table['Post'],
array("MIN(log_ID)","MAX(log_ID)"),
array(
array('=', 'log_Type', '0'),
array('=', 'log_Status', '0'),
),
array('log_PostTime' => 'ASC'),
null,
null
);
$array = $zbp->db->Query($sql);
$i=mt_rand($array[0]["MIN(log_ID)"],$array[0]["MAX(log_ID)"]);
$order = '';
$where = array(
array('=','log_Status','0'),
array('>','log_ID',$i)
);
$array = $zbp->GetArticleList(array('*'),$where,$order,array(5),'');
foreach ($array as $key=>$article) {
if($key>5){
break;
}
$str .='<li><a href="'.$article->Url.'">'.$article->Title.'</a></li>';
}
return $str;
}
可以说是解决了燃眉之急,但是(就这对了,哪有那么完美啊)就是当你的文章ID有断档的时候,可能会出现少几篇文章的现象,这个倒是可以解决的啊,毕竟zblog应用中心就插件,可以修改连续ID又不会影响已经存在的ID,这个就完美啦。
问题可以解决,可是不是谁都愿意使用插件的啊,于是继续寻找,偶然间看到飞鸟博客提供了一种方法:
1、先从数据库中提出一部份数据,加入数组中;
2、随机抽取数组中的数据,并显示。
function 模板ID_rand($num){
global $zbp,$str,$order;$i;
$i = $num;
$str = '';
$arr = array();
$arand = array();
$order = array('log_ViewNums'=>'ASC');
$where = array(array('=','log_Status','0'));
$array = $zbp->GetArticleList(array('*'),$where,$order,array(20),'');$arr = array_rand($array,$i);for($j=0;$j<$i;$j++){$arand[]=$array[$arr[$j]];}
foreach ($arand as $related) {
$str .= "<li><a href=\"{$related->Url}\" title=\"{$related->Title}\" target=\"_blank\">{$related->Title}</a></li>";
}
return $str;
}
代码中,使用的PHP中的array_rand()函数,用随机获取数组的键名,并不是数据。至于代码怎么样就看后期使用的效果了,目前来说还是可以的,有问题我会及时反馈的。。。撒由那拉!