- N +

zblogphp随机显示文章的教程

最近几次上架新主题的时候都被驳回了,原因是zblog博客已经全面禁止利有“rand()”函数进行提取,不让使用“rand()”原因就是:“rand()”不支持mysql以外的数据库,在数据库数据比较多的情况下速度会变得很慢。

php.jpg

引用官网解释

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()函数,用随机获取数组的键名,并不是数据。至于代码怎么样就看后期使用的效果了,目前来说还是可以的,有问题我会及时反馈的。。。撒由那拉!

有好的文章希望李洋个人博客帮助分享推广,猛戳这里我要投稿

作者:非李莫属

舞台上有你,就演好角色; 舞台上没你,就静静地做观众;

返回列表
上一篇:
下一篇:
评论列表 (已有3条评论,共1132人参与)
网友昵称:沐沐
沐沐游客3周前 (10-31)回复
博客很漂亮,加收藏夹了,以后常来
敢问大神,如何创建一个随机文章模板页面,可以访问一个形如abc.com/random的自定义链接来随机显示一篇文章,用WP的时候好多主题都有这个功能,ZB上没见到有
网友昵称:非李莫属
非李莫属管理员3周前 (11-01)回复
@沐沐 我也正在研究,看过wp的,有结果之后会发布出来的。