discuz论坛cdb_threads表displayorder字段含义

http://www.zhaokunyao.com/archives/704

discuz论坛的帖子有不同的状态,例如待审核的,回收站的帖子等,调用时候如何区分帖子不同的状态呢?

可以用cdb_threads.displayorder

1: 本版置顶

2: 本区置顶

3: 全局置顶

0: 正常

-1:回收站中的帖子

-2:待审核的帖子

-3:不清楚

Discuz联表查询优化

引用地址:http://tuibian.com/?p=707

discuz中viewthread.php是用来读取一个话题内相关帖子的程序,相关的sql语句大概为:

SELECT p.*, m.uid, m.username, m.groupid, m.regdate, m.lastactivity, m.posts, m.digestposts, m.oltime,
                m.pageviews, m.credits, m.extcredits1, m.extcredits2, m.extcredits3, m.extcredits4, m.extcredits5, m.extcredits6,
                m.extcredits7, m.extcredits8, m.email, m.gender, m.showemail, m.invisible, m.avatarshowid, m.xspacestatus, mf.nickname, mf.site,
                mf.icq, mf.qq, mf.yahoo, mf.msn, mf.taobao, mf.alipay, mf.location, mf.medals, mf.avatar, mf.avatarwidth,
                mf.avatarheight, mf.sightml AS signature, mf.customstatus
                FROM {$tablepre}posts p
                LEFT JOIN {$tablepre}members m ON m.uid=p.authorid
                LEFT JOIN {$tablepre}memberfields mf ON mf.uid=m.uid
                WHERE p.tid=’TID’ AND p.invisible=’0′ ORDER BY dateline LIMIT 60

这个语句中采用了两个left join查询,如果先查询posts表,然后再查询members和memberfields表是不是会速度更快呢:

程序1:采用完全的联表查询:

query("SELECT p.*, m.uid, m.username, m.groupid, m.regdate, m.lastactivity, m.posts, m.digestposts, m.oltime,
                m.pageviews, m.credits, m.extcredits1, m.extcredits2, m.extcredits3, m.extcredits4, m.extcredits5, m.extcredits6,
                m.extcredits7, m.extcredits8, m.email, m.gender, m.showemail, m.invisible, m.avatarshowid, m.xspacestatus, mf.nickname, mf.site,
                mf.icq, mf.qq, mf.yahoo, mf.msn, mf.taobao, mf.alipay, mf.location, mf.medals, mf.avatar, mf.avatarwidth,
                mf.avatarheight, mf.sightml AS signature, mf.customstatus
                FROM {$tablepre}posts p
                LEFT JOIN {$tablepre}members m ON m.uid=p.authorid
                LEFT JOIN {$tablepre}memberfields mf ON mf.uid=m.uid
                WHERE p.tid=’$i’ AND p.invisible=’0′ ORDER BY dateline LIMIT 60");
    
    while($post = $db->fetch_array($query)) {
        
        //do somthing;
    }
}
$mtime = explode(‘ ‘, microtime());        
$runtime = ($mtime[1] + $mtime[0] – $discuz_starttime);
?>

程序读tid从395000到398770的所有话题,运行8次,运行时间分别为:
19.4085040092 16.5643789768 13.6189751625 14.2483608723 14.4175901413 14.3845379353 17.1536540985 17.2402610779
可以看到运行两三次后mysql的query cache开始生效,速度逐渐稳定在14秒左右

程序2:先读取相关cdb_posts中的数据,再用联表查询用户的信息。

query("SELECT * FROM {$tablepre}posts WHERE tid=’$i’ AND invisible=’0′ ORDER BY dateline LIMIT 60");
    while ($post = $db->fetch_array($query))
    {
        if ($post['authorid'])
        {
            $uid .= ",".$post['authorid'];
        }
    }
    $query = $db->query("SELECT  m.uid, m.username, m.groupid, m.regdate, m.lastactivity, m.posts, m.digestposts, m.oltime,
                m.pageviews, m.credits, m.extcredits1, m.extcredits2, m.extcredits3, m.extcredits4, m.extcredits5, m.extcredits6,
                m.extcredits7, m.extcredits8, m.email, m.gender, m.showemail, m.invisible, m.avatarshowid, m.xspacestatus, mf.nickname, mf.site,
                mf.icq, mf.qq, mf.yahoo, mf.msn, mf.taobao, mf.alipay, mf.location, mf.medals, mf.avatar, mf.avatarwidth,
                mf.avatarheight, mf.sightml AS signature, mf.customstatus FROM {$tablepre}members m 
                LEFT JOIN {$tablepre}memberfields  mf ON mf.uid=m.uid
                WHERE m.uid IN ($uid)
                ");
}
$mtime = explode(‘ ‘, microtime());        
$runtime = ($mtime[1] + $mtime[0] – $discuz_starttime);
?>

