如何不登录Discuz后台刷新模板缓存

Posted in PHP on October 17th, 2011 by Adam

Discuz修改后,缓存的模板常常无法更新,为了不总是麻烦客户,要求后台管理密码,最好的办法就是用程序来刷新。方法很简单:

先手工删除forumdata/templates里面的缓存模板文件,再运行:
if(!file_exists($objfile)){
require_once DISCUZ_ROOT.’./include/template.func.php’;
parse_template($tplfile, $templateid, $tpldir);
}

 

Tags: ,

奇怪的Discuz论坛错误:Current template file not found or have no access

Posted in PHP on October 9th, 2011 by Adam

Discuz!论坛换到新的服务器出现一个令人诡异的错误:

Current template file ‘././templates/default/discuz.htm’ not found or have no access!

经过细密排查,发现并非文件权限和文件是否存在的问题。而是DISCUZ_ROOT出现了一个怪怪的问题:

在include/template.func.php里面的函数function parse_template($tplfile, $templateid, $tpldir),里面有两句:

if(!@$fp = fopen($tplfile, ‘r’)) {
dexit(“Current template file ‘./$tpldir/$file.htm’ not found or have no access!”);
}

发现DISCUZ_ROOT的路径是E://…,此为正确路径,而$tplfile的路径竟然变成了D://,服务器D盘是光驱,自然会找不到。

至于这个$tplfile什么时候跳成D的,很是诡异,暂时没有发现源头。难道是万圣节快到?^_^!

解决办法可以加个preg_match匹配替换错误的D路径,论坛一切正常。

Tags:

Ucenter的终极通信失败

Posted in PHP on January 7th, 2011 by Adam

今天帮客户整合ShopEx和Ecshop到discuz x1.5,发现全新的discuz x1.5安装后,Ucenter仍然出现通信失败的错误。经过排查,排除掉IP和UC_KEY不吻合的问题。分析uc_server的function dfopen发现问题来自fsockopen,返回的是“HTTP 错误 403 – 禁止访问”。原来客户的虚拟主机不支持socke绑定,所以会出现host与实际ip不一致的情况。这可以说是uc_server和uc_client的终极BUG,这种认证方式在无法绑定socket或fsockopen被禁止的主机下完全无效。

如果你还在为你的通信失败伤透脑筋,奉劝你换个hosting试一试。否则只有泪奔的命!

Tags: ,

Discuz搜索页面空白的问题

Posted in PHP on November 2nd, 2010 by Adam

Discuz论坛换服务器后,客户报告搜索页面不法使用,一片空白。由于其他服务一切正常,没有明显错误迹象也没有任何改动。也没有任何错误提示,于是不得不从global.func.php和template.func.php进行追踪,发现最后问题出在function parse_template的preg_replace上,这才恍然大悟原来是曾经遇到过的问题,也就是preg_replace被pcre.backtrack_limit限制的问题,直接修改php.ini里面pcre.backtrack_limit,增大数额,重启服务器,删除旧的缓存文件1_search.tpl.php,问题解决。

Tags:

数据库编码导致discuz无法登录和注册

Posted in PHP on October 20th, 2010 by Adam

昨天帮客户买了VPS迁移网站。本来想着一会的的功夫,没想到倒也折腾了很久。从一开始备份网站程序、数据库都很顺利,到下单VPS,构建FTP server和IIS6的PHP+Mysql环境,似乎一切顺风顺水。可是等到网站恢复的时候,却发现discuz论坛的无登录和注册,验证码始终报错。

本以为是config.inc.php里UC_KEY和UCenter不对,登录Uc_server重新生成新的KEY后,发现通信成功,但是问题依旧。又开始怀疑是不是程序有问题,于是从logging.php一直追踪到uc_client的control->user->onlogin,这才发现还是方向不对。

