如何编写Discuz论坛返回JSON数据的接口

首先,查看一下discuz开发说明文档,找到《Discuz! X3 数据字典》

(地址:http://faq.comsenz.com/library/database/x3/x3_index.htm

我们需要操作的表分别是 版块表(pre_forum_forum )和主题表(pre_forum_thread ),若前台需要读取主题分类则还需要操作 主题分类表(pre_forum_threadclass)。

附加表字段信息:

如何编写Discuz论坛返回JSON数据的接口 Discuz API  第1张

如何编写Discuz论坛返回JSON数据的接口 Discuz API  第2张

如何编写Discuz论坛返回JSON数据的接口 Discuz API  第3张

下一步我们开始写json接口。这里需要注明一点,接口文件必须放在discuz程序的根目录(有些方法不能调用,容易出现错误)。

我们创建一个 json.php 的文件,内容如下:


<?php header('Content-type:text/json;charset=utf-8');
define('APPTYPEID', 5);
define('CURSCRIPT', 'userapp');
require_once './source/class/class_core.php';
$discuz = &discuz_core::instance();
$discuz -> cachelist = $cachelist;
$discuz -> init();

try {
	if ($_GET["type"] == "wdnew") {
		$query = DB::query("SELECT * FROM " . DB::table('forum_thread') . " WHERE fid=49 ORDER BY dateline ASC limit 10");
		$jsonstr = "{state:10000,data:[";
		while ($soft = DB::fetch($query)) {
			$newlist .= "{\"id\":" . $soft['tid'] . ",\"title\":\"" . $soft['subject'] . "\"},";
		}
		$jsonstr = $jsonstr . rtrim($newlist, ',') . "]}";
		echo $jsonstr;
	} else if ($_GET["type"] == "getForumClass") {
		$query = DB::query("SELECT * FROM " . DB::table('forum_forum') . " WHERE status=1 ORDER BY fid ASC");
		$jsonstr = "{state:10000,data:[";
		while ($soft = DB::fetch($query)) {
			$newlist .= "{\"id\":" . $soft['fid'] . ",\"fup\":" . $soft['fup'] . ",\"name\":\"" . $soft['name'] . "\",\"px\":" . $soft['displayorder'] . "},";
		}
		$jsonstr = $jsonstr . rtrim($newlist, ',') . "]}";
		echo $jsonstr;
	} else if ($_GET["type"] == "getForumInfo") {
		$fid = $_GET["fid"];
		$dateline_min = $_GET["dateline_min"];
		$dateline_max = $_GET["dateline_max"];
		$datacount = DB::result_first("SELECT COUNT(*) FROM " . DB::table('forum_thread') . " WHERE fid=".$fid." and closed=0 and dateline>=".$dateline_min." and dateline<=".$dateline_max);		
		if($datacount==0){
			$jsonstr = "{state:10001,data:[]}";			
		}else{
			$query = DB::query("SELECT * FROM " . DB::table('forum_thread') . " WHERE fid=".$fid." and closed=0 and dateline>=".$dateline_min." and dateline<=".$dateline_max);
			$jsonstr = "{state:10000,data:[";
			while ($soft = DB::fetch($query)) {
				$typename = DB::result_first("SELECT name FROM " . DB::table('forum_threadclass') . " WHERE typeid=".$soft['typeid'] );
				$newlist .= "{\"id\":" . $soft['tid'] . ",\"title\":\"[".$typename."]" . $soft['subject'] . "\",\"price\":\"" . $soft['price'] . "\",\"views\":\"" . $soft['views'] . "\",\"dateline\":\"" . $soft['dateline'] . "\"},";
			}
			$jsonstr = $jsonstr . rtrim($newlist, ',') . "]}";
		}
		echo $jsonstr;	
	}else {
		echo "{state:0,data:[]}";
	}
} catch(Exception $e) {
	echo "{state:0,data:[]}";
}
?>


这三个接口分别是 获取 某一个板块下最新发布的前10条记录、获取所有显示的板块分类、获取某一时间段内的某一板块下的主题帖子。


附加discuz的数据库操作封装方法:


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(别名, 方法)排序

注意事项:所有数据在插入数据库之前,均需要进行addslashes()处理,以免特殊 字符未经转义在插入数据库的时候出现错误。Discuz!中所有通过 GET, POST, FILE,取得的变量默认情况下已经使用了addslashes()进行了转义,不必重复进行。如果数据处理必要(例如用于直接显示),可以使用 stripslashes() 恢复,但数据在插入数据库之前必须再次进行转义。缓存文件中,一般对缓存数据的值采用 addcslashes($string, '\'\\')进行转义。

本文标题:如何编写Discuz论坛返回JSON数据的接口
本文链接:https://masoft.cn/post/9.html
作者授权:除特别说明外,本文由 智汇软件 原创编译并授权 智汇科技 刊载发布。
版权声明:本文使用「署名-禁止演绎 4.0 国际」创作共享协议,转载或使用请遵守署名协议。

本文 暂无 评论

Top

分享:

支付宝

微信