运行时间依次为:
14.0723490715 14.4422261715 13.4820911884 13.289301157 13.0309917927 13.1161420345 12.8048489094 12.6428101063
运行时间大大缩短,基本在13秒左右

程序三:先读取相关cdb_posts中的数据,再分别查询cdb_members和cdb_memberfields中的信息。

query("SELECT * FROM {$tablepre}posts WHERE tid=’$i’ AND invisible=’0′ ORDER BY dateline LIMIT 60");
    while ($post = $db->fetch_array($query))
    {
        if ($post['authorid'])
        {
            $uid .= ",".$post['authorid'];
        }
    }
    $query = $db->query("SELECT  uid, username, groupid, regdate, lastactivity, posts, digestposts, oltime,
                pageviews, credits, extcredits1, extcredits2, extcredits3, extcredits4, extcredits5, extcredits6,
                extcredits7, extcredits8, email, gender, showemail, invisible, avatarshowid, xspacestatus FROM {$tablepre}members 
                
                WHERE uid IN ($uid)
                ");    
    $query = $db->query("SELECT  nickname, site,icq, qq, yahoo, msn, taobao, alipay, location, medals, avatar, avatarwidth,
                avatarheight, sightml AS signature, customstatus FROM {$tablepre}memberfields 
                
                WHERE uid IN ($uid)
                ");        
}
$mtime = explode(‘ ‘, microtime());        
$runtime = ($mtime[1] + $mtime[0] – $discuz_starttime);
?>

运行时间依次为:
14.2967050076 13.7778971195 14.3256859779 15.5803039074 13.5902359486 13.9162919521 14.1429729462 14.4423420429
基本在14秒左右

结论,对于数据量较大的网站,采用先读取相关cdb_posts中的数据,再用联表查询用户的信息的方式,可以更提高程序运行效率,减少对服务器的负载,虽然增加了一次查询,但是由于查询的语句简单化,因此反而可以节省一些运行时间。

*******************************
ps:以上方法我都做了测试,结果却跟上面的不一样,我测得的还是论坛原本的代码用时最少,倒是把leftjoin变为逗号直接连表查询会稍微快一些。

Discuz7.2升级到DiscuzX1.5

官方的帮助文档在这里:http://faq.comsenz.com/viewnews-942

说是升级,其实就是先安装DiscuzX1.5,然后把Discuz7.2中的数据导入。官方的文档写的很详细,照着一步一步做就可以。唯一有些模糊的就是关于ucenter的安装问题。

在安装DiscuzX1.5时,会有“全新安装 Discuz! X (含 UCenter Server)”和“仅安装 Discuz! X (手工指定已经安装的 UCenter Server) ”的选项,经测试发现如果选择“全新安装 Discuz! X”,在后面运行convert程序时原来数据库里以pre_uc_为前缀的数据表里的数据并未被导入到DiscuzX1.5的数据库中;如果选择手动指定ucenter,则有可能出现安装不成功的问题。

折中的解决方法就是选择“全新安装Discuz! X (含 UCenter Server)”,然后

1.从旧数据库里导出pre_uc_前缀表的sql(包括结构和数据)

2.在新数据库里删除pre_ucenter_前缀的表

3.将导出的sql语句中”pre_uc_”替换为”pre_ucenter_”,然后导入新数据库中

convert程序在导入前后执行都可以。

Discuz 用户信息加密算法-authcode加密/解密函数详解

引用地址:http://bbs.itokit.com/thread-4009-1-1.html

/**
*用户信息加密解密函数
*
*待加密内容用\t分割
*@return String 加密或解密字符串
*@param String $string 待加密或解密字符串
*@param String $operation 操作类型定义 DECODE=解密 ENDODE=加密
*@param String $key 加密算子
*/
function authcode($string, $operation, $key = '') {
/**
*获取密码算子,如未指定,采取系统默认算子
*默认算子是论坛授权码和用户浏览器信息的md5散列值
*$GLOBALS['discuz_auth_key']----全局变量
*取值为:md5($_DCACHE['settings']['authkey'].$_SERVER['HTTP_USER_AGENT'])
*$_DCACHE['settings']['authkey']是论坛安装时生成的15位随机字符串
*/
    $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);
    $key_length = strlen($key);
/**
*如果解密,先对密文解码
*如果加密,将密码算子和待加密字符串进行md5运算后取前8位
*并将这8位字符串和待加密字符串连接成新的待加密字符串
*/
    $string = $operation == 'DECODE' ? base64_decode($string) : substr(md5($string.$key), 0, 8).$string;
    $string_length = strlen($string);
    $rndkey = $box = array();
    $result = '';

/**
*初始化加密变量,$rndkey和$box
*/
    for($i = 0; $i <= 255; $i++) {
        $rndkey[$i] = ord($key[$i % $key_length]);
        $box[$i] = $i;
    }

/**
*$box数组打散供加密用
*/
    for($j = $i = 0; $i < 256; $i++) {
        $j = ($j + $box[$i] + $rndkey[$i]) % 256;
        $tmp = $box[$i];
        $box[$i] = $box[$j];
        $box[$j] = $tmp;
    }

/**
*$box继续打散,并用异或运算实现加密或解密
*/
    for($a = $j = $i = 0; $i < $string_length; $i++) {
        $a = ($a + 1) % 256;
        $j = ($j + $box[$a]) % 256;
        $tmp = $box[$a];
        $box[$a] = $box[$j];
        $box[$j] = $tmp;
        $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
    }
    if($operation == 'DECODE') {
        if(substr($result, 0, 8) == substr(md5(substr($result, 8).$key), 0, 8)) {
            return substr($result, 8);
        } else {
            return '';
        }
    } else {
        return str_replace('=', '', base64_encode($result));
    }

}

