`
kililanxilu
  • 浏览: 27044 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

jforum同步帖子主题至discuzx2.5

阅读更多

本篇讲的是jforum将帖子和主题同步至discuz中,其他开源论坛也可使用。

<?php
// 	sync_threads();
	sync_posts();
// 	update_forum_id();
// 	insert_common_stat();
// 	update_member_count();
// 	update_post_detail();
//	update_thread_detail();
	
	
	/**
	 * update last post time and author name on every thread
	 */
	function update_thread_detail(){
		global $_local_conn, $_new_db_name, $_old_db_name;
		
		$tidresult = mysql_query("SELECT tid, authorid FROM $_new_db_name.pre_forum_thread", $_local_conn);
		while ($thread = mysql_fetch_object($tidresult)) {
			/*
			 * Get recent post from posts under same forum
			*/
			$result = mysql_query("SELECT dateline, author FROM $_new_db_name.pre_forum_post WHERE tid = $thread->tid ORDER BY dateline desc LIMIT 1", $_local_conn);
			$lastpost = mysql_fetch_array($result);
			$username = getusername($thread->authorid);
			mysql_query("UPDATE $_new_db_name.pre_forum_thread SET lastpost = $lastpost[dateline], author = '$username', lastposter = '$lastpost[author]' WHERE tid = $thread->tid"
					, $_local_conn);
		}
	}
	
	function update_post_detail(){
		global $_local_conn, $_new_db_name, $_old_db_name;
		
		$authorresult = mysql_query("SELECT pid, authorid FROM $_new_db_name.pre_forum_post", $_local_conn);
		while($author = mysql_fetch_object($authorresult)){
			$username = getusername($author->authorid);
			mysql_query("UPDATE $_new_db_name.pre_forum_post SET author = '$username' WHERE pid = $author->pid"
			, $_local_conn);
		}
	}
	
	
	function update_member_count(){
		global $_local_conn, $_new_db_name, $_old_db_name;
		
		$resultofthreadbyuser = mysql_query("SELECT count(1) AS threadsnum, authorid, (SELECT COUNT(1) FROM $_new_db_name.`pre_forum_post` post WHERE post.authorid = thread.authorid) AS postsnum"
				." FROM $_new_db_name.`pre_forum_thread` thread GROUP BY thread.authorid", $_local_conn);
		
		while($threadbyuser = mysql_fetch_object($resultofthreadbyuser)){
			$sql = "UPDATE $_new_db_name.`pre_common_member_count` SET posts = $threadbyuser->postsnum, threads = $threadbyuser->threadsnum WHERE uid = $threadbyuser->authorid";
			mysql_query($sql, $_local_conn);
		}
	}
	
	/**
	 * insert pre_common_stat and update thread num
	 */
	function insert_common_stat(){
		global $_local_conn, $_new_db_name, $_old_db_name;
		
		$from_date = "20120731";
		while($from_date < date("Ymd")){
			$date = date_create($from_date);
			date_add($date, date_interval_create_from_date_string("1 days"));
			$from_date = date_format($date, "Ymd");
			
// 			echo strtotime($from_date)."/".(strtotime($from_date)-86400);
			
			$resultofthreadsbydate = mysql_query("SELECT COUNT(1) AS threadnum FROM $_new_db_name.pre_forum_thread WHERE dateline > ".strtotime($from_date)." AND dateline < ".(strtotime($from_date)+86400), $_local_conn);
			$threadbydate = mysql_fetch_array($resultofthreadsbydate);
			
// 			echo "SELECT COUNT(1) AS threadnum FROM $_new_db_name.pre_forum_thread WHERE dateline > ".strtotime($from_date)." AND dateline < ".(strtotime($from_date)+86400);
			$sql = "INSERT INTO $_new_db_name.`pre_common_stat` (`daytime`, `login`, `mobilelogin`, `connectlogin`, `register`, `invite`, `appinvite`, `doing`, `blog`, `pic`, `poll`, `activity`, `share`, `thread`, `docomment`, `blogcomment`, `piccomment`, `sharecomment`, `reward`, `debate`, `trade`, `group`, `groupjoin`, `groupthread`, `grouppost`, `post`, `wall`, `poke`, `click`, `sendpm`, `friend`, `addfriend`) "
					."VALUES ($from_date, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, $threadbydate[threadnum], 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)";
			mysql_query($sql, $_local_conn);
		}
	}
	
	
	function sync_posts(){
		insert_posts();
	}
	
	function insert_posts(){
		global $_local_conn, $_new_db_name, $_old_db_name;
		$_query_old_posts_sql = "SELECT * FROM $_old_db_name.jforum_posts posts, $_old_db_name.jforum_posts_text text WHERE posts.post_id = text.post_id";
		$_old_posts = mysql_query($_query_old_posts_sql, $_local_conn);

		while(($old_post = mysql_fetch_object($_old_posts))){
			
			$_dateline = strtotime($old_post->post_time);
			
			$sql = "INSERT INTO $_new_db_name.`pre_forum_post` (`pid` ,`fid` ,`tid` ,`first` ,`author` ,`authorid` ".
			",`subject` ,`dateline` ,`message` ,`useip` ,`invisible` ,`anonymous` ,`usesig` ,`htmlon` ,`bbcodeoff`".
			" ,`smileyoff` ,`parseurloff` ,`attachment` ,`rate` ,`ratetimes` ,`status` ,`tags` ,`comment` ,`replycredit` ,`position`)"
					."VALUES ('$old_post->post_id', '$old_post->forum_id', '$old_post->topic_id', '1', '', '$old_post->user_id', '$old_post->post_subject',"
					."$_dateline, '$old_post->post_text', '$old_post->post_ip', '0', '0', '1', '1', '-1', '-1', '0', '0', '0', '0', '0', '', '0', '0', NULL)";
			
			mysql_query($sql, $_local_conn);
			
			/*
			 * insert into pre_forum_post_tableid, when insert post
			 */
			mysql_query("INSERT INTO $_new_db_name.`pre_forum_post_tableid` VALUES ($old_post->post_id)", $_local_conn);
		}
	}
	
	function sync_threads(){
		insert_threads();
	}
	
	function update_forum_id(){
		global $_local_conn, $_new_db_name, $_old_db_name;
		/*
		 * update forums
		*/
		$forums = getForums();
		$jforums = getJforums();
		
		
		while($forum = mysql_fetch_object($forums)){
			while($jforum = mysql_fetch_object($jforums)){
				
				if($forum->name == $jforum->forum_name){
					/*
					 * update forum id in table thread
					 */
					mysql_query("UPDATE $_new_db_name.pre_forum_thread SET fid = $forum->fid WHERE fid = $jforum->forum_id", $_local_conn);
					//echo "更新主题表中的板块id信息";
					/*
					 * update forum id in table post
					 */
					mysql_query("UPDATE $_new_db_name.pre_forum_post SET fid = $forum->fid WHERE fid = $jforum->forum_id", $_local_conn);
					
					/*
					 * update pre_forum_forum, forum detail
					 */
					$thread_num_result = mysql_query("SELECT count(1) AS thread_num FROM $_new_db_name.pre_forum_thread WHERE fid = $forum->fid", $_local_conn);
					$thread_num = mysql_fetch_array($thread_num_result);
					$post_num_result = mysql_query("SELECT count(1) AS post_num FROM $_new_db_name.pre_forum_post WHERE fid = $forum->fid", $_local_conn);
					$post_num = mysql_fetch_array($post_num_result);
					$post_message_result = mysql_query("SELECT message FROM $_new_db_name.pre_forum_post WHERE fid = $forum->fid ORDER BY dateline DESC LIMIT 1", $_local_conn);
					$post_message = mysql_fetch_array($post_message_result);
					$sub_message = substr($post_message[message], 0, 29);
					
					mysql_query("UPDATE $_new_db_name.pre_forum_forum SET threads = $thread_num[thread_num], posts = $post_num[post_num], lastpost = '$sub_message'"
							." WHERE fid = $forum->fid"
							, $_local_conn);
				}
			}
			mysql_data_seek($jforums, 0); //put jforum db result index back to 0
		}
	}
	
	/**
	 * insert threads only sql
	 */
	function insert_threads(){
		global $_local_conn, $_new_db_name, $_old_db_name;
		//create a query
		$sql = "SELECT * FROM discuz.pre_common_member limit 0, 10";
		
		$queryJforumTopics = "SELECT * FROM jforum1.jforum_topics ";
		
		$result = mysql_query($queryJforumTopics, $_local_conn);
		
		////insert new threads
		while (($row = mysql_fetch_object($result))){
			//print "$row->topic_id<br />";
			$_dateline = strtotime($row->topic_time);
			
			$sql = "INSERT INTO discuz.pre_forum_thread (`tid` ,`fid` ,`posttableid` ,`typeid` ,`sortid` ,`readperm` ,`price` ,`author` ,`authorid` ,`subject` ,".
			"`dateline` ,`lastpost` ,`lastposter` ,`views` ,`replies` ,`displayorder` ,`highlight` ,`digest` ,`rate` ,`special` ,`attachment` ,`moderated` ,`closed` ,".
			"`stickreply` ,`recommends` ,`recommend_add` ,`recommend_sub` ,`heats` ,`status` ,`isgroup` ,`favtimes` ,`sharetimes` ,`stamp` ,`icon` ,`pushedaid` ,`cover` ,".
			"`replycredit` ,`relatebytag` ,`maxposition`)".
			" VALUES ('$row->topic_id' , '$row->forum_id', '0', '0', '0', '0', '0', '', '$row->user_id', '$row->topic_title', $_dateline, UNIX_TIMESTAMP(), '',  '1', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '32', '0', '0', '0', '-1', '-1', '0', '0', '0', '0', '0')" ;
		
			mysql_query($sql, $_local_conn);
		}
	}
	
	function getusername($userid){
		global $_local_conn, $_new_db_name, $_old_db_name;
		$finduseridsql = "SELECT username FROM $_new_db_name.pre_common_member WHERE uid = $userid";
		$userresult = mysql_query($finduseridsql, $_local_conn);
		$user = mysql_fetch_array($userresult);
		return $user[username];
	}
	
	/**
	 * get new forum detail
	 * @return resource
	 */
	function getForums(){
		global $_local_conn, $_new_db_name, $_old_db_name;
		$sql = "SELECT * FROM $_new_db_name.pre_forum_forum WHERE type = 'forum' and status = '1'";
		
		$forums = mysql_query($sql, $_local_conn);
		return $forums;
	}
	
	/**
	 * get old forum detail. <in jforum>
	 * @return resource
	 */
	function getJforums(){
		global $_local_conn, $_new_db_name, $_old_db_name;
		$sql = "SELECT * FROM $_old_db_name.jforum_forums ";
		
		$jforums = mysql_query($sql, $_local_conn);
		return $jforums;
	}

?>
 

    按照上面的function执行顺序执行即可。涉及到需要改动的table有pre_forum_thread,pre_forum_post,pre_forum_forum,pre_common_stat,pre_common_member_count,pre_forum_post_tableid

详见:http://www.gforetell.com/?/question/188#reply1

 

同步后出现一个问题。在论坛里发主题的时候会报主键重复错误,查看后得知。2.5版本的pre_forum_post里面pid不是自动增长的,在做插入操作的时候会从pre_forum_post_tableid里面取得最大的+1,改了下最大的就解决了。

 

之后又出现了一个问题。jforum里面的帖子内容是包含html标签的,但是直接同步到discuz后会直接在页面上出现标签。需要在管理端的“论坛”-“板块管理”-“帖子选项”中将相应版块的“允许使用HTML代码”开启。

分享到:
评论

相关推荐

    Jforum二次开发成果

    本文将详细探讨Jforum的二次开发过程,以及如何利用Eclipse进行开发,并介绍增加的如子论坛、主页、热门帖子、推荐帖子等功能。 一、Jforum二次开发基础 1.1 Jforum框架理解:Jforum采用MVC(Model-View-...

    JForum论坛数据库表结构.rar

    16、帖子内容表JFORUM_POSTS_TEXT 6 17、消息表JFORUM_PRIVMSGS 6 18、消息内容表JFORUM_PRIVMSGS_TEXT 6 19、配置限定表JFORUM_QUOTA_LIMIT 7 20、会员等级表JFORUM_RANKS 7 21、角色表JFORUM_ROLES 7 22、...

    jforum说明文档 源码解析 单点登录 jforum缓存

    Jforum的数据库设计是其核心部分,包含了用户信息、论坛板块、主题、帖子等数据表。配置文件如`database.properties`用于设定数据库连接参数,如URL、用户名、密码等。此外,`config.properties`包含了论坛的基本...

    jforum3.0所需要的jar包

    3. **数据库连接jar**:jForum需要与数据库进行交互,存储用户信息、帖子内容等数据。因此,需要数据库驱动的jar包,如mysql-connector.jar(如果使用MySQL)或者ojdbc.jar(如果使用Oracle)。这些jar包提供了与...

    Jforum相关文档和PPT

    理解并正确配置这些参数对于Jforum的正常运行至关重要。 初始化流程是Jforum启动时执行的一系列操作,如加载配置、初始化核心组件、注册监听器等。这个过程保证了论坛在启动后能正确地提供服务。开发者可以通过跟踪...

    jforum3.0项目需要的jar包

    6. **数据库设置**:JForum需要一个数据库来存储论坛的数据,如用户信息、帖子、主题等。常见的选择有MySQL、PostgreSQL或Oracle。需要创建一个新的数据库,并将提供的SQL脚本导入以初始化表结构。 7. **数据源连接...

    jforum3源代码 数据库

    JForum3是一款基于Java的开源论坛系统,它提供了丰富的社区功能,包括用户管理、论坛板块、主题讨论、帖子回复等。本篇将深入探讨JForum3的源代码和其与数据库的交互,以及如何进行配置。 **一、JForum3源代码结构*...

    Jforum论坛数据库架构

    为了提高Jforum论坛的性能,数据库层面的优化至关重要: - **索引优化**:对频繁查询的字段创建索引,如用户ID、论坛ID、主题ID和帖子ID,以加速查询速度。 - **缓存机制**:利用缓存技术(如Redis或Memcached)...

    Java论坛系统 JForum

    JForum以其高效、稳定和可扩展性著称,采用MVC(Model-View-Controller)架构模式,支持多语言,提供丰富的功能,如用户管理、主题分类、帖子发布、搜索、私信、用户积分和权限管理等。 **1. Java开发语言** Java是...

    JForum3 完整项目

    5. **论坛板块与主题**:拥有灵活的板块分类和主题管理,支持子版块,便于组织和查找信息。 6. **发帖与回复**:支持富文本编辑器,用户可以插入图片、链接等,同时具备帖子编辑、删除、锁定、置顶等操作。 7. **...

    jforum3源代码

    JForum3的数据库设计包含了用户表、论坛表、板块表、帖子表等核心实体,通过精心设计的数据库模式实现高效的数据存储和检索。开发者可以借此了解如何设计适应大规模用户社区的数据库架构。 7. **缓存机制** 为了...

    jforum漏洞利用源代码

    本文将围绕"jforum漏洞利用源代码"这一主题,深入探讨相关知识点。 1. **JForum漏洞类型** JForum中的漏洞主要分为两类:一类是逻辑漏洞,如权限绕过、SQL注入等;另一类是安全配置错误,如弱密码策略、未加密敏感...

    JForum3 jforum java 开源论坛 论坛

    JForum3是一款基于Java开发的开源论坛系统,其核心设计目标是提供一个高效、稳定且功能丰富的在线讨论平台。这款论坛软件使用了Java语言编写,遵循开放源代码的原则,允许用户自由地使用、修改和分发。JForum3是...

    Jforum2.19

    这个版本的Jforum提供了丰富的功能,包括用户管理、论坛分类、主题发布、回复讨论、搜索功能以及各种自定义设置,满足了创建在线互动社区的基本需求。 **在MyEclipse中使用Jforum 2.19** 的过程涉及到多个步骤,...

    jforum+ckeditor整合案例

    JForum是一款流行的Java论坛软件,它提供了一个用户友好的界面,支持多语言,且具有高度可扩展性。CKEditor则是一个先进的在线文本编辑器,广泛用于网站内容管理系统,提供丰富的富文本编辑功能。在JForum中整合...

    jforum 源码

    源码中包含了这些功能的具体实现,如帖子的CRUD操作、版块的分类和权限控制等。 10. **扩展性与模块化** JForum设计时考虑了可扩展性,通过插件系统实现了模块化。开发者可以通过源码学习如何设计和编写插件,以...

    jforum2.1.8

    《JForum 2.1.8:开源Java论坛系统详解》 JForum是基于Java的开源论坛系统,其2.1.8版本以其强大的功能、灵活性和社区支持而备受青睐。这个版本包含了完整的源代码,使得开发者能够深入理解其工作原理,并可以根据...

    利用JForum创建论坛

    【JForum论坛创建详解】 JForum是一款知名的开源论坛软件,具备多语言支持,包括简体中文,虽然管理界面并未完全汉化。它以其强大的功能、优雅的界面以及清晰的代码结构,成为二次开发的理想选择。JForum基于BSD...

    JForum_SSO_-_JForum单点登陆原理与配置

    【JForum SSO原理与配置】 JForum是一款开源的论坛软件,具备强大的功能。在与其他Web应用集成时,为了提供无缝的用户体验,通常需要实现单点登录(SSO,Single Sign On)。SSO允许用户在一个系统登录后,无需再次...

Global site tag (gtag.js) - Google Analytics