Typecho 随机文章数

发布于 2019-08-15  263 次阅读


之前在使用本站使用的模板时发现,搜索似乎有些问题。当搜索不存在的文章或分类时报错 500 Database Query Error

在经过一段时间的摸索♂和练习♂之后发现问题位于 functions.php 中的 getRandomPosts 函数,似乎只针对了 Mysql 的适配

原代码

function getRandomPosts($limit = 10){
    $db = Typecho_Db::get();
    $result = $db->fetchAll($db->select()->from('table.contents')
        ->where('status = ?','publish')
        ->where('type = ?', 'post')
        ->where('created <= unix_timestamp(now())', 'post')
        ->limit($limit)
        ->order('RAND()')
    );
    if($result){
        foreach($result as $val){
            $val = Typecho_Widget::widget('Widget_Abstract_Contents')->push($val);
            $post_title = htmlspecialchars($val['title']);
            $permalink = $val['permalink'];
            echo '<li><a href="'.$permalink.'" title="'.$post_title.'" target="_blank">'.$post_title.'</a></li>';
        }
    }
}

可以看到其中的->order('RAND()')是在 Mysql 中的用法,而在 SQlite 中则是 RANDOM()
所以需要加一个判段,判断所使用的数据库是哪一个而切换用法
改为:

function getRandomPosts($limit = 10){
    $db = Typecho_Db::get();
    $adapterName = $db->getAdapterName();//兼容非 MySQL 数据库
    if($adapterName == 'pgsql' || $adapterName == 'Pdo_Pgsql' || $adapterName == 'Pdo_SQLite' || $adapterName == 'SQLite'){
        $order_by = 'RANDOM()';
    }else{
        $order_by = 'RAND()';
    }
    $sql = $db->select()->from('table.contents')
        ->where('status = ?','publish')
        ->where('table.contents.created <= ?', time())
        ->where('type = ?', 'post')
        ->limit($limit)
        ->order($order_by);
    $result = $db->fetchAll($sql);
    if($result){
        foreach($result as $val){
            $val = Typecho_Widget::widget('Widget_Abstract_Contents')->push($val);
            $post_title = htmlspecialchars($val['title']);
            $permalink = $val['permalink'];
            echo '<li><a href="'.$permalink.'" title="'.$post_title.'" target="_blank">'.$post_title.'</a></li>';
        }
    }
}

再次搜索不存在的文章或分类时成功跳转至相应页面