解密cookie代码示例:

//此处要包含上面的函数代码

$auth_key=$_DCACHE['settings']['authkey'];   //此值也可以从cdb_settings表中查到,即authkey对应的值
$key=md5($auth_key.$_SERVER['HTTP_USER_AGENT']);
$result=authcode($_COOKIE['Fbw_auth'], 'DECODE', $key);//$_COOKIE['Fbw_auth']是当前用户登录后的cookie值

echo $_COOKIE['Fbw_auth'];
echo "
"; echo $result;

输出的结果格式是“e10adc3949ba59abbe56e057f20f883e 2”,分别是用户加密后的密码和ID。

Discuz和jQuery冲突的解决方法

引用地址:http://hi.baidu.com/mimimo/blog/item/2840768dd7048915b31bbadb.html

Discuz和jQuery的冲突有两点,在/include/javascript/common.js文件的57~64之间有如下代码:

Array.prototype.push = function(value) {
this[this.length] = value;
return this.length;
}

function $(id) {
return document.getElementById(id);
}

Discuz为了兼容低版本的IE,重写了Array对象的push方法,但在重写之前没有做任何判断,有点太XX了~,改为一下形式:

if(typeof Array.prototype.push === ‘undefined’) {
Array.prototype.push = function(value) {
this[this.length] = value;
return this.length;
}
}

第二点就是Discuz也有$()函数,就只是为了实现getElementById?功能没有人家强大就别学人家用美元符号嘛,占用符号资源。应该学学百度,人家就用一个字符G,多低调不和别人争美元。
关于$()函数的冲突,jQuery中给出了解决方法,jQuery.noConflict(),把美元让给你(看看人家多大肚)。

我们的jQuery代码可以这样写:

var jq = jQuery.noConflict(); //把$让给第一个实现它的库,用jq代替
jq(function()
{
//**********************
}
);

这样就完美解决了两者的冲突

discuz7.2我型我秀任务无法完成解决方法

discuz7.2的我型我秀任务上传了头像之后依然显示任务未完成,导致无法往下进行其他任务。

