当前位置: 首页 > 图文教程 > 网络编程 > PHP > DISCUZ架构:积分系统代码分析二

PHP
利用discuz实现PHP大文件上传应用实例代码
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
php在字符串中查找另一个字符串
php下HTTP Response中的Chunked编码实现方法
PHP实现定时生成HTML网站首页实例代码
PHP下一个非常全面获取图象信息的函数
PHP strtr() 函数使用说明
php 删除无限级目录与文件代码共享
php AJAX实例根据邮编自动完成地址信息
php miniBB中文乱码问题解决方法
cmd下运行php脚本
PHP 遍历XP文件夹下所有文件
php 移除数组重复元素的一点说明
discuz论坛 用户登录 后台程序代码
Optimizer与Debugger兼容性问题的解决方法
Zend Studio 无法启动的问题解决方法
php 页面执行时间计算代码
php smarty的预保留变量总结
php获取网页内容方法总结
php读取msn上的用户信息类

PHP 中的 DISCUZ架构:积分系统代码分析二


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 212 ::
收藏到网摘: n/a

第二部分:include/newthread.inc.php

以下为引用的内容:
这个文件处理发新帖的特定请求。
if(isset($poll)) {
        $special = 1;
} elseif(isset($trade)) {
        $special = 2;
} elseif(isset($reward)) {
        $special = 3;
} elseif(isset($activity)) {
        $special = 4;
} else {
        $special = 0;
}
这一部分的代码是用来判断帖子的类型的,1为投票,2为交易帖,3为悬赏,4为活动,0为普通帖。
        $price = intval($price);
        $price = $maxprice && !$special ? ($price <= $maxprice ? $price : $maxprice) : 0;
这里是帖子价格的赋值,超过了最大的价格的处理,特殊帖子的价格处理。
} elseif($special == 3 && $allowpostreward) {
                $rewardprice = intval($rewardprice);
                if(!$rewardprice) {
                        showmessage('reward_credits_please');
                } elseif($rewardprice > 32767) {
                        showmessage('reward_credits_overflow');
                } elseif($rewardprice < $minrewardprice || ($maxrewardprice > 0 && $rewardprice > $maxrewardprice)) {
                        showmessage('reward_credits_between');
                } elseif(($realprice = $rewardprice + ceil($rewardprice * $creditstax)) > $_DSESSION["extcredits$creditstrans"]) {
                        showmessage('reward_credits_shortage');
                }

 

                $price = $rewardprice;

                $db->query("UPDATE {$tablepre}members SET extcredits$creditstrans=extcredits$creditstrans-$realprice WHERE uid='$discuz_uid'");
前面说过3表示悬赏帖子,那么当你发表成功了一个悬赏帖子后,就会相应在cdb_members表中减少相应的扩展积分,便是上面的代码的作用了。
elseif($special == 3 && $allowpostreward) {
                $db->query("INSERT INTO {$tablepre}rewardlog (tid, authorid, netamount, dateline) VALUES ('$tid', '$discuz_uid', $realprice, '$timestamp')");
        }
后续判断如果为悬赏帖子的话就往cdb_rewardlog(悬赏记录表)里写入一条记录。
        if($attachment) {
                $searcharray = $pregarray = $replacearray = array();
                foreach($attachments as $key => $attach) {
                        $db->query("INSERT INTO {$tablepre}attachments (tid, pid, dateline, readperm, price, filename, description, filetype, filesize, attachment, downloads, isimage, uid, thumb, remote)
                                VALUES ('$tid', '$pid', '$timestamp', '$attach[perm]', '$attach[price]', '$attach[name]', '$attach[description]', '$attach[type]', '$attach[size]', '$attach[attachment]', '0', '$attach[isimage]', '$attach[uid]', '$attach[thumb]', '$attach[remote]')");
                        $searcharray[] = '[local]'.$localid[$key].'[/local]';
                        $pregarray[] = '/\[localimg=(\d{1,3}),(\d{1,3})\]'.$localid[$key].'\[\/localimg\]/is';
                        $replacearray[] = '[attach]'.$db->insert_id().'[/attach]';
                }
                $message = str_replace($searcharray, $replacearray, preg_replace($pregarray, $replacearray, $message));
                $db->query("UPDATE {$tablepre}posts SET message='$message' WHERE pid='$pid'");
                updatecredits($discuz_uid, $postattachcredits, count($attachments));
        }
如果帖子中带有附件的话,就把附件插入cdb_attachments表,然后注意到$message这一个变量在这里用到了替换,这里的作用是图文混排。接下来往cdb_posts写一条记录,再用include/global.func.php定义到一个函数updatecredits来更新积分。
给Discuz的一个小建议:可以判断是不是postattachcredits为0,为0就可以不执行updatecredits这个函数,虽然在函数定义的时候也有判断,不过在这里判断似乎更好。
if($modnewthreads) {

                $db->query("UPDATE {$tablepre}forums SET todayposts=todayposts+1 WHERE fid='$fid'", 'UNBUFFERED');
                $allowuseblog && $isblog && $blog ? showmessage('post_newthread_mod_blog_succeed', "blog.php?uid=$discuz_uid") :
                        showmessage('post_newthread_mod_succeed', "forumdisplay.php?fid=$fid");

        } else {

                if($digest) {
                        foreach($digestcredits as $id => $addcredits) {
                                $postcredits[$id] = (isset($postcredits[$id]) ? $postcredits[$id] : 0) + $addcredits;
                        }
                }
                updatepostcredits('+', $discuz_uid, $postcredits);

                $lastpost = "$tid\t$subject\t$timestamp\t$author";
                $db->query("UPDATE {$tablepre}forums SET lastpost='$lastpost', threads=threads+1, posts=posts+1, todayposts=todayposts+1 WHERE fid='$fid'", 'UNBUFFERED');
                if($forum['type'] == 'sub') {
                        $db->query("UPDATE {$tablepre}forums SET lastpost='$lastpost' WHERE fid='$forum[fup]'", 'UNBUFFERED');
                }

                if($allowuseblog && $isblog && $blog) {
                        showmessage('post_newthread_blog_succeed', "blog.php?tid=$tid");
                } else {
                        showmessage('post_newthread_succeed', "viewthread.php?tid=$tid&extra=$extra");
                }

        }
这里是最后一段代码,作用是这样的:
首先看看是不是在发新帖的时候就被加为文集