zoukankan      html  css  js  c++  java
  • 模拟discuz发帖的类实现

    一直想弄个discuz的数据采集程序,这2天研究了下discuz发帖涉及的几个数据库表,这里分享一下自己的处理方法。

    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:主要是更新用户的主题数量

    自己处理发帖主要涉及到了上面6个数据库表,其中第5个不是必须的。想了解discuz 数据库相关信息可以查看:http://faq.comsenz.com/library/database/x25/x25_index.htm

    大致流程是这样的:

    第一步:向 主题表 pre_forum_thread 中插入版块ID、用户ID、用户名、帖子标题、发帖时间等信息。

    第二步:获取第一步插入表 pre_forum_thread 的数据ID,作为主题ID,即 tid

    第三步:向 post 分表协调表 pre_forum_post_tableid 插入一条数据,这张表中只有一个自增字段 pid

    第四步:获取 第三步 插入表 pre_forum_post_tableid 的数据ID,作为 pid

    第五部:向帖子表 pre_forum_post 中插入帖子相关信息,这里需要注意的是: pid为第四部的pid值,tid为第二步的tid值

    第六部:更新版块 pre_forum_forum 相关主题、帖子数量信息

    第七步:更新用户 pre_common_member_count 帖子数量信息

    discuz发帖过程主要就是以上7个步骤,通过这几个步骤就可以完成对实现discuz的发帖流程,其中设计到一些积分等其他信息的可以自己加上。

    <?php
    date_default_timezone_set('PRC');
    include 'db.class.php';
    
    class post
    {
    	private $host = 'localhost';
    	private $username = 'root';
    	private $password = '123456';
    	private $database_name = 'ultrax';
    	private $_db = null;
    
    	private $fid = null;
    	private $title = null;
    	private $content = null;
    	private $author = null;
    	private $author_id = null;
    	private $current_time = null;
    	private $displayorder = null; //0:正常,-2:待审核
    
    	public function __construct($fid, $title, $content, $author, $author_id, $displayorder = -2)
    	{
    		$this->_db = db::get_instance($this->host, $this->username, $this->password, $this->database_name);
    
    		$this->fid          = $fid;
    		$this->title        = $title;
    		$this->content      = $content;
    		$this->author       = $author;
    		$this->author_id    = $author_id;
    		$this->current_time = time();
    		$this->displayorder = $displayorder;
    	}
    
    	public function post_posts()
    	{
    		$tid = $this->do_pre_forum_thread();
    
    		if(!$tid)
    		{
    			return '更新表 pre_forum_thread 失败<br />';
    		}
    
    		$pid = $this->do_pre_forum_post_tableid();
    
    		if(!$this->do_pre_forum_post($pid, $tid))
    		{
    			return '更新表 pre_forum_post 失败<br />';
    		}
    
    		if(!$this->do_pre_forum_forum())
    		{
    			return '更新表 pre_forum_forum 失败<br />';
    		}
    
    		if($this->displayorder == -2)
    		{
    			if(!($this->do_pre_forum_thread_moderate($tid)))
    			{
    				return '更新表 pre_forum_thread_moderate 失败<br />';
    			}
    		}
    
    		return ($this->do_pre_common_member_count()) ? '发帖成功<br />' : '更新表 pre_pre_common_member_count 失败<br />';
    	}
    
    	private function do_pre_forum_thread()
    	{
    		$data                 = array();
    		$data['fid']          = $this->fid;
    		$data['author']       = $this->author;
    		$data['authorid']     = $this->author_id;
    		$data['subject']      = $this->title;
    		$data['dateline']     = $this->current_time;
    		$data['lastpost']     = $this->current_time;
    		$data['lastposter']   = $this->author;
    		$data['displayorder'] = $this->displayorder;
    
    		$result = $this->_db->insert($data, 'pre_forum_thread');
    
    		if($result == 1)
    		{
    			$tid = $this->get_last_id();
    		}
    
    		return $tid;
    	}
    
    	private function do_pre_forum_post_tableid()
    	{
    		$sql    = "INSERT INTO `pre_forum_post_tableid`(`pid`) VALUES(NULL)";
    		$result = $this->_db->query($sql);
    		if($result == 1)
    		{
    			$pid = $this->get_last_id();
    		}
    
    		return $pid;
    	}
    
    	private function do_pre_forum_post($pid, $tid)
    	{
    		$data             = array();
    		$data['pid']      = $pid;
    		$data['fid']      = $this->fid;
    		$data['tid']      = $tid;
    		$data['first']    = 1;
    		$data['author']   = $this->author;
    		$data['authorid'] = $this->author_id;
    		$data['subject']  = $this->title;
    		$data['dateline'] = $this->current_time;
    		$data['message']  = $this->content;
    
    		$result = $this->_db->insert($data, 'pre_forum_post');
    
    		return ($result == 1) ? true : false;
    	}
    
    	private function do_pre_forum_forum()
    	{
    		$sql = "UPDATE `pre_forum_forum` SET `threads`=threads+1,`posts`=posts+1,`todayposts`=todayposts+1 WHERE `fid`={$this->fid}";
    
    		$result = $this->_db->query($sql);
    
    		return ($result == 1) ? true : false;
    	}
    
    	private function do_pre_forum_thread_moderate($tid)
    	{
    		$data             = array();
    		$data['tid']      = $tid;
    		$data['status']   = 0;
    		$data['dateline'] = $this->current_time;
    
    		$result = $this->_db->insert($data, 'pre_forum_thread_moderate');
    
    		return ($result == 1) ? true : false;
    	}
    
    	private function do_pre_common_member_count()
    	{
    		$sql = "UPDATE `pre_common_member_count` SET `threads`=threads+1 WHERE `uid`={$this->author_id}";
    
    		$result = $this->_db->query($sql);
    
    		return ($result == 1) ? true : false;
    	}
    
    	private function get_last_id()
    	{
    		$sql    = "SELECT LAST_INSERT_ID()";
    		$result = mysql_query($sql);
    
    		while($row = mysql_fetch_assoc($result))
    		{
    
    			$id = $row['LAST_INSERT_ID()'];
    		}
    
    		return $id;
    	}
    }
    

    转自:http://blog.csdn.net/laiqun_ai/article/details/49586917  

  • 相关阅读:
    vue-loader介绍和单页组件介绍
    webpack的插件 http-webpack-plugin。 webpack-dev-server
    webpack的介绍
    Axios 的基本使用
    如何使用 re模块的, spilt.
    为 JS 的字符串,添加一个 format 的功能。
    另一种分页器 不依赖Paginator模块的方法
    Socket初识
    网络协议
    双下方法补充以及异常处理
  • 原文地址:https://www.cnblogs.com/esion/p/6230328.html
Copyright © 2011-2022 走看看