zoukankan      html  css  js  c++  java
  • discuz二次开发,分析和实现 之 向dz数据库插入自己的帖子吧

    发个博客太麻烦了,难怪写博客的越来越少,吐一下,cnblogs的编辑器模板太丑!

    最近开发社区 需要采集一些数据,使得模板输出有图文效果。就写了个简单的采集脚本,爬取目标站的内容,(用php 下载图片 处理起来比较麻烦)。
    有了数据 就要插入到dz的数据库 ,随便命名一个 test.php 放在discuz 的web根目录下。
    操作一下 花了点功夫,中间有不少头疼的时候。特记录。
    两个注意点,
    一 ,Discuz的帖子 存储在帖子表 pre_forum_post ,message 字段,这里的图片 和换行 之类都是 bbcode, 插入之前需要先转换
    二,Discuz 本身处理发帖的代码 位于sourceclassmodelmodel_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." ";


                }
                if($tagcount > 4) {
                    unset($tagarray);
                    break;
                }
            }
        }
        return $return;
    }
    呵呵哒,结合采集代码 给$param数组 传数据 就可以了。

  • 相关阅读:
    has already been called for this response
    Mysql Innodb的两种表空间方式
    针对MyISAM表锁的解决方案
    MySQL数据库表修复--MyISAM
    如何修复损坏的MySQL数据表[转]
    MySQL大量unauthenticated user
    Linux基本命令篇 进程管理
    Linux 知识点滴
    Linux基本命令篇 用户管理
    Linux基本命令篇 文件管理
  • 原文地址:https://www.cnblogs.com/hoomob/p/4509071.html
Copyright © 2011-2022 走看看