鹽城網站建設 -> 信息中心 -> 網絡編程 -> PHP

discuz二次開發,分析和實現 之 向dz數據庫插入自己的帖子吧

日期:2019-01-30 09:09:36 閱讀:176次 【 字體:

最近開發社區 需要采集一些數據,使得模板輸出有圖文效果。就寫了個簡單的采集腳本,爬取目標站的內容,(用php 下載圖片 處理起來比較麻煩)。

有了數據 就要插入到dz的數據庫 ,隨便命名一個 test.php 放在discuz 的web根目錄下。

操作一下 花了點功夫,中間有不少頭疼的時候。特記錄。

兩個注意點,

一 ,Discuz的帖子 存儲在帖子表 pre_forum_post ,message 字段,這里的圖片 和換行 之類都是 bbcode, 插入之前需要先轉換

二,Discuz 本身處理發帖的代碼 位于\source\class\model\model_forum_thread.php,要使用里面的 方法 先要在test.php 引入discuz的核心類

require_once './source/class/class_core.php';

C::app()->init(); // 一定要初始化一下,否則 model_forum_thread.php 里的方法 無法使用

Discuz 作為一個老牌社區 有近300個表,實現帖子數據插入比較復雜。

剛開始,百度了一下,找到一篇文章記錄,感覺比較靠譜。

引用一下:

discuz發表主題涉及的幾個表:(這里列出了主要的幾個相關的表)

1、主題表 pre_forum_thread:這個表一個主要數據就是 tid 主題ID

2、post 分表協調表 pre_forum_post_tableid:這里需要獲取一個自增的 pid

3、帖子表 pre_forum_post :記錄主題pid、fid、tid、title、content等主要信息

4、版塊表 pre_forum_forum:這里主要更新版塊的主題、帖子數量

5、帖子主題審核數據表 pre_forum_thread_moderate:這個可以根據自己狀況決定,并不是必須的

6、用戶統計表 pre_common_member_count:主要是更新用戶的主題數量

感謝不知名的作者菌,剛搞的時候可以參考,畢竟300 個表里找幾個具體的 也費功夫呢。

另有 http://discuzt.cr180.com/discuzcode-db.html cr180 discuz 二開大牛 提供的 數據庫字典 對數據表 有詳細索引。

直接上代碼段 ,這個在我的本地環境是可以成功插入帖子數據的。

require_once './source/class/class_core.php';
C::app()->init();
$param=array(
'fid'=>2, //分類id
'uid'=>1, // 發布者的 id
'subject' =>'文章標題333',
'author' => '大哥哥',
'message'=>'內容位置,實現插入',
'publishdate' =>TIMESTAMP,
'views' =>168,
'tstatus' =>32,
'tags'=>array('good','cool'),
'useip' => getglobal('clientip'),
'port' => getglobal('remoteport')
);
//print_r($newImgSrc);
function dzThread($param){
$newthread = array(
'fid' => $param['fid'],// 文章分類板塊
'author' => $param['author'],
'authorid' =>$param['uid'],
'subject' => $param['subject'],
'dateline' => $param['publishdate'],
'lastpost' => $param['publishdate'],
'lastposter' => $param['author'],
'attachment' => 0,
'views' =>$param['views'],
'status' => $param['tstatus'],
'closed' => $param['closed'] ? 1 : 0
);
$tid = C::t('forum_thread')->insert($newthread, true);
C::t('forum_newthread')->insert(array(
'tid' => $tid,
'fid' => $param['fid'],
'dateline' => $param['publishdate'],
));
//處理 tags
$param['tagstr'] = addTag($param['tags'], $tid, 'tid');
$pid = insertpost(array(
'fid' => $param['fid'],
'tid' => $tid,
'first' => '1',
'author' => $param['author'],
'authorid' => $param['uid'],
'subject' => $param['subject'],
'dateline' => $param['publishdate'],
'message' => $param['message'],
'useip' => $param['clientip'],
'port' => $param['remoteport'],
'usesig' => 1,
'attachment' => '0',
'tags' => $param['tagstr'],
'replycredit' => 0,
'status' => 0
));
}
function insertpost($data) {
if(isset($data['tid'])) {
$thread = C::t('forum_thread')->fetch($data['tid']);
$tableid = $thread['posttableid'];
} else {
$tableid = $data['tid'] = 0;
}
echo $data['tid'];
$pid = C::t('forum_post_tableid')->insert(array('pid' => null), true);
echo '116';
$data = array_merge($data, array('pid' => $pid));
C::t('forum_post')->insert($tableid, $data);
if($pid % 1024 == 0) {
C::t('forum_post_tableid')->delete_by_lesspid($pid);
}
savecache('max_post_id', $pid);
return $pid;
}
// discuz 的tag 處理比較麻煩 
function addTag($tagarray, $itemid, $idtype = 'tid'){
$tagcount = 0;
$return='';
foreach($tagarray as $tagname) {
$tagname = trim($tagname);
if(preg_match('/^([\x7f-\xff_-]|\w|\s){3,20}$/', $tagname)) {
$status = $idtype != 'uid' ? 0 : 3;
$result = C::t('common_tag')->get_bytagname($tagname, $idtype);
if($result['tagid']) {
if($result['status'] == $status) {
$tagid = $result['tagid'];
}
} else {
$tagid = C::t('common_tag')->insert($tagname,$status);
}
if($tagid) {
if($itemid) {
C::t('common_tagitem')->replace($tagid,$itemid,$idtype);
}
$tagcount++;
$return .= $tagid.','.$tagname."\t";
}
if($tagcount > 4) {
unset($tagarray);
break;
}
}
}
return $return;
}

呵呵噠,結合采集代碼 給$param數組 傳數據 就可以了。



上一篇:解析php利用正則表達式解決采集內..
下一篇:php通過curl模擬登陸DZ論壇
最新文章
會員 客服 QQ 電話 充值 工單
Top

24小時客服熱線

0515-87213010

18036323215

海南飞鱼游戏技巧