Discuz作为流行的论坛程序,有着很多人都采用它来搭建论坛。而且有很多人对它进行二次开发,就是我们经常说的二开。因为功能强大,所以才有很多人对它进行二次开发,可以说通过二次开发,discuz可以改进成各种类型网站。它可以是论坛,也可以是内容类型网站,也可是购物网站,还可以是小说站,总之,通过二次开发,我们可以使用discuz来做各种类型的网站。

今天我们就简单介绍下,如何获取数据库中表的数据,我想这应该是最基本,也是最重要的一个知识点。

首先,discuz中的数据库是单例模式,我么可以通过它来查询我们的数据,最简单的方法是使用sql语句来查询。

$query = $db->query("SELECT t.*, f.name FROM {$tablepre}threads t, {$tablepre}forums f WHERE t.fid<>'$fid' AND f.fid=t.fid ORDER BY t.dateline DESC LIMIT 0, 8");

通过这个语句,我们就可以从板块forum表和帖子表threads中查询出帖子信息和板块信息,其中需要注意的是,我们使用{$tablepre}这个占位符来表示表前缀,这样的代码没有写死,即使表前缀修改了,依然可以查出数据。

while($nthread = $db->fetch_array($query))


通过山面的查询,我们就可以循环得到帖子的数据放到我们想要的数组中,还可以给数组添加一些新的元素。

当然,discuz还做了数据分层处理,在source/class/table文件夹里面是各个表的数据操作,我们如果有新添加的表处理,可以在这里添加文件,然后文件中定义类继承discuz_table就可以获取到数据表中的数据,discuz_table中的数据操作方法如下:

DB::table($tablename) 获取正确带前缀的表名,转换数据库句柄

DB::delete($tablename, 条件,条数限制) 删除表中的数据

DB::insert($tablename, 数据(数组),是否返回插入ID,是否是替换式,是否silent) 插入数据操作

DB::update($tablename, 数据(数组)条件) 更新操作

DB::fetch(查询后的资源) 从结果集中取关联数组,注意如果结果中的两个或以上的列具有相同字段名,最后一列将优先。

DB::fetch_first($sql) 取查询的第一条数据fetch

DB::fetch_all($sql) 查询并fetch

DB::result_first($sql) 查询结果集的第一个字段值

DB::query($sql) 普通查询

DB::num_rows(查询后的资源) 获得记录集总条数

DB::_execute(命令,参数) 执行mysql类的命令

DB::limit(n,n) 返回限制字串

DB::field(字段名, $pid) 返回条件,如果为数组则返回 in 条件

DB::order(别名, 方法) 排序

比如:

public function fetch_all_fid_by_uids($uids) {
    if(empty($uids)) {
        return array();
    }
    $data = array();
    $query = DB::query("SELECT fid FROM %t WHERE %i AND level>0 ORDER BY lastupdate DESC", array($this->_table, DB::field('uid', $uids)));
    while($row = DB::fetch($query)) {
        $data[] = $row['fid'];
    }
    return $data;
}

我们定义了一个方法,然后在控制层中,我们就可以直接调用fetch_all_fid_by_uids这个方法获取到数据。条用方法如下:

C::t('forum_groupuser')->fetch_all_fid_by_uids($_G['uid']);

我们通过C::t来获取到数据表实例化对象,然后调用类方法就可以获取到数据。