最近论坛在搞抢楼,有用户被判定一分钟发了50贴是机器灌水行为,我好想觉得后台设置过发帖时间限制为10秒的,也就是说1分钟最多发6贴。就自己研究了下,发现自从升级到dz7以来用户的最后更新时间就没更新过,而发帖限制是靠 现在时间-发帖限制时间 和 最后发表时间去比对的,所以导致发帖时间限制的设置形同虚设。所以又仔细看了下更新用户最后发表时间相关代码。
首先来看一段源代码代码
1
2
3
4
5
6
| $self = $creditnotice && $uidarray == $discuz_uid;
……
$lastpostadd = $self ? ", lastpost='$timestamp'" : '';
……
……
$db->query("UPDATE {$tablepre}members SET posts=posts+('$operator$posts') $lastpostadd $creditsadd2 WHERE uid IN ($uids)", 'UNBUFFERED'); |
这里看到要 $self=1 才会把更新最后发表时间的 lastpost=’$timestamp’ 加到update的sql里面,而$self=1的话除了判断下uid之外的话还有个参数 $creditnotice 必需也等于1才行。
也就是必须要打开 dz7 后台 界面 全局里面的积分变动提示才会更新用户最后发表时间。
我想这应该算是个bug把
一个兄弟网站的discuz论坛换了台新的服务器,从apache换到了nginx结果发现换了之后wap访问论坛出来的页面没有任何中文字(英文还是存在的)。我在看了之后一开始以为是wap程序php取数据库编码的问题。后来做了几次修改尝试后发现并非数据库输出内容无中文,而且经过和我们的对比发现连普通的静态内容的中文也都是没有的,一下子就想到问题出在了php上面,于是安装wap下面原来的index.php输出方式手写了一个临时php调试,发现php输出都没问题,有乱码出现,看来问题出在编码转换上面。于是自己看了下discuz的编码转码的库文件chinese.class.php,发现这台新服务器是启用iconv函数的,里面检测到了iconv然后使用iconv函数进行编码转换,忽然想到可能是系统iconv函数库的问题。于是找的了判断iconv的代码:
1
2
3
4
5
6
7
| if(function_exists('iconv') && $this->config['TargetLang'] != 'BIG5' && !$ForceTable) {
$this->iconv_enabled = true;
} else {
$this->iconv_enabled = false;
$this->OpenTable();
}
...... |
修改了这段代码绕过了iconv检测,强制设为不存在iconv的方式处理编码转换。
1
2
| $this->iconv_enabled = false;
$this->OpenTable(); |
然后测试果然中文又回来了。