解决方法:
官方网站给出的方法如下:
方法1:打开./uc_client/client.php文件,
找到$res = uc_fopen2($url, 500000, ”, ”, TRUE, UC_IP, 20);
修改为$res = uc_fopen2($url, 500000, ”, ”, TRUE, ”, 20);
方法2:打开FTP论坛根目录下,./config.inc.php
找到define(‘UC_IP’, ‘127.0.0.1’);
或类似代码
修改为define(‘UC_IP’, ”);
即可解决问题
造成问题原因是./uc_client/client.php,第211行:$fp = @fsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout);对IP做了判断

但是该方法在菲律宾论坛测试机试了没有效果。

后来找到另一种方法,就是修改uc_client/client.php中uc_check_avatar函数:

function uc_check_avatar($uid, $size = 'middle', $type = 'virtual') {
    @$file_exists = trim(uc_fopen2(UC_API."/avatar.php?uid=$uid&check_file_exists=1"));
    return $file_exists;
/*        
        $res = @file_get_contents($url);
        if($res == 1) {
                return true;
        } else {
                return false;
        }
*/
}

该修改稍微改变了一下功能,只要存在图片就认为任务done,而不管是申请任务之后上传还是之前上传

U-Center和UCenter Home的关系

2008第三届互联网站长年会

李国德:首先感谢各位站长能够来参加我们今天下午举办的技术分会,现在由我简单为大家介绍一下我们公司新推出来的U-Center和UCenter Home,以及接下来的一系列产品是怎么样的一个体系和我们为什么要做这些产品的改变。
 
首先简单讲一下我们为什么要在原来的Discuz体系上引入了U-Center。我用过之前的一些站点比较深有体会,要跟Discuz进行整合的话可以发 现是比较困难的,比如说Discuz版本之间如果升级不能很配合的话,就会发现有很多问题。而且随着我们公司将来推出一些新的产品的出现,如果一个站点装 这么多程序的话,整个这个产品体系就比较混杂了,包括用户的统一登录以及用户的统一管理,还有各个产品之间的数据互通都是非常困难的。其实从产品层面来 说,在产品需要改善的状况下,我们也需要推出有用户的统一管理平台,U-Center和一个数据交换中心,也是U-Center。
 
从另一个角度来讲,从目前互联网的发展趋势来看,我们以前的产品比较过多的注重了内容,而忽略了一个隐藏在内容背后的元素,就是人。我觉得将来的互联网就 是说每个人的存在性是越来越重要了,在这种情况下,作为我们免费提供给站长所用的程序来说,我们需要把人的因素提高上来,能够让站内的人在我们的产品体系 下更好的得到一个功能上的完善以及人与人之间交互功能需求的满足。在这两个前提下,我们推出了U-Center体系。大家可以看一下大屏幕的图片,首先我 们看一下U-Center和这些产品的应用,在这个体系下,U-Center是作为背后的像飞机上的黑匣子一样,它的作用把Discuz、Supe Site、SupeV这些应用进行一个有机的整合,包括用户的整合,用户统一的登录、退出这些基本的功能,还有一个整合就是数据的整合,包括Discuz 地面的帖子能够在SupeSite里面展示,SupeV里面旁边会有一个视频,这些都是在U-Center里面实现的,这些都是不需要改变的,都是基于这 个黑匣子。UCenter Home和U-Center的关系,UCenter Home是把U-Center里面的数据作为一个展示,U-Center是一个黑匣子,一般人看不到里面有什么东西,UCenter Home就是完成这个使命,把数据进行一个有效的展示,同时赋予站内的每个人一个家。这个人在家里面可以跟踪他在站内所有应用里面的活动,包括好友的活动 以及与好友之间的互通。下面的图就基本上说明了上面的情况,具体的U-Center数据过程,待会儿会由U-Center的产品经理再给大家详细介绍。
 
