之前在使用本站使用的模板时发现,搜索似乎有些问题。当搜索不存在的文章或分类时报错 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>';
}
}
}
再次搜索不存在的文章或分类时成功跳转至相应页面
Comments NOTHING