考虑到旧的数据库是4.0,新的数据库是5.0。会不会导入数据的时候出错?万万没想到恰恰是数据库的问题,让我重第一步就犯下了致命错误。我忽略了一个细节,旧的服务器数据库编码默认是latin1,而新的utf-8编码。由于编码的不同,table的字段长度会发生变化,例如:

latin1: ip varchar(15) -> utf8: ip varchar(5)
latin1: charset varchar(8) -> utf8: charset varchar(2)

这种毁灭性的变化,不但让数据添加有问题,表格本身也千疮百孔,无法修改。以至于出现了discuz无法正常登陆的诡异现象。其实之前重新生成UC_KEY的时候就发现了一个现象,IP地址保存后变成了5位:216.1,但是当时没有特别在意这个问题。这是一个教训。

Tags: , ,

Discuz7.2数据库莫名错误

Posted in PHP on October 14th, 2010 by Adam

客户反映Discuz论坛无法打开,经查看发现多个表格损坏和丢失

#29 – File ‘./cdb_adminsessions.MYD’ not found (Errcode: 2)
#1017 – Can’t find file: ‘cdb_bbcodes’ (errno: 2)
#29 – File ‘./cdb_threadtypes.MYD’ not found (Errcode: 2)
cdb_forumfields,cdb_tasks,cdb_threadtags and cdb_typeoptions dosn’t exist

按理说论坛访问量不大,也没有发生异常的事件,数据库表格损坏和丢失的可能性极低,目前尚不清楚是黑客原因还是空间的问题。
根据upgrade13.php升级程序的内容找回丢失和损坏的表格,一切恢复正常,好在主要的表格没有丢失和顺坏。

Tags:

给Discuz7增加修改用户名的功能

Posted in PHP on July 21st, 2010 by Adam

有朋友的discuz论坛升级到7后,发现修改用户名的功能没有了,很是头痛。我写了一个php脚本可以来解决这个问题。主要原理是查询所有数据表是否包含username和author字段,然后将其匹配的用户名修改成新用户名,这个脚本经测试对discuz论坛和UCenter有效。

主要包含上述字段的数据表有:
bbs_activityapplies -> username
bbs_announcements -> author
bbs_forumrecommend -> author
bbs_magicmarket -> username
bbs_members -> username
bbs_mytasks -> username
bbs_posts -> author
bbs_promotions -> username
bbs_ratelog -> username
bbs_reportlog -> username
bbs_rsscaches -> author
bbs_sessions -> username
bbs_threads -> author
bbs_threadsmod -> username
bbs_uc_admins -> username
bbs_uc_feeds -> username
bbs_uc_members -> username
bbs_uc_mergemembers -> username
bbs_uc_protectedmembers -> username
bbs_warnings -> author

需要的朋友也可以在这里下载discuz7_utf8_update_username.php,需要注意的是:

本脚本用于UTF8版discuz7论坛用户名的修改,运行需要管理员登录,用户自己承担使用后果,作者不承担任何责任,请使用者慎重。

Tags:

Ucenter的外链漏洞?

Posted in 杂项 on July 5th, 2010 by Adam

最近常在zaccode晃悠,zaccode用的是Discuz开发的Ucenter社区程序,在Ucenter里面发布日志话题的时候,在里面的链接,如果是链向外部网站的,通常都会加上转向功能:

http://www.zhaiduo.com => /link.php?url=http://www.zhaiduo.com

但是在无意间,我注意到某些日志的外部链接并没有被转向,而是直链的。经过自己的测试证实Ucenter确实有这个问题,可以通过某些手段绕过URL转向。
这是我在zaccode的测试页面:Ucenter外链测试

根据测试结果,在Ucenter里面添加链接的时候,只要使用类似这种格式(注意href前面的title):
<a title=”" href=”http://www.zhaiduo.com/” target=”_blank”> zhaiduo.com </a>
都可以添加成直链。估计是Ucenter在preg_replace的时候,匹配规则的漏洞所至。

至于有URL转向的链接和直链有什么区别,我就不用废话了。嘿嘿~

Tags: , , ,
RSS Feed