我对UCenter Home简单介绍一下,之前给大家介绍一下整体的架构,我主要从这四个方面来介绍一下UCenter Home。第一个我告诉大家UCenter Home是什么东西,UCenter Home最简单的介绍就是Home,就是一个家,其实我们理解的以前很多网站都忽略了人的重要性,过多的强调话题的重要性,比方说论坛里面发帖子,每天可 能产生一千个话题,一千个贴子,但是你可能忽略了谁来制造这些帖子,制造这些帖子的人能留住他们吗?还是每天靠不断的搜索引擎提供流量,还是靠人的互动产 生流量,这都是值得我们思考的。UCenter Home就提供给了你一个比较好的解决方案,能够保证网站里面的人想在网站进行长期居住的话,你给他提供了这么一个平台,就像你已经建好了一座房子放在这 儿,他只要愿意居住的话,可以很容易的居住进来,并且他居住完以后,可以很容易的跟周围的邻居打交道,而且也不用像在论坛一样,要去这个版块,去那个版块 看一看有什么动态,把不需要,在他的家里面就可以看到自己关注的那些人到底有什么动态,在UCenter Home里面,这个人最基本的感受就是这个网站是我的,这个网站我说了算。就是下面这两个,一个是隐私和筛选,隐私就是说我控制一下我的东西谁能看,筛选 就是控制一下我想看哪个东西,就是从这两个层面来说的。UCenter Home在隐私方面是做了比较大的一些完善,它基本上能够实现四个方面的功能,一个是全站的用户可见,这是最基本的,是公开性质的。还有一个就是只有好友 可见,就是说你跟他成为相互好友的这些人可见。还有一个就是我想给谁看谁来看,就是说好友里面,可能有一些人,比如说有一些是父母,有一些是学生,我要发 一篇日志我不想让父母看到,只想让学生看到,UCenter Home也可以看不到。还有一个就是自己可见。还有一个就是密码可见,比如说你这篇日志可以设一个密码就可以了。还有筛选我们提供了两个层次,一个是根据 好友组来筛选,因为里面的好友是可以分组的,比如说把家属设为一组,把同学设为一组,你不想看同学的最新动态,你只想看家属或者亲密好友的最新动态,通过 筛选就可以实现。还有一种筛选就是针对类别的筛选,UCenter Home有一个最基本的平台,就是大家如果上过我们的网站的话,就会发现大家应该流浪最多的是首页,首页里面有很多的迷你的视件,各个活动里面会展示在首 页上,大家看到这么多动态的时候,你就可以通过筛选去现在性的让你想看一些动态展示在你的首页上,一些无关的,你想屏蔽掉的就可以屏蔽掉。
 
第三个UCenter Home最重要的就是好友和互动,这是在以前我们公司推出的产品里面比较不足的一个,包括我们之前推的个人空间,还有以前的Discuz,都是在好友方面 做的非常少,包括Discuz里面,大家可能会有感受,如果你加了一个好友以后,你会发现加了好友和没加好友没有什么区别。当然我们发现好友这个是非常重 要的,UCenter Home就把好友这一块进行了彻底的利用。UCenter Home和UCenter我刚才可能也讲了一下,它们之间的关系是什么呢?UCenter就是一个用户中心和数据中心,联系现实的话我们可以把它理解成一 个人才管理中心,就是一个档案管理中心。UCenter Home是这个人真正的家,你在这个UCenter里面做了一个存档,但是你在那里是没有家的,你真正的家是在你的UCenter Home里面,UCenter Home是你真正的家。Discuz、SupeSite、SupeV是这个人在家里面的各种应用,是玩的地方,这都是一些他可以玩的地方。
 
接下来讲一线UCenter Home和X-Space的关系,这两个产品都是我负责研发的,UCenter Home出来的时候引起过很多的质疑,包括有一些站长都在论坛上向我们进行一个观点的PK,他认为UCenter Home里面包括日志以及个人空间比较绚丽的风格等等,都不如X-Space里面好。我们是这么理解的,X-Space是一个传统的博客程序,传统的博客 重点是在于展示,而不是这种交互。它展示的重要性超过了它交互的重要性,所以展示可能要注重,第一SOU化,我展示的话,是拼命的让让更多的人看到我的观 点,不需要有什么权限,就是要让更多的人看得到。展示就是要求有个性的,必须是整个世界上独一无二的,还有其他的一些方面。UCenter Home跟这个是有本质的不同的,大家都会发现,UCenter Home界面都是单调的,所有的操作按纽都是永远固定在左边和上边,为什么要这么设计呢?其实是作为一个工具而存在的。我觉得它已经是高于展示的功能之 上,它是一个比展示更为强大的一个应用,展示只是它一个简单的方面。应用注重人的习惯性,就跟我们用电脑一样,键盘是永远在屏幕下面的,不会因为我需要一 个绚丽的电脑,就把键盘移到上面去,那是不可能的,当然我理解的是这样的,我觉得工具一定要简单、易用、快,更多的是一个扩展性,就是说它作为一个平台的 工具的话,它的扩展性一定要强。就是包括你想给你站内的用户提供什么服务,在这个平台上是非常容易的,当然现在我们只是官方提供了Discuz、 SupeV、ECshop等等这些,包括很多人用的体系,所有的站长都可以通过一两步的操作挂接到这个平台上面,并且所有的用户的展示都可以在 UCenter Home里面看不见。
 
接下来再讲一下UCenter Home和Discuz的关系,很多人都认为UCenter Home里面的群组跟Discuz是冲突的,其实一点也不冲突,Discuz是作为非常大的集市,任何人都可以在上面活动,任何人都可以写一些东西。其实 Discuz是为UCenter Home提供人脉的基础,UCenter Home它自己要产生一个人与人之间的人脉的话是比较困难的,说到这儿,如果你作为一个站长,你想单纯只装一个UCenter Home去发展你的网站是比较困难的,你应该是建立在你现有的应用的基础上去把你应用里面人的关系挖掘出来,大家去挂接UCenter Home。UCenter Home为Discuz提供一个包间的功能,让Discuz上面这些人有了一个密闭的群组的功能,或者个人的平台,就像一个包间一样。
 
我讲的UCenter Home以及UCenter整个产品体系基本上就是这些,谢谢大家。如下有疑问的话,待会儿大家再进行交流,谢谢。

Facebook 粉絲&遊戲序號領取插件的安装(dz7.2)

Facebook 粉絲插件:

facebookFans2.0

安裝方法解壓 > 將upload目錄下目錄上傳到根目錄 > 後臺 > 外掛程式 > 論壇外掛程式 > xlg_fbfan 安裝
安裝提示“本外掛程式適用於 Discuz! 7.2 與當前版本(7.1)不一致,您確定要安裝嗎?”可以點擊確定安裝!

参考网址:http://www.alan888.com/Discuz/thread-180343-1-1.html

遊戲序號領取插件:

gameacc_utf8

1)上傳/覆蓋檔案:
discuz_plugin_gameacc.xml,install.php,uninstall.php→plugins/gameacc
gameacc.php→論壇根目錄;
gameacc.htm→templates/default
2)修改檔案 admin/usergroups.inc.php
查找:
showsetting(‘usergroups_edit_basic_read_access’, ‘readaccessnew’, $group[‘readaccess’], ‘text’);
在其後面加入:
showsetting(‘usergroups_edit_acc_get’, ‘allowaccgetnew’, $group[‘allowaccget’], ‘radio’);
showsetting(‘usergroups_edit_acc_free’, ‘allowaccfreenew’, $group[‘allowaccfree’], ‘radio’);
查找:
readaccess=’$readaccessnew’,
在其後面加入:
allowaccget=’$allowaccgetnew’, allowaccfree=’$allowaccfreenew’,
3)修改檔案 templates/default/admincp.lang.php
查找:
‘usergroups_edit_basic_read_access’ => ‘閱\讀權限:’,
‘usergroups_edit_basic_read_access_comment’ => ‘設置用戶瀏覽帖子或附件的權限級別,範圍 0~255,0 為禁止用戶瀏覽任何帖子或附件。當用戶的閱\讀權限小於帖子或附件的閱\讀權限許\可(默認時為 1)時,用戶將不能閱\讀該帖子或下載該附件’,
在其後面加入:
‘usergroups_edit_basic_read_access’ => ‘閱\讀權限:’,
‘usergroups_edit_acc_get’ => ‘選擇「是」允許\該用戶組在領取插件中領取項目:’,
‘usergroups_edit_acc_free’ => ‘擁有免費領取權限:’,
‘usergroups_edit_acc_free_comment’ => ‘選擇「是」該用戶組將擁有免費領取項目的權限(如選擇「是」,必須先允許領取項目):’,
4)到後台插件安装中選取 gameacc 項目進行安裝
5)完成

参考网址:http://www.alan888.com/Discuz/redirect.php?fid=96&tid=183053&goto=nextnewset